diff --git a/driver/Makefile b/driver/Makefile index 45b350a08..7552bd664 100644 --- a/driver/Makefile +++ b/driver/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.40 2012/01/25 21:37:03 matthieu Exp $ +# $OpenBSD: Makefile,v 1.41 2012/02/06 22:53:02 matthieu Exp $ # The input driver ABI broke between xserver 1.9 and 1.10. # Some drivers were updated to the new ABI without keeping compatibility @@ -65,7 +65,7 @@ VIDEO_DRV_amd64= \ ${VIDEO_DRV_COMMON} \ xf86-video-intel \ xf86-video-openchrome \ - xf86-video-radeonold \ + xf86-video-radeonhd \ xf86-video-vmware \ xf86-video-wsudl @@ -83,7 +83,7 @@ VIDEO_DRV_i386= \ xf86-video-i740 \ xf86-video-intel \ xf86-video-openchrome \ - xf86-video-radeonold \ + xf86-video-radeonhd \ xf86-video-vmware \ xf86-video-voodoo \ xf86-video-wsudl diff --git a/driver/xf86-video-ati/COPYING b/driver/xf86-video-ati/COPYING index 529cbf26b..7f33cbfd2 100644 --- a/driver/xf86-video-ati/COPYING +++ b/driver/xf86-video-ati/COPYING @@ -1,129 +1,12 @@ -Copyright 1997 through 2004 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org +This is a stub file. This package has not yet had its complete licensing +information compiled. Please see the individual source files for details on +your rights to use and modify this software. -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, and -that the name of Marc Aurele La France not be used in advertising or -publicity pertaining to distribution of the software without specific, -written prior permission. Marc Aurele La France makes no representations -about the suitability of this software for any purpose. It is provided -"as-is" without express or implied warranty. +Please submit updated COPYING files to the Xorg bugzilla: -MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO -EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. +https://bugs.freedesktop.org/enter_bug.cgi?product=xorg -Copyright (C) 2005 Bogdan D. bogdand@users.sourceforge.net -Copyright (c) 1995-2003 by The XFree86 Project, 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 holder(s) -and author(s) 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 holder(s) and author(s). - -Copyright 2006-2007 Advanced Micro Devices, Inc. -Copyright 2007 Egbert Eich -Copyright 2007 Matthias Hopf -Copyright (C) 1999-2001 Brian Paul All Rights Reserved. -Copyright 2007 Luc Verhaegen - -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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. - -Copyright 2007 Advanced Micro Devices, Inc. -Copyright (C) 2008-2009 Advanced Micro Devices, Inc. -Copyright 2004 Eric Anholt -Copyright 2005 Eric Anholt -Copyright 2000 ATI Technologies Inc., Markham, Ontario, and -Copyright 2004 ATI Technologies Inc., Markham, Ontario -Copyright (C) 2008-2009 Alexander Deucher -Copyright 2008 Jérôme Glisse -Copyright 2005 Benjamin Herrenschmidt -Copyright 2008 Kristian Høgsberg -Copyright (C) 2008-2009 Matthias Hopf -Copyright (c) 2006 Itronix Inc. -Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. -Copyright © 2007 Red Hat, Inc. -Copyright © 2009 Red Hat, Inc. -Copyright 2007 George Sapountzis -Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. -Copyright 2006 Tungsten Graphics, Inc. -Copyright 2000 VA Linux Systems, Inc., Fremont, California. - -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 (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 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. - -Copyright © 2006 Keith Packard - -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, and -that the name of the copyright holders not be used in advertising or -publicity pertaining to distribution of the software without specific, -written prior permission. The copyright holders make no representations -about the suitability of this software for any purpose. It is provided "as -is" without express or implied warranty. - -THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO -EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR -CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE -OF THIS SOFTWARE. +All licensing questions regarding this software should be directed at the +Xorg mailing list: +http://lists.freedesktop.org/mailman/listinfo/xorg diff --git a/driver/xf86-video-ati/ChangeLog b/driver/xf86-video-ati/ChangeLog index 7f195e054..370cd17ff 100644 --- a/driver/xf86-video-ati/ChangeLog +++ b/driver/xf86-video-ati/ChangeLog @@ -1,7460 +1,3 @@ -commit 93459f842c2d8dc178a1954b8e05150fcb96ac9a -Author: Michel Dänzer -Date: Wed Nov 2 12:51:15 2011 +0100 - - Bump version for 6.14.3 release. - -commit fe3ce559b7f07d39ded39abb38576846d6eb185b -Author: Jeremy Huddleston -Date: Tue Nov 1 20:27:03 2011 -0700 - - Build fix for -Werror=int-to-pointer-cast - - Signed-off-by: Jeremy Huddleston - -commit d3d6a5da07aaec5961e51c9a8f90c1490ee101b6 -Author: Tormod Volden -Date: Sat Oct 29 23:08:46 2011 +0200 - - radeon: do not include xf86PciInfo.h - - We already use atipciids.h instead most places. - - Signed-off-by: Tormod Volden - -commit 70da7001e81363ed6ef2c4727c512daf53ae29fe -Author: Jeremy Huddleston -Date: Sat Oct 29 20:15:09 2011 -0700 - - Use malloc/calloc/realloc/free directly - - Signed-off-by: Jeremy Huddleston - -commit a3bb07efb1757c33d70e2e1928219d12a4dd6498 -Author: Michel Dänzer -Date: Tue Oct 25 17:43:58 2011 +0200 - - EXA >= R6xx / KMS: Avoid running out of CS space at inconvenient times. - - Otherwise we may end up with things not properly set up at the beginning of the - next CS. - - Fixes http://bugs.debian.org/645007 . - - In contrast to the Composite code for < R6xx, this isn't necessary with UMS, - as the draw packet only uses constant space in the indirect buffer, and nothing - else can mess with the 3D state between indirect buffers. - - Signed-off-by: Michel Dänzer - Reviewed-by: Alex Deucher - -commit 23788c4a5e3b6affb9b183e1393edd0e5ca4550e -Author: Michel Dänzer -Date: Thu Oct 27 19:12:22 2011 +0200 - - EXA < R6xx: Make sure 2D state is re-emitted after running out of CS space. - - Otherwise it's basically luck what the 2D state ends up being at the beginning - of the next CS. - - Signed-off-by: Michel Dänzer - -commit 6e0e1a821accc6ca95f4134e49b66a6b168c1934 -Author: Michel Dänzer -Date: Tue Oct 25 17:39:57 2011 +0200 - - Make radeon_dri2_create_buffer(s) more robust. (Bug #30047) - - In particular, handle and propagate failure to allocate GPU accessible memory, - instead of crashing. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=30047 . - - Also take care not to leak resources in error paths. - - Signed-off-by: Michel Dänzer - -commit 856583dbca9319c77fed40daa9956e81a0068f9e -Author: Jerome Glisse -Date: Thu Oct 20 14:17:14 2011 -0400 - - radeon/kms: fallback to vesa if GPU is not supported by UMS - - For GPU not supported by UMS, test in probe so that we properly - fallback to vesa. - - Signed-off-by: Jerome Glisse - Reviewed-by: Alex Deucher - -commit f6f1b4f7789cfef763c063e671b76b60be8bdd8e -Author: Maarten Lankhorst -Date: Tue Oct 18 14:30:39 2011 +0200 - - dri2: Add vdpau driver name entry - - libvdpau has a driver loading mechanism that looks for a dri2 driver - first before falling back to nvidia, so lets use that. - - Allows use of libvdpau_rx00 without having to set things up separately, - similar to the patch to xf86-video-nouveau. - - Signed-off-by: Maarten Lankhorst - Reviewed-by: Christian König - Reviewed-by: Michel Dänzer - Tested-by: Michel Dänzer - -commit a6b2bd2d184f10d4c56c4ee17186aedb238a36ec -Author: Alex Deucher -Date: Wed Sep 21 17:00:16 2011 -0400 - - UMS: fix DDIA enable on some rs690 systems - - DVOOutputControl checks the value of of bios scratch reg 3 - on some tables and assumes the encoder is already enabled - if the DFP2_ACTIVE bit is set. Clear that bit so the table - sets the DDIA enable bit properly. - - Signed-off-by: Alex Deucher - -commit d78860ba53d9bfcf6c28e1cfd2d970709b5e20fa -Author: Michel Dänzer -Date: Fri Aug 12 11:21:33 2011 +0200 - - Only call radeon_dri2_close_screen() if DRI2 was enabled. - - Signed-off-by: Michel Dänzer - -commit 11330ca5dc61a70fe4507e63230f9133ca22d891 -Author: Michel Dänzer -Date: Fri Aug 12 11:21:32 2011 +0200 - - Remove dead variable remain_size_bytes. - - Signed-off-by: Michel Dänzer - -commit fcf0cca9c0ab0f692b222f619aee8f1cdad3b519 -Author: Michel Dänzer -Date: Tue Sep 20 12:34:05 2011 +0200 - - KMS Color Tiling requires xserver which supports EXA_MIXED_PIXMAPS. - - Signed-off-by: Michel Dänzer - -commit c96e6fb8a5f5be2319fdb4c431c1ba5279997fe8 -Author: Alex Deucher -Date: Sat Sep 17 08:26:12 2011 -0400 - - man: note that the list of marketing names is non-exhaustive - - Signed-off-by: Alex Deucher - -commit 1a51fce6f6ab169c882a86b936909c0820f27a68 -Author: Alex Deucher -Date: Thu Sep 15 17:52:25 2011 -0400 - - update man page with new marking names - - Note that the driver support all currently - shipping asics and the names in the man page - are just a sampling. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=40808 - - Signed-off-by: Alex Deucher - -commit 64f237a4cf3ef5bcb3163e88e1447ff275a1eefa -Author: Michel Dänzer -Date: Thu Aug 18 19:11:08 2011 +0200 - - Convert register ranges for >= r6xx from enums to defines. - - Avoids lots of "comparison between 'enum ' and 'enum '" - warnings with newer versions of gcc. See - https://bugs.freedesktop.org/show_bug.cgi?id=38238 . - - Signed-off-by: Michel Dänzer - -commit 95991fcce45f0dd904f76b9f98f9c7ed5708e4fa -Author: Michel Dänzer -Date: Wed Aug 17 11:10:34 2011 +0200 - - Bail if we're trying to start up in UMS mode on KMS. - - Ideally, the display manager will start the X server again, and everything - will be fine and dandy. But in the worst case, at least we won't hit the - hardware behind the KMS driver's back. - - (This change intentionally makes (ab)use of the fact that Bool is defined as - int). - - Signed-off-by: Michel Dänzer - Reviewed-by: Alex Deucher - -commit f95a41b7851565c282d22f8d679db1377428f165 -Author: Michel Dänzer -Date: Thu Aug 11 11:22:57 2011 +0200 - - video: Don't round up bottom/right edge for clipping source width/height. - - It's not necessary: If the top/left edge was rounded down, this will be - compensated by the subtraction. - - Worse, if the original source width/height is odd, rounding up may result in - reading past the end of the source data. - - Fixes http://bugs.debian.org/637258 . - - Signed-off-by: Michel Dänzer - Reviewed-by: Alex Deucher - -commit 93fc0843a1e31dc9237433bc2bf17df79e956d26 -Author: Michel Dänzer -Date: Wed Aug 10 17:44:37 2011 +0200 - - Change my e-mail address to something that still works, and always will, I hope. - -commit 9151f3b1c2ebcc34e63195888ba696f2183ba5e2 -Author: Michel Dänzer -Date: Tue Aug 9 19:13:26 2011 +0200 - - Prefer the CRTC of the primary output for synchronization. - - See https://bugs.freedesktop.org/show_bug.cgi?id=39696 . - - Signed-off-by: Michel Dänzer - -commit 3b9fdc807dd7e52af0576299cefba596040f6f2f -Author: Alex Deucher -Date: Wed Aug 3 16:20:13 2011 -0400 - - r5xx+: Fix vline setup with crtc offsets - - On r5xx+, vline is relative to to the viewport, not - the scanlines. Based on initial patch and investigation - from Herbert Pötzl (Bertl) on IRC. - - Signed-off-by: Alex Deucher - -commit 104b2d7c071f29266b1bc4184a74e9714d14febc -Author: Alex Deucher -Date: Mon Aug 1 10:05:30 2011 -0400 - - kms: fix possible leak in pageflip code - - Signed-off-by: Alex Deucher - -commit d29bab632e9ecccba518d4107d52620bf75eb1cf -Author: Ville Syrjala -Date: Wed May 4 23:51:27 2011 +0300 - - kms: Move flip_count and co. to a per swap structure - - If multiple drawables are doing page flipping, the global drmmode - structure can't be used to keep per swap information. For example - flip_count can increase prematurely due to another swap request, - and then the previous swap request never gets completed, leading to a - stuck client. Move the relevant pieces of data to a strucuture that - gets allocated once per swap request and shared by all involved CRTCs. - - Signed-off-by: Ville Syrjala - -commit 9493563c1ef4b51af0ee8a44cb4e7c5bb280347e -Author: Ville Syrjala -Date: Wed May 4 23:51:26 2011 +0300 - - dri2: Update front buffer pixmap and name before exchanging buffers - - Buffer exchange assumes that the front buffer pixmap and name - information is accurate. That may not be the case eg. if the window - has been (un)redirected since the buffer was created. - - Signed-off-by: Ville Syrjala - -commit 8c9266ed2da22a510243f9a952c14d4423f48a2b -Author: Alex Deucher -Date: Fri Jul 15 10:44:57 2011 -0400 - - radeon: add some new NI pci ids - - Signed-off-by: Alex Deucher - -commit f59c3b294b0f715fc96e2bbe25893f2b31aa488b -Author: Christian König -Date: Thu Jul 14 11:49:06 2011 +0200 - - Register XvMC video decoding acceleration - -commit e8d0d437957b15252dfad775796a3949ed50dbcf -Author: Dave Airlie -Date: Tue Jul 12 11:43:25 2011 -0400 - - evergreen: Emit SQ_LDS_RESOURCE_MGMT - - Avoids rendering problems when compute changes this reg. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=39119 - - Signed-off-by: Alex Deucher - -commit 9bb31158466e6168116d841d12c8b4303f11c4a6 -Author: Alex Deucher -Date: Wed Jun 22 12:24:28 2011 -0400 - - evergreen: fix num_banks for 2D tiling config - - The field is encoded. - - Signed-off-by: Alex Deucher - -commit 122b471f734aa07427b01d4bec35ff1ac28290b5 -Author: Alex Deucher -Date: Fri Jun 17 04:02:16 2011 -0400 - - dri2: fix copy pasto in a6154c00c64932332e8f6e334661ffd579cfd894 - - Reported-by: Nils Wallménius - Signed-off-by: Alex Deucher - -commit 122bedcbcf45cb583cf51b2fd04ed2805e0ca60b -Author: Alex Deucher -Date: Thu Jun 16 12:57:11 2011 -0400 - - dri2: missing bit from a6154c00c64932332e8f6e334661ffd579cfd894 - - Signed-off-by: Alex Deucher - -commit a6154c00c64932332e8f6e334661ffd579cfd894 -Author: Alex Deucher -Date: Thu Jun 16 12:48:43 2011 -0400 - - dri2/eg+: fix size and alignment of depth/stencil buffers - - Base alignment may be 256B or 512B depending on the group - size. Also need to check against front size for virtualX. - - Signed-off-by: Alex Deucher - -commit 41eb1fbb3d9da64feb4a96df7c575e44136b1538 -Author: Alex Deucher -Date: Mon Jun 13 12:50:39 2011 -0400 - - kms/man: update ColorTiling info - - Signed-off-by: Alex Deucher - -commit 481baa5c74271cd7ce38bae3965d2bc4b8809058 -Author: Alex Deucher -Date: Mon Jun 13 12:44:07 2011 -0400 - - kms: enable ColorTiling by default on r6xx-cayman asics - - Currently only 1D tiling as 2D tiling still has some corner - cases to fix up. - - Signed-off-by: Alex Deucher - -commit cbcc57b0fa6f581be777bef648f2bf3efe7443ee -Author: Alex Deucher -Date: Mon Apr 4 12:52:00 2011 -0400 - - radeon: add llano pci ids - - Signed-off-by: Alex Deucher - -commit 36afd1e1055eeadb2396dadcc68b214655bd90a9 -Author: Alex Deucher -Date: Tue May 31 16:03:36 2011 -0400 - - radeon: add support for llano APUs - - - KMS only - - Includes full EXA/Xv support - - Signed-off-by: Alex Deucher - -commit 557f46dc2f18734ecf1f18dee7e951e0bf062e63 -Author: Dave Airlie -Date: Fri May 27 07:22:08 2011 +1000 - - bump version after release - -commit 2fca40ea65d9f2a6f8451c324bb4b82786f34f76 -Author: Dave Airlie -Date: Thu May 26 12:52:21 2011 +1000 - - radeon: bump version for release of 6.14.2 - -commit fab868c5f7d8cafdb0176d2751f216819a5ba66a -Author: Alex Deucher -Date: Wed May 25 01:09:12 2011 -0400 - - EXA: make evergreen_fix_scissor_coordinates static - - Signed-off-by: Alex Deucher - -commit fe5c42f5155361006b687da824181418f688809f -Author: Alex Deucher -Date: Tue May 24 22:32:01 2011 -0400 - - cayman: endian fixes for shaders - - Signed-off-by: Alex Deucher - -commit 470ecd02347c32e79316046d01a7d5dad0e2fe99 -Author: Alex Deucher -Date: Tue May 24 18:31:47 2011 -0400 - - EXA/Xv: add workarounds for eg/cayman scissors bugs - - Signed-off-by: Alex Deucher - -commit b913e7ba2b60d47a6660699210cc3cf6f5dc52c2 -Author: Alex Deucher -Date: Tue May 24 18:02:52 2011 -0400 - - Revert "cayman: add scissors workaround." - - Needs a proper workaround for a hw bug. - - This reverts commit b77d374b0d11f48c33cfffdb4157c4ec4b05ea15. - -commit 82cb33c3f0e1ba802d7a94f3159b3c5c86cd4043 -Author: Dave Airlie -Date: Wed May 18 14:49:17 2011 +1000 - - cayman: enable all accel - -commit b77d374b0d11f48c33cfffdb4157c4ec4b05ea15 -Author: Dave Airlie -Date: Tue May 24 15:53:58 2011 +1000 - - cayman: add scissors workaround. - - wasted a lot of time getting to this. - -commit ffeab7a7058298e15294a3b2c740c731e36dda1d -Author: Alex Deucher -Date: Mon Apr 18 18:16:51 2011 -0400 - - cayman: fix dword counts default state - - Signed-off-by: Alex Deucher - -commit 3cbfae361bf5e779d3364f0f31cfd25bd0f59e65 -Author: Alex Deucher -Date: Wed Mar 2 20:48:19 2011 -0500 - - cayman: add spi state to default state - - changed in e3145801b80fd4be4cf770128876e86e89bda66f - - Signed-off-by: Alex Deucher - -commit b8ade97c9d0fa5aacb0e3166868bb72e9bc679a6 -Author: Alex Deucher -Date: Wed Mar 2 20:44:19 2011 -0500 - - cayman: first pass at exa/Xv shaders - - Main differences with evergreen: - - 4-way rather than 5-way - - END_OF_PROGRAM bit removed from CF istructions, use - CF_INST_END instead. - - MEGA_FETCH* fields removed from VTX commands - - no more VC, all fetches go through the TC - - Signed-off-by: Alex Deucher - -commit 01b646ed800732985c1638b147716641a99082f9 -Author: Alex Deucher -Date: Wed Mar 2 20:39:38 2011 -0500 - - cayman: add a default state function - - The rest of the state functions can be shared - with evergreen. I've noted where there are - differences. - - Signed-off-by: Alex Deucher - -commit 42eecc6f4fb1570769490bdaeac06817c6c36a7e -Author: Alex Deucher -Date: Wed Mar 2 20:20:56 2011 -0500 - - cayman: add 3D register headers - - Signed-off-by: Alex Deucher - -commit e1d28e011f4a5139cbc778973c63158ed2746716 -Author: Alex Deucher -Date: Wed Mar 2 20:13:50 2011 -0500 - - kms/cayman: stub out exa support - - Just fallbacks for now. - - Signed-off-by: Alex Deucher - -commit 21e44a20b8b1b64079ee77f45aaa5010206ed7b6 -Author: Michel Dänzer -Date: Thu May 12 09:23:38 2011 +0200 - - UMS: Fix comparison of unsigned variable against < 0. - - Pointed out by clang: - - ../../src/radeon_crtc.c:242:18: error: comparison of unsigned expression < 0 is always false [-Werror,-Wtautological-compare] - error = error < 0 ? 0xffffffff : error; - ~~~~~ ^ ~ - - If a UMS regression is bisected to this commit, the assignment should probably - just be removed, as it's a no-op in the current form. - -commit 3b893d81982c9381393c92625e308541e0071b05 -Author: Michel Dänzer -Date: Fri May 13 09:10:02 2011 +0200 - - KMS: Fix output properties logic error. - - Pointed out by clang: - - ../../src/drmmode_display.c:1023:30: error: use of logical && with constant operand; switch to bitwise & or remove constant [-Werror,-Wconstant-logical-operand] - if (props && (props->flags && DRM_MODE_PROP_ENUM)) { - ^ ~~~~~~~~~~~~~~~~~~ - - Reviewed-by: Alex Deucher - -commit f83d58cf5b33686139067f8f898b8e566ba5c253 -Author: Nicolas Kaiser -Date: Fri May 13 00:56:31 2011 +0200 - - man: fix typos - - Signed-off-by: Nicolas Kaiser - -commit 90abffbd30f44b9cf76a6e28103ddcb5419b4522 -Author: Ilija Hadzic -Date: Fri May 6 09:45:23 2011 -0400 - - DRI2: fix high-crtc/vblank oversight/bug - - improvements to high-crtc handling done in - f0b7d7b449cc77bb2b281d81108507f8bc2e6018 introduced a bug that caused - the populate_vbl_request_type to never use the high-crtc field even - when it should. The reason is that the offending patch put the code - under #ifdef DRM_VBLANK_HIGH_CRTC_MASK which is not visible outside the - enum type, so #else was always taken in compilation type. This patch - fixes it by basing #ifdef on (pre-processor visible) - DRM_VBLANK_HIGH_CRTC_SHIFT constant - - Signed-off-by: Ilija Hadzic - -commit 62a4cd180fe884dca24586d453395472516e6496 -Author: Alex Deucher -Date: Wed May 4 01:13:55 2011 -0400 - - fusion: fix tiling enable logic - - Signed-off-by: Alex Deucher - -commit 76638ca687b02d3b1494b9868f817fd4fd892c64 -Author: Alex Deucher -Date: Wed May 4 01:06:22 2011 -0400 - - fusion: enable tiling if DFS works - - Signed-off-by: Alex Deucher - -commit a6d2dba6573a3512d550d7e442bf42ea03012bbc -Author: Dave Airlie -Date: Wed May 4 10:44:43 2011 +1000 - - radeon: add add hw DFS support for fusion - - Fusion had a bug setting up the VM on earlier kernels so we need to work - around that and only enable accel on a new enough kernel. - - Signed-off-by: Dave Airlie - -commit 859e052af49e68a826b77a9135c7f067dc331a06 -Author: Alex Deucher -Date: Tue May 3 15:15:04 2011 -0400 - - radeon: add some new pci ids - - Signed-off-by: Alex Deucher - -commit 8f8bbf628c6eed037f57bc8c155f0ecdacbebad1 -Author: Alex Deucher -Date: Sun May 1 13:19:15 2011 -0400 - - man: add cayman to man page - - Signed-off-by: Alex Deucher - -commit 903e90c31cf0319be9297529aa7b8daa1756cf63 -Author: Alex Deucher -Date: Wed Apr 20 03:10:08 2011 -0400 - - EXA/Xv: used cached bo tiling flags for accel setup on 6xx+ - - This avoids calling into the kernel for each bo in the accel - code. This is a follow on to: - cc7d1fa39da40a532fcdbe6c7924ca47a879e66a - - Signed-off-by: Alex Deucher - -commit 982c22f16c8eeee9be81779fbfe17d8d3f9b6897 -Author: Adam Jackson -Date: Thu Apr 14 16:04:50 2011 -0400 - - R520: Fix textures larger than 2k - - Ported from the equivalent fix in Mesa. - -commit cc7d1fa39da40a532fcdbe6c7924ca47a879e66a -Author: Michel Dänzer -Date: Mon Apr 4 17:37:12 2011 +0200 - - EXA: Cache BO tiling flags. - - Calling into the kernel every time is quite expensive, and nobody else should - ever change the tiling flags. - - There's still more to do along the same lines for >= R6xx. - -commit f0b7d7b449cc77bb2b281d81108507f8bc2e6018 -Author: Michel Dänzer -Date: Tue Apr 5 13:36:01 2011 +0200 - - DRI2: Some cleanups for the scheduling mess. - - * Fix build against libdrm that doesn't define *_VBLANK_HIGH_CRTC*. - * If we have more than two CRTCs but can't use DRM_VBLANK_HIGH_CRTC_MASK, don't - enable scheduling in the first place rather than relying on - DRM_VBLANK_SECONDARY magically doing something sensible for higher CRTCs. - * Only set up client state tracking when scheduling is enabled. - * Only declare pRADEONEnt when it's needed, and break long lines. - -commit 7acf9bc833de539fa2259a051c66a99445a54bc4 -Author: Alex Deucher -Date: Mon Apr 4 11:08:37 2011 -0400 - - radeon: add some additional ontario pci ids - - Signed-off-by: Alex Deucher - -commit 0af6386f85a0f1ba14864a3334164733a10a6cb8 -Author: Ilija Hadzic -Date: Thu Mar 24 13:33:27 2011 -0400 - - xf86-video-ati: (revised #2) add support for vblank on crtc > 1 - - Hi Alex, - - Enclosed is a revised version of two patches sent on Mar 18 and Mar 22, - respectively. Details summarized in these two threads: - http://lists.freedesktop.org/archives/dri-devel/2011-March/009463.html - http://lists.freedesktop.org/archives/dri-devel/2011-March/009582.html - - This patch reconciles the DDX with the change in libdrm sent to this list - earlier today. Specifically, it refers to a symbol that has been renamed - from DRM_CAP_HIGH_CRTC to DRM_CAP_VBLANK_HIGH_CRTC. It *supersedes* the - previous patch (i.e. apply it to the master branch as it exists at the - time of this writing, not as an incremental patch to the one sent previously). - - Regards, - - Ilija - - Signed-off-by: Ilija Hadzic - Signed-off-by: Alex Deucher - -commit fe2e0ad3ffa58f40311319c950b842e2928a5740 -Author: matthew green -Date: Mon Mar 21 12:17:58 2011 -0400 - - bug fix for r6xx/r7xx UMS - - Signed-off-by: Alex Deucher - -commit 83978ad5fe37581e2b2f3fbd9c073d91b2ae1d50 -Author: Alex Deucher -Date: Thu Mar 17 19:07:43 2011 -0400 - - bump version post release - - Signed-off-by: Alex Deucher - -commit 38d9368e59b2990bf32a028ece2132451b402350 -Author: Alex Deucher -Date: Thu Mar 17 18:59:55 2011 -0400 - - bump for release - - Signed-off-by: Alex Deucher - -commit cdfc007eccc9b130fc08012deef304488eb6e469 -Author: Dave Airlie -Date: Wed Mar 16 10:40:42 2011 +1000 - - radeon/exa: correct function name - - this corrects the function name so it matches the contents. - - Signed-off-by: Dave Airlie - -commit b93d7658f669f6dc1cfacebcfe955a1e113a537c -Author: Dave Airlie -Date: Wed Mar 16 10:37:22 2011 +1000 - - radeon/exa: fix scaling check - - This caused a regression in firefox, as these numbers are xFixed - values hence 1 is actually 65536. - - Should fix: https://bugzilla.redhat.com/show_bug.cgi?id=685084 - - Signed-off-by: Dave Airlie - -commit 8567b8cd9e136ef69906e02286b3752db2404741 -Author: Alex Deucher -Date: Tue Mar 15 13:13:06 2011 -0400 - - APU: no tiling yet - - Signed-off-by: Alex Deucher - -commit 4d350497012fa31a417ada662006e2d64db2a4b5 -Author: Dave Airlie -Date: Tue Mar 15 10:32:19 2011 +1000 - - radeon: exa shaders don't handle scaling either. - - rendercheck tsrccoords test fails. - - Signed-off-by: Dave Airlie - -commit 6319a33cb7bd8dba1eaf47bee1e2608cee5d7600 -Author: Alex Deucher -Date: Wed Mar 2 19:38:04 2011 -0500 - - kms: add cayman pci ids - - Signed-off-by: Alex Deucher - -commit fd65def45a57e3242596274d270791df8abc8e29 -Author: Alex Deucher -Date: Thu Jan 13 17:02:31 2011 -0500 - - kms: no accel yet for cayman - - Signed-off-by: Alex Deucher - -commit 585e2a3b803b6d3e070f2427e9cb49bab0949239 -Author: Alex Deucher -Date: Thu Jan 13 16:58:01 2011 -0500 - - kms: add cayman chip family - - KMS only. No UMS support for cayman. - - Signed-off-by: Alex Deucher - -commit 6835e22256ba7a74c02504383f63baaba7e87156 -Author: Alex Deucher -Date: Wed Mar 2 12:20:45 2011 -0500 - - r6xx+: truncate point sampled coordinates - - By default the hardware rounds texcoords. However, - for point sampled textures, the expected behavior is - to truncate. When we have point sampled textures, - set the truncate bit in the sampler. - - Signed-off-by: Alex Deucher - -commit 8a8862e4165dc5be779bce5e327a31da4826db3b -Author: Sedat Dilek -Date: Sat Feb 26 21:04:22 2011 +0100 - - kms: Fix warning XNFprintf is deprecated (v2) - - The first take of my patch missed the breakage against pre-1.10 - xservers and now I know XNFasprintf() is not a 1:1 replacement - for XNFprintf(). - The idea for the fix seemed to be so obvious, but as usual "really" - test the patch you are sending to any ML. - I am awfully sorry for the overhasty bad hack. - Thanks to Alan and Alex for the help to fix it correctly, now. - - Tested-By: Sedat Dilek - Signed-off-by: Sedat Dilek - -commit 88304fe9c0ce69012d44a77a5368c35236511dac -Author: Alex Deucher -Date: Mon Feb 28 11:29:19 2011 -0500 - - kms: don't rotate if acceleration is not enabled - - Signed-off-by: Alex Deucher - -commit 99141761e947e2153ed1a3bc485dc5716a22acb1 -Author: Alex Deucher -Date: Mon Feb 28 11:20:44 2011 -0500 - - kms: don't enable tiling if accel is off - - Signed-off-by: Alex Deucher - -commit 7928c120fb629a782846bcd5734d9fa14cbb099d -Author: Dave Airlie -Date: Mon Feb 28 14:11:57 2011 +1000 - - xv: fix height alignments for U/V planes - - The kernel CS checks showed we were incorrectly aligning the - U/V allocations for when we used them as texture sources. - - This should fix - https://bugs.freedesktop.org/show_bug.cgi?id=34567 - - Signed-off-by: Dave Airlie - -commit e55520c0e582f2a500b3b01c2cb78750e15256ca -Author: Michel Dänzer -Date: Sat Feb 26 15:27:59 2011 +0100 - - Revert "kms: Fix warning XNFprintf is deprecated" - - This reverts commit cb4dc7ab66016d0c980800f8dbf71bbe993889d3. - - Looks like this caused https://bugs.freedesktop.org/attachment.cgi?id=43852 , - but even if it didn't, the following needs to be addressed first: - - cc1: warnings being treated as errors - ../../src/radeon_kms.c: In function ‘radeon_open_drm_master’: - ../../src/radeon_kms.c:413: error: passing argument 1 of ‘XNFasprintf’ from incompatible pointer type - /usr/local/include/xorg/Xprintf.h:57: note: expected ‘char **’ but argument is of type ‘char *’ - ../../src/radeon_kms.c:413: error: passing argument 2 of ‘XNFasprintf’ makes pointer from integer without a cast - /usr/local/include/xorg/Xprintf.h:57: note: expected ‘const char * restrict’ but argument is of type ‘uint16_t’ - ../../src/radeon_kms.c:413: error: assignment makes pointer from integer without a cast - make[2]: *** [radeon_kms.lo] Error 1 - -commit cb4dc7ab66016d0c980800f8dbf71bbe993889d3 -Author: Sedat Dilek -Date: Fri Feb 25 17:21:52 2011 -0500 - - kms: Fix warning XNFprintf is deprecated - - Noticed when building ati/radeon ddx against xserver 1.10-rc3. - - [ build.log ] - ../../src/radeon_kms.c:412:5: warning: 'XNFprintf' is deprecated (declared at /usr/include/xorg/os.h:273) - - agd5f: don't break the build against pre-1.10 xservers. - - Signed-off-by: Sedat Dilek - Signed-off-by: Alex Deucher - -commit ecfdb209afe2aafc378baab8c511f5df7b000270 -Author: Sedat Dilek -Date: Fri Feb 25 21:48:14 2011 +0100 - - UMS: Fix build against xserver 1.10-rc3 - - This issue was introduced due to last minute backout of RandR-1.4 - in xserver 1.10-rc3. - - Switch to "#ifdef RANDR_14_INTERFACE" as suggested by Keith Packard. - See also . - - Note: - The ddx needs a rebuild as the X video driver ABI changed to version 10.0. - - Reported-by: Alex Deucher - CC: Keith Packard - Signed-off-by: Sedat Dilek - -commit 04293a3a84acd96ccdf8e5e865cf973325ca43a1 -Author: Alex Deucher -Date: Thu Feb 24 02:33:41 2011 -0500 - - dri2: disable pageflipping for transformed displays - - Based on Ben's nouveau patch. - - Signed-off-by: Alex Deucher - -commit 91070cfd75d5607c4a72ace780f830f0ddb40e84 -Author: Alex Deucher -Date: Wed Feb 23 00:55:28 2011 -0500 - - Xv: use aligned height to calculate Xv buffer size - - Make sure it's large enough for the tiling mode so the - CS checker doesn't complain. Should fix: - https://bugs.freedesktop.org/show_bug.cgi?id=34567 - - Signed-off-by: Alex Deucher - -commit acd54a48a6680956ed903fc890204c0c910b6712 -Author: Mark Kettenis -Date: Sun Feb 20 22:51:04 2011 +0100 - - Properly restore CLOCK_CNTL_INDEX register - - RADEONRestore() restores the CLOCK_CNTL_INDEX register before calling - RADEONRestorePLLRegisters(), which modifies the CLOCK_CNTL_INDEX register - to access the PLL registers. As a result we may end up with the wrong clock - being selected when exiting X. This happens on platforms where the driver - doesn't save and restore the VGA state. - - Signed-off-by: Mark Kettenis - -commit d7c2ba4286ea32401c0026cb92ec167f7b5753d8 -Author: Alex Deucher -Date: Wed Feb 16 18:30:34 2011 -0500 - - man: add btc chips to the list - - Signed-off-by: Alex Deucher - -commit d0f8bffbbc26818eccdd305ef142387dc4975bba -Author: Alex Deucher -Date: Wed Feb 16 15:09:20 2011 -0500 - - kms: add tiling support for evergreen/NI - - - requires 2.6.37 or newer - - 1D only at the moment - - disabled by default - - Signed-off-by: Alex Deucher - -commit 0471d8412acd82e281a35fc4c6bb2d53b1ff5802 -Author: Alex Deucher -Date: Wed Feb 16 15:07:35 2011 -0500 - - kms: EXA/Xv tiling fixes - - - properly set tiling flags for temp surfaces - - fix CB non_disp_tiling bits on evergreen - - Signed-off-by: Alex Deucher - -commit 4d7e1498f7d9eb50e2eddabca193fc27bde24f0e -Author: Alex Deucher -Date: Tue Feb 15 11:24:23 2011 -0500 - - fix Xv on pre-r6xx asics - - broken by: - a9c1358099:"Xv: fix textured video alignment" - - Reported by: - Artur Skawina - - Signed-off-by: Alex Deucher - -commit a9a59717d11af37a2dda5555f6a83c5b65449527 -Author: Alex Deucher -Date: Sat Feb 12 05:34:50 2011 -0500 - - kms: use worst case base/pitch align if we don't have drm tiling info - - To avoid CS rejection. - - Signed-off-by: Alex Deucher - -commit 5f9b7fdb4ce27f8c6a64134bb4d5ebeb1c958cca -Author: Alex Deucher -Date: Sat Feb 12 05:19:12 2011 -0500 - - kms: always get the tiling info even if we aren't tiling - - We need the proper group size to calculate alignment so the - ddx and drm agree. - - Signed-off-by: Alex Deucher - -commit 355f0f7a67ce239b7fd2f2e81bcaaa88b2a09f03 -Author: Alex Deucher -Date: Sat Feb 12 04:52:52 2011 -0500 - - kms: fix rotate pitch align - - Signed-off-by: Alex Deucher - -commit f1dc419c989addc4737aed06ec8b8acdb4d40063 -Author: Alex Deucher -Date: Fri Feb 11 17:21:10 2011 -0500 - - kms: evergreen/ni big endian accel support - - Based on 6xx/7xx patches from Cédric Cano. - - Signed-off-by: Alex Deucher - -commit e8dc728a549323f1babe337b9d42ad504af1ca39 -Author: Cédric Cano -Date: Fri Feb 11 17:06:47 2011 -0500 - - ums: atombios endian fixes - - agd5f: fix a few more cases. - - Signed-off-by: Alex Deucher - -commit 48ffad957f1dbca909515ffa00629f4caa68706b -Author: Cédric Cano -Date: Fri Feb 11 17:00:31 2011 -0500 - - kms: 6xx/7xx big endian accel support - - agd5f: minor cleanups - - Signed-off-by: Alex Deucher - -commit 151b22bd7c3b1002a7261538611fb2b468815c86 -Author: Cédric Cano -Date: Fri Feb 11 16:33:16 2011 -0500 - - kms/6xx+: endian swap cursor uploads - - agd5f: remove kms surface for cursor since - we now do the swap in the cursor load to avoid - breaking pre-6xx cards with BE. - - Signed-off-by: Alex Deucher - -commit 309fac041f998e20338d320aabaeda5cc1bb6348 -Author: Alex Deucher -Date: Fri Feb 11 14:32:45 2011 -0500 - - kms/exa/xv: fix alignment checking in accel state setup - - Signed-off-by: Alex Deucher - -commit 25fe3ec4c6dfcdf6ba72a032bc9cb2c84d84029a -Author: Alex Deucher -Date: Fri Feb 11 14:03:56 2011 -0500 - - kms/exa: UTS/DFS base alignment fixes - - Signed-off-by: Alex Deucher - -commit 3d10278ce511f5dabb68ed86ee43eaaf43585983 -Author: Alex Deucher -Date: Fri Feb 11 13:51:11 2011 -0500 - - Xv: fix textured video alignment harder - - Signed-off-by: Alex Deucher - -commit a9c135809945fb372ce390f06918b9fd8e455b3f -Author: Alex Deucher -Date: Fri Feb 11 13:21:43 2011 -0500 - - Xv: fix textured video alignment - - Signed-off-by: Alex Deucher - -commit e5bd99faa3b6629a55168386d5dfa936ee4e97ae -Author: Alex Deucher -Date: Fri Feb 11 12:14:55 2011 -0500 - - kms: remove RADEON_TILING_SURFACE flag on front bo - - Should have been removed in: - ef9bfb262db7004bef3704e5d914687e50d3fca4 - - Signed-off-by: Alex Deucher - -commit 92ffce1892d24a98d789aad57a4230cadb0c812a -Author: Alex Deucher -Date: Fri Feb 11 03:12:43 2011 -0500 - - EXA/r6xx+: properly account for height alignment in copy temp buffer - - Signed-off-by: Alex Deucher - -commit 39104c6e8461cf49c1bb03a18858ad75a9d98b46 -Author: Alex Deucher -Date: Thu Feb 10 14:31:43 2011 -0500 - - remove EVERGREENSetAccelState() - - It was a duplicate of the R600 variant. - - Signed-off-by: Alex Deucher - -commit 7ac3a2e0bcdadff7c7172a9f833f526b526da16b -Author: Alex Deucher -Date: Thu Feb 10 14:24:50 2011 -0500 - - 6xx+: switch to linear aligned rather than linear general - - linear aligned is supposedly more performant, but more - importantly, linear general only works on the CB without - slices. The texture blocks technically don't support - linear general although, I think linear general gets - upgraded to linear aligned in the hw which is why it - currently works. - - Signed-off-by: Alex Deucher - -commit e3145801b80fd4be4cf770128876e86e89bda66f -Author: Alex Deucher -Date: Thu Feb 10 14:14:55 2011 -0500 - - evergreen/NI: consolidate spi setup - - Signed-off-by: Alex Deucher - -commit be67ded05621aff9c85525372fd119071d3278ec -Author: Alex Deucher -Date: Thu Feb 10 14:06:38 2011 -0500 - - 6xx/7xx: consolidate spi setup - - Signed-off-by: Alex Deucher - -commit 2c5ae1724307e0dba5d0306fe27c1e15a7390a2f -Author: Alex Deucher -Date: Thu Feb 10 13:47:53 2011 -0500 - - evergreen/ni: consolidate CB state handling - - Signed-off-by: Alex Deucher - -commit c52d817b51e13447802fe338be2d247ffba2a669 -Author: Alex Deucher -Date: Thu Feb 10 13:35:02 2011 -0500 - - 6xx/7xx: consolidate remaining CB state - - Signed-off-by: Alex Deucher - -commit 5f9bc127d302404432b631e3e774192950f57b42 -Author: Alex Deucher -Date: Thu Feb 10 03:28:01 2011 -0500 - - kms/r6xx+: clean up pitch/height alignment in EXA UTS/DFS - -commit a4899db96029acde6cd400fc0541693a487898e7 -Author: Alex Deucher -Date: Sat Feb 5 14:11:42 2011 -0500 - - UMS: fix spelling in error message - - Noticed by: Warren Block - - Signed-off-by: Alex Deucher - -commit 84450ea9221f32296c1f786a6aa126a08bb9756f -Author: Alex Deucher -Date: Sat Feb 5 14:05:48 2011 -0500 - - UMS/DCE3.2: fix segfault - - atombios_pick_dig_encoder() needs to be called - with a valid crtc assigned. - - Signed-off-by: Alex Deucher - -commit a27b5dbd9fba689f1814c0888d1b7459b6c6b1a1 -Author: Alex Deucher -Date: Thu Feb 3 19:06:22 2011 -0500 - - Bump version post release - - Signed-off-by: Alex Deucher - -commit 0a1a0513a61f392580bde39cca4880f2c19abc8d -Author: Alex Deucher -Date: Thu Feb 3 18:09:17 2011 -0500 - - bump version for release - - Signed-off-by: Alex Deucher - -commit ef9bfb262db7004bef3704e5d914687e50d3fca4 -Author: Alex Deucher -Date: Tue Feb 1 19:24:44 2011 -0500 - - kms/pre-6xx: fix pageflipping with tiling - - Use UTS/DFS to tile/untile as appropriate for sw access on - pre-6xx. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=33738 - - Signed-off-by: Alex Deucher - -commit bb16dd77321e5a64a3cb2d2ca9982117799ac1a8 -Author: Alex Deucher -Date: Tue Feb 1 19:20:00 2011 -0500 - - kms/r6xx+: fix tiling and pageflipping harder - - Thanks for Michel for final fix. Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=33738 - for r6xx+ asics. A similar approach for pre-r6xx - asics is pending. - - Signed-off-by: Alex Deucher - -commit 9c124f781049ef11a8b19894a29b7f62975b3011 -Author: Alex Deucher -Date: Tue Feb 1 18:59:40 2011 -0500 - - radeon: remove device 0x4243 - - 0x4243 is a PCI bridge, not a gpu. - - See: - https://bugs.freedesktop.org/show_bug.cgi?id=33815 - - Signed-off-by: Alex Deucher - -commit 66eb81b62e5ae8e1d7bd44ed8a179e5ec1ca69af -Author: Michel Dänzer -Date: Mon Jan 31 12:26:20 2011 +0100 - - UMS: Slightly improve xserver version check. - - This will ensure the xserver definitions necessary to compile the new code are - there. xf86CrtcSetMode will be unresolved at runtime with a few xserver - commits, but I'm afraid this is the best we can do. - - See https://bugs.freedesktop.org/show_bug.cgi?id=33719 . - -commit 3dc28c86eb57cac819e4ed650acfe1f7df6ef565 -Author: Alex Deucher -Date: Thu Jan 27 13:09:26 2011 -0500 - - ums: fix build against xserver >= 1.10 - - xf86CrtcSetMode was removed in: - http://cgit.freedesktop.org/xorg/xserver/commit/?id=8b35118c03590a7ad3786d3284bafb3f40fcb8cc - -commit f58e1354b78bf6b70120bddfe1566da3b0723f72 -Author: Jerome Glisse -Date: Wed Jan 26 16:13:30 2011 -0500 - - dp: fix displayport support by syncing with KMS code - - Warning the dp clock value are divided by 10 in ddx (10 times - bigger than kernel value) this is somethings very picky. - - Signed-off-by: Jerome Glisse - -commit 0f90133ac61c5e1d80b6fa9256e079349940029f -Author: Alex Deucher -Date: Mon Jan 24 12:40:22 2011 -0500 - - vbo: warn if we add a bo with a pointer to the wait list - -commit 42529603ecf86fcfd0a8f3495d9db9ce1ee9b4c3 -Author: Alex Deucher -Date: Mon Jan 24 12:30:56 2011 -0500 - - vbo: always flush the cbuf bo in flush_indirect() - - Always flush the cbuf in case we end up with a cbuf mapped in - Prepare*(), but never end up issuing a draw call since the cbuf - may be in use by multiple ops. - - The CS check for the cbuf bo is no longer necessay because - the cbuf bo is NULL at this point due to the radeon_vbo_put() - just prior. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=32188 - -commit 9b0e03e98ab739efb4031f81cc4a1a50b3d87a42 -Author: Alex Deucher -Date: Mon Jan 24 00:13:25 2011 -0500 - - vbo: avoid extra cs revalidation in vbo alloc - - Make sure we have a valid bo before revalidating. - -commit fadee0409a8e13b78bbccb83dd70f590fee23d57 -Author: Alex Deucher -Date: Fri Jan 21 17:30:28 2011 -0500 - - vbo: balance radeon_vbo_get() and radeon_vbo_put() - - bo_ref() and bo_map() in radeon_vbo_get() - bo_unmap() and bo_unref() in radeon_vbo_put() - - rather than doing the bo_map() separately in - radeon_vbo_space(). - -commit af7d81625a8cf873e6efc881489b3eda9861bd03 -Author: Alex Deucher -Date: Fri Jan 21 17:01:25 2011 -0500 - - evergreen: use vb_offset rather than vb_start_op for cbuf offset - -commit 4817fac5f728b777939e2e2bee16b842c9e1367b -Author: Alex Deucher -Date: Fri Jan 21 15:59:32 2011 -0500 - - vbo: remove useless radeon_vb_discard() - - We already reset vb_start_op to -1 in the - UMS/KMS ib discard functions. - -commit 0a03f03a65aad925ba2d9c76b1d3356184607bf9 -Author: Alex Deucher -Date: Thu Jan 20 17:07:32 2011 -0500 - - evergreen/ni: fix Xv artifacts - - Port of the 6xx/7xx fix to evergreen. Bad texture size - for texture cache flush. - -commit f41cf83750ba9a2e0797fdb21ea9104b85ce53aa -Author: Marton Balint -Date: Thu Jan 20 17:04:56 2011 -0500 - - r6xx/7xx: fix Xv artifacts - - bad textures size for cache flushes. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=22007 - -commit 57fbddfc21d8c6794f378489b764cc2a0ad4a48c -Author: Michel Dänzer -Date: Tue Jan 18 16:07:52 2011 +0100 - - Fix crash freeing KMS video memory. - - Where's that brown paper bag? :} - -commit 6548bb9836253c586023ffe5ad1497ddabaa50fc -Author: Michel Dänzer -Date: Tue Jan 18 10:23:41 2011 +0100 - - Fix KMS textured video leaks (bug #33193). - - v2: Fix radeon_legacy_free_memory() argument type error pointed out by - Marton Balint, refactor video memory freeing logic into helper function. - - Fixes https://bugs.freedesktop.org/show_bug.cgi?id=33193 . - -commit edc3496b55577ee8509ddd9188e6f2bcdf7169a1 -Author: Dave Airlie -Date: Mon Jan 17 07:55:29 2011 +1000 - - radeon: add back flush in block handler. - - this is also needed for certain things like stipple rendering. - - Signed-off-by: Dave Airlie - -commit 63d7dece3f4be8b14012b3a2bedd850831c0437b -Author: Alex Deucher -Date: Thu Jan 13 11:24:26 2011 -0500 - - rs880 fix typo in HD 4250 string - - Noticed by Nigel Taylor - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=33057 - -commit c5b3db18d888552328e9718ea022794fc5bde352 -Author: Alex Deucher -Date: Tue Jan 11 16:21:18 2011 -0500 - - kms: fix pitch aligment for scanout - - Display has slightly stricter pitch alignment requirements - than other blocks. Factor that in when aligning pitch. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=32997 - -commit bbd7adce889359b5eb3239b73e904b3ede283e12 -Author: Alex Deucher -Date: Tue Jan 11 15:41:03 2011 -0500 - - radeon: fix yet another pitch align - -commit af2e6d7d2f1b3d8f8f6b0acfb2b7b0cfaff7bcdb -Author: Alex Deucher -Date: Tue Jan 11 14:42:17 2011 -0500 - - radeon: fix pitch align in pageflip code - -commit e5d0a400d08da2358fac9c2ad12042f125525736 -Merge: 0e432df e27e9b4 -Author: Alex Deucher -Date: Mon Jan 10 18:16:49 2011 -0500 - - Merge branch 'kms-pflip' of git+ssh://git.freedesktop.org/git/xorg/driver/xf86-video-ati - -commit 0e432dff9e06a183acaeb20db29cbd03ff0f4b82 -Author: Alex Deucher -Date: Thu Jan 6 20:56:45 2011 -0500 - - NI: add pci ids - -commit 34d61785b9bc13287bd7ab8bdd8a1b99a3df4440 -Author: Alex Deucher -Date: Tue Nov 23 20:54:57 2010 -0500 - - Add EXA/Xv acceleration support for NI chips - -commit 97322c00faf08461b941edf97efe86d8b082a0ce -Author: Alex Deucher -Date: Wed Nov 24 12:18:04 2010 -0500 - - Bail on NI cards with UMS - - NI cards require KMS. - -commit c678b79f99238473df6ff1bedbae840950cdf88c -Author: Alex Deucher -Date: Tue Nov 23 20:45:25 2010 -0500 - - add NI family ids - -commit e27e9b4e50ad42885ad2e25be897cdf29aa59712 -Author: Mario Kleiner -Date: Sun Dec 19 03:56:17 2010 +0100 - - ddx/ati: Bugfix for pageflip consistency check. - - target_msc wasn't passed from vblank event handler - to pageflip routine, due to a missing initalization. - Now fixed. - - Signed-off-by: Mario Kleiner - -commit 30c5f217f91ed1ee15b5fff0002521d98682efb7 -Author: Alex Deucher -Date: Fri Dec 17 13:40:40 2010 -0500 - - exa/dfs/ontario: always use the CPU for DFS for now - - There are issues with rendering to gart memory that haven't - been sorted out completely yet. - -commit e97079c1b621433b4aa3ecfdd2aa0884aac5df76 -Author: Alex Deucher -Date: Thu Dec 16 18:49:55 2010 -0500 - - DCE4.1: fix DIGx routing - - Works more like DCE4.0. With only two DIGx blocks - the routing is hardcoded based on link. - This fixes blank screen issues when changing crtc - routing due to incorrect crtc to dig mapping. - - Signed-off-by: Alex Deucher - -commit 3b1fb12dec7df4e9434b2c51568ac8d997638922 -Author: Alex Deucher -Date: Sun Dec 12 19:16:47 2010 -0500 - - man: minor formatting fixes - -commit b1af52e522158788a9613d6f1a2309a3987ad59f -Author: Alex Deucher -Date: Tue Dec 7 19:17:09 2010 -0500 - - man: add rs880 info - -commit f9bbb26dd97254b66de11bb2abd821aa293ecba5 -Author: Matt Turner -Date: Thu Dec 2 17:00:11 2010 -0500 - - Add missing call to vbeFree (bug 4417) - - Also kill unneeded vbe.h include from radeon_bios.c. - - Signed-off-by: Matt Turner - -commit 9fc16ff3f8806971cb495e8838af1e5f9149d34f -Author: Alex Deucher -Date: Fri Dec 3 02:04:28 2010 -0500 - - radeon: remove duplicated define - - xfixedtofloat macro was defined several times - -commit f074762fff4253a457cb48519bb33a2e2c90f8b9 -Author: Alex Deucher -Date: Fri Dec 3 01:25:41 2010 -0500 - - radeon/exa: fallback for non-affine transforms - - We need to implement a texture lookup with perspective - divide for non-affine transforms. For now just fallback. - Should fix: - https://bugs.freedesktop.org/show_bug.cgi?id=31799 - although it appears either EXA or the xserver gets this - wrong too. - -commit 774b114baa932078f8bf91ea302850a8c54c2c07 -Author: Nicolas Joly -Date: Thu Dec 2 16:02:44 2010 -0500 - - ati: remove leftover word in ati.man - - fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=28297 - -commit 69639ef377a9d6701cdef902f8a1c5e0b58cf833 -Author: Alex Deucher -Date: Thu Dec 2 02:12:24 2010 -0500 - - radeon/kms: pageflipping man page updates - -commit f48af8a6cfa1ac665f07b8f9712e94b77bc4f5e9 -Author: Mario Kleiner -Date: Tue Nov 23 04:41:53 2010 +0100 - - ddx/ati: Fix reporting of pageflip completion events on multi-head. - - When a drawable is page-flipped on multiple crtc's (fullscreen - drawable on mirror-mode or multi-head x-screen), only one pageflip - event is finally delivered, after the last participating crtc signals - flip completion, this to avoid visual corruption. - - Old code returned vblank count and timestamps of flip completion - of this last crtc, instead of the values of the "master crtc", the - one that was used for initially scheduling/triggering the pagflip - via vblank events. (master = radeon_dri2_drawable_crtc(drawable)) - - This patch makes sure that the pageflip completion values of the - "master" crtc are returned, otherwise client applications will - get confused by the random (msc, ust) values returned by whichever - crtc was the last to complete its flip. Without this, the returned - values change randomly and jump forward and backward in time and - count. - - The patch also implements a consistency check on returned vblank - count values of pageflip completion. Impossible values are detected, - a x-warning is logged and returned (msc,ust) values are marked invalid, - so clients could perform error handling. Such a warning would indicate - bugs in the pageflip completion routine of future kms drivers or the - ddx to aid driver debugging. - - Signed-off-by: Mario Kleiner - -commit 122536ee0aeb1eef1a9d80d5e464dcb423dc2837 -Author: Mario Kleiner -Date: Mon Nov 22 04:11:07 2010 +0100 - - ddx/ati: Add option "SwapbuffersWait" to control vsync of DRI2 swaps. - - A new optional kms driver option "SwapbuffersWait" is defined - for xorg.conf, which defaults to "on". If "on", DRI2 bufferswaps - will be synchronized to vsync, otherwise not. - - This currently only affects copy-swaps, not pageflipped swaps. - It also requires a swap_interval setting of zero by the OpenGL - client. - - Ideally, we'd provide a way for dri2 to pass the current swap - interval to the ddx so we could change this dynamically. - - Signed-off-by: Mario Kleiner - -commit 0de680730294bd623f6b3e189faa7b88a09d3a2a -Author: Alex Deucher -Date: Wed Nov 17 17:39:39 2010 -0500 - - radeon/kms: add pageflip support - - requires radeon drm 2.8.0 or higher - - Signed-off-by: Alex Deucher - Signed-off-by: Jerome Glisse - -commit fccdca8db34010f566bd068c74cdef0f4a8cb7f5 -Author: Alex Deucher -Date: Wed Nov 17 17:37:25 2010 -0500 - - radeon/kms: allow tiled front buffer on 6xx/7xx - - Use UTS/DFS to tile/untile as appropriate for sw access. - Also enables pageflipping with tiling enabled. - -commit 035f7f3ab529ca19b853066792af8a23d08a0f53 -Author: Dave Airlie -Date: Wed Dec 1 10:23:14 2010 +1000 - - radeon: add some missing math.h and assert.h includes - -commit 0f924e83d7be6fca7e024acdf973089efdf3b627 -Author: Dave Airlie -Date: Wed Dec 1 10:23:33 2010 +1000 - - radeon: make sure EXA is off when EXA is disabled with --disable-exa - -commit e142e55c56d8440d7185b594c696ec9eeb699cda -Author: Alex Deucher -Date: Tue Nov 30 15:51:21 2010 -0500 - - evergreen: set default group_bytes to 256 - - 512 seems to cause issues on certain cards. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=31724 - -commit 90f831361844f1b80b3f6bb718ff5ac584d73d48 -Author: Alex Deucher -Date: Mon Nov 29 18:09:05 2010 -0500 - - evergreen: use dot4 for transforms - -commit 3cae361d0448b6e231c80f53d64bdbbdd74dc4cf -Author: Alex Deucher -Date: Mon Nov 29 17:44:47 2010 -0500 - - 6xx/7xx: clean up gpr/const handling in shaders - -commit d9bcac516f2a810acb300b29169e56a2df0b47ac -Author: Alex Deucher -Date: Mon Nov 29 17:23:30 2010 -0500 - - r6xx/r7xx use dot4 for transforms - -commit 5d3f33729be0639cef17372345b2dab6127e39d9 -Author: Alex Deucher -Date: Wed Nov 24 10:59:09 2010 -0500 - - radeon/kms: fix output enumeration - - If a system has a mix of DVI-I, and DVI-D connectors, or a mix - of HDMI-A and HDMI-B connectors, the enumeration was per - connector type, but the naming was the same for multiple - connectors (DVI-[0-n] for DVI-I, -D, -A, and HDMI-[0-n] - for HDMI-A, and -B), you'd end up with multiple connectors - with the same name. Fix this by tracking the number of - connectors across similar connector types. - -commit dc470b5382ffa27bd4a673b21fb6b978d3716ca0 -Author: Alex Deucher -Date: Tue Nov 23 01:46:15 2010 -0500 - - radeon/man: divide driver options into UMS and KMS - -commit 4cbb7100df4b983d77c20a77431cf2f5101bde36 -Author: Alex Deucher -Date: Tue Nov 23 01:22:04 2010 -0500 - - update man page to include ontario - -commit 718dfd443897d70d97fc19afddfbcfe1e39a9c59 -Author: Alex Deucher -Date: Mon Nov 22 13:11:50 2010 -0500 - - Ontario: add workaround for small pixmap issues with DFS - - On past asics these kind a problems were usually due to a bad - backend map config. I suspect in this case, and the previous - cases it may be related to using linear buffers rather than - tiled. - - Signed-off-by: Alex Deucher - -commit 61c97b0812c820564c7bc9d64a998c109bcd46b3 -Author: Alex Deucher -Date: Mon Nov 22 13:10:16 2010 -0500 - - Add EXA/Xv acceleration support for Ontario Fusion APUs - - Signed-off-by: Alex Deucher - -commit 0659f35dfbeda7dd3ff58da1deb6484fabadc332 -Author: Alex Deucher -Date: Mon Nov 22 13:07:00 2010 -0500 - - Add Ontario fusion APU pci ids - - Signed-off-by: Alex Deucher - -commit fa0cec331e6c94cebf82270dcd6c179b15851c5e -Author: Alex Deucher -Date: Mon Nov 22 12:56:45 2010 -0500 - - ontario: add UMS modesetting support - - Accel not enabled yet. - - Signed-off-by: Alex Deucher - -commit 7ad1f01573e930aa6238eaeb0e11708ae548dfce -Author: Jerome Glisse -Date: Fri Nov 19 10:27:40 2010 -0500 - - evergreen: fix typo for fetch resource offset - - Signed-off-by: Jerome Glisse - -commit 3455a3b58532ea3ad901a317126968ab6cbb21b7 -Author: Alex Deucher -Date: Wed Nov 17 17:32:41 2010 -0500 - - radeon/kms: fix buffer base alignment for tiling - - On r6xx+, 2D tiling can require larger than 4k base alignment. - -commit beb7fecd0191e38fb238134ba612985062cf9770 -Author: Dave Airlie -Date: Mon Nov 15 11:59:58 2010 +1000 - - dce4: improve the VT switching code. - - add in lots more blocks of regs to save/restore - -commit 51e51f864a691e51b5193d102398ced667e0beb1 -Author: Dave Airlie -Date: Thu Nov 11 18:48:40 2010 +1000 - - evergreen: remove warnings since last commit - -commit abbf73ee990512ac16ca77e8bb23288495e1f9f4 -Author: Dave Airlie -Date: Thu Nov 11 09:38:15 2010 +1000 - - evergreen: add UMS VT switch support. - - This isn't perfect, but it brings back text VTs here on the - DAC and DVI outputs. - -commit e1dfaf93d06bc5eafdbc2e1823d19204ce8f242c -Author: Dave Airlie -Date: Thu Nov 11 09:15:27 2010 +1000 - - avivo: use arrays to store the crtc/pll info for save/restore - - this is just prep work for evergreen VT save/restore - -commit 0c2834e67df6e143a7d15f373faaddca1dda6b18 -Author: Michel Dänzer -Date: Fri Nov 5 09:30:40 2010 +0100 - - Fix incorrect CS size in one textured video path. (Bug #31364) - - Fixes https://bugs.freedesktop.org/show_bug.cgi?id=31364 . - -commit 2a7b080727f61559cf8444c93a5088f4155a8fdf -Author: Alex Deucher -Date: Fri Oct 29 16:56:45 2010 -0400 - - radeon/kms: more alignment fixes - -commit bf60af579382a0d48f7a65a4cec88759cc8b683c -Author: Dave Airlie -Date: Thu Oct 28 13:06:54 2010 +1000 - - dri2: reference count the client privates key/callback - - This lets multi-screen work better, but still having issues after server - recycle, but it doesn't crash at least. - -commit fb22d0c06a7dc42216230e198ff443d8035e9d21 -Author: Dave Airlie -Date: Thu Oct 28 11:10:03 2010 +1000 - - radeon: only register block handler once per fd. - - should fix https://bugs.freedesktop.org/show_bug.cgi?id=29726 - - the problem is of course the second head instance tries to access the - fd and fails, however I think this might break syncing on the second - head but not sure, but its better than just hanging up the X server - -commit 040140b5d7cbeaf5d83687bc87e4a236ff9f0cbd -Author: Alex Deucher -Date: Wed Oct 27 20:16:17 2010 -0400 - - drm/radeon: unify fb bo alignment harder - - More duplicated paths discoved... - -commit f07f9b7b61c05f2de1d61bb0e2f71bd017c8d36a -Author: Alex Deucher -Date: Wed Oct 27 12:37:42 2010 -0400 - - kms/radeon: unify fb bo alignment handling - - Previously there were 3 different paths with what should - have had duplicated code: - - EXACreatePixmap2 - - Initial front buffer creation - - Randr resize - - This patch attempts to unify the alignment across all 3. - - This may fix tiling issues in some cases and should make - buffer pitches match for pageflipping. - -commit d31046ba6c8eee9b7decc3875697d37c38bc38f3 -Author: Michel Dänzer -Date: Wed Oct 27 12:12:04 2010 +0200 - - Re-use result of GetScreenPixmap call. - - Fixes compile warning due to local variable ppix being unused when building - against current xserver Git. - -commit 4dd7f835c17b00707f1d8d4e36a24380ba52761e -Author: Michel Dänzer -Date: Wed Oct 27 12:09:03 2010 +0200 - - Fix another stray xfree() call. - -commit f815e9c3c61b1ed73e7dd9383587efcdd8dfc07f -Author: Michel Dänzer -Date: Wed Oct 27 11:29:12 2010 +0200 - - Don't try to delete DRI2 event list entries that were never added. (Bug #31086) - - Fixes https://bugs.freedesktop.org/show_bug.cgi?id=31086 . - -commit df92245e1fd0ead2581b675cd96ac8bcc8cb65d7 -Author: Alex Deucher -Date: Sun Oct 24 14:27:27 2010 -0400 - - r100: add some missing bits in SE_COORD_FMT - - Texture coordinates work fine with or without these, - but this should be more correct I think although - I don't think it matters since we aren't sending w - anyway. - -commit fc7aa6e3bbb86eaa2f34b827629f7e82cde65ac7 -Author: Alex Deucher -Date: Sun Oct 24 11:56:48 2010 -0400 - - UMS/radeon: fix typo in restore palette - -commit 5efdf514ab0e5439114e8dd7a49105812155eb69 -Author: Alex Deucher -Date: Sun Oct 24 11:45:19 2010 -0400 - - UMS/radeon: fix screen dimming on VT switch - - Save and restore the palettes on VT switch. The restore - has to be done after the vga restore to work properly as - determined by Jonathan Kollasch. - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=18407 - -commit 1e3ede62c39307d0210cb2044badd619a4f44fec -Author: Alex Deucher -Date: Sun Oct 24 11:24:07 2010 -0400 - - UMS/atom: default to DVI mode if we don't have monitor hdmi info - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=30330 - -commit 51f26a7f01b68e373867c03881868ca8830664d6 -Author: Mark Schreiber -Date: Sat Apr 10 10:55:08 2010 -0700 - - Correct spelling and grammar - -commit 0f575984594e6977b4a7cb794dad8c6e56c850f1 -Author: Alex Deucher -Date: Tue Oct 19 19:21:39 2010 -0400 - - Xv: limit overlay to 2047x2047 - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=15391 - -commit 0f184630cd4760199430320215e4280438fc4ce5 -Author: Alex Deucher -Date: Tue Oct 19 17:13:06 2010 -0400 - - radeon: fix compilation on xserver >= 1.10 - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=30451 - - Signed-off-by: Alex Deucher - -commit 179b0e15924ae2757efaece6488ae835ba6436e3 -Author: Dave Airlie -Date: Tue Oct 19 13:37:22 2010 +1000 - - r600: for 2d tiles we need to align to channels no banks. - -commit 809cacbc23ab37aa7952665f9b2e37c03a34f173 -Author: Adam Jackson -Date: Mon Oct 18 12:32:11 2010 -0400 - - kms: Let the server know if we got more than 1 EDID block - - Otherwise things like xf86MonitorIsHDMI() won't work right. - - Signed-off-by: Adam Jackson - -commit 042037e485396981cf4a420c247104ba5d016ca0 -Author: Alex Deucher -Date: Thu Oct 14 17:00:51 2010 -0400 - - evergreen: requires same cursor fix as avivo chips - -commit 0f37458c253aec46d98db6661c4def711df8fc17 -Author: Adam Jackson -Date: Thu Oct 14 14:37:34 2010 -0400 - - Don't allow the config file to override BIOS location - - Signed-off-by: Adam Jackson - -commit 2918df3a312fc600e83f84c298b9653d2eb3a8d5 -Author: Alex Deucher -Date: Wed Oct 13 17:16:04 2010 -0400 - - evergreen: increase XV_CRTC Xv attribute range - - Cover all 6 possible crtcs. - -commit 0d1f9fd03d0196dda5c1ce34b2e68b007c1874f2 -Author: Alex Deucher -Date: Sun Oct 10 12:06:22 2010 -0400 - - DCE3+: UMS modesetting fixes - - - add mising LVTMA case statement for DCE3.0 dig encoder - - some DCE4 systems have EN/DISABLE_OUTPUT actions - -commit acf4024aa0ef192355b2bd8281507b1c2e6b7de4 -Author: Alex Deucher -Date: Fri Oct 8 16:30:36 2010 -0400 - - ATOM DDC fixes for UMS - - - Header size was already subtraced from table size - - Only hw capable ddc pads are shared with aux - -commit 74fd2b91477106a26a2d9fb4b11c885910996041 -Author: Alex Deucher -Date: Thu Oct 7 17:33:00 2010 -0400 - - DCE3.2 UMS: fix duallink - - Should fix: - https://bugs.freedesktop.org/show_bug.cgi?id=30686 - -commit 8c544272f218fd8bd93a898b96afedc2498b27bb -Author: Alex Deucher -Date: Thu Oct 7 17:25:47 2010 -0400 - - fix the non-kms build - - Should fix: - https://bugs.freedesktop.org/show_bug.cgi?id=30685 - -commit 81360adffb2a66b9a95a38671f9227a9718c9841 -Author: Oldřich Jedlička -Date: Mon Sep 6 21:14:52 2010 +0200 - - radeon: proper DRI2 pending events handling when client gone. (v6) - - Properly handle asynchronous DRI2 events for disconnected clients. - Track client's pending requests and mark them as invalid when the - client disconnects. - - This is based on the version from Alban Browaeys in bug #29065. - - v1 (Alban Browaeys): Based upon a detailed explanation from Oldřich - Jedlička and comments from Christopher James Halse Rogers. - on http://lists.x.org/archives/xorg-driver-ati/2010-August/016780.html . - - v2: Updated version to apply on master. Removed unnecessary - client_index field from _DRI2FrameEvent. Added freeing/removing from - list to failed paths of radeon_dri2_schedule_wait_msc and - radeon_dri2_schedule_swap. - - v3: Adopt to older xorg-server that doesn't have dixRegisterPrivateKey. - - v4: Conditional include of list.h, unreachable return removed. - - v5: Distribute list.h as xorg_list.h, remove xorg-server version check. - Use the version from xorg-server when available (checked in - configure.ac). - - v6: Removed xorg_list.h, made DRI2 scheduling features dependent on - list.h presence. - -commit adee138f007e26307f1aab7f8fe066150c12e55d -Author: Jesse Adkins -Date: Tue Sep 28 13:29:50 2010 -0700 - - Purge cvs tags. - - Signed-off-by: Jesse Adkins - Signed-off-by: Alan Coopersmith - -commit f1bf9cbb471d60ee4b0422bc4e896e3b86f4d75f -Author: Alex Deucher -Date: Wed Oct 6 11:44:42 2010 -0400 - - radeon: man page updates - - - tv-out is not supported on carding using - the rage theatre chip for tv-out - - add evergreen cards to the list - -commit 0921ecc1c751df0dd56e0b1d0b78ab53d7164904 -Author: Alex Deucher -Date: Mon Oct 4 12:34:47 2010 -0400 - - evergreen: use EXACreatePixmap2 if available - -commit 5bdb6434975584eef90eb9e5955b9c2a14b7f327 -Author: Alex Deucher -Date: Mon Oct 4 12:31:51 2010 -0400 - - evergreen: port Karl's UTS/DFS changes to evergreen - -commit be8f45cbd313b68ad663f303c64edb4525b8f981 -Merge: e843faf ff5f466 -Author: Alex Deucher -Date: Mon Oct 4 12:36:56 2010 -0400 - - Merge branch 'evergreen_accel' of git+ssh://git.freedesktop.org/git/xorg/driver/xf86-video-ati - -commit ff5f466e6ca0ee541a255facff6c9198976dfd52 -Author: Alex Deucher -Date: Fri Oct 1 15:46:43 2010 -0400 - - evergreen/dri2: fix depth allocation for depth+stencil - - evergreen uses separate allocations for depth and stencil, - so to handle that, create a depth buffer large enough to - handle both. This is required for using the stencil - buffer in mesa. - -commit e843faf355c864beab81e74f0e39f8ad53d4c2bf -Author: Alex Deucher -Date: Thu Sep 30 19:30:35 2010 -0400 - - radeon: fix fbLocation for >32 bit MC addresses - - If the fbLocation was at an address >32 bits, we'd fail. - Change fbLocation to uint64_t and properly cast when needed. - -commit 886febc882053e09294225e85b102f965041b62b -Author: Alex Deucher -Date: Thu Sep 30 19:20:17 2010 -0400 - - r6xx: fix bad mask when setting up HDP_NONSURFACE_BASE - - This fails for MC addresses >32 bits - -commit 16589b862feb796e15dc6e471d25604a4f5e7c1c -Author: Alex Deucher -Date: Mon Sep 27 18:28:43 2010 -0400 - - bump version post release - -commit cc5005af61f45a3552f7358dc5aa711e42f5af54 -Author: Alex Deucher -Date: Mon Sep 27 18:20:53 2010 -0400 - - bump version for release - -commit 7f8820fcec8c90bf2f823170bd08a23e8b4ff7af -Author: Michael Cree -Date: Mon Sep 27 13:39:12 2010 -0400 - - Fix some unaligned 32bit accesses in the AtomBios code. - - On the Alpha architecture unaligned 32bit accesses incur a software - trap to the kernel and pollute the kernel logs. Fixed by use of the - ldl_u() interface. - - Signed-off-by: Michael Cree - -commit c4f834cdfbe96aa47ac5fb039f9dd7aa9730c8a3 -Author: Nicolas Reinecke -Date: Mon Sep 27 13:33:55 2010 -0400 - - radeon: Convert remaining x(c)alloc/xfree to m/calloc/free. - - Fixes deprecation warnings missed out by - f7a91ece264af9f3fd2fc18e99aefcda93ce9f5c - -commit f8fb9312d791af1f77020e8c2d35bb30841ed9aa -Author: Karl Tomlinson -Date: Sun Aug 22 22:46:33 2010 +1200 - - RADEONPrepareAccess_CS: fallback to DFS when pixmap is in VRAM - - This avoids costly CPU VRAM reads and lets EXA manage a system memory cache - of the portions of pixmaps needed for unaccelerated operations. - - https://bugs.freedesktop.org/show_bug.cgi?id=27139 - -commit 35c4ff936601ee083f51510a5192fb97d622a483 -Author: Karl Tomlinson -Date: Sun Aug 22 22:28:06 2010 +1200 - - radeon: complete UTS and DFS even when a scratch BO is not necessary - - Turns on the big-endian paths even for little-endian systems, and adds - similar paths to the r6xx/r7xx functions. - - This makes UTS and DFS reliable, which will let PrepareAccess (with - mixed pixmaps) choose to fail based on whether the pixmap is in VRAM - (to avoid CPU reads). - -commit d46381a3a6bf10903803f5acaa7aa0ce06373b96 -Author: Karl Tomlinson -Date: Sun Aug 22 21:02:45 2010 +1200 - - radeon: complete big endian UTS and DFS even when scratch allocation fails. - - On big endian systems, PrepareAccess will fail when byte-swapping is - required so UploadToScreen and DownloadFromScreen cannot rely on - fallback to PrepareAccess. - - When scratch BO space allocation fails, this patch merely adds simple - fallback to direct CPU access without any GPU blit. This sometimes - requires a CS flush even in UploadToScreen. - (No allocation retry after a flush is added here.) - -commit 4ced4e1eff67946e306c0c67c9ed59dd5f3c4ba9 -Author: Karl Tomlinson -Date: Sun Aug 22 20:04:42 2010 +1200 - - RADEONDownloadFromScreenCS: flush CS writes before mapping BO for read - - If unflushed CS operations write to the pixmap BO, then these need to be - flushed before mapping the BO for read. This currently only affects big - endian systems and only when the operation writes to the GTT domain. - -commit a4eef8faffbb1ea2f742273ee855f4e6f992e5c8 -Author: Karl Tomlinson -Date: Sat Aug 21 22:29:34 2010 +1200 - - FinishAccess_CS: set bo_mapped to FALSE on unmap - - This is actually only necessary when PrepareAccess may behave differently on - different calls with the same pixmap, which currently doesn't happen. - - However resetting bo_mapped is necessary to let PrepareAccess (with mixed - pixmaps) choose to fail based on whether the pixmap is in VRAM (to avoid CPU - reads). - -commit bfebe039af0c0282d04eb6234b6e6d1e02097146 -Author: Karl Tomlinson -Date: Sat Aug 21 21:44:39 2010 +1200 - - DownloadFromScreenCS: download via a scratch BO if pixmap domain is unknown - - radeon_bo_is_busy() may return without setting the domain out-parameter. - If this happens, then download via a scratch GTT BO to avoid CPU VRAM read. - -commit e26a59e9db8067882327f872e3d2d760ce4c66f3 -Author: Mathieu Bérard -Date: Thu Sep 9 19:32:38 2010 -0400 - - Fix NULL possible deref in evergreen_cp_wait_vline_sync - -commit b90cb61ccb0f4f80e0627141f223354a9371d47d -Author: Alex Deucher -Date: Tue Sep 7 11:51:16 2010 -0400 - - radeon: set interlaced and doublescan enabled for randr outputs - - interlaced used to work without setting these parameters. Changes - in the xserver seem to require them now. - - Should fix: - https://bugs.freedesktop.org/show_bug.cgi?id=29591 - -commit 7cc0d3311f23ad569af004e0e4a0e2efbac107e5 -Author: Alex Deucher -Date: Fri Sep 3 00:32:27 2010 -0400 - - evergreen: fix Xv - - VS const buffer offset was wrong. - - fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=29788 - -commit 7c6ce4e62693f446d7d3c8a86502ccc03c0e55b0 -Author: Alex Deucher -Date: Thu Sep 2 20:34:56 2010 -0400 - - evergreen: add additional default state - - Note, you also need a drm patch to fix the GPU hangs: - drm/radeon/kms/evergreen: fix gpu hangs in userspace accel code - - Signed-off-by: Alex Deucher - -commit 2b98ec1f7e931019a4ab699a56d5dfaa395946fb -Author: Alex Deucher -Date: Wed Sep 1 13:24:19 2010 -0400 - - r6xx/r7xx: fix typos - - some stray - signs - -commit 966ac1be81da76c8aa4ea46b63f3ca5358a2c021 -Author: Alex Deucher -Date: Fri Aug 27 18:22:21 2010 -0400 - - evergreen: work around bad data in some i2c tables - - The 7th entry in a lot of evergreen i2c gpio tables is partially - zeroed. Fix the entry. - - Signed-off-by: Alex Deucher - -commit 91f707d308d4bbf16c3d62d046cf280fef5a8f4c -Author: Heikki Lindholm -Date: Fri Aug 27 02:26:24 2010 -0400 - - xv: fix non-kms/non-dri Xv column ordering on big endian systems - - Column order is wrong on big endian systems, primarly because of a - bits / bytes mix up with the bpp variable. Fix tested with r100 and - r300, screen depth 16 and 32 with YV12 and YUY2 (overlay, textured video), - RGBA and RGBT (overlay). - - Should fix: https://bugs.freedesktop.org/show_bug.cgi?id=29041 - - Signed-off-by: Heikki Lindholm - -commit 6a2c8587a4e05a8be2a2e975a6660942cfe115d6 -Author: Christopher James Halse Rogers -Date: Fri Aug 27 13:14:33 2010 +1000 - - dri2: Reference count DRI2 buffers - - When a client calls ScheduleSwap we set up a kernel callback when the - relevent vblank event occurs. However, it's possible for the client - to go away between calling ScheduleSwap and the vblank event, - resulting in the buffers being destroyed before they're passed to - radeon_dri2_frame_event_handler. - - Add reference-counting to the buffers and take a reference in - radeon_dri2_schedule_swap to ensure the buffers won't be destroyed - before the vblank event is dealt with. - - This parallels the approach taken by the Intel DDX in commit - 0d2392d44aae95d6b571d98f7ec323cf672a687f. - - Fixes: http://bugs.freedesktop.org/show_bug.cgi?id=29065 - - v2: Don't write completion events to the client if it has quit. - v3: Don't try to unref the NULL buffers from a DRI2_WAITMSC event. - Take a ref in schedule_swap earlier, so the offscreen fallback - doesn't incorrectly destroy the buffers. - - Signed-off-by: Christopher James Halse Rogers - Signed-off-by: Dave Airlie - -commit e9928fe036e9382fd7bc353f3f05531445f08977 -Author: Dave Airlie -Date: Wed Aug 25 10:42:39 2010 +1000 - - remove explicit buffer submit from copy region - - port of 0be3e95c844247746742805830860ace9f546d99 from intel driver. - - Remove explicit batchbuffer submit in DRI2 copyregion - - Now that we submit from the flush callback chain, we know we'll always - submit before the client receives the reply or event that blocks it from - rendering the next frame. - - Signed-off-by: Dave Airlie - -commit 9f13049ddf06f6f2138851a548cfb82f12a52f42 -Author: Dave Airlie -Date: Wed Aug 25 08:56:37 2010 +1000 - - radeon: add correct flushing for direct rendered - - this is a port of 69d65f9184006eac790efcff78a0e425160e95aa from the Intel - driver. - - Submit batch buffers from flush callback chain - - There are a few cases where the server will flush client output buffers - but our block handler only catches the most common (before going into select - If the server flushes client buffers before we submit our batch buffer, - the client may receive a damage event for rendering that hasn't happened yet - - Instead, we can hook into the flush callback chain, which the server will - invoke just before flushing output. This lets us submit batch buffers - before sending out events, preserving ordering. - - Fixes 28438: [bisected] incorrect character in gnome-terminal under compiz - https://bugs.freedesktop.org/show_bug.cgi?id=28438 - - Signed-off-by: Kristian Høgsberg - - Signed-off-by: Dave Airlie - -commit 141cbc283fddeb67c2a6c47a0f0f5c2aa2bfb430 -Author: Alex Deucher -Date: Tue Aug 24 18:01:05 2010 -0400 - - evergreen Xv: remove stray line that caused a segfault - - fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=29788 - -commit f170dddd3538a587f2363ef5fa10a4b484e762da -Author: Alex Deucher -Date: Mon Aug 23 18:58:12 2010 -0400 - - evergreen: use vbo pool for constant buffers - -commit eede93b057bbdddcde5da3220a3f8c6f73784a7e -Author: Alex Deucher -Date: Mon Aug 23 13:16:27 2010 -0400 - - radeon: move vbo data to a separate struct - - this way we can share the vbo code with const buffers - -commit d8abf27dbd14f5eb746c5e8b8b1436ad292d8ec6 -Author: Alex Deucher -Date: Mon Aug 23 01:31:27 2010 -0400 - - evergreen: fix dword counts in default state - -commit 5a7c9d94733a0db1d3565447acc9f0e751db5950 -Author: Alex Deucher -Date: Mon Aug 23 00:43:48 2010 -0400 - - radeon: fix legacy lvds dpms sequence - - Take from my kms commit. - - Should fix: - https://bugs.freedesktop.org/show_bug.cgi?id=19459 - - Signed-off-by: Alex Deucher - -commit 6930d2c981221757b1e11ef194809f085753a611 -Author: Alex Deucher -Date: Fri Aug 20 16:55:21 2010 -0400 - - Add initial EXA and Xv support for evergreen - - Based on the r6xx/r7xx code updated for evergreen. - Still causes GPU hangs in some cases. We haven't - tracked down why yet. Might be related to constant - buffer persistence. - - Signed-off-by: Alex Deucher - -commit bdd41fecdb19c83c6c7b793016b61d38065dcd13 -Author: Alex Deucher -Date: Fri Aug 20 01:17:13 2010 -0400 - - evergreen: set encoder type to DVI for HDMI - - Fixes: - http://bugs.freedesktop.org/show_bug.cgi?id=27452 - - Signed-off-by: Alex Deucher - -commit ad8ea1f6e5fcb4f163622cf5eab953ea812b5829 -Author: Alex Deucher -Date: Thu Aug 19 17:04:35 2010 -0400 - - DCE3+: switch pads to ddc mode when doing i2c - - The pins for ddc and aux are shared so you need to switch the - mode when doing ddc. The ProcessAuxChannel table already sets - the pin mode to DP. This should fix unreliable ddc issues - on DP ports using non-DP monitors. - - Signed-off-by: Alex Deucher - -commit fd686668289258ffaf6b81057545e50612aac6a8 -Author: Dave Airlie -Date: Thu Aug 12 12:59:18 2010 +1000 - - radeon: fixup non-kms build - -commit 5a9865d90c23c4ce0f46d380ea9119eac87a99eb -Author: Dave Airlie -Date: Thu Aug 12 11:18:06 2010 +1000 - - evergreen: fix multi-head cursor support - -commit 8351bb9f085fde5dc47b115375efcc61adc23859 -Author: Dave Airlie -Date: Tue Aug 10 15:05:45 2010 +1000 - - radeon: take 8/10 encoding into a/c on displayport link - -commit b91e0efcb24eea32e6978c146c5409eeeeac0a62 -Author: Dave Airlie -Date: Tue Aug 10 15:05:25 2010 +1000 - - dce32: remove rmx workaround - -commit 94bc1b7156cd0866566dc44a823c7e051bb45175 -Author: Dave Airlie -Date: Tue Aug 10 13:24:52 2010 +1000 - - atombios: fixup set crtc source like KMS - - This removes a bunch of strict aliasing warnings and fixes the - codepaths up like the latest KMS code, including a workaround for a bug - on evergreen. - -commit 9bc716eb62d4e0eed2902b92437a42634eef6ba1 -Author: Dave Airlie -Date: Tue Aug 10 13:23:21 2010 +1000 - - atombios: move adjust pixel clock around to follow KMS code flow - - This reworks the pixel clock adjusting code to follow the KMS style, - also fixes warnings in this code. - -commit 31de43bf9d9eb93cc2b2150474ea7404beabe49d -Author: Dave Airlie -Date: Tue Aug 10 13:21:39 2010 +1000 - - displayport: retry on timeout - - this is ported from KMS - -commit 9ef67335583d36080d227e8bce1966afe08e0486 -Author: Dave Airlie -Date: Tue Aug 10 13:21:01 2010 +1000 - - evergreen: don't call YUV table on evergreen - -commit 1cce55e8ba43e7958cb67147aeaeb068826ab99f -Author: Dave Airlie -Date: Tue Aug 10 13:20:13 2010 +1000 - - evergreen: add support to parse firmware info for ext dp clk - -commit bbffd67d3296344e8735b007cdee83146d38369c -Author: Dave Airlie -Date: Tue Aug 10 13:14:54 2010 +1000 - - atombios: realign digital transmitter/encoder setup with kms - -commit 6244153467665f5007e2fc7786b4bcc4b0b96030 -Author: Dave Airlie -Date: Tue Aug 10 12:57:22 2010 +1000 - - update atombios.h to latest from kernel - -commit bb7c77ca75e857f90791b0dd1c04c8e2f19d0e3c -Author: Alex Deucher -Date: Mon Aug 9 22:18:53 2010 -0400 - - atom: upstream parser update - - fixes digital output problems on evergreen asics - -commit cc0a167ff2db9b097891883ded147af1d67e4407 -Author: Alex Deucher -Date: Tue May 25 18:17:15 2010 -0400 - - r6xx/r7xx: default to micro (1D) tiling for now - - SW de-tiling used in the r600c 3D driver has issues with - certain configurations. - - Signed-off-by: Alex Deucher - -commit b5bfdbd70d9671250957ccd41dfc8818850d257e -Author: Alex Deucher -Date: Thu Aug 5 17:26:28 2010 -0400 - - r6xx/r7xx: add support for tiling with kms (v3) - - Requires radeon drm 2.6.0 and updated mesa. - - v2: - fix lockup due to not emiting DB_DEPTH_INFO - https://bugs.freedesktop.org/show_bug.cgi?id=28342 - - fix drm minor version to deal with evergreen accel - v3: rebase on current ddx git - - Signed-off-by: Alex Deucher - -commit a3c59c6f6be7067421e348142da0ca13428dcd57 -Author: Alex Deucher -Date: Wed Aug 4 12:07:36 2010 -0400 - - radeon: add new pci ids - -commit a456587b77ae357750179a50f8db2a17c0f2738e -Author: Alex Deucher -Date: Mon Aug 2 14:24:41 2010 -0400 - - r6xx/r7xx: move syrface sync emit to the functions that emit surface info - - reduces code duplication. - -commit 8eba977cab1878ba247da8160771d41194d8014f -Author: Alex Deucher -Date: Thu Jun 10 13:34:59 2010 -0400 - - EXA: move more common helpers to exa_shared - -commit 71c1a2704af23b61439cee5ce784f7fe267a8a26 -Author: Alex Deucher -Date: Thu Jun 10 11:52:43 2010 -0400 - - remove unused reg headers from radeon_exa_shared.c - -commit d73aef78919005369af1b60df138439b4b6105c3 -Author: Alex Deucher -Date: Mon Aug 2 13:27:12 2010 -0400 - - r6xx/r7xx: set VGT_MAX_VTX_INDX to a larger value - -commit dacaf5d827b58c39f9e5a7ac0530f9ea6e257347 -Author: Dave Airlie -Date: Mon Aug 2 08:33:51 2010 +1000 - - fix make distcheck - -commit c79ce215a01b45fc63b483da167ae37ec7aefad6 -Author: Dave Airlie -Date: Sun Aug 1 16:51:48 2010 +1000 - - radeon/r600: restructure exa + vbo to provide more sharing - - This is a precursor for r300/500 vbo support. - - Signed-off-by: Dave Airlie - -commit 82254b59268140c4102ae3cd713743ae2be15c00 -Author: Alex Deucher -Date: Fri Jul 30 17:15:05 2010 -0400 - - r6xx/r7xx: unify composite mask and non-mask pixel shader - -commit 1c17f3a192f644e8e38b5cfb1470f49434bfba27 -Author: Alex Deucher -Date: Fri Jul 30 16:34:54 2010 -0400 - - r6xx/r7xx: clean up composite vertex shader - - keep CF, ALU, Fetch instructions in separate groups - -commit f9d6c0de231357f96e2e0de71e6c9221bcb36bd4 -Author: Gaetan Nadon -Date: Fri Jul 23 13:28:42 2010 -0400 - - The local copy of the modes code is no longer required. - - The server 1.2 as shipped in the tarball on the web does not contain the - modes code. It was added just after and found in git branch server-1.2-branch. - - The modes code was initially included in version ati 6.8.0 and fails to compile - with server 1.2 as it requires randr 1.2. The modes code is included in server - versions 1.3 and later, so there is no need to provide an unknown version of - the modes code in the ati driver tarball. It will never be used. - - This patch makes the ati driver requiring server 1.3 or later. - Version 6.8.0 configures and builds ok on server 1.3 - Master branch post 6.13.1 configures and builds ok on server 1.3 - - Signed-off-by: Gaetan Nadon - -commit 0028419acb0762eeb950de5fe702c93e70301612 -Author: Gaetan Nadon -Date: Sat Jul 24 10:51:18 2010 -0400 - - config: add AM_PROG_CC_C_O for per-target compilation flags - - Per-target compilation flags (theatre200_drv_la_CFLAGS) are required - when multiple targets which require different compiler flags, - are build in the same makefile. - - Automake issues a command with -c and -o flags which not all compilers - support. The object fles are prefixed with theatre200_drv_la. - The macro AM_PROG_CC_C_O must then be used to provide this feature - on compilers that do not have it. If not, a warning is issued at make time. - - This macros checks for compiler support and if missing, uses a "compile" - script it generates in the package root directory. - - Signed-off-by: Gaetan Nadon - -commit aca0a8669b538d58f018f95c9b22e6b3ec1ffe50 -Author: Gaetan Nadon -Date: Wed Jul 21 16:49:04 2010 -0400 - - config: add comments for main statements - -commit 66e614f7115efeec237b3b916d9637e8b3e8985c -Author: Gaetan Nadon -Date: Wed Jul 21 16:07:00 2010 -0400 - - config: replace deprecated use of AC_OUTPUT with AC_CONFIG_FILES - - Signed-off-by: Gaetan Nadon - -commit 16e5510c90ef1ba2bbaab78d18943f080b86d809 -Author: Gaetan Nadon -Date: Wed Jul 21 14:37:41 2010 -0400 - - config: replace deprecated AC_HELP_STRING with AS_HELP_STRING - - Signed-off-by: Gaetan Nadon - -commit b36d8c09e91382f4cfa71635374ec88f5b676d1c -Author: Gaetan Nadon -Date: Wed Jul 21 14:05:22 2010 -0400 - - config: replace deprecated AM_CONFIG_HEADER with AC_CONFIG_HEADERS - - Signed-off-by: Gaetan Nadon - -commit cd9351b04c2d6982b28c647a63d550eb3e1937eb -Author: Alex Deucher -Date: Wed Jul 21 13:48:24 2010 -0400 - - r6xx/r7xx: group op variable state - - Group the op variable state into one emit block, re-order - to reduce dwords emitted. - -commit 5f838c664e8010f4e51afecd4100d73a96fe1209 -Author: Gaetan Nadon -Date: Wed Jul 21 09:27:42 2010 -0400 - - config: complete AC_INIT m4 quoting - - Signed-off-by: Gaetan Nadon - -commit 48ec2e65c268b426ab9a3e214d174447cf5b5936 -Author: Gaetan Nadon -Date: Wed Jul 21 08:33:38 2010 -0400 - - config: remove unrequired AC_SUBST for LIBDRM and LIBUDEV - - These macros are called by the PKG_CHECK_MODULES macro. - - Signed-off-by: Gaetan Nadon - -commit 1aabb7eb7d8f06c7481151145db3b9a722ce4ef0 -Author: Gaetan Nadon -Date: Tue Jul 20 21:54:11 2010 -0400 - - config: remove unrequired AC_SUBST([DRI_CFLAGS]) - - This macro is called by PKG_CHECK_MODULES - - Signed-off-by: Gaetan Nadon - -commit 8f92b349821a3ee5ed8df55273d905b9605385aa -Author: Gaetan Nadon -Date: Tue Jul 20 21:44:57 2010 -0400 - - config: remove unrequired AC_SUBST([XORG_CFLAGS]) - - This macro is called by PKG_CHECK_MODULES - - Signed-off-by: Gaetan Nadon - -commit 5b483b832f9c4a5b92ffb7f72a470669201f1fba -Author: Gaetan Nadon -Date: Tue Jul 20 20:24:42 2010 -0400 - - config: remove unrequired AC_HEADER_STDC - - Autoconf says: - "This macro is obsolescent, as current systems have conforming - header files. New programs need not use this macro". - - Signed-off-by: Gaetan Nadon - -commit 6574e3a16eb3631ee7e00ee60a8c9ba95c8b84ef -Author: Gaetan Nadon -Date: Tue Jul 20 19:41:30 2010 -0400 - - config: remove AC_PROG_CC as it overrides AC_PROG_C_C99 - - XORG_STRICT_OPTION from XORG_DEFAULT_OPTIONS calls - AC_PROG_C_C99. This sets gcc with -std=gnu99. - If AC_PROG_CC macro is called afterwards, it resets CC to gcc. - - Signed-off-by: Gaetan Nadon - -commit 593eff2924c2ad161d8b490fbf6d7e433fbe2a80 -Author: Gaetan Nadon -Date: Tue Jul 20 18:45:18 2010 -0400 - - config: update AC_PREREQ statement to 2.60 - - Unrelated to the previous patches, the new value simply reflects - the reality that the minimum level for autoconf to configure - all x.org modules is 2.60 dated June 2006. - - ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.60.tar.gz - - Signed-off-by: Gaetan Nadon - -commit c2ab6ffc25aa6759cbbb4c1fbbd4a136b38983bf -Author: Gaetan Nadon -Date: Tue Jul 20 16:15:29 2010 -0400 - - config: upgrade to util-macros 1.8 for additional man page support - - Use MAN_SUBST now supplied in XORG_MANPAGE_SECTIONS - The value of MAN_SUBST is the same for all X.Org packages. - -commit cdeb1949c820242f05a8897d3ddd0718f204dacf -Author: Jerome Glisse -Date: Thu Jul 15 16:21:41 2010 -0400 - - kms: don't call cursor helper if using software cursor - - Fix : - https://bugzilla.redhat.com/show_bug.cgi?id=601713 - https://bugzilla.redhat.com/show_bug.cgi?id=598358 - - Signed-off-by: Jerome Glisse - -commit 06691376b1ee963c711420edaf5a03eab6f5658f -Author: Dave Airlie -Date: Wed Jul 7 13:15:03 2010 +1000 - - fix build on non-kms - -commit 052cf0169ae70d5448af6dc4db840b2fc195569b -Author: Dave Airlie -Date: Wed Jul 7 11:10:46 2010 +1000 - - configure.ac: bump version post release - -commit ad999e633ff41d27eed9d2c6535e163a7181b0bd -Author: Dave Airlie -Date: Wed Jul 7 10:49:22 2010 +1000 - - set version for release - -commit 37b348059b1c15d7b381cd3df3db52bd9ee6613e -Author: Alex Deucher -Date: Wed Jun 30 12:56:48 2010 -0400 - - remove rv100 quirk - - Some RV100 cards with 2 VGA ports show up with DVI+VGA, however - some boards with DVI+VGA have the same subsystem ids. Better - to have a VGA port show up as DVI than having a non-useable - DVI port. - - reported by DHR in irc. - - Signed-off-by: Alex Deucher - -commit c8ea942bd0e9d1c055d50b94440aa4dae425f20b -Author: Cooper Yuan -Date: Tue Jun 29 20:34:57 2010 +0800 - - Remove HDP_SOFT_RESET function, there is no need to reset HDP block. - - This commit can fix an issue reported on DELL server, system gets hang - during soft resetting while another application tries to access PCI - configuration space. - -commit 139b38bf67ec10d876cc56df833541d497ae4fa4 -Author: Alex Deucher -Date: Thu Jun 24 14:55:09 2010 -0400 - - r6xx shader: use ADDR() for CF_DWORD0 - - no change in functionality - -commit 801e83227a59a29eea425ea612083bbf2b536c30 -Author: Wolfram -Date: Mon Jun 21 18:59:19 2010 -0400 - - r6xx/r7xx: fix ums cmd buffer leak - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=27957 - -commit b13d719080b75fc6db4d15d2d323b8fce8b7ad06 -Author: Alex Deucher -Date: Mon Jun 21 18:49:44 2010 -0400 - - r6xx/r7xx: fix miscount in state emit - -commit c3c5c8e2cc91b51a24effdffb85281216eed731d -Author: Alex Deucher -Date: Mon Jun 21 14:30:17 2010 -0400 - - r6xx/r7xx accel: add back some additional default state - - This adds back everything removed in c29157bbf5b0dd26857675282ab094082fbaed0d - except CB_FOG_*, CB_CLEAR_* and the VPORT transforms. Those shouldn't - be needed as we aren't using fog or viewport transforms. We probably don't - need all the state that was added back either but I can't reproduce any - problems here, so it's hard to say which parts are problematic. - - Should fix: - https://bugs.freedesktop.org/show_bug.cgi?id=28629 - and several corruption reports on #radeon. - - Signed-off-by: Alex Deucher - -commit 800cb2088fec698d0626063a9ab198ff534938c0 -Author: Michel Dänzer -Date: Mon Jun 21 08:15:14 2010 +0200 - - DRI2: Fix up confusion between windows and pixmaps. - - Fixes crashes with xserver master, where looking up a pixmap private on a - window no longer happens to work. - -commit f7a91ece264af9f3fd2fc18e99aefcda93ce9f5c -Author: Michel Dänzer -Date: Mon Jun 14 08:52:16 2010 +0200 - - Convert x(c)alloc/xfree to m/calloc/free. - - Fixes deprecation warnings with xserver master and should also work with older - xservers. - -commit ea37d24b1b6d4cbcf73e680846de25b72af216e3 -Author: Dave Airlie -Date: Mon Jun 21 13:55:15 2010 +1000 - - radeon: fix support for 1.9 server master. - - This moves pixmap and mode set into CSR where its allowed. Should work fine on - old servers also. - - Signed-off-by: Dave Airlie - -commit fdd8ecafd054f65842351aee6ee6fba7af6613b2 -Author: Alex Deucher -Date: Wed Jun 16 19:02:10 2010 -0400 - - r6xx/r7xx: macro safety fixes - -commit 4651d77211b508cb6b76931807780e317f232220 -Author: Alex Deucher -Date: Wed Jun 16 12:28:36 2010 -0400 - - radeon: fix depth 16 with ums - - Fixes: - https://bugs.freedesktop.org/show_bug.cgi?id=28494 - https://bugzilla.redhat.com/show_bug.cgi?id=554967 - - Signed-off-by: Alex Deucher - -commit 1e1d6a515428b6884fea586d180346fc74ef75a1 -Author: Alex Deucher -Date: Wed Jun 16 12:20:03 2010 -0400 - - r3xx-r5xx Xv: disable bicubic filtering by default - - - makes Xv more consistent with r1xx/r2xx/r6xx/r7xx - - Xv attributes like brightness, contrast, hue, etc. only work - when bicubic is disabled. - - avoids performance issues on some systems when sampling from textures - in GART with kms. - - It can be re-enabled with using xvattr - - Signed-off-by: Alex Deucher - -commit c29157bbf5b0dd26857675282ab094082fbaed0d -Author: Alex Deucher -Date: Tue Jun 15 19:39:42 2010 -0400 - - r6xx/r7xx: remove unnecessary state emit - - No need to emit state that doesn't impact that we use for EXA/Xv. - - Signed-off-by: Alex Deucher - -commit 35280545fcfb911f189d7657bd1040a28450fe7b -Author: Alex Deucher -Date: Tue Jun 15 19:21:32 2010 -0400 - - r6xx/r7xx: reorg default and clipping state emit - - Group ordered registers to save command buffer space. - Reduces the default and clipping state from 256 to 160 dwords. - - Signed-off-by: Alex Deucher - -commit a2528a734c1d4e8639c49e5d222e3630a93ffbfd -Author: Alex Deucher -Date: Tue Jun 15 17:00:34 2010 -0400 - - r6xx/r7xx accel: remove some duplicate emits and minor clean up - - Signed-off-by: Alex Deucher - -commit 5f093357f18eb9bea641394ab86a92a1766d8f2e -Author: Gaetan Nadon -Date: Sat Jun 12 15:11:46 2010 -0400 - - COPYING: replace stub file with actual copyright notices - - Signed-off-by: Gaetan Nadon - -commit 0c2118586d3edeecc2473b5d685472df4b5e70fa -Author: Dave Airlie -Date: Fri Jun 11 15:53:18 2010 +1000 - - radeon: fixup last fix, use CURSOR_WIDTH not RADEON_CURSOR_WIDTH. - -commit 9a117f768cb8261327fd3c324da9c98875785cc1 -Author: Dave Airlie -Date: Fri Jun 11 14:28:24 2010 +1000 - - radeon: set proper stride for cursor in tiling flags. - - definitely incorrect, but hope it doesn't break anything. - - Signed-off-by: Dave Airlie - -commit b6346ede94f0d0b11ee04770cf52508cb0a5e6c6 -Author: Dave Airlie -Date: Thu Jun 10 20:13:58 2010 -0400 - - drmmode: fix big endian issue with properties. - - On a power machine with an rn50, this was causing load detection to be turned off after the first X run, subsequent X runs would find nothing connected. - - Signed-off-by: Dave Airlie - -commit 1971dc6d758dea13b9fb6d1c8f516c165628b5e5 -Author: Alex Deucher -Date: Tue Jun 8 11:18:28 2010 -0400 - - radeon: fix rn50 cloning with kms - - Since they only have one crtc sometimes the xserver doesn't assign - a crtc to one of the outputs even though both outputs have common modes - which results in only one monitor being enabled. Assign a crtc in - preinit so that both outputs light up. - - Signed-off-by: Alex Deucher - -commit 426114b4a99d37b394efe3336968bb0ab9b6e9ae -Author: Dave Airlie -Date: Tue Jun 8 11:34:35 2010 +1000 - - xv: fix Xv on M6/RV100 under KMS. - - pRADEONEnt->HasCRTC2 wasn't setup under KMS. - - Signed-off-by: Dave Airlie - -commit f64bf0de8e2de7c1bf9cc0c614603dd23c9060ad -Author: Alex Deucher -Date: Thu Jun 3 14:48:21 2010 -0400 - - evergreen: explicitly disable accel on evergreen - - Previously we relied on the drm not having accel enabled - to make sure evergreen used shadowfb, now we when we enable - accel in the drm, we need to make sure the ddx doesn't try - and use it until it's implemented. - - Signed-off-by: Alex Deucher - -commit 428125c095b18c2a2864c1aef24ac0f384b6be54 -Author: Marek Olšák -Date: Sun May 16 20:11:17 2010 +0000 - - r3xx-r5xx: enable color tiling by default on KMS - - Signed-off-by: Marek Olšák - -commit 6712ce4f4715c8ce7c2fcddb52ca9b103bdd634c -Author: Marek Olšák -Date: Sun May 16 20:09:31 2010 +0000 - - rs740: follow macro-switch too - - Signed-off-by: Marek Olšák - -commit 842fa162e9d3bbad2bc44d3732bbc8e5a54402ea -Author: Alex Deucher -Date: Tue May 18 11:21:01 2010 -0400 - - dri2: use radeon_pick_best_crtc() - - It's already exposed and used by exa and Xv and has - the same functionality. radeon_covering_crtc() can - be dropped eventually. - -commit 64e6858aaf5d0e39ecc9f9804689012f3a38660a -Author: Alex Deucher -Date: Mon May 17 12:50:44 2010 -0400 - - r2xx exa: fix typo in 27c3326863deae36bc35e2c3b73fffd400208ff1 - - Signed-off-by: Alex Deucher - -commit 27c3326863deae36bc35e2c3b73fffd400208ff1 -Author: Alex Deucher -Date: Mon May 17 09:53:32 2010 -0400 - - r1xx/r2xx EXA: handle RepeatNone properly with transforms - - Fallback with unsupported ops like r3xx, r6xx. - - Should fix fdo bug 28142. - - Signed-off-by: Alex Deucher - -commit 30591320ec46e491ba20904cc64f3405b51c6505 -Author: Jerome Glisse -Date: Fri May 7 17:35:09 2010 +0200 - - kms: add support for the MSC swap & sync API - - This patch is mostly a port over of Intel ddx code for - MSC support. It needs a radeon KMS module with version - 2.4 which has the query for hw crtc id. - - Signed-off-by: Jesse Barnes - Signed-off-by: Jerome Glisse - -commit 766024dcc61c83490540910ce752f9bfe6dddba4 -Author: Marek Olšák -Date: Mon May 3 22:56:27 2010 +0200 - - r3xx-r5xx: fix texturing with small macrotiled pixmaps - - Pixmaps smaller than a macrotile cannot be used as textures because hardware - automatically switches to macro-linear and therefore sampled pixels are - messed up. This behavior is known as MACRO_SWITCH. - - The only sane workaround seems to be not using macrotiling for small pixmaps. - - The function RADEONMacroSwitch has been ported from r300g and implements - MACRO_SWITCH the same way it's implemented in hardware. It's been well tested - in r300g. - - This commit also fixes blit-based framebuffer reads, which are used for tiled - surfaces in r300g, when ColorTiling is enabled. - - Signed-off-by: Marek Olšák - -commit 6aedd57f6c2f08d0151a8bd1c5893d40d3db709a -Author: Alex Deucher -Date: Tue May 4 14:30:52 2010 -0400 - - radeon: fix pll_out_min default for pre-avivo - - Fixes fdo bug 27960 - -commit b2ecd1bb507ed4e0d9ba6ebd498c51da2e8136fa -Author: Michel Dänzer -Date: Fri Apr 23 18:28:22 2010 +0200 - - FB/MMIO_cnt should be ints, not pointers. - - Pointed out by compiler warnings. - - https://bugs.freedesktop.org/show_bug.cgi?id=27817 - -commit 1ad41054989f7c3edec373ccf09dceda6d7c94b4 -Author: Alex Deucher -Date: Thu Apr 22 16:48:21 2010 -0400 - - r3xx: fix gb pipe setup for SE cards - - Noticed by Tormod Volden - -commit 59e287d7c484b4addd4a06d013670577639c7ae2 -Author: Alex Deucher -Date: Thu Apr 22 02:05:40 2010 -0400 - - r3xx-r5xx: fix vertex units - - Noticed by Tormod Volden. - - RV3xx is 2, RV560,RV570 is 8 - -commit 2a6b409496f26da0436972b5feae6ea035dde08d -Author: Owain Ainsworth -Date: Mon Apr 19 14:37:33 2010 +0100 - - Reference count shared driver mappings. - - With MMIO it wasn't *such* a bit deal if we leaked the smallish mapping. - with FB it could be a larger deal. So instead of worrying about this, - reference count the mappings in the entity structure and unmap them when - no one cares anymore. - - Prompted by a discussion with airlied - - Signed-off-by: Dave Airlie - -commit 761f0de5556e46f166280476185977f720efe586 -Author: Owain G. Ainsworth -Date: Mon Apr 19 04:05:36 2010 +0100 - - Make consistent use of fbOffset and share fb mappings. - - What we were doing previously was mapping the framebuffer for zaphod for - only this driver instances chunk, however, fbOffset was (rightly) set to - the offset into the whole framebuffer we were using. - - Since in some cases we did operations on the FB virtual address + - fbOffset (for example zeroing the framebuffer on entervt) we were - actually pissing all over ourselves in those cases. - - Fix this by implementing shared fb mappings like we do for MMIO already, - and whenever we wish to refer to our area of FB space we always use - fbOffset. Fixes zaphod for some users on r600 chipsets, my 4870 is still - behaving strangely on screen 0, but I suspect that is another bug. - - Once calculation (in PreInitAccel) is now wrong because of this, however - dri on zaphod does now happen so this is irrelavent, add a comment to - that effect. - - Signed-off-by: Dave Airlie - -commit 2059d628c5fb03222a62502cc1b5724bf296a7b3 -Author: Owain G. Ainsworth -Date: Mon Apr 19 04:05:35 2010 +0100 - - Kill per-context SAREA support. - - It has never been used, and since the world is changing it almost - certainly never will be. Good riddance. - - Signed-off-by: Dave Airlie - -commit c4b46f56279cc18c8114235ca41cfb41ffede67f -Author: Owain G. Ainsworth -Date: Mon Apr 19 04:05:34 2010 +0100 - - Remove remnants of the ShowCache option. - - The rest of it died a long time ago. - - Signed-off-by: Dave Airlie - -commit 03b34c5fb12c4df180d4df113d2b654f6afd7230 -Author: Dave Airlie -Date: Mon Apr 19 17:58:07 2010 +1000 - - radeon: add FireMV 2400 pci id. - - From RH#581927 - thanks to Carsten Clasohm - - Signed-off-by: Dave Airlie - -commit 6c07816025f70e522986614c29c300ea13e5d932 -Author: Alex Deucher -Date: Fri Apr 16 18:50:17 2010 -0400 - - r5xx texvid: deal with large numbers of verts - - should fix fdo bug 25884 - -commit 5ee320a6b1b4c65fe592c8ac4d1981799242d59e -Author: Alex Deucher -Date: Fri Apr 16 18:42:56 2010 -0400 - - r3xx texvid: deal with large numbers of verts - - should fix fdo bug 25884 - -commit 47af3f4f266232517486238917d82fc5ca9c82e6 -Author: Alex Deucher -Date: Fri Apr 16 20:50:18 2010 -0400 - - r2xx texvid: deal with large numbers of verts - - should fix fdo bug 25884 - -commit 57577d5cd0641b7cad02242478699bcfece59227 -Author: Alex Deucher -Date: Fri Apr 16 20:40:56 2010 -0400 - - r1xx texvid: deal with large numbers of verts - - should fix fdo bug 25884 - -commit 31a888e78fa403f2bddacee098a29f36eaa969cb -Author: Alex Deucher -Date: Fri Apr 16 15:52:59 2010 -0400 - - r5xx textured video: split into prepare and draw functions - -commit f7ebe4a127965bb9e46d20c60331bcc4dab76fc5 -Author: Alex Deucher -Date: Fri Apr 16 15:46:24 2010 -0400 - - r3xx textured video: split into prepare and draw functions - -commit 10799b4ce0c18c5a7d92d688549e8e777344f111 -Author: Alex Deucher -Date: Fri Apr 16 15:38:49 2010 -0400 - - r2xx textured video: split into prepare and draw functions - -commit bd1cf42201a1f918080bf34786a6de327cb31b5f -Author: Alex Deucher -Date: Fri Apr 16 15:31:40 2010 -0400 - - r1xx textured video: split into prepare and draw functions - -commit c1136f94b80346065893f8a43c0fbf60c8c9b057 -Author: Alex Deucher -Date: Fri Apr 16 15:23:14 2010 -0400 - - Xv: track vtx_count, is_planar in port priv - -commit 2f680b631357661511456f07b7b4ba1aa2cbf30c -Author: Alex Deucher -Date: Fri Apr 16 13:43:41 2010 -0400 - - radeon/kms: fix possible crtc mask for evergreen - -commit 4656f5dff1ed72fa2c7a1484305f2aef7b65ff2b -Author: Alex Deucher -Date: Fri Apr 16 13:36:25 2010 -0400 - - radeon/kms: fix crash when using more than two heads - - fixes fdo bug 27692 - -commit a69e749d0562887af6bd236c38802472e54640c4 -Author: Dave Airlie -Date: Fri Apr 16 13:58:54 2010 +1000 - - kms: add uevent support. - - When we get a hotplug event from the kernel we should notify the client side to reconfigure displays. - - based on work by ajax in intel driver. - - Signed-off-by: Dave Airlie - -commit 22a46dddd375b2b9399e12fdf168fa5292ff17a4 -Author: Alex Deucher -Date: Tue Apr 13 11:08:59 2010 -0400 - - radeon: add support for pll algo selection - - tv-out on atom systems is very particular about it's - dividers. force it to use the old algo. - - Should fix fdo bug 27593. - -commit c1b817c45477c21234abaaebe78feb7ea4fd92b1 -Author: Alex Deucher -Date: Mon Apr 12 16:32:04 2010 -0400 - - atom: disable TV encoder when VGA is in use - - Switching between TV and VGA caused problems on some - systems since the TV encoder was left enabled. - - Should fix fdo bug 25520. - -commit 878814aeab7031ff6169fcaf2be869b7595c8699 -Author: Alex Deucher -Date: Mon Apr 12 11:16:14 2010 -0400 - - Xv overlay: set scalerwidth to 1920 on r3xx/r4xx chips - - reported on phoronix forums. - -commit 276fe739f1caa95778213054375a65288b80f320 -Author: Alex Deucher -Date: Fri Apr 9 20:03:09 2010 -0400 - - radeon: add some new pci ids - -commit eb5665688ef9b52f03f61546351d0848cab54740 -Author: Alex Deucher -Date: Thu Apr 8 00:31:52 2010 -0400 - - radeon: don't setup Xv on rn50 - - It has no overlay or 3D engine. - - fixes fdo bug 27528 - -commit 3c6c6afcbfc6f2c582e13a7c37fe2014b0875b22 -Author: Alex Deucher -Date: Mon Apr 5 12:12:56 2010 -0400 - - change version post release - -commit fb7911912e60b2cdbc2152b96847775b767ca3ef -Author: Alex Deucher -Date: Mon Apr 5 11:59:24 2010 -0400 - - bump version for release - -commit 476a1c6e8b42807b897b8c6f8550ec42b2d5c10e -Author: Alex Deucher -Date: Thu Apr 1 12:42:56 2010 -0400 - - radeon: fix possible gpio i2c table overrun - - GPIO_I2C_INFO does not always have ATOM_MAX_SUPPORTED_DEVICE - entries. Should fix Novell bug 589022. - -commit 6baa96c44ca93b88acf5233335cee233e59d5af4 -Author: Dave Airlie -Date: Thu Apr 1 11:24:32 2010 +1000 - - r600/exa: further cleanup, use the object struct in the accel state. - - This cleans up the accel state objects as well. - - Signed-off-by: Dave Airlie - -commit 87f49a24019967552c5478d6af89ba438b4261c8 -Author: Dave Airlie -Date: Thu Apr 1 10:52:58 2010 +1000 - - r600: cleanup wasteful variables. - - Just assign directly to the structs. - - Signed-off-by: Dave Airlie - -commit 478319e55d52fce241d040912fea952071e3b742 -Author: Dave Airlie -Date: Thu Apr 1 10:45:52 2010 +1000 - - r600: reduce function call overhead. - - Create a small accel object that can be used to reduce the amount - of parameters passed to SetAccelState. This can be cleaned up a lot more. - - Signed-off-by: Dave Airlie - -commit bc93395b3eb5e3511c1b62af90693269f4fa6e13 -Author: Alex Deucher -Date: Wed Mar 31 22:30:24 2010 -0400 - - r6xx+ EXA: fix swapped domains in kms UTS - - Noticed by Dave. - - Should fix fdo bug 27284 - -commit 3a33b1a92c328b690bdc1aafa0011e4326109815 -Author: Owain G. Ainsworth -Date: Tue Mar 30 17:14:02 2010 +0100 - - Add support for MacModel autodetection on OpenBSD. - - This allows radeon-equipped macs to work without an xorg.conf on openbsd. - Patch originally written by Mark Kettenis (kettenis@openbsd.org) - -commit c7eeda8c3f3514ba95ebf2893fbe124bf526b3df -Author: Alex Deucher -Date: Fri Mar 26 01:38:36 2010 -0400 - - radeon: add support eDP connectors with and LCD device tag - - should fix fdo bug 27322 - -commit ff323e11485fa5030ac278c836bf80a535c22249 -Author: Alex Deucher -Date: Fri Mar 26 01:24:16 2010 -0400 - - radeon: fix name string for eDP - -commit 53ac06161eb2b8cffb1b88e24a9a21cfd12e5883 -Author: Alex Deucher -Date: Tue Mar 23 13:34:38 2010 -0400 - - r6xx+ EXA/Xv: add a R600SetAccelState function - - This moves CS bo checking and alignment checks into - a central location. It also cleans up the code. - -commit 7a044472dfea7cf05ba4c2b87be30e94e2ae0b62 -Author: Alex Deucher -Date: Tue Mar 23 01:27:22 2010 -0400 - - r6xx+ EXA: always use a temp surface for overlapping copies - - The scanline based fallback code was complex and added a lot of - overhead. It also didn't work with kms. - -commit d33bddaedae81126ab7f0023af1c6443bb0b4c4f -Author: Alex Deucher -Date: Mon Mar 22 18:15:23 2010 -0400 - - r6xx+ EXA: always use the accel_state state in DoPrepareCopy - -commit dda3f5a99e7a2dc5d57860f4d07df3498e1e21df -Author: Alex Deucher -Date: Mon Mar 22 18:05:36 2010 -0400 - - r6xx EXA/Xv: track src/dst domains - - Much of the code is shared, so track the src/dst - domains so we make sure the uses consistent domains - for each bo. - -commit 5c256808cb5fea955eea96ffe9196473715156aa -Author: Alex Deucher -Date: Wed Mar 17 23:47:50 2010 -0400 - - XAA: disable render accel - - It's been reported broken for a while. Should fix - fdo bug 27151, others. - -commit a0683be5cc082bdbdd3bc4e9b52f39f423650946 -Author: Dave Airlie -Date: Thu Mar 18 12:36:25 2010 +1000 - - radeon: avoid using DRI1 init path on DRI2 driver. - - I was playing with multi-seat and found this code, fixed - it up to be sane and more DRI2 like. - - Signed-off-by: Dave Airlie - -commit 080a5414593e9b59ed923f26aa6057747b0c868f -Author: Alex Deucher -Date: Tue Mar 16 12:33:39 2010 -0400 - - kms: fix ums naming compat for DisplayPort - -commit 819b4015349b5d8c5ffa5f979097599774fce5bb -Author: Alex Deucher -Date: Mon Mar 15 13:47:29 2010 -0400 - - dump version for rc release - -commit d3482a947e3731be4ed0b00b4e3079470700dc4c -Author: Michael Cree -Date: Fri Mar 12 22:23:31 2010 +1300 - - Fix some word accesses in AtomBios to work on all architectures. - - The UINT16LE_TO_CPU(), etc., macros are used in the AtomBios code to - fix up endian issues but they do not address bad alignment or assist - architectures that cannot perform hardware byte or word accesses. - This patch inserts use of the ldw_u(), etc., interface of the Xserver - into certain AtomBios accesses to address alignment issues. - - This resolves Debian bug 572311, namely that the driver when compiled - for generic Alpha architecture (i.e. doesn't use the byte-word extension) - resulted in no display output on certain Radeon cards. - - Signed-off-by: Michael Cree - -commit 488c9fd8300505cc6c0c2f8f0f00849f27cc5d63 -Author: Alex Deucher -Date: Mon Mar 15 12:25:57 2010 -0400 - - r6xx/r7xx: fix domain handling in accel code - - Noticed by Pauli and Michel on IRC. - - Improves GetImage performace by a factor of ~10. - -commit 2ace2591d92fb6d3ce7a6453edb04b36a6c49a32 -Author: Alex Deucher -Date: Mon Mar 15 12:03:58 2010 -0400 - - radeon: remove some leftover debugging output - -commit 67e81c8f17ddde6eba633d2a5aef528e1d598d89 -Author: Andrzej Hajda -Date: Wed Mar 10 18:19:35 2010 -0500 - - radeon: add support for pal on legacy IGP chips - - Based on my initial non-working patch. - - Fixes some element of fdo bug 12007 - -commit 3a44f1cb0d2bb748692b1024003de8ee88ca77a5 -Author: Alex Deucher -Date: Tue Mar 9 09:44:01 2010 -0500 - - atom: i2c gpio fixes - - Basically a port of my kms patch. This allows us - to remove some quirks. - -commit d85cb40f516c67305e818302bec7ee817df4144c -Author: Matt Turner -Date: Sun Mar 7 14:24:35 2010 -0500 - - Don't check for Xinerama. - - It doesn't seem to be used anywhere, so don't require it. - - CC: Jerome Glisse - CC: Alex Deucher - CC: Dave Airlie - Signed-off-by: Matt Turner - -commit e7b41f8cb082ed462d29bf3fc440072424cbd852 -Author: Alex Deucher -Date: Fri Mar 5 19:16:11 2010 -0500 - - radeon: disable frac fb div with new pll code - - fixes fdo bug 26897 - -commit 14aff767490c253cbcdd411f812e50b91673119e -Author: Alex Deucher -Date: Wed Mar 3 13:31:19 2010 -0500 - - radeon: add new RS880 pci id - -commit e6dc886634b38e4a36af7b5f0b23299d5acd7244 -Author: Dave Airlie -Date: Tue Mar 2 10:25:15 2010 +1000 - - radeon: bump configure.ac - -commit 4975658f05c387b39b3e96a292a7683f17645c2c -Author: Dave Airlie -Date: Sat Feb 27 16:47:19 2010 +1000 - - pciids: hopefully fix HP - -commit e76b90b399c3cc0f0998c0209300c46f97505498 -Author: Alex Deucher -Date: Fri Feb 26 15:01:28 2010 -0500 - - rv740: disable dfs workaround for drm 1.32+ - - rv740 pipe setup was fixed in 2.6.33 - -commit 2de0af5f5b806f9dbfdb1e9b6a5cf96d9433961d -Author: Matt Turner -Date: Wed Feb 24 22:46:28 2010 -0500 - - Use RADEON_ALIGN instead of open coding it. - - Also fix some RADEON_ALIGN(x, 63), which would return incorrect results - for odd x. Though this shouldn't happen, it's still not right. You - wouldn't ever write (x + 62) & ~62 which is clearly wrong (and what it - expands to). - - CC: Jerome Glisse - CC: Alex Deucher - CC: Dave Airlie - Signed-off-by: Matt Turner - -commit c7e81d2f3a372e0d5f751dd0c5091aec2b56d936 -Author: Matt Turner -Date: Wed Feb 24 22:46:27 2010 -0500 - - Use/define RADEON_GPU_PAGE_SIZE instead of sprinkling 4096 everywhere. - - Also, define RADEON_BUFFER_ALIGN in terms of it, and replace some - RADEON_ALIGN(x, RADEON_BUFFER_ALIGN) with RADEON_ALIGN(x, - RADEON_GPU_PAGE_SIZE) since this is really what was intended. - - CC: Jerome Glisse - CC: Alex Deucher - CC: Dave Airlie - Signed-off-by: Matt Turner - -commit c0a5c9403dff254e1669df606a4193794270aeff -Author: Dave Airlie -Date: Fri Feb 26 19:17:28 2010 +1000 - - pci: add HP vendor id - -commit 3970cc5563900f08ba5236b23f765c926616c345 -Author: Cooper Yuan -Date: Fri Feb 26 16:14:12 2010 +0800 - - add more triple-head server ID - -commit b499eee7506f7478649e0000e9f8fcd00ac9d88d -Author: James Le Cuirot -Date: Thu Feb 25 21:13:18 2010 -0500 - - clean up kms zaphod handling - - Taken from James patch on bug 24523 - - agd5f: adapt to the current code - -commit 433c8617341f5768255826435a2b09afba684f02 -Author: Alex Deucher -Date: Thu Feb 25 21:03:13 2010 -0500 - - update ZaphodHeads option - - Now that the screen section mapping is fixed, - Make the option per-instance and allow multiple - outputs to be specified; e.g., DVI-0 and HDMI-0 - associated with instance 0 and LVDS and VGA-0 - associated with instance 1. - -commit f3e20b01c77f02bdf3483ceee27a1f00d240c33d -Author: James Le Cuirot -Date: Thu Feb 25 19:10:19 2010 -0500 - - zaphod: Fix entity instance assignment. - - Each screen needs to have a pointer back to its - device's entity instance, Currently Screen1 is - pointing to Screen0's instance so when it comes - to match up the screen sections with the detected - screens, Screen0 gets chosen in both cases. - - See bug 24523 - -commit 1b7e9a2e50f77819b3aff4e37ba39eaec69ff932 -Author: Alex Deucher -Date: Tue Feb 23 11:39:55 2010 -0500 - - radeon: fixes for zaphodheads option - - Needed for systems with more than two outputs. - Both KMS and non-KMS zaphod work on systems with - more than two outputs now. - -commit bd83e5f1c75b8c00b43846c7225568917fc9a8ce -Author: Dave Airlie -Date: Tue Feb 23 19:27:24 2010 +1000 - - zaphod: hopefully fix kms + zaphod - -commit 0c3468d812e3790ce03d9e76779ae81e7b7b82d5 -Author: Alex Deucher -Date: Mon Feb 22 17:34:51 2010 -0500 - - AVIVO: set frac fb divider pll flag - - matches previous behavior - -commit 212e152536c4325e6799018891d9aee132681f48 -Author: Alex Deucher -Date: Mon Feb 22 17:27:24 2010 -0500 - - radeon: update new pll algo - - - add support for pre-avivo chips - - add support for fixed post/ref dividers - - add support for non-fractional fb dividers - - By default avivo chips use the new algo and - pre-avivo chips use the old algo. Use the - "NewPLL" option to toggle between them (set to - TRUE for the new algo, FALSE for the old). - -commit e68d3a3890fc81c51f2006b5548da1e8756ad2fd -Author: Alex Deucher -Date: Thu Feb 18 14:02:00 2010 -0500 - - RS600: add connector quirk - - System lists DVI port as HDMI. - - fixes fdo bug 26605 - -commit a3b730eceb522c7ac1ef3dd6f6c7d773118d03f7 -Author: Jerome Glisse -Date: Thu Feb 18 14:13:48 2010 +0100 - - r6xx/kms: when reseting BO force default state emission - - In KMS world each cs need to fully initialize the 3D engine - when we were erasing cs in IBDiscard for r6xx we weren't - forcing reemission of default state. This patch force this - emission. Fix : - - http://bugs.freedesktop.org/show_bug.cgi?id=26603 - http://bugzilla.kernel.org/show_bug.cgi?id=15284 - -commit 579cdcf9b4e38c791a497b747a055fc0a07d8dd6 -Author: Alex Deucher -Date: Wed Feb 17 12:22:48 2010 -0500 - - radeon: add ZaphodHeads option - - Allows users that want to use zaphod mode to select - which xrandr outputs are assigned to which head. E.g., - - Option "ZaphodHeads" "LVDS,VGA-0" - will assign LVDS to the first zaphod driver instance - and VGA-0 to the second instance. - -commit 47136fa347d1756523239746b4c74cd5278a1118 -Author: Michel Dänzer -Date: Mon Feb 15 16:44:39 2010 +0100 - - EXA: Fix order of coordinates passed to radeon_pick_best_crtc(). - - The wrong order prevented tearing avoidance from working with EXA/DRI2. - -commit 6e95905f759b844373be62ec513c78153ed00222 -Author: Michel Dänzer -Date: Mon Feb 15 17:02:16 2010 +0100 - - Allocate BOs for 'video offscreen surfaces' and 'TV-in' in VRAM. - - I think these can only really work in VRAM, though right now there's probably - nothing to prevent them from getting evicted... - -commit 78e7047c5235b09858b66dd3688d39aaa27d7589 -Author: Pauli Nieminen -Date: Mon Feb 15 13:40:37 2010 +0200 - - Allocate Xv buffers to GTT. - - KMS doesn't have acceleration for upload to vram. memcpy/memmove to VRAM - directly is very slow (40M/s in benchmark) which causes visible problems - to video. - - Allocating video buffer in GTT will give good performance (350-450M/s) - for memmove operation. This is nice performance boost for Xv under KMS. - - Signed-off-by: Pauli Nieminen - -commit 3ec25e59854b6b03ad763bc374d3475a50f562d8 -Author: Pauli Nieminen -Date: Mon Feb 15 13:45:28 2010 +0200 - - Use memcpy instead of memove for RADEONSwapCopy. - - memcpy has about 25% better performance than memmove when - destination is GTT (wc caching). Changing memmove to memcpy - in SwapCopy will reduce CPU time spent moving data between - host and GPU. - - memcpy will specially help Xv when playing high resolution - videos. - - The swap path doesn't support overlapping memory copies either - so extra safety is not worth the performance hit in commonly - used code path. - - Signed-off-by: Pauli Nieminen - - [ Michel Dänzer: Fixed up whitespace ] - -commit 221ef11b31756deb7134801730e76c040e841f5c -Author: Alex Deucher -Date: Fri Feb 12 14:15:10 2010 -0500 - - r6xx/r7xx: implement EXA vline support - -commit 8ad4025affe1fb2f417e3a3031d74f83be5df253 -Author: Alex Deucher -Date: Fri Feb 12 11:34:47 2010 -0500 - - radeon: consolidate crtc selector for vline wait - - Use the Xv version as it takes into account the area - covered by the op rather than just picking the largest - crtc area. - -commit 4f9d1714a7382594b834d446bbe502663f6a2778 -Author: Alex Deucher -Date: Fri Feb 5 12:27:51 2010 -0500 - - r500: fix relocs for Xv planar video - - fixes fdo bug 26445 - -commit b7ca1ab11ac0e4e4be5a1e7789ae8633b460a2d4 -Author: Dave Airlie -Date: Fri Feb 5 13:37:20 2010 +1000 - - rs400/rs480: mc idle bit is bit 2 like original radeon - - backport from a KMS fix, the rs400/480 mc idle is bit 2 not bit 4. - - Signed-off-by: Dave Airlie - -commit 97c387e269672b146a95b45fbef5c8c18e473e36 -Author: Gaetan Nadon -Date: Fri Jan 29 16:08:17 2010 -0500 - - config: remove dead LINUXDOC macro usage - - This module does not generate LINUXDOC documentation. - - Signed-off-by: Gaetan Nadon - -commit 05fa2dee0c63d56fd523ee1ebab479bcb9f5e89d -Author: Alex Deucher -Date: Thu Feb 4 13:13:58 2010 -0500 - - evergreen: minor clean up in transmitter setup - - both link and encoder must be set for linkb - -commit 76eea5e02776f7beeb8f4491a374bd36792eda92 -Author: Alex Deucher -Date: Thu Feb 4 10:52:14 2010 -0500 - - r600: reduce number of cache flushes - - We don't need to flush so often. Next step - would be to move the flushing to the drm and only - flush after each command buffer rather than each - draw. - -commit 8d63d70f7ebaf9d250f0449d3720ef47516c05df -Author: Alex Deucher -Date: Wed Feb 3 15:22:22 2010 -0500 - - evergreen: use external clock source for DP PHY - - DP CRTC clock always comes from DCPLL. This frees - up PPll1/2 for non-DP-mode PHYs and CRTCs - -commit ecbc26431914216a8b207e81451282ea07c8b92f -Author: Alex Deucher -Date: Wed Feb 3 03:52:07 2010 -0500 - - evergreen: blank/unblank DP in dpms calls - -commit 710a2fd07235349f084ec40626cc28fbae523d27 -Author: Alex Deucher -Date: Wed Feb 3 03:00:24 2010 -0500 - - evergreen: pll fixes - - SetPixelClock needs to be called for DP outputs with a - valid PLL. - -commit 9ab2377ee23c5dc360ba135a77aa6b181a1862e6 -Author: Alex Deucher -Date: Tue Feb 2 15:15:36 2010 -0500 - - evergreen: DP requires coherent mode - -commit 634da80056525a48ec17ffb81e2fb59b168bea9e -Author: Alex Deucher -Date: Tue Feb 2 15:09:57 2010 -0500 - - evergreen: fix units on frac_fb_div - -commit a887818f491f6c7315c56c4e0d0b702c4c6aa4ac -Author: Alex Deucher -Date: Mon Feb 1 11:01:47 2010 -0500 - - evergreen: add pci ids - -commit cb2772b69480268c059766c4f6b209ce590ede0e -Author: Alex Deucher -Date: Fri Jan 29 12:59:46 2010 -0500 - - evergreen: add atombios crtc/pll functions - -commit bd8e04cb7b39f38b6958273582a9b324a9f0759a -Author: Alex Deucher -Date: Mon Feb 1 10:07:43 2010 -0500 - - evergreen: add atom support for digital outputs - - analog is already supported by the existing code. - -commit 8ad40d3c32ad5b91725bd37fcade6bed504df421 -Author: Alex Deucher -Date: Tue Jan 26 15:39:44 2010 -0500 - - evergreen: add crtc set base/format support - -commit 2c9cf0a07ff9e5a4989861bc2fdfd71d841013a8 -Author: Alex Deucher -Date: Thu Dec 10 15:29:14 2009 -0500 - - evergreen: add lut support - -commit 65246545c3dd9bfef73e8a0f200bd5909b89a167 -Author: Alex Deucher -Date: Tue Jan 26 12:10:02 2010 -0500 - - evergreen: add hw cursor support - -commit c05cad56b69d239fa2e69905d15f4f08b9db4c55 -Author: Alex Deucher -Date: Thu Jan 28 01:28:52 2010 -0500 - - evergreen: add base asic support - -commit ed63e1b1abe8810b5da6b4140892337eef08a9ea -Author: Alex Deucher -Date: Fri Jan 29 12:42:33 2010 -0500 - - evergreen: add register and utility defines - -commit 019260ec4a9f9fbf2ac63a2ca3314aa308471f7e -Author: Alex Deucher -Date: Thu Dec 10 14:57:39 2009 -0500 - - evergreen: add chip enums - -commit e86ae564d8b94d2cc8d3c7cceb452a197ab6387a -Author: Alex Deucher -Date: Mon Feb 1 12:03:23 2010 -0500 - - atom: update to the latest upstream atombios.h changes - -commit 77b13a02c70842a58e0590d0243f0ae016c5a640 -Author: Alex Deucher -Date: Mon Feb 1 12:16:20 2010 -0500 - - r500: fix CS section size missmatch in Xv code - -commit 5c11264517d1b9808415d47e9dedc345610f0f86 -Author: Dave Airlie -Date: Fri Jan 29 15:10:33 2010 +1000 - - radeon: further digital encoder cleanups. - - this just cleans up a few more bits of the digital encoder setup. - - Signed-off-by: Dave Airlie - -commit 872a11fa9efb0b76cef83089ea1bb80792b94930 -Author: Alex Deucher -Date: Thu Jan 28 01:19:23 2010 -0500 - - radeon: clean up dig encoder handling - - - switch the var name to dig_encoder - - quiet coherent messages - - clean up dig encoder selection - - Signed-off-by: Alex Deucher - -commit c1a73ff51b371ecc6f57a81a33f644344b4e3f70 -Author: Dave Airlie -Date: Thu Jan 28 12:58:29 2010 +1000 - - radeon: add support for picking the digitial encoder - - Testing on a W500 laptop found the LVDS + DisplayPort would conflict - over the choice of digital encoder, and only one would work. - - This patch fixes the DCE3 case where LVTMA requires the second digital - encoder and lets DP/DVI use the first in most cases. - - Signed-off-by: Dave Airlie - -commit 95b56275d80dcee48a7927df124602c34cd72235 -Author: Alex Deucher -Date: Wed Jan 27 15:48:25 2010 -0500 - - avivo: add some hotplug detect regs - -commit 5a4327f7784361933484895c9af751ccfa242d48 -Author: Alex Deucher -Date: Tue Jan 26 16:06:00 2010 -0500 - - radeon: minor pll updates - - add new fixed post divider option - -commit cbd642af7c76469d701471daea0c8d167567ccf8 -Author: Alex Deucher -Date: Tue Jan 26 12:03:45 2010 -0500 - - radeon: use mmio bar size rather than hardcoded number for register ops - - newer asics have larger mmio bars - -commit e5933fd74923a07aa401bdb4ecd8d1d641148440 -Author: Alex Deucher -Date: Mon Jan 25 13:18:47 2010 -0500 - - KMS: fix no accel option - - NO_ACCEL wasn't handled correctly with KMS. - - fixes fdo bug 26198 - -commit ba99a82ced1a6101365876723d22bcfec4607537 -Author: Dave Airlie -Date: Mon Jan 25 13:50:13 2010 +1000 - - radeon/kms: only enable EXA pixmaps under kms if we support render accel - - I've seen RN50s with 64MB of RAM that are slow as molasses, this - should fix them. - - RH bug 556400 - - Signed-off-by: Dave Airlie - -commit de40d36264364434541377c7f65f3836dc514fc0 -Author: Kusanagi Kouichi -Date: Fri Jan 22 17:18:51 2010 +0900 - - Remove unnecessary checks. - - Signed-off-by: Kusanagi Kouichi - -commit 30a19b75cc82b8e04c45e6684b84f9a4ccc0505b -Author: Alan Coopersmith -Date: Tue Jan 19 14:54:04 2010 -0800 - - Fix configure with --disable-dri - - AM_CONDITIONAL calls can't be made inside if statements, since - automake won't know what to do when the if isn't true. - - Signed-off-by: Alan Coopersmith - -commit bd011784c0609f1fd03dcb784744c8f5cdef33da -Author: Alex Deucher -Date: Tue Jan 19 11:59:38 2010 -0500 - - ATOM: Upstream parser updates - -commit 95d63e408cc88b6934bec84a0b1ef94dfe8bee7b -Author: Jerome Glisse -Date: Mon Jan 18 10:46:50 2010 +0100 - - r6xx/r7xx: emit relocation for FRAG & TILE buffer - - FRAG & TILE buffer are unused but still they need - to be associated with a valid relocation so that - userspace can't try to abuse them to overwritte - GART and then try to write anywhere in system - memory. - -commit bbaf71fb46e3e0acdadcb91e9b1c73396bd9aa8e -Author: Alan Coopersmith -Date: Fri Jan 15 15:09:27 2010 -0800 - - Update Sun license notices to current X.Org standard form - - Signed-off-by: Alan Coopersmith - -commit 3d158716a60d5a113a541ea2f680b81a1be41ad2 -Author: Dave Airlie -Date: Thu Jan 14 11:21:33 2010 +1000 - - displayport: fix DDC on DVI->DP convertors. - - Seems we have to not do auxch DDC if we aren't talking to a DP - sink. - -commit 6a363f68415d37c302151581f2a86855dba39b67 -Author: Alex Deucher -Date: Mon Jan 11 15:13:45 2010 -0500 - - rv100: fix typo in fix for bug 25992 - - Noticed by Maarten Maathuis. - -commit 7b01e1ee29f681bf1735ecded6445d12beeb52d8 -Author: Alex Deucher -Date: Mon Jan 11 12:40:06 2010 -0500 - - rv100: reject modes >135 Mhz with DVI - - Due to heat issues. fixes bug 25992 - - Signed-off-by: Alex Deucher - -commit 74da9a66a420a40bb5d562f07e97ce6ac2eb010f -Author: Alex Deucher -Date: Fri Jan 8 16:51:43 2010 -0500 - - radeon/kms: add new strings for eDP and TV - -commit 61977f61f516b54d1fd9df34d0f0892fbf5227d7 -Author: Alex Deucher -Date: Thu Jan 7 02:15:31 2010 -0500 - - radeon: fallback to i2c for edid if aux fails - - In case of a DP->DVI adapter for example. - -commit 958d073869404f60e56dc0cc70b3e7de85904694 -Author: Alex Deucher -Date: Thu Jan 7 02:12:00 2010 -0500 - - radeon: add initial support for eDP (embedded DisplayPort) - - Should fix fdo bug 25931 - -commit 944ae73f7cd5f9a1622b38e06a58565812cb102f -Author: Alex Deucher -Date: Thu Jan 7 01:52:35 2010 -0500 - - radeon: updated ObjectID.h - -commit 48aa5064aff4b9adf768e480df2312d4375e9c40 -Author: Alex Deucher -Date: Mon Jan 4 11:05:44 2010 -0500 - - radeon: fix LVDS power sequence on Mac cards - - Noticed by John R. Dunning. Fix taken from radeonfb. - - I'm not sure if this sequence would be useful on any PC - laptops or not so make it mac specific for now. - -commit 36bd69affc996c92c40b7360a7fbaa1a3a46abfd -Author: Gaetan Nadon -Date: Wed Dec 16 15:52:18 2009 -0500 - - configure.ac: remove unused sdkdir=$(pkg-config...) statement - - The sdkdir variable isn't use, so remove the statement. - - Acked-by: Dan Nicholson - - Signed-off-by: Gaetan Nadon - -commit 9d0f3af7278dc939fd4e6f3ea69d9f488a9fbed7 -Author: Alex Deucher -Date: Tue Dec 22 08:45:27 2009 -0500 - - radeon: add cvt timing if we only have panel w/h - - fixes mac laptops without an edid - - Signed-off-by: Alex Deucher - -commit 6e1f5553c6d7e3b5d089af2e3d587efe95936855 -Author: Alex Deucher -Date: Mon Dec 21 17:32:40 2009 -0500 - - ATOM: add new power table defs - -commit 4b05c47ac657f9a93d76221269761ed64c81f716 -Author: Dave Airlie -Date: Thu Dec 17 14:30:23 2009 +1000 - - radeon: use new libdrm api - -commit 1d620800bd79290967fa487decf798e318c45f25 -Author: Ingmar Vanhassel -Date: Sun Dec 20 21:04:56 2009 +0100 - - Replace shave with automake silent-rules - - Which are enabled by default in Xorg's util-macros 1.3 if automake-1.11 - is used. - - Signed-off-by: Ingmar Vanhassel - -commit 52f6a2ff682ad1f8e26ef1cd7d380493dcd57752 -Author: Gaetan Nadon -Date: Wed Dec 16 15:29:53 2009 -0500 - - src/Makefile.am: missing 3 header files in tarball - - radeon_dummy_bufmgr.h - radeon_vbo.h - simple_list.h - Replace leading spaces with tab for radeon_atomwrapper.h - - Signed-off-by: Gaetan Nadon - -commit 3a30210d50b27f8772fc5045133940246764fce9 -Author: Matthias Hopf -Date: Tue Dec 15 10:53:48 2009 -0500 - - fix 200M freezes on VT switch if CRTC is disabled - - It appears that RS4xx chips need to have the crtc - enabled when the timing is programmed. - - agd5f: minor fixes/cleanup of the original patch - -commit 299d395bd3f294239dee58ab7d607d7d2c657f61 -Author: Corbin Simpson -Date: Sun Dec 13 14:51:17 2009 -0800 - - dri: be more useful if disabling DRI due to KMS/UMS mismatch. - - It's only fair. - - Compile-tested only. - - Signed-off-by: Dave Airlie - -commit 0e5c9d87b5d7e0751df71cc8958ca5ccaed25104 -Author: Alex Deucher -Date: Thu Dec 10 14:27:43 2009 -0500 - - ATOM: split set base/format into separate functions - - Signed-off-by: Alex Deucher - -commit 46630da5fd6f45bb8ea150b870162997480d69c7 -Author: Alex Deucher -Date: Wed Dec 9 12:55:25 2009 -0500 - - AVIVO: add new PLL code - - This should hopefully help the problems with flickering - and blinking monitors reported on some systems. If there - are problems, the old PLL algorithm can be selected with: - Option "NewPLL" "FALSE" - in the device section of your X config. - - Signed-off-by: Alex Deucher - -commit f082b1693d6f7f763ccf5a8436a89890ca2c6129 -Author: Matthijs Kooijman -Date: Thu Dec 3 12:10:14 2009 -0500 - - radeon: fix crtc2 dpms - - noticed by Matthijs Kooijman on fdo bug 22140 - -commit 3a96fbf3b84522cf1ba1b176e82b662222331c14 -Author: Alex Deucher -Date: Wed Dec 2 18:02:33 2009 -0500 - - radeon: only read RADEON_PPLL_REF_DIV for ref div on pre-avivo - - Signed-off-by: Alex Deucher - -commit f03450796d2e9247a1228c4e2abb1dfad7aecddf -Author: Kusanagi Kouichi -Date: Wed Dec 2 01:36:37 2009 -0500 - - radeon: Lift hardcoded limit from RADEONQueryImageAttributes - - The dimension of an XvImage is limited to 2048 x 2048 even if an adaptor - supports larger image. - XvCreateImage and XvShmCreateImage lower the width or height of an image. - XvPutImage and XvShmPutImage return BadValue. - The cause is that 2048 is hardcoded in RADEONQueryImageAttributes. - -commit efbc2c80ab02879edf3b7b3d65b16c45ddce5017 -Merge: 88a50a3 a612813 -Author: Dave Airlie -Date: Wed Dec 2 14:30:36 2009 +1000 - - Merge remote branch 'origin/displayport' - -commit 88a50a30df11a06263209340a42251851f8e2334 -Author: Dave Airlie -Date: Mon Nov 30 15:32:12 2009 +1000 - - r600: fix multi-operation in single batch support. - - This ports the mesa DMA buffer handling with the 3 lists, - - Signed-off-by: Dave Airlie - -commit b2597deea3a3953ff50d54ff37e3c043eac409f4 -Author: Kusanagi Kouichi -Date: Mon Nov 30 11:10:50 2009 -0500 - - R600: fix some warnings - -commit 4d90dc3cb248e9d61c0c490bba80f6727fafd318 -Author: Alex Deucher -Date: Mon Nov 30 11:05:38 2009 -0500 - - atom: pull misc mode info for lvds panel mode from bios tables - - sync polarity, etc. This will likely fix LVDS problems - on some laptops. - - Signed-off-by: Alex Deucher - -commit a612813c5f329f00a9271e7bb69abd2630a49403 -Author: Alex Deucher -Date: Fri Nov 27 17:20:30 2009 -0500 - - radeon: clean up DP code - - Signed-off-by: Alex Deucher - -commit a8dbf7c23481501987971a9c0b6cb0760f86127f -Author: Dave Airlie -Date: Fri Nov 27 10:16:00 2009 +1000 - - r600/accel: cleanup and merge a lot of the accel functions - - All of the drawing ops were the exact same modulo the vtx size, - this along with the vertex buffer wrapping code could all be consolidated - into a smaller set of functions. - - This also adds 2 VBO which we switch between, and merges a #define to - enable the multiple operations in one CS under KMS mode. - - Multi-operation still isn't working though. - - Signed-off-by: Dave Airlie - -commit 971e463b2cfdc1ba1c78a24fb439d33dd9155dfc -Author: Alex Deucher -Date: Thu Nov 26 12:45:15 2009 -0500 - - dce3: CV1/TV1OutputControl tables didn't go away until dce3.2 - - Signed-off-by: Alex Deucher - -commit 95385f0906f371a1ed6e60eb3e597e699c7a3222 -Author: Jerome Glisse -Date: Thu Nov 26 12:21:21 2009 +0100 - - kms: Fix resizing when acceleration is disabled - - When acceleration is disabled we need to reallocate - a new shadow framebuffer and we should also avoid - calling any EXA function as EXA is disabled in such - case. - -commit 8195385d3cedf70d89ca576371af6bca5045bbd2 -Author: Dave Airlie -Date: Thu Nov 26 15:43:54 2009 +1000 - - dce3: no CV1 or TV1 Output Control tables anymore. - - According to the DCE3 docs we should only use DAC1/2 not - CV1/TV OutputControl, also my rv730 bios doesn't have any - CV1/TV tables. - - Signed-off-by: Dave Airlie - -commit 381b14d5422131ea8ff942ab06a328f6beca0d3f -Author: Dave Airlie -Date: Thu Nov 26 15:28:15 2009 +1000 - - atombios: CV mode retrival was broken. - - a) crev and frev are reversed - b) my rv730 bios only has one mode in it, so - bounds check the table size. - -commit a67a13c315a9235be052662e2a3270686cccc0f0 -Author: Dave Airlie -Date: Thu Nov 26 13:41:36 2009 +1000 - - radeon: fix typo in unused as of yet CV code - -commit cd9bfb5892eebef6dff14ac414dff074db5ddee4 -Author: Dave Airlie -Date: Thu Nov 26 06:43:13 2009 +1000 - - fixes displayport for me here - -commit 256de862a3c017dcb4ed0d8689294a552eda0d18 -Author: Dave Airlie -Date: Thu Nov 26 06:35:39 2009 +1000 - - displayport: cleanup call dp from dpms on instead. - -commit 05551295c5e0946745163f17e5c1d3d41b94bcbf -Author: Kristian Høgsberg -Date: Tue Nov 24 21:09:03 2009 -0500 - - dri2: Use drmGetDeviceNameFromFd() instead of open coded loop. - -commit 0061c4db1d3aecdca13efb5133ab8784dc37df95 -Author: Dave Airlie -Date: Wed Nov 25 15:39:10 2009 +1000 - - Revert "r600: enable multiple operations in one CS" - - turn this off for now, on my rv635 desktop, I started getting blanks - in places in firefox and the odd bit of font corruption, need to - track that down. - - This reverts commit 985a065518b1d33599de33f7fe082d3302db58a6. - -commit 8b28534bcf877557a5681fa3b4f107c74615d3de -Author: Dave Airlie -Date: Wed Nov 25 13:24:44 2009 +1000 - - radeon/exa: change option to determine exa pixmap usage. - - This moves to a boolean instead of using VRAM sizing. - - as per Michel's suggestions on list. - - Signed-off-by: Dave Airlie - -commit f0acb16fa19844453adc6db3399977fba7c8a0db -Author: Dave Airlie -Date: Wed Nov 25 12:04:47 2009 +1000 - - r600/xv: drop inited 3d false in xv code - -commit 985a065518b1d33599de33f7fe082d3302db58a6 -Author: Dave Airlie -Date: Wed Nov 25 11:54:08 2009 +1000 - - r600: enable multiple operations in one CS - - This switches on multiple ops in a single CS under KMS/DRI2. - - It gets for on a Pentium D 3 + rv740 from 330,000 to 500,000 - with x11perf -aa10text. - - It also knocks a couple of seconds of gtkperf -a - - Signed-off-by: Dave Airlie - -commit af816ac752820255f245793b53a7cca5a4a49cd4 -Author: Dave Airlie -Date: Wed Nov 25 11:53:07 2009 +1000 - - r600: fixup problems with EXA operation reset for multiple ops - - To put multiple ops into one CS, you can't just discard the whole - IB. This add supports for reset the CS cdw to the correct place - after an op discards. - - Still doesn't enable the final accel bits. - -commit 3d8dcbc29323a3c644100bec13aa93f024653bd3 -Author: Dave Airlie -Date: Wed Nov 25 11:43:57 2009 +1000 - - kms: flush cs on close screen. - - this is needed for server recycle. - - Signed-off-by: Dave Airlie - -commit 19f1a357944f9d8f4567a2691a68067ec033ccb7 -Author: Dave Airlie -Date: Wed Nov 25 11:41:52 2009 +1000 - - radeon: fix check for no work in operation - -commit 3a460a14b9603159f10d89da27b559c36a184e27 -Author: Dave Airlie -Date: Wed Nov 25 10:33:17 2009 +1000 - - r600: refactor code to help future acceleration speedups. - - This changes the vertex buffer index to be an offset, and - records the start of the vb for each operation and uses - that to set the operations up. - - This still flushes after each operation to make sure we have - no regressions in non-kms/kms cases. - - Signed-off-by: Dave Airlie - -commit 797a3f0c71c94477eec565ea2c95553c6f66d9fd -Author: Dave Airlie -Date: Wed Nov 25 10:07:59 2009 +1000 - - kms: allow prepare copy to fail without dying - -commit ba76acc76e0d0a51a1c488e4d5494a71e155a05b -Author: Dave Airlie -Date: Tue Nov 24 15:38:47 2009 +1000 - - radeon/kms: drop special r600 indirect flush - - This just merges it with the main kms cs flush - -commit 3c527d752d3cced219c6113acb932511b16e35fb -Author: Dave Airlie -Date: Tue Nov 24 15:11:12 2009 +1000 - - r600: enable mixed pixmaps - -commit b9eb2380df5145c85b2ef694a04628c055c47429 -Author: Alex Deucher -Date: Mon Nov 23 12:12:02 2009 -0500 - - DCE3.2: fix uniphy2 dvi issues - - In some cases the atom transmitter table sets the - golden value of this reg differently which some monitors - don't like. I haven't had time to dig further, so this - works around it for now. - - Fixes fdo bug 24313 - - Signed-off-by: Alex Deucher - -commit d0dd5122d8d75b7c4a72df07dc7f562b2e75dd5e -Author: Gaetan Nadon -Date: Mon Nov 23 09:25:05 2009 -0500 - - Makefile.am: add ChangeLog and INSTALL on MAINTAINERCLEANFILES - - Now that the INSTALL file is generated. - Allows running make maintainer-clean. - -commit 3d7888aa0493f46d826f4d80dea36f1f642f3c6b -Author: Dave Airlie -Date: Mon Nov 23 15:26:15 2009 +1000 - - radeon: fix warning in printf - -commit 3a1a8b7b73424a769baf917bba2223ea6515b596 -Author: Dave Airlie -Date: Mon Nov 23 15:07:10 2009 +1000 - - radeon: surround mixed pixmaps usage with ifdef check for old servers - -commit e20af9c94982ec6487dae42c141d33cf6a7a2eb4 -Author: Dave Airlie -Date: Fri Nov 20 12:15:02 2009 +1000 - - radeon: avoid using hw pixmaps when we have little VRAM. - - This patch returns NULL for pixmap creation when we are using - mixed pixmaps and the pixmap has a size. - - The size check is necessary for the front buffer. - - We add a flag to force pixmap creation for certain pixmaps - that need to be hw, like the DRI2 and Xv ones. - - Idea from Michel and workarounds from Ben Skeggs. - - v2: add Option "EXALowVRAM" to allow configuring this, value in MBs. - - Signed-off-by: Dave Airlie - -commit 543338842ba7fe7da4902947d386ea1cabd1cdf0 -Author: Alex Deucher -Date: Fri Nov 20 16:38:43 2009 -0500 - - dp fix timing - - aux channel atom command table delay is 10 usec units - this gets the link training working, but alas, no image. - -commit dd3eab848cf352bb96c3d01fe6028d8a4a8e451e -Author: Alex Deucher -Date: Fri Nov 20 01:06:49 2009 -0500 - - r300: render target limit is 2560 - - limit was increased to 4021 in r4xx. - - fixes fdo bug 25191. - - Signed-off-by: Alex Deucher - -commit df35d40d4ec260cdab57a9b36e4e96b2a6c2a827 -Author: Alex Deucher -Date: Thu Nov 19 20:01:42 2009 -0500 - - DP: hack that makes DP work. - - Something's wrong with the status check. - -commit f42412ec4dbd21f562a7fe4239c0a1f17ef1b8f2 -Author: Alex Deucher -Date: Thu Nov 19 19:40:54 2009 -0500 - - wip - -commit eb9bc133fc426e67b397e661bfd22bf62009d9d3 -Author: Dave Airlie -Date: Fri Nov 20 09:23:31 2009 +1000 - - kms: recalculate the flush limits after screen resize. - - When we resize the front buffer we need to reduce the flush limits - appropriately. - - Signed-off-by: Dave Airlie - -commit f7f58ef4c042e492618665a6c5555e8e67387ab3 -Author: Dave Airlie -Date: Fri Nov 20 09:22:39 2009 +1000 - - radeon: r100/r200 have a 2047 scissor limit - - We were overflowing this in my case with a 2704 width desktop, - so videos were stopping around 700 bytes across the screen. - - can I haz shatter already? - - Signed-off-by: Dave Airlie - -commit 54c09778d79de1516ee511d6d7d5b54dd4bf9130 -Author: Alex Deucher -Date: Thu Nov 19 13:32:30 2009 -0500 - - DP wip - - - use coherent - - fix up lane/clock numbers - -commit 02d017a0552db2c8a48506c5b26c48a1a2ab75b6 -Author: Gaetan Nadon -Date: Wed Oct 28 14:41:41 2009 -0400 - - INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206 - - Automake 'foreign' option is specified in configure.ac. - Remove from Makefile.am - -commit 396ee9b7e7e3b1dd64532270c4e32cdb33857596 -Author: Gaetan Nadon -Date: Wed Oct 28 14:09:09 2009 -0400 - - INSTALL, NEWS, README or AUTHORS files are missing/incorrect #24206 - - Add missing INSTALL file. Use standard GNU file on building tarball - README may have been updated - Remove AUTHORS file as it is empty and no content available yet. - Remove NEWS file as it is empty and no content available yet. - -commit 1dcda0c4d5d506e18a7989ff05f2ad8569a73f23 -Author: Gaetan Nadon -Date: Mon Oct 26 12:54:21 2009 -0400 - - Several driver modules do not have a ChangeLog target in Makefile.am #23814 - - The git generated ChangeLog replaces the hand written one. - Update configure.ac to xorg-macros level 1.3. - Use XORG_DEFAULT_OPTIONS which replaces four XORG_* macros - Update Makefile.am to add ChangeLog target if missing - Remove ChangeLog from EXTRA_DIST or *CLEAN variables - This is a pre-req for the INSTALL_CMD - -commit 5b517bcc353e7111d2365a213505f27cfae30924 -Author: Gaetan Nadon -Date: Thu Oct 22 12:34:16 2009 -0400 - - .gitignore: use common defaults with custom section # 24239 - - Using common defaults will reduce errors and maintenance. - Only the very small or inexistent custom section need periodic maintenance - when the structure of the component changes. Do not edit defaults. - -commit 605c869076985b69350c893cf2bbcc90de8dc6bf -Author: Alex Deucher -Date: Wed Nov 18 01:51:12 2009 -0500 - - more dp cleanup - - - clean up handling of linkb, etc. - - add support for ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH - to existing transmitter control function - - fix lots of warnings - -commit bce1911f66f446b793125ac8cd5463bf6292629e -Author: Alex Deucher -Date: Wed Nov 18 00:04:33 2009 -0500 - - radeon: pull previous displayport work into master - -commit 437113124bbd6fb166825169eabec4dfde900dd9 -Author: Alex Deucher -Date: Tue Nov 17 14:16:22 2009 -0500 - - radeon: deal with connectors sourced to the same encoder - - Some systems have multiple connectors connected to the - same encoder; e.g., DVI and HDMI connected to the same - encoder with the same ddc line. Since we expose - connectors as xrandr outputs, randr treats them separately - which results in it trying to source the same encoder to - different crtcs. If we have an HDMI and DVI-D port on the - same encoder, pick the one to be considered connected - based on the edid (HDMI if edid indicates HDMI, DVI - otherwise). Also, don't turn off (dpms) encoders that are - shared. - - Fixes fdo bug 21767. - - Signed-off-by: Alex Deucher - -commit 9b8605d4e2bf7703c7848f3e2022a8c7328a3acd -Author: Alex Deucher -Date: Tue Nov 17 11:45:09 2009 -0500 - - radeon: fix potential memory leak in ddc code - - Signed-off-by: Alex Deucher - -commit ce8299962003de572122561a6f7f61eaccf633b2 -Author: Dave Airlie -Date: Tue Nov 17 15:23:30 2009 +1000 - - kms: check for 0 mask for cloned outputs. - - Signed-off-by: Dave Airlie - -commit 06d68f7fa3870f9601e837e1834d33e8395008b1 -Author: Dave Airlie -Date: Tue Nov 17 15:10:04 2009 +1000 - - kms: add cloning support. - - We have to translate from the kernel encoder cloning to the randr - connector cloning, we do this by constructing an encoder mask per output - and an encoder cloning mask per output then comparing them. - - Signed-off-by: Dave Airlie - -commit 7587ce16ab0380337fe801f457c1d1d9b4141cc5 -Author: Alex Deucher -Date: Mon Nov 16 19:16:03 2009 -0500 - - r600: remove un-needed format conversions - - we do the normalization and xforms in the vertex - shader. - - Signed-off-by: Alex Deucher - -commit ba605b5c9ff48765f2b66960aa4cc81b6235d012 -Author: Alex Deucher -Date: Mon Nov 16 19:00:52 2009 -0500 - - r600: fix num format in vtx fetch - - Signed-off-by: Alex Deucher - -commit 0c4710c67a2fee2061fc3da43c9f908585693cfa -Author: Alex Deucher -Date: Thu Nov 12 11:11:17 2009 -0500 - - radeon: man page updates - -commit 2af2744c80f3307e6d84edba9479be5bd36e1d03 -Author: Alex Deucher -Date: Wed Nov 11 13:12:24 2009 -0500 - - radeon: fix support for external tmds on some legacy chips - - Should fix bug 11801. - - Signed-off-by: Alex Deucher - -commit f17657fdc83d8f4c0386d2c7dade98de5b94acbe -Author: Alex Deucher -Date: Mon Nov 9 16:59:11 2009 -0500 - - r600/r700: typo, fix mask of DB_ALPHA_TO_MASK - - noticed by glisse. - -commit 0ee7763fb33bf7fbc4ae1e8372cbc74578bfb720 -Author: Alex Deucher -Date: Mon Nov 9 15:09:34 2009 -0500 - - IGP: some IGP chips report as AGP - - Set bus type appropriately. fixes bug 25002 - - Signed-off-by: Alex Deucher - -commit da1fcddaade58e371c7bee555ce32944c689f810 -Author: Alex Deucher -Date: Thu Nov 5 14:13:49 2009 -0500 - - radeon: properly fix unused label warnings - -commit 6e496f46fdc90d0a6cef41e9d45a6458aaed1eca -Author: Alex Deucher -Date: Thu Nov 5 14:11:55 2009 -0500 - - Revert "Fix warning about unused defined labels in radeon_exa_funcs.c." - - This reverts commit b6ac42cce2156880ac18b32e15acbff40b2f53e9. - - This patch is very broken. - -commit b6ac42cce2156880ac18b32e15acbff40b2f53e9 -Author: Tomáš Chvátal -Date: Sat Oct 31 23:07:07 2009 +0100 - - Fix warning about unused defined labels in radeon_exa_funcs.c. - - Signed-off-by: Tomáš Chvátal - -commit 87d7235790866f9c19ef08972d5237f09d940cd9 -Author: Alex Deucher -Date: Thu Nov 5 10:23:03 2009 -0500 - - EXA: fallback if no pMaskPicture->pDrawable - - A solid or gradient mask could be used for blending - the source picture onto the destination picture. - - Fixes fdo bug 24838 - - Signed-off-by: Alex Deucher - -commit 873897c54429e230a23011a9dd2f1069f4eb7752 -Author: Alex Deucher -Date: Thu Nov 5 00:51:11 2009 -0500 - - DCE3+: call transmitter init on mode set - - Generally this is done at post, but might not always - be done with softboot or for connectors on docking - stations. - - Signed-off-by: Alex Deucher - -commit 3028374488cc0f34942ac372c8d05cf15898a613 -Author: Alex Deucher -Date: Wed Nov 4 18:48:03 2009 -0500 - - ATOM/DCE3+: fix up usPixelClock calculation for Transmitter tables - - Signed-off-by: Alex Deucher - -commit 52973e8f2c4104de60d00c0e5c29a31f77bf3de7 -Author: Alex Deucher -Date: Sun Nov 1 13:58:03 2009 -0500 - - radeon/atom: fix tv-out on r5xx - - fixes bug 24796 - - Signed-off-by: Alex Deucher - -commit 19b4f5f9b647cd470616b8ec1d34f1e4afa357ad -Author: Alex Deucher -Date: Tue Oct 27 11:55:20 2009 -0400 - - ATOM: fix up DVO for DCE 3.x - - AdjustDisplayPll takes care of this for us. - -commit 5a0019126a57138ee506d9a66738c9e8b75cbb96 -Author: Alex Deucher -Date: Tue Oct 27 11:39:06 2009 -0400 - - radeon: fix DVO on AVIVO chips - - DVO generally requires 2x ppll on AVIVO cards due to the - way the tmds chip is wired up. Because of this, disable - cloning of DVO outputs. - - fixes fdo bug 21857. - - Signed-off-by: Alex Deucher - -commit 2a6eeec72d6bb04a32225883f431c1d2e8cff123 -Author: Alex Deucher -Date: Tue Oct 27 11:18:44 2009 -0400 - - atom: loosen pll min output limits - - Limiting the pll output range is a good thing generally as - it limits the number of possible pll combinations for a given - frequency presumably to the ones that work best on each card. - That's why the limits are in the bios tables. However, certain - duallink DVI monitors seem to like pll combinations that would - be limited by this at least on pre-DCE 3.0 r6xx hardware. This - might need to be adjusted per family or per clock range in the - future. - - Fixes fdo bug 24727. - - Signed-off-by: Alex Deucher - -commit f0d9d80fee4176eaba9435a9539f29d0eefe2a87 -Author: Luca Tettamanti -Date: Sat Oct 24 16:45:23 2009 -0400 - - Disable color tiling on r600/r700 - - Not supported yet. - -commit ac499c3c0ea92f83ebd8127bb8cb5de625de6c94 -Author: Alex Deucher -Date: Fri Oct 23 10:48:55 2009 -0400 - - radeon: clamp the internal FB map to the aperture size v2 - - We don't use the invisible memory yet and on cards with - large amounts of vram this can cause the top of GART - calculation to overflow. - - Fixes bug fdo bug 24301: - http://bugs.freedesktop.org/show_bug.cgi?id=24301 - - v2: only clamp cards with more than 512 MB. This seems - to cause problems on some older cards due to the way the - drm and ddx set up the internal memory map. - -commit e57b54daf318ff59315a1c9ed21934f288c5c782 -Author: Alex Deucher -Date: Thu Oct 22 16:07:58 2009 -0400 - - R7xx: program additional CUR/GRPH regs for 40 bit addresses - - The *_HIGH regs are reversed. The secondary ones are in the - primary block and vice versa. - -commit 4cf06dfba617529291ce4b4c306c4fc1bba110ee -Author: Alex Deucher -Date: Thu Oct 22 02:08:45 2009 -0400 - - ATOM: use indirect addressing for regs >= 0x10000 - -commit 66b194a78c470cb3978f310828dd96c3f3e96944 -Author: Alex Deucher -Date: Wed Oct 21 15:58:18 2009 -0400 - - ATOM: fix up get clock info - - Newer revisions of the atom firmware table have - changed. This helps select better pll dividers - in some cases. Noticed by Mathias Froehlich. - -commit bd89b7501f294ac645390ef144df569953c81dc4 -Author: Alex Deucher -Date: Sun Oct 18 16:21:36 2009 -0400 - - radeon: fixup CustomEDID option - - - add support for analog option to force edid to analog - mode - - fix compilation on older xservers - - updated man page - -commit 255ac8d54e3dc12e579e05edb41b40946a00eab8 -Author: Alex Deucher -Date: Tue Oct 13 12:27:52 2009 -0400 - - radeon: add XV_CRTC attribute for textured video - - This attribute allows the user to override which - crtc is synced with when XV_VSYNC is enabled. This - is useful for clone modes where the user can might want - to override the default. - -commit 801d900add4731f3c424ebb780ad2dbd7a1c6a25 -Author: Alex Deucher -Date: Mon Oct 12 10:00:57 2009 -0400 - - ATOM: minor cleanups to pll setup - -commit f4407962cd7b272e0860319f11f6a6583ef226c2 -Author: Csillag Kristof -Date: Fri Oct 9 18:00:09 2009 -0400 - - Fix some issues with CustomEDID support - - - Fixes a memory allocation problem introduced with the previous - version of the CustomEDID patch (now in GIT), and - - Enhances the syntax of the CustomEDID option so that I can force - digital output, even if the EDID was acquired over an analog link. - -commit de55995e82c3875f70b6394fff440d695d062113 -Author: Alex Deucher -Date: Fri Oct 9 11:07:30 2009 -0400 - - r600 EXA: fix up mask reg mixup - -commit a168caf5349b757873ad89d977772feaa7fb6e58 -Author: Alex Deucher -Date: Fri Oct 9 10:32:26 2009 -0400 - - r600 EXA: fix some compile warnings - -commit fb8dda2928bd0def2b34c8c8e414129e650d6eb5 -Author: Alex Deucher -Date: Fri Oct 9 10:30:21 2009 -0400 - - r600 EXA: properly check planemask - - We only support per-component masks. - -commit 1b25bad2d8ebe481ffb4b0fd3a85ab636bd4fec2 -Author: Dave Airlie -Date: Fri Oct 9 20:09:52 2009 +1000 - - Revert "radeon: clamp the internal FB map to the aperture size" - - This reverts commit 5f846360c46f5a989f5d0fde6d251cdbd61d4968. - - Numerous reports of system hangs since this, I'm guessing - some sort of conflict with the drm memory setup. This code - has always been fragile between kernel/userspace drivers. - -commit a956d478043b44c49aed39c7aa3d576ef32cadc5 -Author: Dave Airlie -Date: Fri Oct 9 20:08:31 2009 +1000 - - Revert "kms: setup colormap and gamma correctly." - - This reverts commit 60d9685abddccec17c1a9a5ec48cbe9c92543e0f. - - which breaks colormap on 1.6 X server - - Conflicts: - - src/drmmode_display.c - -commit a493feb94c0d84aaf5bfd84c6940d7f03974dd86 -Author: Dave Airlie -Date: Fri Oct 9 15:05:25 2009 +1000 - - kms: don't use scratch pixmaps at all - - use our own wrapper to allocate a pixmap for wrapping a bo in. - -commit 0caffbd6fd6b356b9b7d715c015285eaa91e3e36 -Author: Dave Airlie -Date: Fri Oct 9 15:04:56 2009 +1000 - - drmmode: reload cursors on modeset - -commit 02e12ae6be7bc1976f63848fa2854d320d5ab36e -Author: Alex Deucher -Date: Wed Oct 7 19:56:58 2009 -0400 - - ATOM: rework crtc modeset - - - clean up tv timing handling - - unify SetCRTCTiming and SetCRTCDTDTiming interfaces - -commit d499eeaf22f77a1294e99aa38a50aa6810bb684a -Author: Alex Deucher -Date: Wed Oct 7 17:43:11 2009 -0400 - - ATOM: reorder crtc dpms based on bios recommendations - -commit 4ccd2a21f9c50515b4246f35454f76ef49006c76 -Author: Alex Deucher -Date: Wed Oct 7 16:30:03 2009 -0400 - - ATOM: add support for AdjustDisplayPll table - - Depending on the output and clock, this table will - adjust the pixelclock accordingly. - -commit 5f846360c46f5a989f5d0fde6d251cdbd61d4968 -Author: Alex Deucher -Date: Wed Oct 7 17:01:55 2009 -0400 - - radeon: clamp the internal FB map to the aperture size - - We don't use the invisible memory yet and on cards with - large amounts of vram this can cause the top of GART - calculation to overflow. - - Fixes bug fdo bug 24301: - http://bugs.freedesktop.org/show_bug.cgi?id=24301 - -commit 186bf719c394116341abff471fb4b4803650da9a -Author: Dave Airlie -Date: Wed Oct 7 17:23:36 2009 +1000 - - radeon: fix rotation since mixed pixmaps. - - Passing null in here stops the mixed pixmap code doing it wrong, - but I'm not 100% sure how it is meant to work, we have the - same issue with the real front bo by the looks of it. - -commit e08411af1aa8c7d4233ba593b84360397cdbb307 -Author: Roel Kluin -Date: Tue Oct 6 18:31:17 2009 -0400 - - radeon: Fix duplicated bit settings - - [agd5f: adapted from kms patch] - - Signed-off-by: Alex Deucher - -commit e59ae08270711512e64b70f79b6476cc2c52d230 -Author: Michel Dänzer -Date: Tue Oct 6 00:13:09 2009 +0200 - - Don't call radeon_cs_flush_indirect() without KMS. - - Fixes http://bugs.freedesktop.org/show_bug.cgi?id=24316 . - -commit 457646d734558672402b6bcd15cadb66741edbed -Author: Jerome Glisse -Date: Mon Oct 5 15:52:42 2009 +0200 - - kms: assume accel is working is info ioctl return -EINVAL - - -EINVAL should only happen if the info ioctl doesn't support - the get accel query. This patch assume that on such case accel - is working. - -commit 9d596562496863d65850306d2126d8df98464de4 -Author: Dave Airlie -Date: Mon Oct 5 18:35:20 2009 +1000 - - kms: only touch gamma stuff on 1.7 - - for correct colormap operation you probably want 1.7 - -commit 876f43d4682df4d47d3e158f75e0ca6040f41c70 -Author: Alex Deucher -Date: Mon Oct 5 02:23:03 2009 -0400 - - R1/2xx EXA: Minimise number of draw primitives used for Composite operations. - -commit 86cafb8affea448bdf58300044e755201b822d2a -Author: Dave Airlie -Date: Mon Oct 5 14:17:25 2009 +1000 - - kms: don't use scratch pixmaps when copying fbcon. - - scratch pixmaps seem to interact badly with mixed pixmaps, it appears - some state may be getting left around in the privates somewhere, since - scratch pixmap headers don't get destroyed. - -commit f8471512ea9f1d38140dfe98a0f832e9f935f51b -Author: Csillag Kristof -Date: Sun Oct 4 18:18:56 2009 -0400 - - radeon: add support for Custom EDID - - Allows you to specify an edid per output from a file - to override what is detected by DDC. Useful for - problematic monitors or KVM switches that block - DDC. Specifying an EDID that is not compatible with - your monitor could damage your monitor so use with - caution. - - agd5f: cache the custom edid at startup so we don't - have to read it from file every time the output is - queried. - -commit 60d9685abddccec17c1a9a5ec48cbe9c92543e0f -Author: Dave Airlie -Date: Mon Oct 5 12:41:30 2009 +1000 - - kms: setup colormap and gamma correctly. - - We need to program the gamma at modeset. no need to use - old cmap interface at all. - -commit b0b10e548fd69b3ff67a0f9b71456b89c61cb4d6 -Author: Alex Deucher -Date: Sun Oct 4 17:07:32 2009 -0400 - - R6/7xx EXA: Add support for BGRA picture formats. - - Also add mysteriously missing case statements for ABGR destination formats. - -commit 8404c37b2ff95aba31db97676f106ec2f30fda7f -Author: Dave Airlie -Date: Sun Oct 4 18:18:51 2009 +1000 - - radeon: fix build without kms - -commit 9460ea864b12ec1fbd11c5d9a20bb5a4279d9d3d -Author: Michel Dänzer -Date: Sat Oct 3 16:33:33 2009 +0200 - - Fix KMS on big endian machines. - - Requires at least xserver 1.7 to work properly. - - Also make sure the front buffer is and stays tiled if colour tiling is enabled. - -commit aee6b6f2c120baf477b4845ddc1a94637c31db2f -Author: Michel Dänzer -Date: Sat Oct 3 16:33:33 2009 +0200 - - EXA: Bail earlier from PrepareCopy hook on trivially unsupportable conditions. - -commit 30031b169def5caadb394225919a6079a0957142 -Author: Michel Dänzer -Date: Sat Oct 3 16:33:33 2009 +0200 - - R3/5xx EXA: Add support for BGRA picture formats. - - Also add mysteriously missing case statements for ABGR destination formats. - -commit 4b4ce36081ca151c24e028c54b59986f41731a73 -Author: Michel Dänzer -Date: Sat Oct 3 16:33:32 2009 +0200 - - R3/5xx EXA: Minimise number of draw primitives used for Composite operations. - - This should reduce the kernel CS checker overhead, if nothing else. - - I'll leave porting this to other chipset families to others who can test it. - -commit eade1e5be159c9f2965d611925596d33cab11d6d -Author: Michel Dänzer -Date: Sat Oct 3 16:33:32 2009 +0200 - - EXA: Don't always flush when switching between 2D/3D engines with KMS. - - This seems to work fine here now and help 2D performance quite a bit, let's see - if it breaks anybody else's setup... - -commit 926e414fc835ace141c066830d11d8ce32dbb06c -Author: Michel Dänzer -Date: Sat Oct 3 16:33:32 2009 +0200 - - KMS: Double-buffer textured video source image upload. - - In order to avoid stalling on previous frame. - - OTOH without KMS we can't do this but have to wait for the previous frame to - finish rendering. - -commit 6a3b75fae4147244212298ff55c7ab36c3d80d30 -Author: Michel Dänzer -Date: Sat Oct 3 16:33:31 2009 +0200 - - KMS: Don't hide HW cursor when it's updated. - - Inspired by the intel driver; might avoid/reduce HW cursor flicker in some - cases. - -commit c4ba15b4871c70cced7f1761e24be692cdb28d2b -Author: Michel Dänzer -Date: Sat Oct 3 16:33:31 2009 +0200 - - Fix some compiler warnings. - -commit cc45856a18dd3e6f7e44d9eb507b31419da70977 -Author: Kenneth Graunke -Date: Fri Oct 2 14:31:36 2009 -0400 - - radeon: Remove gatos message from driver startup - - Remove a message on driver startup which directs people to the old GATOS - website; said site contains highly out of date software which is no longer - necessary. - -commit d302481493ff61eb7f8648b7afe7407b6b653cf7 -Author: Jerome Glisse -Date: Wed Sep 16 15:18:40 2009 +0200 - - radeon/kms: fallback to shadowfb if kernel report acceleration is off - - This will fallback to shadowfb is GPU accel failed somewhere during - KMS kernel init. - -commit 7968e1fb89f6b59d1654df48249bf4b81990c008 -Author: Alex Deucher -Date: Fri Sep 25 19:05:38 2009 -0400 - - radeon: fix segfault in MMIO path in RADEONInit3DEngine - - fixes fdo bug 24158. - - Signed-off-by: Alex Deucher - -commit 0380a9cf98d34e88dd81370ade5525680ec89c02 -Author: Alex Deucher -Date: Fri Sep 25 16:46:43 2009 -0400 - - kms/r600: add support for vline relocs - - Signed-off-by: Alex Deucher - -commit 3efecebb10de7f7bacf9f8c57ae20fd508097294 -Author: Alex Deucher -Date: Fri Sep 25 14:44:41 2009 -0400 - - radeon: fix vline handling for kms - - drm crtc ids do not correspond to actual hw crtcs, - as such the vline stuff was never enabled for Xv. - - Signed-off-by: Alex Deucher - -commit 9733dcde0a21b7503aa20254724f2910b541b990 -Author: Dave Airlie -Date: Sat Sep 26 06:15:58 2009 +1000 - - r600: fix build - -commit ff18595eace42ddfc931f4f948cb5adf59ebcf52 -Author: Dave Airlie -Date: Sat Sep 26 06:04:51 2009 +1000 - - r600/xv: fix dst bo write domain - -commit 718a611f3cc7f5eea95cd73a9dcc7913c922fcbc -Author: Dave Airlie -Date: Sat Sep 26 06:03:51 2009 +1000 - - radeon: fix zaphod - -commit 86c367be517e992aabc1bcfea2a2dde1a1ae520c -Author: Alex Deucher -Date: Fri Sep 25 13:03:44 2009 -0400 - - r600: fix bo accounting for Xv - - fixes Xv after changes in: - 8f80e37eed3ec028718b4e71bbb9b598847fd94e - - Signed-off-by: Alex Deucher - -commit 8f80e37eed3ec028718b4e71bbb9b598847fd94e -Author: Dave Airlie -Date: Fri Sep 25 11:37:38 2009 +1000 - - r600: space check wasn't correct. - - the r6xx space check code was incorrect for the DFS case, since - the dst bo was in GTT but the hardcoded cp_start function - assumed the bos were where it thought. - - Ripped out assumptions and replaced with code more like other radeons. - -commit 90669f6cb5ada9067d6fccc7f54c69b367862f42 -Author: Alex Deucher -Date: Thu Sep 24 10:40:40 2009 -0400 - - radeon: remove old pre-randr rotation cruft - - leftover from the randr 1.2 conversion. - - Signed-off-by: Alex Deucher - -commit 97a4e747bfac14f34646c55ddf639e8fe22f2f55 -Author: Michael Olbrich -Date: Sun Sep 20 14:19:41 2009 +0200 - - use AC_CHECK_HEADER instead of AC_CHECK_FILE - - AC_CHECK_FILE is not possible when cross-compiling. Use AC_CHECK_HEADER / - AC_PREPROC_IFELSE instead. - - [ Michel Dänzer: Shuffled things around slightly to make it work on my setup ] - - Signed-off-by: Michael Olbrich - Signed-off-by: Michel Dänzer - -commit 579070ed9f0218a975e840331b6fe9fa8fd05789 -Author: Alex Deucher -Date: Sat Sep 19 19:15:14 2009 -0400 - - kms: disable dga - - Can be dangerous with kms: - http://lists.freedesktop.org/archives/xorg-devel/2009-September/002113.html - -commit da7487f6ac7b32ed7866af53da2925aa52ed7aae -Author: Alex Deucher -Date: Sat Sep 19 13:08:02 2009 -0400 - - kms: init dga using xf86DiDGAInit - - fixes cursor problems in games like UT2004 and Penumbra Overture - - see fdo bug 24034 - -commit 52279251fae9df99c569c16e2522bbd346d8ec38 -Author: Dave Airlie -Date: Fri Sep 18 14:29:32 2009 +1000 - - avivo: disable VGA rendering core when starting X. - - this thing can be rendering to VRAM when we don't expect it. - turn it off. - - Signed-off-by: Dave Airlie - -commit 2c46bafcb77c4125a27c18ad6ca2f6de5f143a2d -Author: Pauli Nieminen -Date: Thu Sep 17 15:13:51 2009 +0300 - - Fix configuration to disable KMS if not finding libdrm_radeon. - - Most of KMS building was disabled if LIBDRM_RADEON was not detected. But at - least configure was reporting KMS enabled even tough it was realy disabled. - -commit ee9f6d802988a4d7f7985687036db854f4a14fe5 -Author: Pauli Nieminen -Date: Mon Sep 14 16:36:48 2009 +0300 - - radeon: Add missing libdrm_radeon cflags to compiler paramaters. - - This fixes compilation if libdrm_radeon is installed to non-standard location like /opt. - -commit ac853ca0a950d6147cd6a0b4a1b089f5d2f080ea -Author: Alex Deucher -Date: Fri Sep 11 14:25:31 2009 -0400 - - atom: fix typo in asus quirks - - Should be DVI-I, not DVI-D - -commit a88f60e7b789cd23a79e6e18a7e3fa008d15aa77 -Author: Alex Deucher -Date: Thu Sep 10 13:42:31 2009 -0400 - - r600: add CS UTS and DFS hooks - -commit 0bb0ff0e55aaf8e64017d204e376a14f0a7384a3 -Author: Dave Airlie -Date: Thu Sep 10 11:48:00 2009 +1000 - - r6xx: fix EXA crash with gtkperf -a - - unmapping was getting unbalanced. - -commit 10a58d54857484b6e89763ecf463f54dc290c702 -Author: Dave Airlie -Date: Wed Sep 9 14:24:49 2009 +1000 - - kms: add property support. - - this adds support to the userspace DDX to get properties from the kernel - and expose them over randr. Its most liberated from the Intel driver. - -commit fad9ee6cdae5ae45e6406e3071a84276f1b59a85 -Author: Alex Deucher -Date: Tue Sep 8 17:50:50 2009 -0400 - - radeon: replace dga code with DiDGA - -commit 651fe5a47435c6a5cc1cdfb33c5c6601d692adcb -Author: Adam Jackson -Date: Tue Sep 8 13:21:07 2009 +1000 - - radeon: fix dri2 struct zeroing - -commit 6990f2ac6478bf92929a4400ef84fb2142699204 -Merge: 917f2d7 853f4c3 -Author: Dave Airlie -Date: Tue Sep 8 11:26:32 2009 +1000 - - Merge branch 'r6xx-cs' - -commit 853f4c3d1ea8f975ab2855f18d3ae336a4095091 -Author: Dave Airlie -Date: Tue Sep 8 11:25:39 2009 +1000 - - r600: more alignment fixups + vb map/unmap - - I'm not so sure the vb map/unmap is a good idea, I think - it pretty much locksteps the cpu/gpu, so we should really - work out if we really need to flush this often, since - mesa doesn't have to and we are just doing 3D ops. - -commit 917f2d7cd1815279710939edc27133ca6609460f -Author: Alex Deucher -Date: Sun Sep 6 10:53:29 2009 -0400 - - RV280: add agp quirk - - deb bug 545040 - -commit 78fcbf577ad6eba6399cc39f74b7ce5f9c8e265e -Author: Michel Dänzer -Date: Thu Sep 3 14:55:05 2009 +0200 - - EXA: Check for solid/gradient pictures the same way for all generations. - - In particular, also catch them for >= R300. - -commit 794ae743c305331741e7cf45dd71c755fe325ed5 -Author: Michel Dänzer -Date: Wed Sep 2 09:19:17 2009 +0200 - - EXA: Fix Composite restart dst/src switcheroo. - - Fixes http://bugs.freedesktop.org/show_bug.cgi?id=22636 . - - Now, where's that brown paper bag? :} - -commit c4ab50c5eafca3d04129a72453496eb8afb26b34 -Author: Alex Deucher -Date: Tue Sep 1 13:43:00 2009 -0400 - - radeon: add some notes about DVO setup - -commit 22fbd6476f4b3513378e848affc4dd269e9d4498 -Author: Dave Airlie -Date: Tue Sep 1 15:22:57 2009 +1000 - - r100/r200: seriously WRAP is illegal for rectangular textures - - unless we scale all the bos up to POT - -commit 8f4196e88855f10762254fca9e0a0988e7b5562f -Author: Alex Deucher -Date: Mon Aug 31 19:41:59 2009 -0400 - - r6xx/r7xx: various CS fixes from Dave - -commit a32384f9b9ed73c14484a380dfa14652ed478ad6 -Author: Alex Deucher -Date: Mon Aug 31 13:26:05 2009 -0400 - - r1xx: fix textured video - - Copy/paste bug from when kms support was added. - -commit 3d6bf0f8cf128ee67d448491be44d345547b75c5 -Author: Pauli Nieminen -Date: Fri Aug 28 17:05:44 2009 +0300 - - radeon: Fix DRI2BufferPtr to be DRI2Buffer2Ptr for xserver 1.6. - - Bump requirement for xserver in KMS mode to 1.6.2 for DRI2Buffer2Ptr. - -commit 6521dbf3884185ca5692d35d879d251890cc4f08 -Author: Roland Scheidegger -Date: Sat Aug 29 12:11:03 2009 +0200 - - r100/r200: fix section size mismatch for textured video - - this fixes the driver complaining though reportedly it still does - not work (on r100) - -commit 39dfac41eebbcdacb1ae0c17cea325ea2966c4a5 -Author: Michel Dänzer -Date: Fri Aug 28 12:20:04 2009 +0200 - - EXA: RENDER repeat fix and more cleanup. - - Apparently changing pPict->repeatType causes badness, see - http://bugs.freedesktop.org/show_bug.cgi?id=23560 . - - Now we just use a normalized repeatType value derived from pPict->repeat and - pPict->repeatType everywhere. - -commit 7d36f13afa5da742aa6c989a2652e92c96e5f80e -Author: Michel Dänzer -Date: Thu Aug 27 09:52:11 2009 +0200 - - KMS: Remove explicit radeon_bo_wait calls before radeon_bo_map. - - libdrm_radeon always takes care of this implicitly now. - -commit 066c90e8f5b93c80195dc43486ad3efa083a1f3a -Author: Michel Dänzer -Date: Thu Aug 27 09:52:11 2009 +0200 - - KMS: Don't use a blit for UploadToScreen if the pixmap BO will be idle anyway. - - Direct CPU writes should be at least as fast in that case. - -commit 174b61bb786a841cebd354e23b4b0caa85b541aa -Author: Michel Dänzer -Date: Thu Aug 27 09:52:11 2009 +0200 - - KMS: DownloadFromScreen improvements. - - * Drop superfluous RADEONDownloadFromScreenGTT function, EXA does the same - thing when we return FALSE. - * Take unflushed operations into account for determining which GEM domain the - pixmap BO will end up in. - * Only use a blit if it ends up in VRAM. - -commit 7623e169e1f7d5afbd4108de03f28098bca519db -Author: Michel Dänzer -Date: Thu Aug 27 09:52:11 2009 +0200 - - EXA: Allocate pixmap BOs in VRAM. - - This is the intention with EXA in xserver Git, and IME it improves performance - significantly even with older versions. - -commit b90b823790657707b5bf7249095833bef959b0e8 -Author: Michel Dänzer -Date: Thu Aug 27 09:52:11 2009 +0200 - - DRI2: Set tiling for depth/stencil buffers with all DRI2 interface versions. - -commit 27d9664f8862d1948dd32021f8e9bcb94f23e4ef -Author: Michel Dänzer -Date: Thu Aug 27 09:52:10 2009 +0200 - - EXA: RENDER repeat cleanups. - - We can't rely on the server setting pPict->repeatType to something sensible - when pPict->repeat is FALSE, but we can do it ourselves. - -commit 9b5517fcf7f2397a1a814d396fc9dc24769a6d9f -Author: Michel Dänzer -Date: Thu Aug 27 09:52:10 2009 +0200 - - Throttle DRI2 buffer swaps / frontbuffer flushes. - -commit e87f0f50f31a59ca1f60d4582d4a57ed00854fb7 -Author: Alex Deucher -Date: Wed Aug 26 02:13:38 2009 -0400 - - r6xx/r7xx: set EXA_HANDLES_PIXMAPS - -commit 3212c26b90c0f6f1a7248b4da3ed985a9c2e9381 -Author: Alex Deucher -Date: Wed Aug 26 01:42:10 2009 -0400 - - r6xx/r7xx: more WIP - -commit 5a08e68cc254fb255e631b456e331c32456ef0e7 -Author: Alex Deucher -Date: Tue Aug 25 19:24:41 2009 -0400 - - r6xx/r7xx: fix some define problems in Xv code - -commit 9aa214e125b7927d62b9fe124a851d0373c24d7e -Author: Alex Deucher -Date: Tue Aug 25 18:45:49 2009 -0400 - - r6xx/r7xx: fix reloc for vtx buffer - -commit bba51187055932ecd466f5f817428d6c773747b9 -Author: Alex Deucher -Date: Tue Aug 25 18:37:15 2009 -0400 - - R6xx/r7xx: unmap vb bo when done - -commit 599adfc1f5e6d708be7ad30f4871de3046775727 -Author: Alex Deucher -Date: Tue Aug 25 18:13:14 2009 -0400 - - r6xx/r7xx: fix flipped domains - -commit 2e83cca8d7efaf1a6836cfb9ea5893fd9d70175f -Author: Alex Deucher -Date: Tue Aug 25 18:05:43 2009 -0400 - - r6xx/r7xx: more cs exa wip - -commit 65852de027989c105246fa4e4eed432f29525a22 -Author: Alex Deucher -Date: Tue Aug 25 17:29:42 2009 -0400 - - r6xx/r7xx EXA: WIP - -commit 69ec7a35e2a0a3d802ec093a6aab2d7ed2cc88be -Author: Alex Deucher -Date: Tue Aug 25 16:14:02 2009 -0400 - - r6xx/r7xx: first pass at kms accel support - - Adapted from various patches from Dave and Jerome. - -commit 04692f80678ffea15ac33820381ce45865e697b8 -Author: Dave Airlie -Date: Wed Aug 26 05:31:56 2009 +1000 - - radeon: afaics these aren't radeon regs but r128 regs. - - so remove them from radeon use. - -commit 9cf965bbc977f0523437c0ecf1d7363b17de2468 -Author: Alex Deucher -Date: Tue Aug 25 12:47:34 2009 -0400 - - R6xx/r7xx: add begin/end batch macros - -commit b6368cc572c79bce9a9366242c727c13cab3f006 -Author: Alex Deucher -Date: Tue Aug 25 12:14:33 2009 -0400 - - r6xx/r7xx: move more common state to default state setup - -commit fc74e1194c980d978667e02c60a29a761a694bde -Author: Alex Deucher -Date: Tue Aug 25 11:39:56 2009 -0400 - - RV740: disable small DFS transfers - - Seems problematic on all rv740 chips, so until we - can find a solution, disable them. - -commit 1c909ecd88e75c6e16af7aa068e32a7a60b0af37 -Author: Jerome Glisse -Date: Tue Aug 25 11:21:41 2009 +0200 - - radeon: Fix X recycling with KMS - - On X recycling CloseScreen drop master so grab it again - in InitScreen and avoid to reallocate buffer & various - others cs/bo utilities on X recycling. - -commit 39aaf9addc923852598ba6fb914459671b78e492 -Author: Dave Airlie -Date: Mon Aug 24 18:59:22 2009 +1000 - - r600: use exa fallback code for solid/copy codepaths. - - Solid seem to try and handle 1bpp which really no. - -commit e4b2d57ddca8739ec0b452565713398d036be0d5 -Author: Dave Airlie -Date: Mon Aug 24 14:11:24 2009 +1000 - - r600: fix bad unit in texture setup - -commit bac224912c750dc1c85ff2d9b8526dad6c23b572 -Author: Dave Airlie -Date: Sat Aug 22 21:17:59 2009 +1000 - - radeon: don't spec any initial placement for pixmaps. - - allow the first use to decide placement. - -commit 77f98717d825162da106c6898cdbcbdf5c984ae6 -Author: Dave Airlie -Date: Sat Aug 22 21:16:25 2009 +1000 - - exa/cs: add DFS from GTT optimisation - - This uses the new libdrm busy interface, once I had this in place - I added a error if this happened and it does on my desktop here, - so may as well add the optimisation that used to be in my old KMS tree. - - Signed-off-by: Dave Airlie - -commit b1b77a4d6fb7404af9568644e1a8e050fdfa956e -Author: Alex Deucher -Date: Wed Aug 19 13:29:04 2009 -0400 - - rs600: add support for DisplayPriority HIGH - - Still haven't implemented the actual watermark - calculation, but this forces the display requests - to urgent if the user specifies DisplayPriority HIGH. - -commit 72e0d1b2cb11a67b8e4be4c74913ee44dc051c5b -Author: Dave Airlie -Date: Wed Aug 19 19:01:30 2009 +1000 - - radeon/kms: add initial colortiling support (disabled by default). - - This requires an X server from git with createpixmap2 support fixed up in it. - - On 1.6 and previous it won't do any tiling, if you are running git server - please upgrade to latest git. - - Option "AllowColorTiling" "true" to enable and do some testing - -commit 479a6daefe46f985c415b0d000b1b1b820f3924e -Author: Alex Deucher -Date: Tue Aug 18 02:53:29 2009 -0400 - - AVIVO: add support for DisplayPriority HIGH - - If the DisplayPriority option is set to HIGH, - force the diplay mem requests to urgent. - -commit 8fd6f69c84103b277de70181988e843da23c85b0 -Author: Dave Airlie -Date: Mon Aug 17 15:50:21 2009 +1000 - - radeon: move detected monitor type debugging. - - We should print this after DAC detection to be useful for TV - -commit d25185f33d06a8162469e18688e95ee19a5d94d8 -Author: Dave Airlie -Date: Mon Aug 17 15:31:16 2009 +1000 - - atom: recall crtc source script after tv dpms on - - For some reason we lost the DACB source when we dpms tv back on. - -commit a971f1cfbbda1e3d16fb41f4a07f3b43fd59bc0d -Author: Dave Airlie -Date: Mon Aug 17 15:25:17 2009 +1000 - - atombios: store dac detect result into save register. - - We end up writing back an empty save register over the dac - detection results so the atombios table can no longer - figure out the S-video vs composite so sets the wrong one up. - - this gets tv-out on my r580 with a composite connector working. - -commit efef7c01ad38e078de2fa3f9e528e4ef7d05d00a -Author: Dave Airlie -Date: Mon Aug 17 13:44:20 2009 +1000 - - atom/tvout: set the correct scaler up for tv out - - If we need to use the second scaler actually set the second scaler - up. - -commit 032a8a06315d12e66240e7ef74b5b165f6d0d1a9 -Author: Dave Airlie -Date: Mon Aug 17 12:18:23 2009 +1000 - - kms: make tv out match the connector name - -commit 36e51c4d63836863dd7a17cbf6e5a9b7c1bbd31a -Author: Dave Airlie -Date: Mon Aug 17 12:17:31 2009 +1000 - - r100/r200: dont emit wrong clamp modes. - - for rect textures you don't want to use wrap clamping which - is the default. - -commit 595f7c3a60ca982ca2836a0174e1f36f9d1a4fec -Author: Dave Airlie -Date: Mon Aug 17 09:38:09 2009 +1000 - - radeon/tv: fix typo in crtc register modifications - -commit 92baeafde8f0c1eed2b6769e96f8093e3d6d7478 -Author: Alex Deucher -Date: Tue Aug 11 15:29:17 2009 -0400 - - RV280: add agp quirk - - from Hartmut Niemann - -commit 04288fdb8b8c62fc2eb32fd467fdf05151ad121a -Author: Jerome Glisse -Date: Tue Aug 11 19:32:52 2009 +0200 - - radeon/r600: abstract vertex buffer for r600 & r700 hardware - - Abstract vertex buffer, preliminary work before others change - to bring cs support along IB support. - -commit 72daee2a18bfb809260d1bcbe80cc14afea3b0fa -Author: Adam Jackson -Date: Mon Aug 10 13:59:49 2009 -0400 - - Fix misleading filenames in DRI setup failure messages - -commit cd99d9f0d715f1f74de4fe22f2fd30046f2c7568 -Author: Michel Dänzer -Date: Fri Aug 7 11:56:50 2009 +0200 - - Properly let radeon_cs_flush_indirect() re-emit 2D state if necessary. - - Also remove a superfluous assignment. - -commit 577ff3ce922e457cc32f80d4365cb1da81552e72 -Author: Michel Dänzer -Date: Fri Aug 7 11:56:49 2009 +0200 - - Add support for EXA_MIXED_PIXMAPS in xserver master. - -commit e755fa56d03aa338d0c6345ed41e32aa3115ad4b -Author: Michel Dänzer -Date: Fri Aug 7 11:56:49 2009 +0200 - - Minor fixes for KMS EXA DownloadFromScreen hook. - - Check we can handle the bpp, and remove superfluous flush. - -commit 4cebafae81c1738a1c330d52a2c5248869f06411 -Author: Alex Deucher -Date: Fri Aug 7 11:56:40 2009 +0200 - - Add KMS EXA UploadToScreen hook. - - Fixups by Michel Dänzer: Doesn't seem to be a win in terms of raw numbers, but - should allow more pipelining and avoiding BO memory waste for small glyph - pixmaps. - -commit 9243791322e36b9231e6a3f04024ad66325385e3 -Author: Dave Airlie -Date: Fri Aug 7 14:07:32 2009 +1000 - - r200: fixup scissors for DDX. - - a) turn of R200_RE_CNTL - SCISSOR_ENABLE - this save us emitting R200_RE_TOP_LEFT, note scissor is still enabled. - b) disable aux scissors. - -commit bd03977e320591ca55b1a2fbb32414c53cb3f72e -Author: Alex Deucher -Date: Tue Aug 4 15:21:44 2009 -0400 - - radeon: fix compile with !kms - -commit 4fc1e67e606daf9227e74518c54315b60cd38301 -Author: Alex Deucher -Date: Tue Aug 4 15:17:39 2009 -0400 - - radeon: re-add asus connector quirks - - fixes bug 19943 - -commit 22074cf0e58fddba743924532625e6fca49b6bdc -Author: Jerome Glisse -Date: Tue Aug 4 21:09:25 2009 +0200 - - radeon/kms: add simple DownloadFromScreen implementation - - What we want to do is add userspace object support to radeon - kernel modesetting. Also this DFS is dumb and might endup doing - blit from GTT to GTT. - -commit fce31b61a88522733863a9b4e9f1c935c439cb4e -Author: Alex Deucher -Date: Tue Aug 4 11:16:05 2009 -0400 - - RS880: enable accel - -commit 6b1b4b9214d58175727f7992fc42bc7244c42bf2 -Author: Alex Deucher -Date: Mon Aug 3 15:55:04 2009 -0400 - - radeon: add some new r7xx pci ids - -commit f564460e94c9d0f1cf3ff4b8535481b2b8b4e9c1 -Author: Alex Deucher -Date: Sat Aug 1 16:53:47 2009 -0400 - - radeon: use XAA in some cases - - Use XAA in low memory situations or when the DRI is disabled. - Using shadowfb might also be a viable option, maybe even a better option... - fixes bug 21683 - -commit c71b2f050e8996787eae463eddbfdb5864ffa65a -Author: Bryce Harrington -Date: Sat Aug 1 16:50:43 2009 -0400 - - radeon: AGPMode quirk needed for SiS - - fixes bug 23065 - -commit e3659ed06fc5bb8817f1dbd7c2d6bc94c67b30f7 -Author: Bryce Harrington -Date: Sat Aug 1 16:48:48 2009 -0400 - - radeon: AGPMode quirk needed for IBM Thinkpad T40 with Mobility M7 LW - - fixes bug 23064 - -commit 2391531ed6b7c11ddd5ab91b2369821cc5f8b8a7 -Author: Bryce Harrington -Date: Sat Aug 1 16:41:41 2009 -0400 - - radeon: AGPMode quirk needed for HP Omnibook 6200 - - fixed bug 23063 - -commit 474eda02257152ced52364f38cbad24c20aebbc0 -Author: Alex Deucher -Date: Sat Aug 1 16:06:52 2009 -0400 - - radeon: reload bicubic Xv texture on VT switch - - fixed bicubic filtering after VT switch or suspend/resume - -commit 447a2ce1b88aa2d6d5713e93174c4002617720f7 -Author: Dave Airlie -Date: Thu Jul 30 09:54:01 2009 +1000 - - radeon: fix r600 shadow fb mode with cursor allocation in wrong place - - From RHEL QE testing, we could end up with the cursor at 0 since - we think EXA is in use when really it isn't. the info->useEXA = FALSe - might be unnecessary but better to be explicit - - Signed-off-by: Dave Airlie - -commit 2b9a5be3bb22fad1d52ec9eea7733c5e956250b7 -Author: Alex Deucher -Date: Wed Jul 29 03:34:11 2009 -0400 - - radeon: fix typo in object header to connector type conversion - - Should fix bug 19943 - -commit 63c873cbd4d1d21d9f688028c0900c79fadc42c1 -Author: Dave Airlie -Date: Tue Jul 28 15:22:40 2009 +1000 - - ati: change to using ABI version check - -commit 21a621c297ac71c65c239ea960c38706e718b91c -Author: Dave Airlie -Date: Tue Jul 28 13:32:28 2009 +1000 - - ati: update for resources/RAC API removal - -commit 5ad2519c2a7c0df389b2cd7cf7151c7e4b7252a8 -Author: Michel Dänzer -Date: Mon Jul 27 14:22:02 2009 +0200 - - KMS: Explicitly specify VRAM and GTT domains when allocating BOs for pixmaps. - - Without this, apparently they are initially allocated in system RAM (or - possibly GTT), so any GPU rendering to them first triggers a copy of the whole - uninitialized data to VRAM... - - We may want to explore more sophisticated schemes in the future, but for now - this seems to improve KMS 2D performance quite a bit. - -commit 57f2c83a22f27567506c555af431f89e6031204c -Author: Alex Deucher -Date: Sat Jul 25 14:19:38 2009 -0400 - - radeon: Set PCI/PCIE bus type properly per asic - - - r1xx-rv350 chips have the old pci gart - - rv380+ chips have newer pcie gart - - Select the right kind regardless of whether the user selects - PCI or PCIE. - -commit 2afc46fa74ce7730f766a3370d323c6b59694186 -Author: Jerome Glisse -Date: Thu Jul 23 20:13:15 2009 +0200 - - radeon: fix KMS shadowfb for r6xx and newer hw. - - We need to map front buffer and also to avoid EXA initialization - when falling back to shadowfb on newer r6xx/r7xx when KMS is enabled. - -commit 328e4c816348b6f867df30b39856dbe78c8e0dcc -Author: Alex Deucher -Date: Thu Jul 23 13:28:36 2009 -0400 - - RS780: fill in MC access functions - - Also, r6xx/r7xx don't have indirect MC space, so - don't try to access it. - -commit f96d5b255425fbd02be2cad26edb590d474a5640 -Author: Alex Deucher -Date: Thu Jul 23 13:25:04 2009 -0400 - - R6xx/R7xx: clip rendering to destination surface dimensions - -commit e372f845b0defaf2d2c9ef3cbbf7498e09d9372e -Author: Michel Dänzer -Date: Sun Jul 19 16:05:29 2009 +0200 - - Guard reference to CRTC active field. - - Fixes build against older xserver. - -commit e38305aebdc95f80f5b4b3e5ba541ea67dc05f01 -Author: Michel Dänzer -Date: Sat Jul 18 22:23:45 2009 +0200 - - Also drop DRM master in KMS CloseScreen. - - The LeaveVT hook isn't always called when the server dies, e.g. when quitting - from the GDM greeter. This may cause existing servers to fall over if the dying - server process still exists when they try to re-acquire master and set a mode. - - Also use drmSet/DropMaster() rather than ioctl() directly. - -commit a43c660a00147bfae5ca601f4720b2680b75211f -Author: Michel Dänzer -Date: Sat Jul 18 22:21:59 2009 +0200 - - Set CRTC active flag to TRUE after a successful KMS mode set. - - Otherwise some things like changing the colour map won't work properly. - -commit f32069f42b3e4643f15148d0b96164def00dcc74 -Author: Michel Dänzer -Date: Sat Jul 18 22:20:08 2009 +0200 - - Set the STALL bit in the CRTC_GUI_TRIG_VLINE registers. - - As recommended by the register reference when using the WAIT_CRTC_VLINE bit in - the WAIT_UNTIL register, as we are. - -commit 27bd9fc9b2c0eeff488c1f26f1355a7fa3655520 -Author: Michel Dänzer -Date: Sat Jul 18 22:14:27 2009 +0200 - - Enable vsync for DRI2 region copies. - -commit 4b1b28865ffb17f58a70d955212fd51cb1fb55ab -Author: Alex Deucher -Date: Thu Jul 16 17:09:33 2009 -0400 - - R6xx/r7xx: reduce the amount of default state setup - - Most of the default state setup was extraneous or duplicated - in the accel ops. There's no need to reset all the consts - everytime you reset the default state for example. This leads - to a 10x reduction in default state. - -commit 7e6557b81026d8a4d6c837839e68c28b151f8a97 -Author: Peter Hutterer -Date: Thu Jul 16 11:33:57 2009 +1000 - - Update to xextproto 7.1 support. - - DPMS header was split into dpms.h (client) and dpmsconst.h (server). Drivers - need to include dpmsconst.h if xextproto 7.1 is available. - - Signed-off-by: Peter Hutterer - -commit 95d431e8b260dd43cf6d93b90eecab1dc0ec7c26 -Author: Dave Airlie -Date: Wed Jul 15 12:07:01 2009 +1000 - - radeon: emit colorpitch relocs. - - This causes relocs to be emitted for the colorpitch. - - Shouldn't have no effect on current kernels, but will keep DDX - going on kms kernels when tiling lands - - Also contains a missing reloc space for r200 - -commit 8312763977b22e108b7d003cbf3256e0165e4439 -Author: Alex Deucher -Date: Tue Jul 14 18:13:27 2009 -0400 - - Add an r420 AGP quirk - - fixes bug 22726 - -commit 5473eeeb45468fd200fec49a8506281628a5e4b5 -Author: Alex Deucher -Date: Tue Jul 14 14:05:13 2009 -0400 - - R3/4/5xx: only upload the bicubic texture once - - Upload the bicubic texture once during textured video init - rather than once per frame. Suggested by Michel Daenzer on - IRC. - -commit 0485f27bc3d75cb6ab320e8164dbe6ea2713c78e -Author: Alex Deucher -Date: Tue Jul 14 13:11:12 2009 -0400 - - R3/4/5xx: fix bicubic Xv filtering with KMS changes - - fixes bug 22730 - -commit ca4a9efef987108266ae59afbb5142d4d2000c8e -Author: Alex Deucher -Date: Mon Jul 13 11:28:41 2009 -0400 - - Add configure option to disable kms support - - Useful to building with mixed kms/non-kms setups - -commit 035e8d1d5593c12828bb079de4e663cf1b1f1674 -Author: Edward O'Callaghan -Date: Sun Jul 12 13:45:29 2009 +0200 - - Fix a warning - - Signed-off-by: Nicolai Hähnle - -commit 76af48c43f829e7aebacc9f2a623823fa26ee22b -Author: Gaetan Nadon -Date: Wed Jul 8 09:58:56 2009 -0400 - - xf86-video-ati: use XORG_CHANGELOG macro to create ChangeLog. #22611 - - Build break: Makefile.am: command not found: git-log - Adding the macro in configure.ac and use it in Makefile.am - Refer to: https://bugs.freedesktop.org/show_bug.cgi?id=22611 - Tested: running autogen.sh, make and 'make dist' - - Signed-off-by: Gaetan Nadon - Signed-off-by: Peter Hutterer - -commit 43db263d301082e84e9bc304816bcbb206fe280e -Author: Alex Deucher -Date: Thu Jul 9 12:48:06 2009 -0400 - - RV280: another AGP quirk - - fdo bug 12544 - -commit 69b5e5496f10a9f566d2e563862c96cb41952eb6 -Author: Alex Deucher -Date: Thu Jul 9 12:42:45 2009 -0400 - - RV280: Add an AGP quirk - - lp bug 370205 via fdo bug 12544 - -commit a6d6c900e60a3685ee9e93c34eb7f6d237c45fd8 -Author: Alex Deucher -Date: Thu Jul 9 11:30:57 2009 -0400 - - RS740: fixup display latency setting as per rs690 - - Both chips program the same in this regard - -commit ea407570d39ace3162d372eda56bf791bfd80c24 -Author: Dave Airlie -Date: Thu Jul 9 10:46:23 2009 +1000 - - radeon: add shave support. - - clean up output a lot - -commit 8c03c1fdb5ea35570064946557050c87ca30582a -Author: Alex Deucher -Date: Wed Jul 8 18:34:57 2009 -0400 - - R6xx/R7xx: fix hangs on x2 cards with PM options - - Changing the PCIE lanes on x2 cards results in a hang, - so for now, disable it. - - Fixes fdo bug 22669 - -commit 9645838c57f6b40837fdce23ce7f9faefb3d9966 -Author: Michel Dänzer -Date: Wed Jul 8 19:18:02 2009 +0200 - - Further non-KMS fixes / cleanups. - - Only compile tested. - -commit 2d86ec4ddb1fb83be95ed9cdcbabf4d568a6d7b6 -Author: Alex Deucher -Date: Wed Jul 8 12:33:34 2009 -0400 - - Fix the build for the !XF86DRM_MODE case - - compile tested only. - -commit a68afc2a80b8581cc3d67e9b5a95a10b0d4ead0e -Author: Michel Dänzer -Date: Wed Jul 8 09:15:28 2009 +0200 - - Fix RADEON_TRACE_FALL build. - -commit 9ca0aeaad01b7c682396b30af48668f287a59d6e -Author: Michel Dänzer -Date: Wed Jul 8 09:13:36 2009 +0200 - - Pass on CS relocation offset values. - - Not actually used ATM, but just in case... - -commit f718dd794477fbdd5eeb4183f43ff25517c63034 -Author: Michel Dänzer -Date: Wed Jul 8 09:11:18 2009 +0200 - - Don't set EXA UploadTo/DownloadFromScreen hooks when they'd always return FALSE. - -commit 42e76d0b24b76fbcc6b08a4ea5003dbec368645c -Author: Michel Dänzer -Date: Wed Jul 8 08:51:10 2009 +0200 - - Don't always flush CS when switching from 2D to 3D. - - This works fine here and doubles x11perf -aa10text scores, but may cause - problems on other setups according to Dave. Let's see... - -commit 94fe049c35187ddc3ec0472e9309c3a22879f415 -Author: Michel Dänzer -Date: Wed Jul 8 08:36:22 2009 +0200 - - KMS CS fixes, take two. - - Avoid flushing CS in the middle of (setting up state for) an operation, - properly finish/restart the operation. - -commit 0519f15af2fe5e7e5a6c94e7203a96fe363c643e -Author: Michel Dänzer -Date: Tue Jul 7 10:04:09 2009 +0200 - - Fix DRI2 with current xserver Git. - -commit 7ad11fec2579807371360cb680e593f723ebaa1a -Author: Dave Airlie -Date: Mon Jul 6 18:43:08 2009 +1000 - - radeon: add make dist headers - -commit e68fbf743ec88e0fa3a9f1ffe83daf251e250b21 -Author: Dave Airlie -Date: Mon Jul 6 18:32:32 2009 +1000 - - git: fix git-log to git log - -commit 5eeb1fd19c6797cc76ce308570dffe34cb82b24d -Author: Dave Airlie -Date: Mon Jul 6 17:45:50 2009 +1000 - - radeon: oops fix compile without libdrm - -commit 98824f37fc74dc1fec2677515d0dc3cfc263f00a -Author: Dave Airlie -Date: Mon Jul 6 15:29:53 2009 +1000 - - radeon: move state changes into flush function - -commit 503b51343267248b4c6994b88238dd5384528f03 -Author: Dave Airlie -Date: Mon Jul 6 15:20:13 2009 +1000 - - radeon: taken from kms-support + CS fixes commit. - - re-emit 2D state and reset 3D state emit on flush - -commit d78d50591851d14543f0935d051a59ef29751bbc -Author: Dave Airlie -Date: Mon Jul 6 14:45:07 2009 +1000 - - radeon: port to new space checking in libdrm interface - - This uses a new libdrm interface which shares code with mesa. - - It also fixes the bo to flush when full instead of never flushing. - - It survives gtkperf -a here which the driver didn't before now - -commit e1200cb89218930d01330ba0114e013438655cce -Author: Dave Airlie -Date: Mon Jul 6 15:10:29 2009 +1000 - - Revert "KMS CS fixes." - - This reverts commit 11cf8a28eb46f48d101888552266921bee8b63fc. - - I'll bring this back in a few minutes, I've got a big change introducing - a new cs space accounting scheme which this messes up and I think - probably conflicts with what I've done. - - I promise i'll go over this and pick the bits that are still useful :) - -commit 11cf8a28eb46f48d101888552266921bee8b63fc -Author: Michel Dänzer -Date: Sun Jul 5 15:14:59 2009 +0200 - - KMS CS fixes. - - * Flush CS before running out of space. - * Don't flush CS every time when switching between 2D and 3D engine, but make - sure to re-initialize 2D/3D state after flushing. - - Doesn't seem quite perfect yet (some rendering seems to get dropped on the floor - sometimes), but this should fix a lot of CS failures people have been seeing. - -commit 8d2f712eaf1e569fd92bbe2db5aceb43b7b367d1 -Author: Dave Airlie -Date: Fri Jul 3 10:40:59 2009 +1000 - - radeon: don't set up overlay under KMS until we figure out how. - -commit 2a622168606d98c404708b879e6417c8f7d7305c -Author: Michel Dänzer -Date: Thu Jul 2 15:03:53 2009 +0200 - - Test BO pointer before passing it to radeon_bo_unref(). - -commit 36a4ea5a9c7062f4c8aa7480bb7488ce2062390f -Author: Michel Dänzer -Date: Thu Jul 2 14:52:44 2009 +0200 - - Warning fixes. - -commit 65465d56c1bf943113518a5b2f57b3170213bab9 -Author: Dave Airlie -Date: Thu Jul 2 18:38:38 2009 +1000 - - radeon: fix up configure check better - -commit ad17108b72c9adf773a122b4c054c7b92e6a8b9d -Author: Dave Airlie -Date: Thu Jul 2 17:25:57 2009 +1000 - - radeon: fix it properly. - - I blame the flu - -commit e1b9cb9ea665eaa84e64a386299efa0819d55df4 -Author: Dave Airlie -Date: Thu Jul 2 17:18:47 2009 +1000 - - radeon: fix compile without kms - -commit de427fac6912a625f7e4d8b982a1f7a1ba80dfbe -Author: Dave Airlie -Date: Thu Jul 2 15:41:43 2009 +1000 - - radeon/dri2: fix dri2 - needs newest libdrm_radeon - -commit 2b671adba54ebff1756dd990123f4bade6e35d61 -Author: Dave Airlie -Date: Thu Jul 2 15:25:19 2009 +1000 - - radeon/dri2: call proper gem bo function - -commit 851b2b8cab883e4422745cca1827aa8ac9f193a3 -Author: Dave Airlie -Date: Thu Jul 2 15:17:13 2009 +1000 - - radeon/kms: add textured video BO size checks - -commit 9d092060236e8587697fdd57a7a01f3c0dddd680 -Author: Dave Airlie -Date: Thu Jul 2 15:17:03 2009 +1000 - - kms: drop DGA - -commit 207174ea964c561076bdd5297a2fb6f136b4b645 -Author: Dave Airlie -Date: Thu Jul 2 15:16:47 2009 +1000 - - radeon: fix CS imbalance - -commit 4d24a9d2c0be0c025266cc8cdf7e8d7bb065cdb1 -Author: Dave Airlie -Date: Thu Jul 2 14:55:45 2009 +1000 - - radeon: enable KMS build - -commit 9bcd3ae7966eb7a17b922bcd33e0d6f016245614 -Author: Dave Airlie -Date: Thu Jul 2 14:55:18 2009 +1000 - - radeon/kms: fixup 3d state emission for KMS - - This fixes font rendering under KMS (should have looked at dmesg) - -commit ac1607bb23f0c7584648407a3ac3fb27142e186e -Author: Dave Airlie -Date: Thu Jul 2 14:55:05 2009 +1000 - - kms: no need to reference fifo slots - -commit 1782ce28953184776c90eb1255208a3e0ad245f0 -Author: Dave Airlie -Date: Tue Jun 30 16:55:26 2009 +1000 - - radeon: add KMS support (still disabled) - - This adds DRI2 + KMS + driver pixmaps support to the driver. - - I've decided to just do a completely separate KMS driver file - instead of hacking the crap out of radeon_driver.c. So now - I do the KMS check in radeon_probe.c time and set the DDX - pointed up to a completely different set at this stage. - - This avoids a lot of if (kms) type crap in the code at - the expense of making sure we make changes to both files - if necessary. - - This code is still disabled in configure.ac as I broke EXA composite - rendering somehow in KMS mode - -commit ac4bd24a66c1bdda0293f770a3f891e2b88cc8ee -Author: Alex Deucher -Date: Tue Jun 30 16:00:06 2009 -0400 - - EXA: fix the build on servers without EXA_HANDLES_PIXMAPS - -commit 49a0ca19ee4109cdd39a43fbf4bedf3f0557d6ec -Author: Michel Dänzer -Date: Tue Jun 30 17:22:50 2009 +0200 - - Warning fixes. - -commit e932836691aeaec37794fdaed2dabb22710fd171 -Author: Dave Airlie -Date: Tue Jun 30 16:24:37 2009 +1000 - - radeon: initial preparation for kms patch. - - This patch contains most of the changes to the EXA and texture video - accel code. - - It adds a few bits of pixmap support but doesn't actually do anything - useful KMS yet. - - Testing this should not have any regressions over what we have already, - biggest worries are r6xx, I've fixed a textured video one, but no idea - what other might lurk - - It won't build against libdrm radeon yet either - -commit bb04b450ed00ca4b1aa44c33085567d47b33b547 -Author: Fredrik Höglund -Date: Mon Jun 29 22:38:26 2009 +0200 - - Check if the composite op is supported in R200CheckComposite. - -commit f39cafc5c4a93a16ac93756473ebb1f33c7881db -Author: Alex Deucher -Date: Sun Jun 28 20:42:49 2009 -0400 - - radeon: call hdmi-b connectors dvi in randr - - Technically HDMI-B is a glorfied DL DVI, but this is confusing - to users, so call it DVI when reporting randr outputs. This - allows us to remove two quirks where the bios was actually - correct. - -commit 407e676b04117c7ca3dcc0cc072f3552b03c64e5 -Author: Roland Scheidegger -Date: Sun Jun 28 16:54:32 2009 -0400 - - R6xx/R7xx: fix pixel centers - - Make sure we are using GL mode (centers at 0.5) rather - than D3D mode (centers at 0.0). This also fixes fdo - bug 21963. - -commit 68001981f22173ff949720055dba89291f284474 -Author: Alex Deucher -Date: Sun Jun 28 16:20:10 2009 -0400 - - Add some missing M96 pci ids - - fixes fdo bug 22404 - -commit 06d5d8d7fd92b58b2467c782e57a80a3520a2c90 -Author: Adam Jackson -Date: Thu Jun 25 13:51:36 2009 -0400 - - Add a (harmlessly) missing break statement. - -commit 7d1d968fdc8de1e0ab0be916a1f3a4a398af47aa -Author: Adam Jackson -Date: Thu Jun 25 13:49:18 2009 -0400 - - Cosmetic cleanup to digital output detection - - No functional change, but this logic would need extending anyway for - DisplayID, so unify it now. - -commit 96581746eea2f4e29a04f9266ec9649f25480424 -Author: Adam Jackson -Date: Wed Jun 24 17:05:47 2009 -0400 - - atom: Fix phantom VGA connector when HDMI-B present. - - HDMI-B is really a glorified DL-DVI connector, the analog pins work fine. - -commit 496adc4dc7cf53fc6acfecb1158f1491d5f36168 -Author: Michel Dänzer -Date: Fri Jun 19 14:37:01 2009 +0200 - - Revert "Build fixes for -Werror that aren't ready for prime time yet." - - This reverts commit ab20ea1530ec8a3a9fd4089775c4e157e50fe1bf. - - Whoops, pushed wrong branch... - -commit ab20ea1530ec8a3a9fd4089775c4e157e50fe1bf -Author: Michel Dänzer -Date: Sun Jun 14 16:50:07 2009 +0200 - - Build fixes for -Werror that aren't ready for prime time yet. - -commit 77e3537d312175a25f0e21cc07c3a96f78c3b35a -Author: Markus Gapp -Date: Sat Jun 13 11:51:29 2009 -0400 - - Add quirk for asus hd3450 board - - Fixes bug 22266 - -commit e8e0bb1ba29761c94d473e42ca6ada161cfff557 -Author: Alex Deucher -Date: Fri Jun 12 11:07:43 2009 -0400 - - Fix count in 3d state setup after 43374c7420e378918bec062f4cbd581f16adb6f0 - -commit 808c90a24c48da7fa97e15e2f12be5bb8fd8cc96 -Author: Alex Deucher -Date: Thu Jun 11 16:09:40 2009 -0400 - - Only enable frac fb divs on rs600/rs690/rs740 for now - - fixes bug 21413 - -commit d095bb3157faaee10b0130ea9b1032e0b533aaee -Author: Alex Deucher -Date: Thu Jun 11 12:34:15 2009 -0400 - - Re-enable frac feedback dividers on AVIVO hardware - - Preferring a freq <= target frequency seems to fix the - previous issues with frac fb divs. Appears to work fine - on all hardware I've tested on. See fdo bug 22229 for - details. Should fix bugs: 22229, 21553, 21413, and - possibly other ones related to unstable images at certain - resolutions. - -commit 55fbdbae83d1563b472f49d0436c9298e390be66 -Author: Alex Deucher -Date: Thu Jun 11 12:31:53 2009 -0400 - - Add PLL flag to prefer frequencies <= the target freq - - This appears to be needed when using fractional feedback - dividers. Based on a patch from Tom Hirst. See fdo - bug 22229 for more details. - -commit 43374c7420e378918bec062f4cbd581f16adb6f0 -Author: Alex Deucher -Date: Tue Jun 9 14:39:54 2009 -0400 - - r1xx/r2xx: clip 3D rendering to destination buffer - -commit 74b0a38c75c1d6a6344015d32d84b43d9e80df1d -Author: Alex Deucher -Date: Tue Jun 9 14:26:21 2009 -0400 - - Consolidate indentical RADEONDoneSolid/RADEONDoneCopy functions - -commit f6dff8836729cc9d29264080c9cfa0e1df6182cf -Author: Alex Deucher -Date: Tue Jun 9 13:31:15 2009 -0400 - - r3xx/r4xx/r5xx: clip 3D rendering to destination buffer - -commit 48dbf09e1309c815ac8b733145a0310083a29933 -Author: Alex Deucher -Date: Tue Jun 9 13:12:40 2009 -0400 - - r3xx/r4xx/r5xx: refactor exa prepare composite - - - consolidate code duplicated between r3xx/r4xx and r5xx - - make pixel shader setup easier to read and less - redundant - -commit ec1a3ccdf61c2226617b571cc4a209a542e9d7e3 -Author: Alex Deucher -Date: Mon Jun 8 15:31:57 2009 -0400 - - R6xx/r7xx: don't clamp tex coords in composite VS - - Fixes broken repeat modes. see fdo bugs 21818, 22139 - -commit 32c218c5633fb7ffeb19e717bf645c1b25dd4ef5 -Author: Alan Coopersmith -Date: Thu Jun 4 07:23:03 2009 -0700 - - Add link to patch submission instructions to README - - Signed-off-by: Alan Coopersmith - -commit 39f736d6cb65fc7c3fd769478023fc87c1af5979 -Author: Alex Deucher -Date: Thu Jun 4 09:57:22 2009 -0400 - - atom: connector quirk - - Some r6xx cards have a VGA and an HDMI port with - a shared ddc line listed as an HDMI port with both - analog and digital encoders. - - Fixes bug 19943 - -commit 7599dc40855c33a5fbd8e9bbc2b4cd62752fb7df -Author: Alex Deucher -Date: Fri May 29 16:29:50 2009 -0400 - - Add RV740 (HD4770) support - - Verified by ernstp on IRC - -commit ee0424078a3ea26f58c2998c9e58e065fb63f1a0 -Author: Alex Deucher -Date: Wed May 27 18:37:58 2009 -0400 - - radeon: remove dead code - -commit b34df233115c0d82d7bcf82e041afbc55981ce82 -Author: Alex Deucher -Date: Tue May 26 17:47:01 2009 -0400 - - R3xx/R4xx: increase EXA render target limits - - now that we are using 1/12 subpixel mode - -commit 1457bc089d1395d18cf582a4d52444005f013753 -Author: Matthieu Herrb -Date: Tue May 26 17:21:07 2009 -0400 - - radeon: fix segfault if Option "NoAccel" is set - -commit 4079f97958cf1d5fd76a83aa61b93d6289bb9b1e -Author: Michel Dänzer -Date: Sat May 23 13:51:00 2009 +0200 - - Bump version to mark Git snapshot. - - The fourth version component isn't visible in the log file. - -commit 88a9e98341d96e5e7f48b69aed597d1bada6313a -Author: Alex Deucher -Date: Tue May 19 17:11:34 2009 -0400 - - Pre-atom: Improve engine clock setup code - - Also remove SetMemoryClk() for pre-atom cards for now - as it requires quite a bit more asic specific work. - To set the mclk we'll need to use the mem reset/dll tables - in the bios. - -commit 1429133ffdbfe046249fcaaa4cbee432a1012e55 -Author: Michel Dänzer -Date: Mon May 18 17:59:00 2009 +0200 - - EXA: Set new EXA_SUPPORTS_OFFSCREEN_OVERLAPS flag when we have a 2D engine. - -commit e9cca1e7dc521d3756bb2d97f1d703b9ad65cb47 -Author: Alex Deucher -Date: Mon May 18 10:48:25 2009 -0400 - - r4xx: Add some missing pci ids - - Noticed by Romain in bug 21798 - -commit 76fffd51027820b3a6ea10de2be67d5fd4f3e843 -Author: Alex Deucher -Date: Fri May 15 16:35:13 2009 -0400 - - R100: switch to normalized texture coordinates - - for consistency with the other asics - -commit 1a1eef31e36f98b7a30e27e567c1b66e0e4cf7dc -Author: Alex Deucher -Date: Thu May 14 15:48:54 2009 -0400 - - radeon: try harder when checking if a card is posted - - fixes debian bug 524280, possibly others. - -commit 22e39392297fa11003df90c175db3c449d8f9853 -Author: Michel Dänzer -Date: Thu May 14 10:24:07 2009 +0200 - - Pre-R600 EXA: Fix coordinate limits off-by-one error. - - Fixes http://bugs.freedesktop.org/show_bug.cgi?id=21598 . - -commit fa09b058c7a17689989e600ffd465856a058579d -Author: Alex Deucher -Date: Wed May 13 16:10:40 2009 -0400 - - R6xx/R7xx Xv: normalize texture coordinates in the vertex shader - -commit 026b6f820d6caea17d2a082193e850713d5770a8 -Author: Alex Deucher -Date: Wed May 13 15:48:32 2009 -0400 - - R6xx/R7xx: do EXA transforms in the vertex shader - -commit cd89241396d1931b04cfbdd8d553be16dbf9c360 -Author: Alex Deucher -Date: Tue May 12 17:30:02 2009 -0400 - - R3xx-R5xx: do EXA transforms in the vertex shader - -commit 15ee78d37f8b64c3e6d234e7ab37a31e82327b6b -Author: Alex Deucher -Date: Mon May 11 02:22:13 2009 -0400 - - RV770: add missing pci id - - Fixes bug 21209 - -commit 5ff51ea83f9fdd836e830c77e3561eaef4b83183 -Author: Alex Deucher -Date: Fri May 8 13:19:26 2009 -0400 - - R7xx: add support for reading disabled bios images - -commit 76fdae9018330aa5af0d57339baff3ca4834e1b5 -Author: Alex Deucher -Date: Thu May 7 02:59:32 2009 -0400 - - R3xx/R4xx tex vid: no need to check if IS_R300_3D - - function is r3xx/r4xx specific already - -commit 23a8ada06a5b1ccc975e89f129c00382ecbf29df -Author: Alex Deucher -Date: Thu May 7 02:34:22 2009 -0400 - - R3xx/R4xx tex vid: increase the guardband limit for rendering with a tri - - limit goes from 2880 to 4021 now that we've switched to 1/12 subpixel mode. - - This allows us to render with a clipped tri at higher resolutions preventing - diagonal tearing. - -commit 0c3541f7013c53fb8096ada63cc7b3577524aa4c -Author: Alex Deucher -Date: Wed May 6 12:24:35 2009 -0400 - - AVIVO: set default cursor mode in cursor init - - Should fix bug 21557 - -commit da58e351b6398fa18b1d9c1a57a6e49b285f610f -Author: Alex Deucher -Date: Mon May 4 16:03:53 2009 -0400 - - AVIVO: fix cursoe corruption bands for real - - Don't have to leave both cursors enabled, just have to use - the same mode for both cursors whether or not they are enabled. - -commit 2c8e130f73c680d4a7381b2ef37982b82c6ee478 -Author: Alex Deucher -Date: Mon May 4 13:40:17 2009 -0400 - - radeon: switch to EXA by default - -commit 8155a62df6817358a12cc2d613c1470ca55996ef -Author: Alex Deucher -Date: Mon May 4 12:57:36 2009 -0400 - - AVIVO: move cusor offscreen when disabling - - Adapted from Yang's patch. Setting size to zero is - actually a 1x1 cursor. - -commit a1c64ea5224009779ccad66b0f84d861eae966ac -Author: Alex Deucher -Date: Sun May 3 19:42:44 2009 -0400 - - r3xx-r5xx: switch to 1/12 subpixel precision - - - based on similar patch in Jerome's cs ddx tree - - also fix clipping offsets - - should eventually allow for 4k render targets - - mesa driver uses 1/12 mode, this avoids changing the - subpixel mode when switching between ddx and mesa - -commit 3880bc3c95764acccd62cfa438932458df95daf6 -Author: Alex Deucher -Date: Sun May 3 19:01:28 2009 -0400 - - Remove some old debugging info - -commit 3362381aa3a97c1da564f8a479ed4e7b0d6368b8 -Author: Alex Deucher -Date: Sun May 3 18:52:00 2009 -0400 - - r2xx-r4xx: fix typo in last i2c fix and clarify hw i2c pin sel - -commit e01b8dc827ce1913927e1a4fad05a99a2dd9e805 -Author: Alex Deucher -Date: Sun May 3 13:09:39 2009 -0400 - - RS690: gpio/connector fixes - - Fixes bug 21521 - -commit 1f70c9f05df9017d87b37f887e1eccd6d0568a02 -Author: Alex Deucher -Date: Thu Apr 30 19:18:13 2009 -0400 - - R3xx-R5xx: don't set TX_OFFSET_RS in RS_INST_COUNT - - Isn't necessary and seems to cause problems for RS690 users - -commit de17d36c1f710305870e3c636cae3f742f1cb6d6 -Author: Alex Deucher -Date: Thu Apr 30 19:13:09 2009 -0400 - - AVIVO: first pass at display watermark setup - - This helps with flickering and blanking when - there is contention for MC bandwidth. - -commit 7d9f643ae3d07e51e644a5979ca90bc2c102bc89 -Author: Alex Deucher -Date: Wed Apr 29 12:38:15 2009 -0400 - - radeon: fix several dpms issues - - - atom dpms was unblanking for standby/suspend - - return if r600+ in radeon_crtc_modeset_ioctl() - - remove seprate standby/suspend handling in legacy - crtc dpms. we turn the outputs off, so turn the - crtcs off too. - - disable the crtcs in legacy crtc dpms - - move radeon_crtc_modeset_ioctl() calls to radeon_crtc_dpms() - so they will get called for both atom and legacy paths - - Should fix bug 21321 - -commit 35183ef528411eb0122cf48550d93f921d291d12 -Author: Alex Deucher -Date: Wed Apr 29 01:55:10 2009 -0400 - - AVIVO: better fix for cursor flickering/corruption issues - - Should prevent ghost cursor from being left on screen. - -commit 53e75cbd0ba8f39799d7b776cdc59d60aa2a6916 -Author: Alex Deucher -Date: Wed Apr 29 01:05:31 2009 -0400 - - R6xx/r7xx: fix CURSOR_SWAPPING_* macros - - r6xx/r7xx have different swapper regs - -commit 4e948e2aaa59267a9aa797396add2c6b7b4c1e7c -Author: Alex Deucher -Date: Tue Apr 28 19:28:25 2009 -0400 - - AVIVO: fix cursor corruption/flickering issues - - When both crtcs are enabled, both cursors need to be enabled - or you get corruption bands. - - Thanks to Yang Zhao for figuring this out. - -commit 4d0beaf02b28d5a5dac4ff6053593a2f979f92ec -Author: Alex Deucher -Date: Tue Apr 28 12:33:24 2009 -0400 - - RV410: SE variants only have 1 quad pipe - - Should fix EXA corruption with the 3D engine. - Mesa and drm patches forthcoming. - - Reported by Kano on IRC. - -commit abd565ae71d9844d5afcd658628ca7778ce26ab1 -Author: Alex Deucher -Date: Mon Apr 27 14:21:38 2009 -0400 - - AVIVO: disable fractional feedback divs - - Doesn't seem to work well in all cases. Needs more investigation. - fixes bug 21413 - -commit 93626b1277f57bd559cf71b263221209b02e0046 -Author: Alex Deucher -Date: Mon Apr 27 03:35:24 2009 -0400 - - AVIVO: make sure cursor width isn't negative - -commit 32af0f097bccc4499d67e969d46ba35e7487c5e2 -Author: Dave Airlie -Date: Sat Apr 25 19:39:34 2009 +1000 - - Revert "r300/r500: set R clamp mode." - - This reverts commit dab3d61619d91ae6a3da3e9b29b8258313653813. - -commit b2c8f57bccbd46164907049a26ad2dd209d7b108 -Author: Dave Airlie -Date: Sat Apr 25 19:39:19 2009 +1000 - - Revert "r3xx/r5xx: fix typo in last commit" - - This reverts commit 1a7b982457ead5f21c6e62a409ca0dbf86005607. - -commit 253731dce6ab25122f2eda559233c098536b7143 -Author: Dave Airlie -Date: Sat Apr 25 19:39:05 2009 +1000 - - Revert "radeon: attempt to fix R clamping for repeat again" - - This reverts commit 5998f262a52cb85b334fcc1fe24c7b2ae474ce93. - -commit 5998f262a52cb85b334fcc1fe24c7b2ae474ce93 -Author: Dave Airlie -Date: Fri Apr 24 17:30:57 2009 +1000 - - radeon: attempt to fix R clamping for repeat again - -commit 7ed27b926f28a1f088eace5034a7d9985f13752d -Author: Alex Deucher -Date: Thu Apr 23 14:06:06 2009 -0400 - - r2xx/r3xx/r4xx: further i2c fixups - - - hw i2c engine has pin selection on r2xx/r2xx/r3xx chips - - also switch hw i2c pin sel for external tmds - -commit 0da80f34b5aa5999d2030ffbc5187328fa4e4ae5 -Author: Alex Deucher -Date: Wed Apr 22 18:42:36 2009 -0400 - - radeon: minor cleanup and warning fix - -commit 1a7b982457ead5f21c6e62a409ca0dbf86005607 -Author: Alex Deucher -Date: Thu Apr 23 10:09:22 2009 -0400 - - r3xx/r5xx: fix typo in last commit - - Noticed by osiris on IRC - -commit dab3d61619d91ae6a3da3e9b29b8258313653813 -Author: Dave Airlie -Date: Thu Apr 23 15:46:44 2009 +1000 - - r300/r500: set R clamp mode. - - On rs690 without this set, we appear to end up fetching from well - outside the texture sometimes into memory that isn't mapped. - - This "shouldn't" have any effect. - -commit bbfd4625478e37d10fd58b23f46153f349370a52 -Author: Alex Deucher -Date: Wed Apr 22 14:47:16 2009 -0400 - - radeon PM: update quirks - -commit e3c564114eea4d032f920fcebd4040f1934c21b0 -Author: Alex Deucher -Date: Wed Apr 22 14:31:44 2009 -0400 - - AVIVO: fix for cursor corruption issue - -commit 24e4b73b4fbbb2c790e6120ede3caaa4e7e58359 -Author: Alex Deucher -Date: Wed Apr 22 11:42:18 2009 -0400 - - radeon pll: add support for fractional feedback divs - - Allows us to hit dot clocks much closer, especially on - chips with non-27 Mhz reference clocks like most IGP chips. - - This should fix most flickering and blanking problems with - non-exact dot clocks. - -commit efa0825a86a8dc0f03ebb42c576ed26189e9d4bb -Author: Alex Deucher -Date: Tue Apr 21 13:51:11 2009 -0400 - - Tex vid: fix top clipping - -commit aa59b5b55e6ac64940fb3f0fa61f7b8fe36ba745 -Author: Alex Deucher -Date: Tue Apr 21 12:06:24 2009 -0400 - - RS690: add quirk for acer board - - thanks to Gino Badouri for testing - -commit 0e5164d968316bbb59b4484a7df087854738068f -Author: Alex Deucher -Date: Tue Apr 21 04:47:43 2009 -0400 - - Tex vid: rework part 2 - - - use pPriv->w/h directly for tex coords - - take src x/y offset into account when calculating tex coords - - when copying data, only optimize for y clipping. In order - to deal with the x clipping optimization, the copy routines - or tex coords would need to be fixed. This should fix clipping - problems with the current code. - -commit 06a1b4169b506f69dd807380d9ce7210b3a3bc23 -Author: Alex Deucher -Date: Tue Apr 21 01:21:51 2009 -0400 - - R4xx: avoid a PM related hang - -commit 228b9ac87668241b09980fca17e9d866891285e6 -Author: Alex Deucher -Date: Tue Apr 21 01:02:34 2009 -0400 - - radeon PM: add some quirks - -commit b6febf7368d3df3f1d3fee6a87aa71c54e77cdcc -Author: Alex Deucher -Date: Mon Apr 20 18:04:18 2009 -0400 - - Tex vid: cleanup and unify common code - -commit d096d1189c8dc5e19f68cc605ccffe1a8fef048b -Author: Alex Deucher -Date: Mon Apr 20 13:05:18 2009 -0400 - - Endian fixes for object table - -commit 101ce28ec4af696549b7d6defebb5b4ad412176c -Author: Alex Deucher -Date: Sun Apr 19 12:13:18 2009 -0400 - - Remove old messages - - R5xx/r6xx support isn't really experimental anymore - -commit db177c70ce88af19c8e05eb916a15f3e124876eb -Author: Alex Deucher -Date: Fri Apr 17 01:05:15 2009 -0400 - - Update Xv info in man page - -commit 00266177bed2dc8693df497ca3ec19f2dc4adc05 -Author: Alex Deucher -Date: Thu Apr 16 20:33:28 2009 -0400 - - R3xx/R5xx: only apply Xv attributes if bicubic is disabled - - Provides consistent output - -commit 85323a7f84381fef7fad20c7f7ec601637af9aa7 -Author: Alex Deucher -Date: Thu Apr 16 11:10:51 2009 -0400 - - R3xx/R4xx: set tex caching for Y texture when doing planar rendering - - Doesn't affect performance, but docs indicate its the right - thing to do. - -commit 5ea5df22c038fc8f00984acc760e9d8c962bf902 -Author: Alex Deucher -Date: Wed Apr 15 20:26:34 2009 -0400 - - Tex vid: remove remnants of XV_HWPLANAR - - no longer needed as bicubic is the only thing that uses - the old csc code. - -commit 9091b3f5f13dbea83ffd89679dac600e9f280bb2 -Author: Alex Deucher -Date: Wed Apr 15 20:07:42 2009 -0400 - - R3xx/R4xx: fix up planar shader - - We were overwriting the coord fetch address with the first - tex fetch. Seemed to work however, luck I guess. Reorder - the fetches to write to temp0 last. - -commit 14c13faeb9f9b7717a25fcc1ca97d46cc6ee0031 -Author: Alex Deucher -Date: Wed Apr 15 19:53:12 2009 -0400 - - R5xx: add shader-based csc - - - native planar support - - Xv attributes - -commit 832efc7b90f5eb2da99512fcb902ab4838d2dcd1 -Author: Alex Deucher -Date: Tue Apr 14 17:56:49 2009 -0400 - - R3xx/R4xx: Implement shader-based csc for packed formats - -commit 32625118c27041265d25811c00d25ab7e82fb340 -Author: Alex Deucher -Date: Tue Apr 14 16:38:40 2009 -0400 - - tex vid: fix attribute setup typo for XV_COLORSPACE - -commit adf0912006b4f1597784dbfcc563d5c6d1c5667d -Author: Alex Deucher -Date: Tue Apr 14 16:16:33 2009 -0400 - - R6xx/R7xx: implement Xv attributes - - - brightness, contrast, hue, etc. - - TODO: implement gamma - -commit 8810fe92b5aed08888584c6914482586b59f71ab -Author: Alex Deucher -Date: Tue Apr 14 11:26:35 2009 -0400 - - R200: clean code, always use shader based csc - - - consolidate common r2xx csc shader code - - always use shader based csc for both packed and planar - formats - - always use native planar csc on r1xx - -commit 17685fefba68d188c7c0fe7a079180ec0722c046 -Author: Alex Deucher -Date: Mon Apr 13 20:06:11 2009 -0400 - - Tex vid: general cleanup - - - convert macros to more meaningful VTX_OUT_4 and VTX_OUT_6 - names to reflect that they actually do - - fix indenting - -commit 093ab4c9a33b0b396b78c061c3321dc044bdccdc -Author: Alex Deucher -Date: Mon Apr 13 19:48:35 2009 -0400 - - R1xx: add support for native planar textured Xv - -commit ec0cb51df81c6c9a1de640d227fa9c9c33161083 -Author: Alex Deucher -Date: Mon Apr 13 17:21:20 2009 -0400 - - R2xx tex vid: append verts for clip boxes - - rather than sending a new draw packet for each rect - -commit fde075a30a8ee2c333aa1bbe8fbd177258b085ba -Author: Alex Deucher -Date: Mon Apr 13 17:13:51 2009 -0400 - - R1xx tex vid: append verts for clip boxes - - rather than sending a new draw packet for each rect - -commit 12839fc17a2cca4ac14b9757bdaa63ba4679f96f -Author: Alex Deucher -Date: Mon Apr 13 17:04:31 2009 -0400 - - Tex vid: split by family - -commit a30737b337edb31528174b483c9094941a5d41bb -Author: Roland Scheidegger -Date: Mon Apr 13 15:36:07 2009 -0400 - - r200/r300: implement brightness/contrast/hue/saturation/gamma controls for textured video - - This implements - contrast/brightness/hue/saturation controls for r200/r300 plus gamma (same - gamma value for all channels used though separate values would be trivial) - control for r300. - Some issues left: - - only r200/r300 - - still can't be combined with bicubic - - controls will silently cease to work if the format used is packed and not - planar (except for rv250) - - gamma range is from 100 to 10000 corresponding to 0.1 and 10.0 like used in - overlay. However, usable range is far smaller. Over 2.0 picture gets dark - pretty quickly, and below 0.6 or so black seems to turn into purple (I've - verified that even with gamma 1.0 black actually often seems to be RGB 1/0/1 so - this explains this since that gets amplified by low gamma values - not sure if - this is a rounding problem somewhere, bogus reference values or is somehow - expected). - - gamma adds a bit too many instructions for my taste (7) though the - alternative (3 texture lookups + some swizzling instructions) doesn't seem any - better. - -commit 9dd33cc8346073300312cd5f68de72d9bea1dd6b -Author: Dave Airlie -Date: Fri Apr 17 10:30:21 2009 +1000 - - radeon: tweak ddc fix for all r300s. - - Alex seems to think this might affect some other chips - -commit a846ec14dd65bb12f314f83ffb45c4c4be564a5e -Author: Dave Airlie -Date: Fri Apr 17 10:24:15 2009 +1000 - - radeon: fix DDC on rv410 VGA ports for non-atom use. - - The rv410 hw i2c block appears to hold down whatever i2c lines - it is connected to when in reset, so when doing DDC change hw i2c to - point at different i2c lines. - -commit efa1476fc0765b53298624198137dc5cc71d37a8 -Author: Alex Deucher -Date: Thu Apr 16 16:43:02 2009 -0400 - - PM: fix reversed logic in pm block handler - -commit 2b95de17781959457a809c8fecc6bbb08336c83f -Author: Alex Deucher -Date: Thu Apr 16 12:52:41 2009 -0400 - - RS400/RS480: attempt to fix ClockGating on RS4xx chips - -commit c0215d2f2a27755fb04d20aaa4320a5e7da7ee04 -Author: Alex Deucher -Date: Thu Apr 16 11:58:19 2009 -0400 - - RS690/RS740: fix connector enumeration in some cases - - Should fix Masta-G's issue reported on IRC. - -commit 573339114660f06e5f257648ba413bab0d6083ce -Author: Alex Deucher -Date: Thu Apr 16 11:19:01 2009 -0400 - - R3xx/R4xx EXA: set explicit tex cache regions - - When using a mask, set explicit cache partitions for - each texture. Gives 1% performance improvement in - x11perf with anti-aliased text. - -commit eea9800890b56bac9c07b7bd9c9e33fae2938af3 -Author: Alex Deucher -Date: Thu Apr 16 10:41:28 2009 -0400 - - Revert "DCE3/3.2: cleanup dpms after previous changes" - - This reverts commit f8c7d6a6162196a743f6885ecaf63ba50de1722a. - - This is apparently still needed for some setups, however, I can't - reproduce this locally anymore. - -commit 099cb27d760af61b967239d960bc77f71e828655 -Author: Alex Deucher -Date: Wed Apr 15 16:23:01 2009 -0400 - - Change ForceLowPowerMode to 4 pcie lanes - - This fixes corruption for some users - -commit 5abcea88d1f3307a7d08ae7757c4b535df1503bf -Author: Alex Deucher -Date: Wed Apr 15 15:52:04 2009 -0400 - - PM: don't touch clock gating regs unless ClockGating option is set - - Fixes an M26 hang reported by tormod on IRC - -commit bae88f81e2a01c0d547132b5b91e717ff9d0497d -Author: Alex Deucher -Date: Wed Apr 15 14:38:35 2009 -0400 - - man page: fix missing break - -commit 4b3a3785f7b06205eeec6ca6b8913ecc2b94bd1f -Author: Alex Deucher -Date: Sat Apr 4 11:39:35 2009 -0400 - - Unify ForceLowPowerMode and DynamicPM Options - - Force lower power mode and switch to a lower mode - when idle. - -commit 63cb57c5eb0d6bc083f54eb100cb972b0e7bca69 -Author: Alex Deucher -Date: Wed Apr 1 16:22:02 2009 -0400 - - Add DynamicPM Option - - Dyanmically switch between power states. Switch to a low - power state when the system is idle (DPMS off). - -commit a34a8b37afbea6ed4bf8ca42364195e174250c48 -Author: Alex Deucher -Date: Wed Apr 1 15:23:17 2009 -0400 - - Set default low power PCIE lanes to 2 - - 1 lane seems to cause occasional corruption when - blitting to/from gart memory. - -commit 1f0dc778dc25f4f85fedd73c55c847cab2c79fc5 -Author: Alex Deucher -Date: Wed Apr 1 15:12:27 2009 -0400 - - Add support for setting the number PCIE lanes - -commit 7e10b6222e8f44a3ecc6aaea55a7a7680d133bb3 -Author: Alex Deucher -Date: Wed Apr 1 15:05:38 2009 -0400 - - Add ForceLowPowerMode Option - - Force the chip to a low power mode at the expense - of performance. - -commit 533d01a5933cd491bbc09cd463ea62475abf4bf2 -Author: Alex Deucher -Date: Tue Mar 31 17:24:29 2009 -0400 - - radeon: Add functions to set sclk/mclk using atombios - -commit adb099409768e695b9928fa6aa5760f93dadd9af -Author: Alex Deucher -Date: Tue Mar 31 17:13:11 2009 -0400 - - radeon: Add functions to set sclk/mclk on r1xx-r4xx - -commit 68e2a959ccc3d1a5d0731f1b55fdf1b2412635b2 -Author: Alex Deucher -Date: Tue Mar 31 17:02:45 2009 -0400 - - Add unified ClockGating Option - - - replaces DynamicClocks Option as the name was misleading - - unified interface for atom and com based bioses - - fix up clock gating code for newer r3xx asics - -commit 336cee0e6d19068582b189b2c747d92cb2139d2f -Author: Dave Airlie -Date: Mon Apr 13 18:11:48 2009 +1000 - - radeon: legacy bandwidth calcs for later r3xx/r4xx cards. - - This is an attempt to rationalise the code using the register info - files available to me here. - - Further info is required: - r350 check for stop_req > 15 then subtract 10: what other chips need it? - get rs480 working instead of using magic. - -commit 367ba7af76e7f63f3186a6e8d9bbe21aa31fc6d1 -Author: Alex Deucher -Date: Fri Apr 10 09:37:15 2009 -0400 - - radeon: fix tmds_pll randr property - -commit 15f1a2f31a7bc33f276a65283dbad0c106bee73e -Author: Alex Deucher -Date: Thu Apr 9 20:17:03 2009 -0400 - - radeon: remove old crtc size heuristics - - IIRC, the old randr code used to use this to use for front buffer sizing, - but it has since been changed. - -commit ce9077b2f5a5e749c0078dfb79d26ef8711a823a -Author: Alex Deucher -Date: Thu Apr 9 19:59:19 2009 -0400 - - R6xx/R7xx: cleanup macro - -commit 6532aeddacdeda3aa534264741c8648e1c449e76 -Author: Michel Dänzer -Date: Thu Apr 9 09:41:56 2009 +0200 - - Clear the framebuffer before initializing modes. - - Fixes garbage being visible shortly on server startup or when VT switching back - to X. - -commit 0c19053975925fed637aaa41d440e0cab8f6b596 -Author: Alex Deucher -Date: Wed Apr 8 13:34:23 2009 -0400 - - radeon: chip family typo - -commit 2888dd9ae9689b1cd72115dc0ceea1f5957299b0 -Author: Alex Deucher -Date: Wed Apr 8 13:10:01 2009 -0400 - - R6xx/R7xx: set proper 3D client driver name for r600 - -commit 61a083116a2c89e145aa19da951243536e07542e -Author: Alex Deucher -Date: Wed Apr 8 10:44:30 2009 -0400 - - Bump version post release - -commit 1b02b93895c31a0c9d641e47b46dce43b40edd97 -Author: Alex Deucher -Date: Wed Apr 8 10:34:44 2009 -0400 - - Bump for release - commit da74b94a5da8f0bcf4ae99b20e594d2f0f4fc6f6 Author: Alex Deucher Date: Tue Apr 7 18:59:06 2009 -0400 @@ -8192,7 +735,7 @@ Date: Thu Feb 26 12:10:08 2009 -0500 R6xx/R7xx: use shadowfb if DRI is disabled commit 000756e052a291230e5c95e48b69a5aa9c4fab0e -Merge: 22d7746 8373f43 +Merge: 22d7746... 8373f43... Author: Alex Deucher Date: Thu Feb 26 11:44:13 2009 -0500 @@ -8901,7 +1444,7 @@ Date: Fri Jan 30 07:56:14 2009 +1000 fixes it. commit bd8021d46e9066e4cd116c03a7b7adcfe2557aff -Merge: 4f88dd8 20d5dd3 +Merge: 4f88dd8... 20d5dd3... Author: Alex Deucher Date: Wed Jan 28 14:33:14 2009 -0500 @@ -8914,7 +1457,7 @@ Date: Wed Jan 28 14:12:26 2009 -0500 Move encoder specific data to encoder dev_priv commit 4f88dd83f290fb38e41256a7f1804008c0f28139 -Merge: 1c5678f 2ca970c +Merge: 1c5678f... 2ca970c... Author: Alex Deucher Date: Wed Jan 28 13:13:13 2009 -0500 @@ -9372,7 +1915,7 @@ Date: Mon Dec 22 02:18:43 2008 -0500 then use quad. commit 4d009d14c9c72f6e1bc8100ec8d9b8037ee4e514 -Merge: d52882d 4e96278 +Merge: d52882d... 4e96278... Author: Dave Airlie Date: Mon Dec 22 16:00:01 2008 +1000 @@ -9771,7 +2314,7 @@ Date: Thu Dec 4 12:28:12 2008 -0500 Fix up US setup after r3xx bicubic merge commit e13fba853ba19e6b0f081b9b3d9fa76c38a0f82b -Merge: d296337 79bbdd9 +Merge: d296337... 79bbdd9... Author: Alex Deucher Date: Thu Dec 4 12:25:29 2008 -0500 @@ -11032,7 +3575,7 @@ Date: Wed Jun 25 15:50:16 2008 -0400 - Make sure 3D is idle too (after composite or textured video) commit 07be302f6dba61dd15918963fae66502230c74b7 -Merge: 8c9b8de 5245974 +Merge: 8c9b8de... 5245974... Author: Jerome Glisse Date: Wed Jun 25 10:30:45 2008 +0200 @@ -11154,7 +3697,7 @@ Date: Fri Jun 20 07:51:27 2008 +1000 discovered on irc with wpwrak. commit 5b323a2cbbc412b6dd4e782438b64ee996558d05 -Merge: dd18caa eed2415 +Merge: dd18caa... eed2415... Author: Dave Airlie Date: Fri Jun 20 07:49:16 2008 +1000 @@ -12148,7 +4691,7 @@ Date: Wed Mar 19 17:58:34 2008 -0400 defines it. commit bed9754ad21d6c0a7f61067b04ba31c430a7cecb -Merge: 55e446b f71ac0e +Merge: 55e446b... f71ac0e... Author: Alex Deucher Date: Wed Mar 19 16:06:41 2008 -0400 @@ -12531,7 +5074,7 @@ Date: Thu Mar 6 17:46:00 2008 -0500 AVIVO: don't add outputs for invalid connectors commit 600dbe080997a01ceaf6be86723189d518bc1281 -Merge: 594743a 5b7875d +Merge: 594743a... 5b7875d... Author: Alex Deucher Date: Thu Mar 6 17:31:37 2008 -0500 @@ -12550,7 +5093,7 @@ Date: Thu Mar 6 14:31:06 2008 -0500 Bug #14826: Fix a bogus check around xf86SetOperatingState. commit 651fe23f4c650ed91843dec48db24e18e8b91219 -Merge: 3de2dc8 766f464 +Merge: 3de2dc8... 766f464... Author: Adam Jackson Date: Thu Mar 6 14:28:27 2008 -0500 @@ -12917,7 +5460,7 @@ Date: Mon Feb 25 07:10:48 2008 +1000 fixup check for EXA composite pointed out by Alan Swanson commit 85e470e64f629de72e361c77770e2e29998d1bf4 -Merge: 27ddb39 1b84c76 +Merge: 27ddb39... 1b84c76... Author: Alex Deucher Date: Sun Feb 24 05:37:22 2008 -0500 @@ -13615,7 +6158,7 @@ Date: Mon Jan 14 16:11:09 2008 -0500 Fixes bug 14001 commit 729da30c80d6545b75c8faea44754634f477cc09 -Merge: 000741e 625a885 +Merge: 000741e... 625a885... Author: Alex Deucher Date: Mon Jan 14 10:05:01 2008 -0500 @@ -13808,7 +6351,7 @@ Date: Wed Jan 2 19:48:28 2008 -0500 RADEON: various avivo tv-out related clean-ups commit ce34090c758ac91171cb6adb9b8a36e4adbf99cf -Merge: 2180f04 30cab1d +Merge: 2180f04... 30cab1d... Author: Alex Deucher Date: Wed Jan 2 16:41:36 2008 -0500 @@ -14015,7 +6558,7 @@ Date: Fri Dec 21 09:45:55 2007 +1000 set ddc line correctly post-merge commit 3c31b96afa20913ad947e68fe0c3a662e5eafbdd -Merge: eb99c3c f5e8c18 +Merge: eb99c3c... f5e8c18... Author: Dave Airlie Date: Fri Dec 21 09:36:22 2007 +1000 @@ -14056,7 +6599,7 @@ Date: Wed Dec 19 19:15:19 2007 -0500 The correct thing to do is filter by the mode's effective memory bandwidth. commit c1b0b69cc50516c3b7e881b0eb46cb3cd2e9dce6 -Merge: 0e66348 ce4fa1c +Merge: 0e66348... ce4fa1c... Author: Alex Deucher Date: Wed Dec 19 11:54:50 2007 -0500 @@ -14131,14 +6674,14 @@ Date: Mon Dec 17 20:20:04 2007 -0500 RADEON: fix typo from merge commit 19b9d3708852b7efe2b05249c8359dadb924dd94 -Merge: cf685f3 29706ca +Merge: cf685f3... 29706ca... Author: Alex Deucher Date: Mon Dec 17 20:07:32 2007 -0500 Merge branch 'atombios-support' of git+ssh://agd5f@git.freedesktop.org/git/xorg/driver/xf86-video-ati into atombios-support commit cf685f37ec874f0aacd09e7c4eb0402c6daec1b0 -Merge: 2a134af 44d07c4 +Merge: 2a134af... 44d07c4... Author: Alex Deucher Date: Mon Dec 17 20:07:07 2007 -0500 @@ -14287,7 +6830,7 @@ Date: Thu Dec 13 18:45:09 2007 -0500 - Unify the PLL calculation between legacy and avivo chips commit f5ac34983411e4c4f41ab1817dce582830f398fd -Merge: f2b2e08 6ccf5b3 +Merge: f2b2e08... 6ccf5b3... Author: Alex Deucher Date: Wed Dec 12 22:37:44 2007 -0500 @@ -14340,7 +6883,7 @@ Date: Tue Dec 11 14:04:58 2007 -0500 RADEON: handle HMDI properly (untested) and fix some merge leftovers commit 3c22ad977c25d5ca2811821fcac6bb8ecd79994a -Merge: c9a0cee f3d2ec3 +Merge: c9a0cee... f3d2ec3... Author: Alex Deucher Date: Tue Dec 11 13:11:15 2007 -0500 @@ -14396,7 +6939,7 @@ Date: Mon Dec 10 15:25:56 2007 +1000 add support for building against legacy servers similiar to Intel codepaths commit 9c278cb7fa7f18d13bde053fd75221cfba9da377 -Merge: 6451ea2 cc167b9 +Merge: 6451ea2... cc167b9... Author: Dave Airlie Date: Mon Dec 10 15:18:03 2007 +1000 @@ -14410,7 +6953,7 @@ Date: Mon Dec 10 15:18:03 2007 +1000 src/radeon_output.c commit 6451ea2dcc4fac762442f699935864f4a8d445f7 -Merge: 0d89556 5896ca4 +Merge: 0d89556... 5896ca4... Author: Dave Airlie Date: Mon Dec 10 15:08:42 2007 +1000 @@ -14470,7 +7013,7 @@ Date: Thu Dec 6 19:23:06 2007 +1100 powerpc: build fixes from last merge commit dbe3d2608ecc9896db9c23b3a347b50748c51e13 -Merge: 48e31cd 21ed435 +Merge: 48e31cd... 21ed435... Author: Dave Airlie Date: Thu Dec 6 14:22:03 2007 +1000 @@ -14571,7 +7114,7 @@ Date: Fri Nov 30 20:11:42 2007 -0500 mode or vesafb etc. after running the driver. commit af0196f7bf0d1d5d211391149c18935d64ed2b06 -Merge: d9858a2 0175b79 +Merge: d9858a2... 0175b79... Author: Alex Deucher Date: Fri Nov 30 16:40:28 2007 -0500 @@ -14603,7 +7146,7 @@ Date: Fri Nov 30 15:37:42 2007 -0500 for now. commit e1945f1f25a34310bd58ce128c8ff27ecc985618 -Merge: b368b0f df7777b +Merge: b368b0f... df7777b... Author: Alex Deucher Date: Fri Nov 30 14:30:55 2007 -0500 @@ -14824,7 +7367,7 @@ Date: Wed Nov 21 17:03:39 2007 -0500 Thanks to AMD for the information commit a12390c832abe423def60e39cd5a9118e5910339 -Merge: d531792 e74dca1 +Merge: d531792... e74dca1... Author: Alex Deucher Date: Wed Nov 21 02:24:48 2007 -0500 @@ -14877,7 +7420,7 @@ Date: Wed Nov 21 00:05:42 2007 -0500 RADEON: store devices ids from bios for each driver output commit 3975da2ea8cb628f7f66c3f26c5dfa181cd1c532 -Merge: e283aa3 295ce27 +Merge: e283aa3... 295ce27... Author: Alex Deucher Date: Tue Nov 20 23:52:29 2007 -0500 @@ -14977,7 +7520,7 @@ Date: Tue Nov 20 13:37:00 2007 +1000 atombios: add all r5xx and r6xx pci ids commit 5d023e2c3c2ab44ea57ffadc9607025d602c376c -Merge: 0d1e0c7 c887260 +Merge: 0d1e0c7... c887260... Author: Dave Airlie Date: Tue Nov 20 13:02:43 2007 +1000 @@ -15002,7 +7545,7 @@ Date: Tue Nov 20 08:15:58 2007 +1000 r5xx: cleanups after last merge commit fe2f7a09050fb7a345a1f52239f8f3c4f1053891 -Merge: 744c8cb 49055d8 +Merge: 744c8cb... 49055d8... Author: Dave Airlie Date: Tue Nov 20 08:04:32 2007 +1000 @@ -15014,7 +7557,7 @@ Date: Tue Nov 20 08:04:32 2007 +1000 src/radeon_output.c commit 744c8cb6c293fcaa687566f52901644e699baace -Merge: e258fbe e530af7 +Merge: e258fbe... e530af7... Author: Dave Airlie Date: Tue Nov 20 07:56:33 2007 +1000 @@ -15027,14 +7570,14 @@ Date: Mon Nov 19 16:35:05 2007 +1000 makes 2-headed cursor work commit e530af79adf51b3e95a0eca676c915a34dcbf4a7 -Merge: 69e197f 52aba8d +Merge: 69e197f... 52aba8d... Author: Alex Deucher Date: Mon Nov 19 00:59:30 2007 -0500 Merge branch 'agd-atom' of /home/alex/git/airlied/xf86-video-ati2 into agd-atom commit 69e197f2c8002aacf2587754c8d3bd63c88f85b1 -Merge: 5e8940f 862dcab +Merge: 5e8940f... 862dcab... Author: Alex Deucher Date: Mon Nov 19 00:57:34 2007 -0500 @@ -15065,7 +7608,7 @@ Date: Mon Nov 19 00:39:19 2007 -0500 Don't assign a gpio for TV commit 52aba8d73189ba959f19c0437499d5e7a8829827 -Merge: 862dcab 5e8940f +Merge: 862dcab... 5e8940f... Author: Dave Airlie Date: Mon Nov 19 15:30:46 2007 +1000 @@ -15102,7 +7645,7 @@ Date: Sun Nov 18 23:43:06 2007 -0500 fix typo in loop commit 384cd8f52c89d089c6559e2eedbae45641fcd14e -Merge: f3f0e4e 234b607 +Merge: f3f0e4e... 234b607... Author: Dave Airlie Date: Mon Nov 19 14:02:55 2007 +1000 @@ -15171,7 +7714,7 @@ Date: Sat Nov 17 00:34:56 2007 -0500 WIP: more new ATOM integration work commit 67db114d97abed7a607467e5d67c7b4ffa2c347e -Merge: 7d06a87 ea15346 +Merge: 7d06a87... ea15346... Author: Alex Deucher Date: Fri Nov 16 14:29:53 2007 -0500 @@ -15234,7 +7777,7 @@ Date: Fri Nov 16 14:48:36 2007 +1000 Add copyright headers commit 3cfcd2164b400bd0d1cb4ede8eeb01abba9d75c8 -Merge: efac14e 718bfd3 +Merge: efac14e... 718bfd3... Author: Alex Deucher Date: Thu Nov 15 23:25:39 2007 -0500 @@ -15755,7 +8298,7 @@ Date: Thu Oct 4 11:32:48 2007 +0200 Surprisingly easy, thanks to George's pci-rework changes. commit 7addf41885ec5658f531624a9c24ea5bd7d22d19 -Merge: 3a958ba 78c6bd3 +Merge: 3a958ba... 78c6bd3... Author: Michel Dänzer Date: Thu Oct 4 11:06:08 2007 +0200 @@ -16214,7 +8757,7 @@ Date: Tue Aug 28 15:37:11 2007 +0300 It still uses the old probe method though, this is due to the ati wrapper. commit 7b38d9a1209f87255e5bb0aefe46a363ce4fb6ef -Merge: 2e3d43a 673f799 +Merge: 2e3d43a... 673f799... Author: George Sapountzis Date: Tue Aug 28 16:01:12 2007 +0300 @@ -16478,14 +9021,14 @@ Date: Thu Aug 23 19:56:21 2007 +1000 updated release numbering for randr 1.2 commit 81a8093f2ffdce59d4e8a44f65f3d5c771fd6425 -Merge: c08e6ec 53a67e3 +Merge: c08e6ec... 53a67e3... Author: Dave Airlie Date: Thu Aug 23 19:51:47 2007 +1000 Merge remote branch 'origin/randr-1.2' commit c08e6ec9e7ac06caee53689b0ec50ef6a7a0ba37 -Merge: 5793e87 a0d0fcd +Merge: 5793e87... a0d0fcd... Author: Dave Airlie Date: Thu Aug 23 19:42:19 2007 +1000 @@ -17358,7 +9901,7 @@ Date: Wed May 30 17:49:01 2007 +1000 we hang when moving the cursor into the second CRTC. commit 7fc02657c4d740941fbda5a8823cf45de3eca3f8 -Merge: 800bf53 4c61c0e +Merge: 800bf53... 4c61c0e... Author: Dave Airlie Date: Wed May 30 17:27:22 2007 +1000 @@ -17413,7 +9956,7 @@ Date: Tue May 29 07:23:24 2007 +1000 rs480: only has single dac commit c52322354fe64725733842b3356798c50e7735d5 -Merge: dd6a966 975da59 +Merge: dd6a966... 975da59... Author: Dave Airlie Date: Tue May 29 07:21:48 2007 +1000 @@ -17895,7 +10438,7 @@ Date: Tue May 8 19:27:48 2007 +0200 remove some old mergedfb cruft commit 76670f665ebec7cdf40a04bf9379cb3ad4417507 -Merge: 83f81ed a3ee422 +Merge: 83f81ed... a3ee422... Author: Alex Deucher Date: Tue May 8 18:41:25 2007 +0200 @@ -18346,7 +10889,7 @@ Date: Sun Feb 25 23:29:09 2007 +1100 fix typo commit 3cfe94d5438961b869766dacbcd13fde8b770ca2 -Merge: 31c018c 3b43788 +Merge: 31c018c... 3b43788... Author: Dave Airlie Date: Sun Feb 25 23:27:19 2007 +1100 @@ -18539,7 +11082,7 @@ Date: Sun Feb 4 11:28:54 2007 +0200 case because pATI->PCIInfo is now set after ATIProcessOptions() is called. commit 9d77aabdff919360f0c9333105436c31f1f5749a -Merge: ff8ea19 57822be +Merge: ff8ea19... 57822be... Author: George Sapountzis Date: Mon Feb 5 19:16:51 2007 +0200 @@ -19712,7 +12255,7 @@ Date: Mon Sep 25 11:35:32 2006 +1000 radeon: cleanup some bits from superpatch commit 9827afaa40720a58e2fc029c0bf92ad2fe223d11 -Merge: 10b4b46 ad8259c +Merge: 10b4b46... ad8259c... Author: Dave Airlie Date: Mon Sep 25 11:25:17 2006 +1000 @@ -19857,7 +12400,7 @@ Date: Fri Sep 22 06:35:34 2006 +1000 radeon: add enable display function commit 4a54886d510f26b29d27e5c9a73647554291b1a6 -Merge: 70264d6 9fa176c +Merge: 70264d6... 9fa176c... Author: Dave Airlie Date: Fri Sep 22 06:00:04 2006 +1000 @@ -20473,7 +13016,7 @@ Date: Thu Jun 15 15:35:05 2006 +0200 Fix some more cosmetic warnings. commit ec93e08b24f7c0e583970d08bfe18ad142e6b047 -Merge: 051c49d 6ca9862 +Merge: 051c49d... 6ca9862... Author: Michel Dänzer Date: Thu Jun 15 15:03:27 2006 +0200 @@ -20492,7 +13035,7 @@ Date: Thu Jun 15 21:24:16 2006 +1000 remove all printf specifier warnings on Linux commit 051c49d0f002c72d1d8f15f6df264d8b093d4e95 -Merge: a840afc dfac819 +Merge: a840afc... dfac819... Author: Michel Dänzer Date: Thu Jun 15 13:10:44 2006 +0200 @@ -20517,7 +13060,7 @@ Date: Thu Jun 15 20:59:33 2006 +1000 some more unused variable cleanups commit a840afc75a0453b4694e3f987ebdbddc6844a169 -Merge: c90c49d d511ef4 +Merge: c90c49d... d511ef4... Author: Michel Dänzer Date: Thu Jun 15 12:46:58 2006 +0200 diff --git a/driver/xf86-video-ati/INSTALL b/driver/xf86-video-ati/INSTALL deleted file mode 100644 index 8b82ade08..000000000 --- a/driver/xf86-video-ati/INSTALL +++ /dev/null @@ -1,291 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, -2006, 2007, 2008 Free Software Foundation, Inc. - - This file is free documentation; the Free Software Foundation gives -unlimited permission to copy, distribute and modify it. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 6. Often, you can also type `make uninstall' to remove the installed - files again. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *Note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/driver/xf86-video-ati/Makefile.am b/driver/xf86-video-ati/Makefile.am index 4c278ba78..87e90baa3 100644 --- a/driver/xf86-video-ati/Makefile.am +++ b/driver/xf86-video-ati/Makefile.am @@ -18,15 +18,15 @@ # 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 -MAINTAINERCLEANFILES = ChangeLog INSTALL -.PHONY: ChangeLog INSTALL +EXTRA_DIST = ChangeLog +CLEANFILES = ChangeLog -INSTALL: - $(INSTALL_CMD) +.PHONY: ChangeLog ChangeLog: - $(CHANGELOG_CMD) + (GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2) -dist-hook: ChangeLog INSTALL +dist-hook: ChangeLog diff --git a/driver/xf86-video-ati/Makefile.in b/driver/xf86-video-ati/Makefile.in index a8f5e3685..7f4aeceea 100644 --- a/driver/xf86-video-ati/Makefile.in +++ b/driver/xf86-video-ati/Makefile.in @@ -42,9 +42,9 @@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = . am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -install_sh_DATA = ${SHELL} $(install_sh) -c -m 644 -install_sh_PROGRAM = ${SHELL} $(install_sh) -c -install_sh_SCRIPT = ${SHELL} $(install_sh) -c +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : @@ -57,8 +57,8 @@ build_triplet = @build@ host_triplet = @host@ DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(srcdir)/config.h.in \ - $(top_srcdir)/configure COPYING ChangeLog INSTALL compile \ - config.guess config.sub depcomp install-sh ltmain.sh missing + $(top_srcdir)/configure COPYING ChangeLog compile config.guess \ + config.sub depcomp install-sh ltmain.sh missing subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac @@ -97,7 +97,6 @@ ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_MAN_DIR = @APP_MAN_DIR@ APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ AR = @AR@ @@ -105,18 +104,22 @@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ -BASE_CFLAGS = @BASE_CFLAGS@ +BUILD_LINUXDOC_FALSE = @BUILD_LINUXDOC_FALSE@ +BUILD_LINUXDOC_TRUE = @BUILD_LINUXDOC_TRUE@ +BUILD_PDFDOC_FALSE = @BUILD_PDFDOC_FALSE@ +BUILD_PDFDOC_TRUE = @BUILD_PDFDOC_TRUE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CHANGELOG_CMD = @CHANGELOG_CMD@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CWARNFLAGS = @CWARNFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ DRIVER_NAME = @DRIVER_NAME@ @@ -124,56 +127,43 @@ DRI_CFLAGS = @DRI_CFLAGS@ DRI_FALSE = @DRI_FALSE@ DRI_LIBS = @DRI_LIBS@ DRI_TRUE = @DRI_TRUE@ -DRM_MODE_FALSE = @DRM_MODE_FALSE@ -DRM_MODE_TRUE = @DRM_MODE_TRUE@ DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -FGREP = @FGREP@ +F77 = @F77@ +FFLAGS = @FFLAGS@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ GREP = @GREP@ -HAVE_XEXTPROTO_71_FALSE = @HAVE_XEXTPROTO_71_FALSE@ -HAVE_XEXTPROTO_71_TRUE = @HAVE_XEXTPROTO_71_TRUE@ -INSTALL_CMD = @INSTALL_CMD@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ LDFLAGS = @LDFLAGS@ -LIBDRM_RADEON_CFLAGS = @LIBDRM_RADEON_CFLAGS@ -LIBDRM_RADEON_LIBS = @LIBDRM_RADEON_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ -LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@ -LIBUDEV_FALSE = @LIBUDEV_FALSE@ -LIBUDEV_LIBS = @LIBUDEV_LIBS@ -LIBUDEV_TRUE = @LIBUDEV_TRUE@ LIB_MAN_DIR = @LIB_MAN_DIR@ LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ -LIPO = @LIPO@ +LINUXDOC = @LINUXDOC@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MAN_SUBSTS = @MAN_SUBSTS@ +MAKE_HTML = @MAKE_HTML@ +MAKE_PDF = @MAKE_PDF@ +MAKE_PS = @MAKE_PS@ +MAKE_TEXT = @MAKE_TEXT@ MISC_MAN_DIR = @MISC_MAN_DIR@ MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ -NM = @NM@ NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -184,29 +174,29 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@ PCIACCESS_LIBS = @PCIACCESS_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PS2PDF = @PS2PDF@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ -STRICT_CFLAGS = @STRICT_CFLAGS@ STRIP = @STRIP@ USE_EXA_FALSE = @USE_EXA_FALSE@ USE_EXA_TRUE = @USE_EXA_TRUE@ VERSION = @VERSION@ -XEXT_CFLAGS = @XEXT_CFLAGS@ -XEXT_LIBS = @XEXT_LIBS@ -XF86DRM_MODE_FALSE = @XF86DRM_MODE_FALSE@ -XF86DRM_MODE_TRUE = @XF86DRM_MODE_TRUE@ +XMODES_CFLAGS = @XMODES_CFLAGS@ +XMODES_FALSE = @XMODES_FALSE@ +XMODES_TRUE = @XMODES_TRUE@ XORG_CFLAGS = @XORG_CFLAGS@ XORG_LIBS = @XORG_LIBS@ -XORG_MAN_PAGE = @XORG_MAN_PAGE@ XSERVER_LIBPCIACCESS_FALSE = @XSERVER_LIBPCIACCESS_FALSE@ XSERVER_LIBPCIACCESS_TRUE = @XSERVER_LIBPCIACCESS_TRUE@ -ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -248,8 +238,10 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ +AUTOMAKE_OPTIONS = foreign SUBDIRS = src man -MAINTAINERCLEANFILES = ChangeLog INSTALL +EXTRA_DIST = ChangeLog +CLEANFILES = ChangeLog all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive @@ -613,6 +605,7 @@ install-strip: mostlyclean-generic: clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) @@ -620,7 +613,6 @@ distclean-generic: maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am @@ -689,15 +681,12 @@ uninstall-info: uninstall-info-recursive tags tags-recursive uninstall uninstall-am uninstall-info-am -.PHONY: ChangeLog INSTALL - -INSTALL: - $(INSTALL_CMD) +.PHONY: ChangeLog ChangeLog: - $(CHANGELOG_CMD) + (GIT_DIR=$(top_srcdir)/.git git-log > .changelog.tmp && mv .changelog.tmp ChangeLog; rm -f .changelog.tmp) || (touch ChangeLog; echo 'git directory not found: installing possibly empty changelog.' >&2) -dist-hook: ChangeLog INSTALL +dist-hook: ChangeLog # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/driver/xf86-video-ati/README b/driver/xf86-video-ati/README index 4b92a1858..99de20db1 100644 --- a/driver/xf86-video-ati/README +++ b/driver/xf86-video-ati/README @@ -1,25 +1,20 @@ xf86-video-ati - ATI Radeon video driver for the Xorg X server +Please submit bugs & patches to the Xorg bugzilla: + + https://bugs.freedesktop.org/enter_bug.cgi?product=xorg + All questions regarding this software should be directed at the Xorg mailing list: http://lists.freedesktop.org/mailman/listinfo/xorg -Please submit bug reports to the Xorg bugzilla: - - https://bugs.freedesktop.org/enter_bug.cgi?product=xorg - The master development code repository can be found at: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-ati http://cgit.freedesktop.org/xorg/driver/xf86-video-ati -For patch submission instructions, see: - - http://www.x.org/wiki/Development/Documentation/SubmittingPatches - For more information on the git code manager, see: http://wiki.x.org/wiki/GitPage - diff --git a/driver/xf86-video-ati/aclocal.m4 b/driver/xf86-video-ati/aclocal.m4 index 3b748b031..3ec9c2c92 100644 --- a/driver/xf86-video-ati/aclocal.m4 +++ b/driver/xf86-video-ati/aclocal.m4 @@ -12,199 +12,101 @@ # PARTICULAR PURPOSE. # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. -m4_define([_LT_COPYING], [dnl -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -]) - -# serial 57 LT_INIT +# serial 52 AC_PROG_LIBTOOL -# LT_PREREQ(VERSION) -# ------------------ -# Complain and exit if this libtool version is less that VERSION. -m4_defun([LT_PREREQ], -[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, - [m4_default([$3], - [m4_fatal([Libtool version $1 or higher is required], - 63)])], - [$2])]) +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) -# _LT_CHECK_BUILDDIR -# ------------------ -# Complain if the absolute build directory name contains unusual characters -m4_defun([_LT_CHECK_BUILDDIR], -[case `pwd` in - *\ * | *\ *) - AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; -esac -]) +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL -# LT_INIT([OPTIONS]) -# ------------------ -AC_DEFUN([LT_INIT], -[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT -AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl -AC_BEFORE([$0], [LT_LANG])dnl -AC_BEFORE([$0], [LT_OUTPUT])dnl -AC_BEFORE([$0], [LTDL_INIT])dnl -m4_require([_LT_CHECK_BUILDDIR])dnl - -dnl Autoconf doesn't catch unexpanded LT_ macros by default: -m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl -m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl -dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 -dnl unless we require an AC_DEFUNed macro: -AC_REQUIRE([LTOPTIONS_VERSION])dnl -AC_REQUIRE([LTSUGAR_VERSION])dnl -AC_REQUIRE([LTVERSION_VERSION])dnl -AC_REQUIRE([LTOBSOLETE_VERSION])dnl -m4_require([_LT_PROG_LTMAIN])dnl - -_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) - -dnl Parse OPTIONS -_LT_SET_OPTIONS([$0], [$1]) +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl # This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" # Always use our own libtool. LIBTOOL='$(SHELL) $(top_builddir)/libtool' AC_SUBST(LIBTOOL)dnl -_LT_SETUP - -# Only expand once: -m4_define([LT_INIT]) -])# LT_INIT - -# Old names: -AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) -AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PROG_LIBTOOL], []) -dnl AC_DEFUN([AM_PROG_LIBTOOL], []) +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL -# _LT_CC_BASENAME(CC) -# ------------------- -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -m4_defun([_LT_CC_BASENAME], -[for cc_temp in $1""; do - case $cc_temp in - compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; - distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -]) - - -# _LT_FILEUTILS_DEFAULTS -# ---------------------- -# It is okay to use these file commands and assume they have been set -# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'. -m4_defun([_LT_FILEUTILS_DEFAULTS], -[: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} -])# _LT_FILEUTILS_DEFAULTS - - -# _LT_SETUP -# --------- -m4_defun([_LT_SETUP], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl - -_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl -dnl -_LT_DECL([], [host_alias], [0], [The host system])dnl -_LT_DECL([], [host], [0])dnl -_LT_DECL([], [host_os], [0])dnl -dnl -_LT_DECL([], [build_alias], [0], [The build system])dnl -_LT_DECL([], [build], [0])dnl -_LT_DECL([], [build_os], [0])dnl -dnl AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + AC_REQUIRE([AC_PROG_LN_S])dnl -test -z "$LN_S" && LN_S="ln -s" -_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl dnl -AC_REQUIRE([LT_CMD_MAX_LEN])dnl -_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl -_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl -dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl -m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl -m4_require([_LT_CMD_RELOAD])dnl -m4_require([_LT_CHECK_MAGIC_METHOD])dnl -m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl -m4_require([_LT_CMD_OLD_ARCHIVE])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_WITH_SYSROOT])dnl +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR -_LT_CONFIG_LIBTOOL_INIT([ -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi -]) -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -_LT_CHECK_OBJDIR - -m4_require([_LT_TAG_COMPILER])dnl +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH case $host_os in aix3*) @@ -218,706 +120,118 @@ aix3*) ;; esac -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -_LT_CC_BASENAME([$compiler]) - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - _LT_PATH_MAGIC - fi - ;; -esac - -# Use C for the default configuration in the libtool script -LT_SUPPORTED_TAG([CC]) -_LT_LANG_C_CONFIG -_LT_LANG_DEFAULT_CONFIG -_LT_CONFIG_COMMANDS -])# _LT_SETUP - - -# _LT_PREPARE_SED_QUOTE_VARS -# -------------------------- -# Define a few sed substitution that help us do robust quoting. -m4_defun([_LT_PREPARE_SED_QUOTE_VARS], -[# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] # Same as above, but do not quote variable references. -double_quote_subst='s/\([["`\\]]\)/\\\1/g' +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] # Sed substitution to delay expansion of an escaped shell variable in a # double_quote_subst'ed string. delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - # Sed substitution to avoid accidental globbing in evaled expressions no_glob_subst='s/\*/\\\*/g' -]) -# _LT_PROG_LTMAIN -# --------------- -# Note that this code is called both from `configure', and `config.status' -# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, -# `config.status' has no value for ac_aux_dir unless we are using Automake, -# so we pass a copy along to make sure it has a sensible value anyway. -m4_defun([_LT_PROG_LTMAIN], -[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl -_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a ltmain="$ac_aux_dir/ltmain.sh" -])# _LT_PROG_LTMAIN - - - -# So that we can recreate a full libtool script including additional -# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS -# in macros and then make a single call at the end using the `libtool' -# label. - - -# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) -# ---------------------------------------- -# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL_INIT], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_INIT], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_INIT]) - - -# _LT_CONFIG_LIBTOOL([COMMANDS]) -# ------------------------------ -# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. -m4_define([_LT_CONFIG_LIBTOOL], -[m4_ifval([$1], - [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], - [$1 -])])]) - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) - - -# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) -# ----------------------------------------------------- -m4_defun([_LT_CONFIG_SAVE_COMMANDS], -[_LT_CONFIG_LIBTOOL([$1]) -_LT_CONFIG_LIBTOOL_INIT([$2]) -]) - - -# _LT_FORMAT_COMMENT([COMMENT]) -# ----------------------------- -# Add leading comment marks to the start of each line, and a trailing -# full-stop to the whole comment if one is not present already. -m4_define([_LT_FORMAT_COMMENT], -[m4_ifval([$1], [ -m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], - [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) -)]) - - - - - -# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) -# ------------------------------------------------------------------- -# CONFIGNAME is the name given to the value in the libtool script. -# VARNAME is the (base) name used in the configure script. -# VALUE may be 0, 1 or 2 for a computed quote escaped value based on -# VARNAME. Any other value will be used directly. -m4_define([_LT_DECL], -[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], - [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], - [m4_ifval([$1], [$1], [$2])]) - lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) - m4_ifval([$4], - [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) - lt_dict_add_subkey([lt_decl_dict], [$2], - [tagged?], [m4_ifval([$5], [yes], [no])])]) -]) - - -# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) -# -------------------------------------------------------- -m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) - - -# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_tag_varnames], -[_lt_decl_filter([tagged?], [yes], $@)]) - - -# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) -# --------------------------------------------------------- -m4_define([_lt_decl_filter], -[m4_case([$#], - [0], [m4_fatal([$0: too few arguments: $#])], - [1], [m4_fatal([$0: too few arguments: $#: $1])], - [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], - [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], - [lt_dict_filter([lt_decl_dict], $@)])[]dnl -]) - - -# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) -# -------------------------------------------------- -m4_define([lt_decl_quote_varnames], -[_lt_decl_filter([value], [1], $@)]) - - -# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_dquote_varnames], -[_lt_decl_filter([value], [2], $@)]) - - -# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) -# --------------------------------------------------- -m4_define([lt_decl_varnames_tagged], -[m4_assert([$# <= 2])dnl -_$0(m4_quote(m4_default([$1], [[, ]])), - m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), - m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) -m4_define([_lt_decl_varnames_tagged], -[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) - - -# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) -# ------------------------------------------------ -m4_define([lt_decl_all_varnames], -[_$0(m4_quote(m4_default([$1], [[, ]])), - m4_if([$2], [], - m4_quote(lt_decl_varnames), - m4_quote(m4_shift($@))))[]dnl -]) -m4_define([_lt_decl_all_varnames], -[lt_join($@, lt_decl_varnames_tagged([$1], - lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl -]) - - -# _LT_CONFIG_STATUS_DECLARE([VARNAME]) -# ------------------------------------ -# Quote a variable value, and forward it to `config.status' so that its -# declaration there will have the same value as in `configure'. VARNAME -# must have a single quote delimited value for this to work. -m4_define([_LT_CONFIG_STATUS_DECLARE], -[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) - - -# _LT_CONFIG_STATUS_DECLARATIONS -# ------------------------------ -# We delimit libtool config variables with single quotes, so when -# we write them to config.status, we have to be sure to quote all -# embedded single quotes properly. In configure, this macro expands -# each variable declared with _LT_DECL (and _LT_TAGDECL) into: -# -# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' -m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], -[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), - [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAGS -# ---------------- -# Output comment and list of tags supported by the script -m4_defun([_LT_LIBTOOL_TAGS], -[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl -available_tags="_LT_TAGS"dnl -]) - - -# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) -# ----------------------------------- -# Extract the dictionary values for VARNAME (optionally with TAG) and -# expand to a commented shell variable setting: -# -# # Some comment about what VAR is for. -# visible_name=$lt_internal_name -m4_define([_LT_LIBTOOL_DECLARE], -[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], - [description])))[]dnl -m4_pushdef([_libtool_name], - m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl -m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), - [0], [_libtool_name=[$]$1], - [1], [_libtool_name=$lt_[]$1], - [2], [_libtool_name=$lt_[]$1], - [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl -m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl -]) - - -# _LT_LIBTOOL_CONFIG_VARS -# ----------------------- -# Produce commented declarations of non-tagged libtool config variables -# suitable for insertion in the LIBTOOL CONFIG section of the `libtool' -# script. Tagged libtool config variables (even for the LIBTOOL CONFIG -# section) are produced by _LT_LIBTOOL_TAG_VARS. -m4_defun([_LT_LIBTOOL_CONFIG_VARS], -[m4_foreach([_lt_var], - m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) - - -# _LT_LIBTOOL_TAG_VARS(TAG) -# ------------------------- -m4_define([_LT_LIBTOOL_TAG_VARS], -[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), - [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) - - -# _LT_TAGVAR(VARNAME, [TAGNAME]) -# ------------------------------ -m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) - - -# _LT_CONFIG_COMMANDS -# ------------------- -# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of -# variables for single and double quote escaping we saved from calls -# to _LT_DECL, we can put quote escaped variables declarations -# into `config.status', and then the shell code to quote escape them in -# for loops in `config.status'. Finally, any additional code accumulated -# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. -m4_defun([_LT_CONFIG_COMMANDS], -[AC_PROVIDE_IFELSE([LT_OUTPUT], - dnl If the libtool generation code has been placed in $CONFIG_LT, - dnl instead of duplicating it all over again into config.status, - dnl then we will have config.status run $CONFIG_LT later, so it - dnl needs to know what name is stored there: - [AC_CONFIG_COMMANDS([libtool], - [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], - dnl If the libtool generation code is destined for config.status, - dnl expand the accumulated commands and init code now: - [AC_CONFIG_COMMANDS([libtool], - [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) -])#_LT_CONFIG_COMMANDS - - -# Initialize. -m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], -[ - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -_LT_CONFIG_STATUS_DECLARATIONS -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$[]1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_quote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in lt_decl_all_varnames([[ \ -]], lt_decl_dquote_varnames); do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[[\\\\\\\`\\"\\\$]]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -_LT_OUTPUT_LIBTOOL_INIT -]) - -# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) -# ------------------------------------ -# Generate a child script FILE with all initialization necessary to -# reuse the environment learned by the parent script, and make the -# file executable. If COMMENT is supplied, it is inserted after the -# `#!' sequence but before initialization text begins. After this -# macro, additional text can be appended to FILE to form the body of -# the child script. The macro ends with non-zero status if the -# file could not be fully written (such as if the disk is full). -m4_ifdef([AS_INIT_GENERATED], -[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], -[m4_defun([_LT_GENERATED_FILE_INIT], -[m4_require([AS_PREPARE])]dnl -[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl -[lt_write_fail=0 -cat >$1 <<_ASEOF || lt_write_fail=1 -#! $SHELL -# Generated by $as_me. -$2 -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$1 <<\_ASEOF || lt_write_fail=1 -AS_SHELL_SANITIZE -_AS_PREPARE -exec AS_MESSAGE_FD>&1 -_ASEOF -test $lt_write_fail = 0 && chmod +x $1[]dnl -m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT - -# LT_OUTPUT -# --------- -# This macro allows early generation of the libtool script (before -# AC_OUTPUT is called), incase it is used in configure for compilation -# tests. -AC_DEFUN([LT_OUTPUT], -[: ${CONFIG_LT=./config.lt} -AC_MSG_NOTICE([creating $CONFIG_LT]) -_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], -[# Run this file to recreate a libtool stub with the current configuration.]) - -cat >>"$CONFIG_LT" <<\_LTEOF -lt_cl_silent=false -exec AS_MESSAGE_LOG_FD>>config.log -{ - echo - AS_BOX([Running $as_me.]) -} >&AS_MESSAGE_LOG_FD - -lt_cl_help="\ -\`$as_me' creates a local libtool stub from the current configuration, -for use in further configure time tests before the real libtool is -generated. - -Usage: $[0] [[OPTIONS]] - - -h, --help print this help, then exit - -V, --version print version number, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - -Report bugs to ." - -lt_cl_version="\ -m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl -m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) -configured by $[0], generated by m4_PACKAGE_STRING. - -Copyright (C) 2011 Free Software Foundation, Inc. -This config.lt script is free software; the Free Software Foundation -gives unlimited permision to copy, distribute and modify it." - -while test $[#] != 0 -do - case $[1] in - --version | --v* | -V ) - echo "$lt_cl_version"; exit 0 ;; - --help | --h* | -h ) - echo "$lt_cl_help"; exit 0 ;; - --debug | --d* | -d ) - debug=: ;; - --quiet | --q* | --silent | --s* | -q ) - lt_cl_silent=: ;; - - -*) AC_MSG_ERROR([unrecognized option: $[1] -Try \`$[0] --help' for more information.]) ;; - - *) AC_MSG_ERROR([unrecognized argument: $[1] -Try \`$[0] --help' for more information.]) ;; - esac - shift -done - -if $lt_cl_silent; then - exec AS_MESSAGE_FD>/dev/null -fi -_LTEOF - -cat >>"$CONFIG_LT" <<_LTEOF -_LT_OUTPUT_LIBTOOL_COMMANDS_INIT -_LTEOF - -cat >>"$CONFIG_LT" <<\_LTEOF -AC_MSG_NOTICE([creating $ofile]) -_LT_OUTPUT_LIBTOOL_COMMANDS -AS_EXIT(0) -_LTEOF -chmod +x "$CONFIG_LT" - -# configure is writing to config.log, but config.lt does its own redirection, -# appending to config.log, which fails on DOS, as config.log is still kept -# open by configure. Here we exec the FD to /dev/null, effectively closing -# config.log, so it can be properly (re)opened and appended to by config.lt. -lt_cl_success=: -test "$silent" = yes && - lt_config_lt_args="$lt_config_lt_args --quiet" -exec AS_MESSAGE_LOG_FD>/dev/null -$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false -exec AS_MESSAGE_LOG_FD>>config.log -$lt_cl_success || AS_EXIT(1) -])# LT_OUTPUT - - -# _LT_CONFIG(TAG) -# --------------- -# If TAG is the built-in tag, create an initial libtool script with a -# default configuration from the untagged config vars. Otherwise add code -# to config.status for appending the configuration named by TAG from the -# matching tagged config vars. -m4_defun([_LT_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_CONFIG_SAVE_COMMANDS([ - m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl - m4_if(_LT_TAG, [C], [ - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -_LT_COPYING -_LT_LIBTOOL_TAGS - -# ### BEGIN LIBTOOL CONFIG -_LT_LIBTOOL_CONFIG_VARS -_LT_LIBTOOL_TAG_VARS -# ### END LIBTOOL CONFIG - -_LT_EOF - +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" ;; esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi - _LT_PROG_LTMAIN +_LT_CC_BASENAME([$compiler]) - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - _LT_PROG_REPLACE_SHELLFNS - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" -], -[cat <<_LT_EOF >> "$ofile" - -dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded -dnl in a comment (ie after a #). -# ### BEGIN LIBTOOL TAG CONFIG: $1 -_LT_LIBTOOL_TAG_VARS(_LT_TAG) -# ### END LIBTOOL TAG CONFIG: $1 -_LT_EOF -])dnl /m4_if -], -[m4_if([$1], [], [ - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile'], []) -])dnl /_LT_CONFIG_SAVE_COMMANDS -])# _LT_CONFIG - - -# LT_SUPPORTED_TAG(TAG) -# --------------------- -# Trace this macro to discover what tags are supported by the libtool -# --tag option, using: -# autoconf --trace 'LT_SUPPORTED_TAG:$1' -AC_DEFUN([LT_SUPPORTED_TAG], []) - - -# C support is built-in for now -m4_define([_LT_LANG_C_enabled], []) -m4_define([_LT_TAGS], []) - - -# LT_LANG(LANG) -# ------------- -# Enable libtool support for the given language if not already enabled. -AC_DEFUN([LT_LANG], -[AC_BEFORE([$0], [LT_OUTPUT])dnl -m4_case([$1], - [C], [_LT_LANG(C)], - [C++], [_LT_LANG(CXX)], - [Go], [_LT_LANG(GO)], - [Java], [_LT_LANG(GCJ)], - [Fortran 77], [_LT_LANG(F77)], - [Fortran], [_LT_LANG(FC)], - [Windows Resource], [_LT_LANG(RC)], - [m4_ifdef([_LT_LANG_]$1[_CONFIG], - [_LT_LANG($1)], - [m4_fatal([$0: unsupported language: "$1"])])])dnl -])# LT_LANG - - -# _LT_LANG(LANGNAME) -# ------------------ -m4_defun([_LT_LANG], -[m4_ifdef([_LT_LANG_]$1[_enabled], [], - [LT_SUPPORTED_TAG([$1])dnl - m4_append([_LT_TAGS], [$1 ])dnl - m4_define([_LT_LANG_]$1[_enabled], [])dnl - _LT_LANG_$1_CONFIG($1)])dnl -])# _LT_LANG - - -m4_ifndef([AC_PROG_GO], [ -# NOTE: This macro has been submitted for inclusion into # -# GNU Autoconf as AC_PROG_GO. When it is available in # -# a released version of Autoconf we should remove this # -# macro and use it instead. # -m4_defun([AC_PROG_GO], -[AC_LANG_PUSH(Go)dnl -AC_ARG_VAR([GOC], [Go compiler command])dnl -AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl -_AC_ARG_VAR_LDFLAGS()dnl -AC_CHECK_TOOL(GOC, gccgo) -if test -z "$GOC"; then - if test -n "$ac_tool_prefix"; then - AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC fi -fi -if test -z "$GOC"; then - AC_CHECK_PROG(GOC, gccgo, gccgo, false) -fi -])#m4_defun -])#m4_ifndef + ;; +esac + +_LT_REQUIRED_DARWIN_CHECKS + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP -# _LT_LANG_DEFAULT_CONFIG -# ----------------------- -m4_defun([_LT_LANG_DEFAULT_CONFIG], -[AC_PROVIDE_IFELSE([AC_PROG_CXX], - [LT_LANG(CXX)], - [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) - -AC_PROVIDE_IFELSE([AC_PROG_F77], - [LT_LANG(F77)], - [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) - -AC_PROVIDE_IFELSE([AC_PROG_FC], - [LT_LANG(FC)], - [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) - -dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal -dnl pulling things in needlessly. -AC_PROVIDE_IFELSE([AC_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], - [LT_LANG(GCJ)], - [AC_PROVIDE_IFELSE([LT_PROG_GCJ], - [LT_LANG(GCJ)], - [m4_ifdef([AC_PROG_GCJ], - [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([A][M_PROG_GCJ], - [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) - m4_ifdef([LT_PROG_GCJ], - [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) - -AC_PROVIDE_IFELSE([AC_PROG_GO], - [LT_LANG(GO)], - [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) - -AC_PROVIDE_IFELSE([LT_PROG_RC], - [LT_LANG(RC)], - [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) -])# _LT_LANG_DEFAULT_CONFIG - -# Obsolete macros: -AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) -AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) -AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) -AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) -AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_CXX], []) -dnl AC_DEFUN([AC_LIBTOOL_F77], []) -dnl AC_DEFUN([AC_LIBTOOL_FC], []) -dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) -dnl AC_DEFUN([AC_LIBTOOL_RC], []) - - -# _LT_TAG_COMPILER -# ---------------- -m4_defun([_LT_TAG_COMPILER], +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], [AC_REQUIRE([AC_PROG_CC])dnl -_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl -_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl -_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl -_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl - # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} @@ -926,20 +240,36 @@ LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC -])# _LT_TAG_COMPILER +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) # _LT_COMPILER_BOILERPLATE # ------------------------ # Check for compiler boilerplate output or warnings with # the simple compiler test code. -m4_defun([_LT_COMPILER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* +$rm conftest* ])# _LT_COMPILER_BOILERPLATE @@ -947,65 +277,40 @@ $RM conftest* # ---------------------- # Check for linker boilerplate output or warnings with # the simple link test code. -m4_defun([_LT_LINKER_BOILERPLATE], -[m4_require([_LT_DECL_SED])dnl +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_SED])dnl ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* +$rm -r conftest* ])# _LT_LINKER_BOILERPLATE # _LT_REQUIRED_DARWIN_CHECKS -# ------------------------- -m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ +# -------------------------- +# Check for some things on darwin +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ case $host_os in rhapsody* | darwin*) AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) - AC_CHECK_TOOL([LIPO], [lipo], [:]) - AC_CHECK_TOOL([OTOOL], [otool], [:]) - AC_CHECK_TOOL([OTOOL64], [otool64], [:]) - _LT_DECL([], [DSYMUTIL], [1], - [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) - _LT_DECL([], [NMEDIT], [1], - [Tool to change global to local symbols on Mac OS X]) - _LT_DECL([], [LIPO], [1], - [Tool to manipulate fat objects and archives on Mac OS X]) - _LT_DECL([], [OTOOL], [1], - [ldd/readelf like tool for Mach-O binaries on Mac OS X]) - _LT_DECL([], [OTOOL64], [1], - [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], [lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -rf libconftest.dylib* - rm -f conftest.* + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c fi]) - AC_CACHE_CHECK([for -exported_symbols_list linker flag], [lt_cv_ld_exported_symbols_list], [lt_cv_ld_exported_symbols_list=no @@ -1013,54 +318,26 @@ m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ echo "_main" > conftest.sym LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [lt_cv_ld_exported_symbols_list=yes], - [lt_cv_ld_exported_symbols_list=no]) - LDFLAGS="$save_LDFLAGS" - ]) - - AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], - [lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD - echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD - $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD - echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD - $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&AS_MESSAGE_LOG_FD - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&AS_MESSAGE_LOG_FD - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" ]) case $host_os in - rhapsody* | darwin1.[[012]]) + rhapsody* | darwin1.[[0123]]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[[012]]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac @@ -1070,10 +347,10 @@ _LT_EOF if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" else _lt_dsymutil= fi @@ -1081,189 +358,206 @@ _LT_EOF esac ]) - -# _LT_DARWIN_LINKER_FEATURES([TAG]) -# --------------------------------- -# Checks for linker and compiler features on darwin -m4_defun([_LT_DARWIN_LINKER_FEATURES], -[ - m4_require([_LT_REQUIRED_DARWIN_CHECKS]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_automatic, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], - [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) - else - _LT_TAGVAR(whole_archive_flag_spec, $1)='' - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - m4_if([$1], [CXX], -[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then - _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" - _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" - fi -],[]) - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi -]) - -# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) -# ---------------------------------- +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- # Links a minimal program and checks the executable # for the system default hardcoded library path. In most cases, # this is /usr/lib:/lib, but when the MPI compilers are used # the location of the communication and MPI libs are included too. # If we don't find anything, use the default library path according # to the aix ld manual. -# Store the results from the different compilers for each TAGNAME. -# Allow to override them for all tags through lt_cv_aix_libpath. -m4_defun([_LT_SYS_MODULE_PATH_AIX], -[m4_require([_LT_DECL_SED])dnl -if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : else - AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], - [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ - lt_aix_libpath_sed='[ - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }]' - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi],[]) - if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then - _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib" + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi fi - ]) - aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) fi -])# _LT_SYS_MODULE_PATH_AIX - - -# _LT_SHELL_INIT(ARG) -# ------------------- -m4_define([_LT_SHELL_INIT], -[m4_divert_text([M4SH-INIT], [$1 -])])# _LT_SHELL_INIT - - - -# _LT_PROG_ECHO_BACKSLASH -# ----------------------- -# Find how we can fake an echo command that does not interpret backslash. -# In particular, with Autoconf 2.60 or later we add some code to the start -# of the generated configure script which will find a shell with a builtin -# printf (which we can use as an echo command). -m4_defun([_LT_PROG_ECHO_BACKSLASH], -[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -AC_MSG_CHECKING([how to print strings]) -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$[]1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' fi -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi -case "$ECHO" in - printf*) AC_MSG_RESULT([printf]) ;; - print*) AC_MSG_RESULT([print -r]) ;; - *) AC_MSG_RESULT([cat]) ;; -esac - -m4_ifdef([_AS_DETECT_SUGGESTED], -[_AS_DETECT_SUGGESTED([ - test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test "X`printf %s $ECHO`" = "X$ECHO" \ - || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) - -_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) -_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) -])# _LT_PROG_ECHO_BACKSLASH +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH -# _LT_WITH_SYSROOT -# ---------------- -AC_DEFUN([_LT_WITH_SYSROOT], -[AC_MSG_CHECKING([for sysroot]) -AC_ARG_WITH([sysroot], -[ --with-sysroot[=DIR] Search for dependent libraries within DIR - (or the compiler's sysroot if not specified).], -[], [with_sysroot=no]) - -dnl lt_sysroot will always be passed unquoted. We quote it here -dnl in case the user passed a directory name. -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - AC_MSG_RESULT([${with_sysroot}]) - AC_MSG_ERROR([The sysroot must be an absolute path.]) - ;; -esac - - AC_MSG_RESULT([${lt_sysroot:-no}]) -_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl -[dependent libraries, and in which our libraries should be installed.])]) - -# _LT_ENABLE_LOCK -# --------------- -m4_defun([_LT_ENABLE_LOCK], +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], [AC_ARG_ENABLE([libtool-lock], - [AS_HELP_STRING([--disable-libtool-lock], - [avoid locking (might break parallel builds)])]) + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Some flags need to be propagated to the compiler or linker for good @@ -1274,93 +568,93 @@ ia64-*-hpux*) echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; esac fi rm -rf conftest* ;; *-*-irix6*) # Find out which ABI we are using. - echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + echo '[#]line __oline__ "configure"' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi fi rm -rf conftest* ;; x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) +s390*-*linux*|sparc*-*linux*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; esac fi rm -rf conftest* @@ -1372,36 +666,23 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) CFLAGS="$CFLAGS -belf" AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, [AC_LANG_PUSH(C) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) AC_LANG_POP]) if test x"$lt_cv_cc_needs_belf" != x"yes"; then # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf CFLAGS="$SAVE_CFLAGS" fi ;; -*-*solaris*) +sparc*-*solaris*) # Find out which ABI we are using. echo 'int i;' > conftest.$ac_ext if AC_TRY_EVAL(ac_compile); then case `/usr/bin/file conftest.o` in *64-bit*) case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; + yes*) LD="${LD-ld} -m elf64_sparc" ;; *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then LD="${LD-ld} -64" fi ;; @@ -1411,105 +692,30 @@ s390*-*linux*|s390*-*tpf*|sparc*-*linux*) fi rm -rf conftest* ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) esac need_locks="$enable_libtool_lock" -])# _LT_ENABLE_LOCK + +])# _LT_AC_LOCK -# _LT_PROG_AR -# ----------- -m4_defun([_LT_PROG_AR], -[AC_CHECK_TOOLS(AR, [ar], false) -: ${AR=ar} -: ${AR_FLAGS=cru} -_LT_DECL([], [AR], [1], [The archiver]) -_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) - -AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], - [lt_cv_ar_at_file=no - AC_COMPILE_IFELSE([AC_LANG_PROGRAM], - [echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - AC_TRY_EVAL([lt_ar_try]) - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - ]) - ]) - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi -_LT_DECL([], [archiver_list_spec], [1], - [How to feed a file listing to the archiver]) -])# _LT_PROG_AR - - -# _LT_CMD_OLD_ARCHIVE -# ------------------- -m4_defun([_LT_CMD_OLD_ARCHIVE], -[_LT_PROG_AR - -AC_CHECK_TOOL(STRIP, strip, :) -test -z "$STRIP" && STRIP=: -_LT_DECL([], [STRIP], [1], [A symbol stripping program]) - -AC_CHECK_TOOL(RANLIB, ranlib, :) -test -z "$RANLIB" && RANLIB=: -_LT_DECL([], [RANLIB], [1], - [Commands used to install an old-style archive]) - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac -_LT_DECL([], [old_postinstall_cmds], [2]) -_LT_DECL([], [old_postuninstall_cmds], [2]) -_LT_TAGDECL([], [old_archive_cmds], [2], - [Commands used to build an old-style archive]) -_LT_DECL([], [lock_old_archive_extraction], [0], - [Whether to use a lock for old archive extraction]) -])# _LT_CMD_OLD_ARCHIVE - - -# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, # [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) # ---------------------------------------------------------------- # Check whether the given compiler option works -AC_DEFUN([_LT_COMPILER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) AC_CACHE_CHECK([$1], [$2], [$2=no - m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$3" # Insert the option either (1) after the last *FLAGS variable, or @@ -1521,43 +727,37 @@ AC_CACHE_CHECK([$1], [$2], -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then $2=yes fi fi - $RM conftest* + $rm conftest* ]) if test x"[$]$2" = xyes; then - m4_if([$5], , :, [$5]) + ifelse([$5], , :, [$5]) else - m4_if([$6], , :, [$6]) + ifelse([$6], , :, [$6]) fi -])# _LT_COMPILER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) +])# AC_LIBTOOL_COMPILER_OPTION -# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, -# [ACTION-SUCCESS], [ACTION-FAILURE]) -# ---------------------------------------------------- -# Check whether the given linker option works -AC_DEFUN([_LT_LINKER_OPTION], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_SED])dnl +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED])dnl AC_CACHE_CHECK([$1], [$2], [$2=no save_LDFLAGS="$LDFLAGS" @@ -1569,7 +769,7 @@ AC_CACHE_CHECK([$1], [$2], if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&AS_MESSAGE_LOG_FD - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then $2=yes @@ -1578,28 +778,22 @@ AC_CACHE_CHECK([$1], [$2], $2=yes fi fi - $RM -r conftest* + $rm -r conftest* LDFLAGS="$save_LDFLAGS" ]) if test x"[$]$2" = xyes; then - m4_if([$4], , :, [$4]) + ifelse([$4], , :, [$4]) else - m4_if([$5], , :, [$5]) + ifelse([$5], , :, [$5]) fi -])# _LT_LINKER_OPTION - -# Old name: -AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) +])# AC_LIBTOOL_LINKER_OPTION -# LT_CMD_MAX_LEN -#--------------- -AC_DEFUN([LT_CMD_MAX_LEN], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -# find the maximum length of command line arguments +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments AC_MSG_CHECKING([the maximum length of command line arguments]) AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl i=0 @@ -1621,7 +815,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=-1; ;; - cygwin* | mingw* | cegcc*) + cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, @@ -1632,11 +826,6 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=8192; ;; - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. @@ -1662,11 +851,6 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=196608 ;; - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not @@ -1686,7 +870,7 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` else lt_cv_sys_max_cmd_len=32768 fi @@ -1697,28 +881,20 @@ AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; @@ -1729,36 +905,28 @@ if test -n $lt_cv_sys_max_cmd_len ; then else AC_MSG_RESULT(none) fi -max_cmd_len=$lt_cv_sys_max_cmd_len -_LT_DECL([], [max_cmd_len], [0], - [What is the maximum length of a command?]) -])# LT_CMD_MAX_LEN - -# Old name: -AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) +])# AC_LIBTOOL_SYS_MAX_CMD_LEN -# _LT_HEADER_DLFCN -# ---------------- -m4_defun([_LT_HEADER_DLFCN], -[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl -])# _LT_HEADER_DLFCN +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN -# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, -# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) -# ---------------------------------------------------------------- -m4_defun([_LT_TRY_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "$cross_compiling" = yes; then : [$4] else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -[#line $LINENO "configure" + cat > conftest.$ac_ext <= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); +#ifdef __cplusplus +extern "C" void exit (int); #endif -int fnord () { return 42; } +void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -1814,19 +980,15 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); - return status; + exit (status); }] -_LT_EOF +EOF if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null lt_status=$? @@ -1841,13 +1003,13 @@ _LT_EOF fi fi rm -fr conftest* -])# _LT_TRY_DLOPEN_SELF +])# _LT_AC_TRY_DLOPEN_SELF -# LT_SYS_DLOPEN_SELF -# ------------------ -AC_DEFUN([LT_SYS_DLOPEN_SELF], -[m4_require([_LT_HEADER_DLFCN])dnl +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown @@ -1863,15 +1025,15 @@ else lt_cv_dlopen_self=yes ;; - mingw* | pw32* | cegcc*) + mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= - ;; + ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= - ;; + ;; darwin*) # if libdl is installed we need to link against it @@ -1881,7 +1043,7 @@ else lt_cv_dlopen_libs= lt_cv_dlopen_self=yes ]) - ;; + ;; *) AC_CHECK_FUNC([shl_load], @@ -1923,7 +1085,7 @@ else AC_CACHE_CHECK([whether a program can dlopen itself], lt_cv_dlopen_self, [dnl - _LT_TRY_DLOPEN_SELF( + _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) ]) @@ -1931,8 +1093,8 @@ else if test "x$lt_cv_dlopen_self" = xyes; then wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" AC_CACHE_CHECK([whether a statically linked program can dlopen itself], - lt_cv_dlopen_self_static, [dnl - _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) ]) @@ -1954,32 +1116,19 @@ else *) enable_dlopen_self_static=unknown ;; esac fi -_LT_DECL([dlopen_support], [enable_dlopen], [0], - [Whether dlopen is supported]) -_LT_DECL([dlopen_self], [enable_dlopen_self], [0], - [Whether dlopen of programs is supported]) -_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], - [Whether dlopen of statically linked programs is supported]) -])# LT_SYS_DLOPEN_SELF - -# Old name: -AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) +])# AC_LIBTOOL_DLOPEN_SELF -# _LT_COMPILER_C_O([TAGNAME]) -# --------------------------- -# Check to see if options -c and -o are simultaneously supported by compiler. -# This macro does not hard code the compiler like AC_PROG_CC_C_O. -m4_defun([_LT_COMPILER_C_O], -[m4_require([_LT_DECL_SED])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_TAG_COMPILER])dnl +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no - $RM -r conftest 2>/dev/null + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out @@ -1994,50 +1143,46 @@ AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&AS_MESSAGE_LOG_FD - echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes fi fi chmod u+w . 2>&AS_MESSAGE_LOG_FD - $RM conftest* + $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out cd .. - $RM -r conftest - $RM conftest* + rmdir conftest + $rm conftest* ]) -_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], - [Does compiler simultaneously support -c and -o options?]) -])# _LT_COMPILER_C_O +])# AC_LIBTOOL_PROG_CC_C_O -# _LT_COMPILER_FILE_LOCKS([TAGNAME]) -# ---------------------------------- +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- # Check to see if we can do hard links to lock some files if needed -m4_defun([_LT_COMPILER_FILE_LOCKS], -[m4_require([_LT_ENABLE_LOCK])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -_LT_COMPILER_C_O([$1]) +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl hard_links="nottested" -if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user AC_MSG_CHECKING([if we can lock with hard links]) hard_links=yes - $RM conftest* + $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no @@ -2050,13 +1195,12 @@ if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != else need_locks=no fi -_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) -])# _LT_COMPILER_FILE_LOCKS +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS -# _LT_CHECK_OBJDIR -# ---------------- -m4_defun([_LT_CHECK_OBJDIR], +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], [AC_CACHE_CHECK([for objdir], [lt_cv_objdir], [rm -f .libs 2>/dev/null mkdir .libs 2>/dev/null @@ -2068,46 +1212,40 @@ else fi rmdir .libs 2>/dev/null]) objdir=$lt_cv_objdir -_LT_DECL([], [objdir], [0], - [The name of the directory that contains temporary libtool files])dnl -m4_pattern_allow([LT_OBJDIR])dnl -AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/", - [Define to the sub-directory in which libtool stores uninstalled libraries.]) -])# _LT_CHECK_OBJDIR +])# AC_LIBTOOL_OBJDIR -# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) -# -------------------------------------- +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- # Check hardcoding attributes. -m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_MSG_CHECKING([how to hardcode library paths into programs]) -_LT_TAGVAR(hardcode_action, $1)= -if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || - test -n "$_LT_TAGVAR(runpath_var, $1)" || - test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then - # We can hardcode non-existent directories. - if test "$_LT_TAGVAR(hardcode_direct, $1)" != no && + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no && - test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then # Linking always hardcodes the temporary library directory. - _LT_TAGVAR(hardcode_action, $1)=relink + _LT_AC_TAGVAR(hardcode_action, $1)=relink else # We can link without hardcoding, and we can hardcode nonexisting dirs. - _LT_TAGVAR(hardcode_action, $1)=immediate + _LT_AC_TAGVAR(hardcode_action, $1)=immediate fi else # We cannot hardcode anything, or else we can only hardcode existing # directories. - _LT_TAGVAR(hardcode_action, $1)=unsupported + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported fi -AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) -if test "$_LT_TAGVAR(hardcode_action, $1)" = relink || - test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || @@ -2115,79 +1253,74 @@ elif test "$shlibpath_overrides_runpath" = yes || # Fast installation is not necessary enable_fast_install=needless fi -_LT_TAGDECL([], [hardcode_action], [0], - [How to hardcode a shared library path into an executable]) -])# _LT_LINKER_HARDCODE_LIBPATH +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH -# _LT_CMD_STRIPLIB -# ---------------- -m4_defun([_LT_CMD_STRIPLIB], -[m4_require([_LT_DECL_EGREP]) -striplib= +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= old_striplib= AC_MSG_CHECKING([whether stripping libraries is possible]) -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" test -z "$striplib" && striplib="$STRIP --strip-unneeded" AC_MSG_RESULT([yes]) else # FIXME - insert some real tests, host_os isn't really good enough case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - AC_MSG_RESULT([yes]) - else - AC_MSG_RESULT([no]) - fi - ;; - *) - AC_MSG_RESULT([no]) + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) ;; esac fi -_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) -_LT_DECL([], [striplib], [1]) -])# _LT_CMD_STRIPLIB +])# AC_LIBTOOL_SYS_LIB_STRIP -# _LT_SYS_DYNAMIC_LINKER([TAG]) +# AC_LIBTOOL_SYS_DYNAMIC_LINKER # ----------------------------- # PORTME Fill in your ld.so characteristics -m4_defun([_LT_SYS_DYNAMIC_LINKER], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_OBJDUMP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CHECK_SHELL_FEATURES])dnl +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([dynamic linker characteristics]) -m4_if([$1], - [], [ +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +m4_if($1,[],[ if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= @@ -2200,7 +1333,7 @@ if test "$GCC" = yes; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; @@ -2220,29 +1353,10 @@ BEGIN {RS=" "; FS="/|\n";} { if (lt_foo != "") { lt_freq[[lt_foo]]++; } if (lt_freq[[lt_foo]] == 1) { print lt_foo; } }'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([[A-Za-z]]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` + sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi]) -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no @@ -2252,7 +1366,7 @@ need_version=unknown case $host_os in aix3*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH @@ -2261,7 +1375,7 @@ aix3*) ;; aix[[4-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes @@ -2279,7 +1393,7 @@ aix[[4-9]]*) aix4 | aix4.[[01]] | aix4.[[01]].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no @@ -2305,18 +1419,9 @@ aix[[4-9]]*) ;; amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) @@ -2326,7 +1431,7 @@ beos*) ;; bsdi[[45]]*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -2339,112 +1444,61 @@ bsdi[[45]]*) # libtool to hard-code these into programs ;; -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no - case $GCC,$cc_basename in - yes,*) - # gcc + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' + chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ - $RM \$dlpath' + $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; - mingw* | cegcc*) + mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' ;; esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' ;; *) - # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' ;; esac + dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; @@ -2454,18 +1508,18 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' -m4_if([$1], [],[ - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' ;; dgux*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' @@ -2473,6 +1527,10 @@ dgux*) shlibpath_var=LD_LIBRARY_PATH ;; +freebsd1*) + dynamic_linker=no + ;; + freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -2480,7 +1538,7 @@ freebsd* | dragonfly*) objformat=`/usr/bin/objformat` else case $host_os in - freebsd[[23]].*) objformat=aout ;; + freebsd[[123]]*) objformat=aout ;; *) objformat=elf ;; esac fi @@ -2498,7 +1556,7 @@ freebsd* | dragonfly*) esac shlibpath_var=LD_LIBRARY_PATH case $host_os in - freebsd2.*) + freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[[01]]* | freebsdelf3.[[01]]*) @@ -2518,26 +1576,12 @@ freebsd* | dragonfly*) ;; gnu*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -2563,18 +1607,18 @@ hpux9* | hpux10* | hpux11*) fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH @@ -2583,14 +1627,12 @@ hpux9* | hpux10* | hpux11*) soname_spec='${libname}${release}${shared_ext}$major' ;; esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 ;; interix[[3-9]]*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' @@ -2606,7 +1648,7 @@ irix5* | irix6* | nonstopux*) nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux else version_type=irix fi ;; @@ -2643,9 +1685,9 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2653,22 +1695,6 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu) finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], - [lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ - LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" - AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], - [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], - [lt_cv_shlibpath_overrides_runpath=yes])]) - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - ]) - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. @@ -2676,7 +1702,7 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu) # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -2693,7 +1719,7 @@ netbsd*) version_type=sunos need_lib_prefix=no need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' @@ -2708,22 +1734,20 @@ netbsd*) ;; newsos6) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; -*nto* | *qnx*) - version_type=qnx +nto-qnx*) + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' + shlibpath_overrides_runpath=yes ;; openbsd*) @@ -2732,13 +1756,13 @@ openbsd*) need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[[89]] | openbsd2.[[89]].*) shlibpath_overrides_runpath=no @@ -2777,7 +1801,7 @@ rdos*) ;; solaris*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -2802,7 +1826,7 @@ sunos4*) ;; sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -2810,6 +1834,7 @@ sysv4 | sysv4.3*) sni) shlibpath_overrides_runpath=no need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) @@ -2826,7 +1851,7 @@ sysv4 | sysv4.3*) sysv4*MP*) if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH @@ -2840,12 +1865,13 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" @@ -2855,19 +1881,8 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) sys_lib_dlsearch_path_spec='/usr/lib' ;; -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - uts4*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -2880,60 +1895,288 @@ esac AC_MSG_RESULT([$dynamic_linker]) test "$dynamic_linker" = no && can_build_shared=no +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - -_LT_DECL([], [variables_saved_for_relink], [1], - [Variables whose values should be saved in libtool wrapper scripts and - restored at link time]) -_LT_DECL([], [need_lib_prefix], [0], - [Do we need the "lib" prefix for modules?]) -_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) -_LT_DECL([], [version_type], [0], [Library versioning type]) -_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) -_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) -_LT_DECL([], [shlibpath_overrides_runpath], [0], - [Is shlibpath searched before the hard-coded library search path?]) -_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) -_LT_DECL([], [library_names_spec], [1], - [[List of archive names. First name is the real one, the rest are links. - The last name is the one that the linker finds with -lNAME]]) -_LT_DECL([], [soname_spec], [1], - [[The coded name of the library, if different from the real name]]) -_LT_DECL([], [install_override_mode], [1], - [Permission mode override for installation of shared libraries]) -_LT_DECL([], [postinstall_cmds], [2], - [Command to use after installation of a shared archive]) -_LT_DECL([], [postuninstall_cmds], [2], - [Command to use after uninstallation of a shared archive]) -_LT_DECL([], [finish_cmds], [2], - [Commands used to finish a libtool library installation in a directory]) -_LT_DECL([], [finish_eval], [1], - [[As "finish_cmds", except a single script fragment to be evaled but - not shown]]) -_LT_DECL([], [hardcode_into_libs], [0], - [Whether we should hardcode library paths into libraries]) -_LT_DECL([], [sys_lib_search_path_spec], [2], - [Compile-time system search path for libraries]) -_LT_DECL([], [sys_lib_dlsearch_path_spec], [2], - [Run-time system search path for libraries]) -])# _LT_SYS_DYNAMIC_LINKER +])# _LT_AC_TAGCONFIG -# _LT_PATH_TOOL_PREFIX(TOOL) +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) # -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- # find a file program which can recognize shared library -AC_DEFUN([_LT_PATH_TOOL_PREFIX], -[m4_require([_LT_DECL_EGREP])dnl +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl AC_MSG_CHECKING([for $1]) AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, [case $MAGIC_CMD in @@ -2946,7 +2189,7 @@ AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, dnl $ac_dummy forces splitting on constant user-supplied paths. dnl POSIX.2 word splitting is done only on the output of word expansions, dnl not every word. This closes a longstanding sh security hole. - ac_dummy="m4_if([$2], , $PATH, [$2])" + ac_dummy="ifelse([$2], , $PATH, [$2])" for ac_dir in $ac_dummy; do IFS="$lt_save_ifs" test -z "$ac_dir" && ac_dir=. @@ -2961,7 +2204,7 @@ dnl not every word. This closes a longstanding sh security hole. $EGREP "$file_magic_regex" > /dev/null; then : else - cat <<_LT_EOF 1>&2 + cat <&2 *** Warning: the command libtool uses to detect shared libraries, *** $file_magic_cmd, produces output that libtool cannot recognize. @@ -2972,7 +2215,7 @@ dnl not every word. This closes a longstanding sh security hole. *** may want to report the problem to your system manager and/or to *** bug-libtool@gnu.org -_LT_EOF +EOF fi ;; esac fi @@ -2989,48 +2232,37 @@ if test -n "$MAGIC_CMD"; then else AC_MSG_RESULT(no) fi -_LT_DECL([], [MAGIC_CMD], [0], - [Used to examine libraries when file_magic_cmd begins with "file"])dnl -])# _LT_PATH_TOOL_PREFIX - -# Old name: -AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) +])# AC_PATH_TOOL_PREFIX -# _LT_PATH_MAGIC -# -------------- +# AC_PATH_MAGIC +# ------------- # find a file program which can recognize a shared library -m4_defun([_LT_PATH_MAGIC], -[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) if test -z "$lt_cv_path_MAGIC_CMD"; then if test -n "$ac_tool_prefix"; then - _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) else MAGIC_CMD=: fi fi -])# _LT_PATH_MAGIC +])# AC_PATH_MAGIC -# LT_PATH_LD +# AC_PROG_LD # ---------- # find the pathname to the GNU or non-GNU linker -AC_DEFUN([LT_PATH_LD], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PROG_ECHO_BACKSLASH])dnl - -AC_ARG_WITH([gnu-ld], - [AS_HELP_STRING([--with-gnu-ld], +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], [assume the C compiler uses GNU ld @<:@default=no@:>@])], [test "$withval" = no || with_gnu_ld=yes], - [with_gnu_ld=no])dnl - + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl ac_prog=ld if test "$GCC" = yes; then # Check if gcc -print-prog-name=ld gives a path. @@ -3047,9 +2279,9 @@ if test "$GCC" = yes; then [[\\/]]* | ?:[[\\/]]*) re_direlt='/[[^/]][[^/]]*/\.\./' # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` done test -z "$LD" && LD="$ac_prog" ;; @@ -3099,24 +2331,15 @@ else AC_MSG_RESULT(no) fi test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) -_LT_PATH_LD_GNU -AC_SUBST([LD]) - -_LT_TAGDECL([], [LD], [1], [The linker used to build libraries]) -])# LT_PATH_LD - -# Old names: -AU_ALIAS([AM_PROG_LD], [LT_PATH_LD]) -AU_ALIAS([AC_PROG_LD], [LT_PATH_LD]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_LD], []) -dnl AC_DEFUN([AC_PROG_LD], []) +AC_PROG_LD_GNU +])# AC_PROG_LD -# _LT_PATH_LD_GNU -#- -------------- -m4_defun([_LT_PATH_LD_GNU], -[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, +# AC_PROG_LD_GNU +# -------------- +AC_DEFUN([AC_PROG_LD_GNU], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld, [# I'd rather use --version here, but apparently some GNU lds only accept -v. case `$LD -v 2>&1 &1 /dev/null 2>&1; then + if ( file / ) >/dev/null 2>&1; then lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' lt_cv_file_magic_cmd='func_win32_libid' else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' lt_cv_file_magic_cmd='$OBJDUMP -f' fi ;; -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' - ;; - darwin* | rhapsody*) lt_cv_deplibs_check_method=pass_all ;; freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then case $host_cpu in i*86 ) # Not sure whether the presence of OpenBSD here was a mistake. @@ -3252,10 +2458,6 @@ gnu*) lt_cv_deplibs_check_method=pass_all ;; -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - hpux10.20* | hpux11*) lt_cv_file_magic_cmd=/usr/bin/file case $host_cpu in @@ -3264,11 +2466,11 @@ hpux10.20* | hpux11*) lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so ;; hppa*64*) - [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl ;; *) - lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' lt_cv_file_magic_test_file=/usr/lib/libc.sl ;; esac @@ -3289,13 +2491,13 @@ irix5* | irix6* | nonstopux*) lt_cv_deplibs_check_method=pass_all ;; -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) +# This must be Linux ELF. +linux* | k*bsd*-gnu) lt_cv_deplibs_check_method=pass_all ;; netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' @@ -3308,12 +2510,12 @@ newos6*) lt_cv_file_magic_test_file=/usr/lib/libnls.so ;; -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all +nto-qnx*) + lt_cv_deplibs_check_method=unknown ;; openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' else lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' @@ -3332,10 +2534,6 @@ solaris*) lt_cv_deplibs_check_method=pass_all ;; -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all - ;; - sysv4 | sysv4.3*) case $host_vendor in motorola) @@ -3363,47 +2561,22 @@ sysv4 | sysv4.3*) esac ;; -tpf*) +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) lt_cv_deplibs_check_method=pass_all ;; esac ]) - -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes - else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` - fi - ;; - esac -fi - file_magic_cmd=$lt_cv_file_magic_cmd deplibs_check_method=$lt_cv_deplibs_check_method test -z "$deplibs_check_method" && deplibs_check_method=unknown - -_LT_DECL([], [deplibs_check_method], [1], - [Method to check whether dependent libraries are shared objects]) -_LT_DECL([], [file_magic_cmd], [1], - [Command to use when deplibs_check_method = "file_magic"]) -_LT_DECL([], [file_magic_glob], [1], - [How to find potential files when deplibs_check_method = "file_magic"]) -_LT_DECL([], [want_nocaseglob], [1], - [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) -])# _LT_CHECK_MAGIC_METHOD +])# AC_DEPLIBS_CHECK_METHOD -# LT_PATH_NM +# AC_PROG_NM # ---------- -# find the pathname to a BSD- or MS-compatible name lister -AC_DEFUN([LT_PATH_NM], -[AC_REQUIRE([AC_PROG_CC])dnl -AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, [if test -n "$NM"; then # Let the user override the test. lt_cv_path_NM="$NM" @@ -3445,128 +2618,20 @@ else done IFS="$lt_save_ifs" done - : ${lt_cv_path_NM=no} + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm fi]) -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - AC_SUBST([DUMPBIN]) - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm -AC_SUBST([NM]) -_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl - -AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], - [lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&AS_MESSAGE_LOG_FD - (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) - cat conftest.out >&AS_MESSAGE_LOG_FD - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest*]) -])# LT_PATH_NM - -# Old names: -AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) -AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_PROG_NM], []) -dnl AC_DEFUN([AC_PROG_NM], []) - -# _LT_CHECK_SHAREDLIB_FROM_LINKLIB -# -------------------------------- -# how to determine the name of the shared library -# associated with a specific link library. -# -- PORTME fill in with the dynamic library characteristics -m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], -[m4_require([_LT_DECL_EGREP]) -m4_require([_LT_DECL_OBJDUMP]) -m4_require([_LT_DECL_DLLTOOL]) -AC_CACHE_CHECK([how to associate runtime and link libraries], -lt_cv_sharedlib_from_linklib_cmd, -[lt_cv_sharedlib_from_linklib_cmd='unknown' - -case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" - ;; -esac -]) -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO - -_LT_DECL([], [sharedlib_from_linklib_cmd], [1], - [Command to associate shared and link libraries]) -])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +NM="$lt_cv_path_NM" +])# AC_PROG_NM -# _LT_PATH_MANIFEST_TOOL -# ---------------------- -# locate the manifest tool -m4_defun([_LT_PATH_MANIFEST_TOOL], -[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], - [lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&AS_MESSAGE_LOG_FD - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes - fi - rm -f conftest*]) -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: -fi -_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl -])# _LT_PATH_MANIFEST_TOOL - - -# LT_LIB_M -# -------- +# AC_CHECK_LIBM +# ------------- # check for math library -AC_DEFUN([LT_LIB_M], +AC_DEFUN([AC_CHECK_LIBM], [AC_REQUIRE([AC_CANONICAL_HOST])dnl LIBM= case $host in -*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) # These system don't have libm, or don't need it ;; *-ncr-sysv4.3*) @@ -3577,52 +2642,2155 @@ case $host in AC_CHECK_LIB(m, cos, LIBM="-lm") ;; esac -AC_SUBST([LIBM]) -])# LT_LIB_M - -# Old name: -AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_CHECK_LIBM], []) +])# AC_CHECK_LIBM -# _LT_COMPILER_NO_RTTI([TAGNAME]) -# ------------------------------- -m4_defun([_LT_COMPILER_NO_RTTI], -[m4_require([_LT_TAG_COMPILER])dnl +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE -_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= -if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; *) - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) +case " $_LT_AC_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac +])# AC_LIBTOOL_POSTDEP_PREDEP + +# AC_LIBTOOL_LANG_F77_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) +AC_DEFUN([_LT_AC_LANG_F77_CONFIG], +[AC_REQUIRE([AC_PROG_F77]) +AC_LANG_PUSH(Fortran 77) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + return + end +" + +# Code to be used in simple link tests +lt_simple_link_test_code="\ + program t + end +" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +_LT_AC_TAGVAR(GCC, $1)="$G77" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) +AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], +[AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# ------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) +AC_DEFUN([_LT_AC_LANG_RC_CONFIG], +[AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +AC_DEFUN([AC_LIBTOOL_CONFIG], +[# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + _LT_AC_TAGVAR(compiler, $1) \ + _LT_AC_TAGVAR(CC, $1) \ + _LT_AC_TAGVAR(LD, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ + _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ + _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ + _LT_AC_TAGVAR(old_archive_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ + _LT_AC_TAGVAR(predep_objects, $1) \ + _LT_AC_TAGVAR(postdep_objects, $1) \ + _LT_AC_TAGVAR(predeps, $1) \ + _LT_AC_TAGVAR(postdeps, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ + _LT_AC_TAGVAR(archive_cmds, $1) \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ + _LT_AC_TAGVAR(postinstall_cmds, $1) \ + _LT_AC_TAGVAR(postuninstall_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ + _LT_AC_TAGVAR(allow_undefined_flag, $1) \ + _LT_AC_TAGVAR(no_undefined_flag, $1) \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ + _LT_AC_TAGVAR(hardcode_automatic, $1) \ + _LT_AC_TAGVAR(module_cmds, $1) \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) \ + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ + _LT_AC_TAGVAR(fix_srcfile_path, $1) \ + _LT_AC_TAGVAR(exclude_expsyms, $1) \ + _LT_AC_TAGVAR(include_expsyms, $1); do + + case $var in + _LT_AC_TAGVAR(old_archive_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ + _LT_AC_TAGVAR(archive_cmds, $1) | \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(module_cmds, $1) | \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\[$]0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` + ;; esac - _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], +ifelse([$1], [], + [cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + AC_MSG_NOTICE([creating $ofile])], + [cfgfile="$ofile"]) + + cat <<__EOF__ >> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], lt_cv_prog_compiler_rtti_exceptions, [-fno-rtti -fno-exceptions], [], - [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) fi -_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], - [Compiler flag to turn off builtin functions]) -])# _LT_COMPILER_NO_RTTI +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI -# _LT_CMD_GLOBAL_SYMBOLS -# ---------------------- -m4_defun([_LT_CMD_GLOBAL_SYMBOLS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_PROG_CC])dnl -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([LT_PATH_NM])dnl -AC_REQUIRE([LT_PATH_LD])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_TAG_COMPILER])dnl - +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([LT_AC_PROG_SED]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) # Check for command to grab the raw symbol name followed by C symbol from nm. AC_MSG_CHECKING([command to parse $NM output from $compiler object]) AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], @@ -3636,18 +4804,33 @@ symcode='[[BCDEGRST]]' # Regexp to match symbols that can be accessed directly from C. sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + # Define system-specific variables. case $host_os in aix*) symcode='[[BCDT]]' ;; -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | pw32*) symcode='[[ABCDGISTW]]' ;; -hpux*) +hpux*) # Its linker distinguishes data from code symbols if test "$host_cpu" = ia64; then symcode='[[ABCDEGRST]]' fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi ;; irix* | nonstopux*) symcode='[[BCDEGRST]]' @@ -3672,79 +4855,49 @@ sysv4) ;; esac +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + # If we're using GNU nm, then use its standard symbol codes. case `$NM -V 2>&1` in *GNU* | *'with BFD'*) symcode='[[ABCDGIRSTW]]' ;; esac -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. +# Try without a prefix undercore, then with it. for ac_symprfx in "" "_"; do # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. symxfrm="\\1 $ac_symprfx\\2 \\2" # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK ['"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx]" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" # Check to see that the pipe works correctly. pipe_works=no rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then # Try sorting and uniquifying the output. if sort "$nlist" | uniq > "$nlist"T; then mv -f "$nlist"T "$nlist" @@ -3753,67 +4906,53 @@ _LT_EOF fi # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT@&t@_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT@&t@_DLSYM_CONST -#else -# define LT@&t@_DLSYM_CONST const -#endif - + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext #ifdef __cplusplus extern "C" { #endif -_LT_EOF +EOF # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT@&t@_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[[]] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const #endif +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + #ifdef __cplusplus } #endif -_LT_EOF +EOF # Now try linking the two files. mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then pipe_works=yes fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" else echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD fi @@ -3845,91 +4984,56 @@ if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; the else AC_MSG_RESULT(ok) fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - -_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], - [Take the output of nm and produce a listing of raw symbols and C names]) -_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], - [Transform the output of nm in a proper C declaration]) -_LT_DECL([global_symbol_to_c_name_address], - [lt_cv_sys_global_symbol_to_c_name_address], [1], - [Transform the output of nm in a C name address pair]) -_LT_DECL([global_symbol_to_c_name_address_lib_prefix], - [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], - [Transform the output of nm in a C name address pair when lib prefix is needed]) -_LT_DECL([], [nm_file_list_spec], [1], - [Specify filename containing input files for $NM]) -]) # _LT_CMD_GLOBAL_SYMBOLS +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE -# _LT_COMPILER_PIC([TAGNAME]) -# --------------------------- -m4_defun([_LT_COMPILER_PIC], -[m4_require([_LT_TAG_COMPILER])dnl -_LT_TAGVAR(lt_prog_compiler_wl, $1)= -_LT_TAGVAR(lt_prog_compiler_pic, $1)= -_LT_TAGVAR(lt_prog_compiler_static, $1)= +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= -m4_if([$1], [CXX], [ +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ # C++ specific cases for pic, static, wl, etc. if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; - amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; - beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) + mingw* | cygwin* | os2* | pw32*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; *djgpp*) # DJGPP does not support shared libraries at all - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= ;; interix[[3-9]]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. @@ -3937,28 +5041,22 @@ m4_if([$1], [CXX], [ ;; sysv4*MP*) if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. case $host_cpu in - hppa*64*) + hppa*64*|ia64*) ;; *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; esac else @@ -3967,33 +5065,37 @@ m4_if([$1], [CXX], [ # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' fi ;; chorus*) case $cc_basename in cxch68*) # Green Hills C++ Compiler - # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" ;; esac ;; - mingw* | cygwin* | os2* | pw32* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; dgux*) case $cc_basename in ec++*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; ghcx*) # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; *) ;; @@ -4005,21 +5107,21 @@ m4_if([$1], [CXX], [ hpux9* | hpux10* | hpux11*) case $cc_basename in CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' if test "$host_cpu" != ia64; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' fi ;; aCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' case $host_cpu in hppa*64*|ia64*) # +Z the default ;; *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac ;; @@ -4034,60 +5136,47 @@ m4_if([$1], [CXX], [ irix5* | irix6* | nonstopux*) case $cc_basename in CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' # CC pic flag -KPIC is the default. ;; *) ;; esac ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + linux* | k*bsd*-gnu) case $cc_basename in KCC*) # KAI C++ Compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' ;; - ecpc* ) - # old Intel C++ for x86_64 which still supported -KPIC. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - icpc* ) - # Intel C++, used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; pgCC* | pgcpp*) - # Portland Group C++ compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; cxx*) # Compaq C++ # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' - ;; - xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) - # IBM XL 8.0, 9.0 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C++ 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; esac ;; @@ -4100,7 +5189,7 @@ m4_if([$1], [CXX], [ mvs*) case $cc_basename in cxx*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' ;; *) ;; @@ -4108,27 +5197,22 @@ m4_if([$1], [CXX], [ ;; netbsd*) ;; - *qnx* | *nto*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; osf3* | osf4* | osf5*) case $cc_basename in KCC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' ;; RCC*) # Rational C++ 2.4.1 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' ;; cxx*) # Digital/Compaq C++ - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # Make sure the PIC flag is empty. It appears that all Alpha # Linux and Compaq Tru64 Unix objects are PIC. - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; *) ;; @@ -4138,15 +5222,15 @@ m4_if([$1], [CXX], [ ;; solaris*) case $cc_basename in - CC* | sunCC*) + CC*) # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' ;; gcx*) # Green Hills C++ Compiler - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' ;; *) ;; @@ -4156,12 +5240,22 @@ m4_if([$1], [CXX], [ case $cc_basename in CC*) # Sun C++ 4.x - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; lcc*) # Lucid - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' ;; *) ;; @@ -4170,96 +5264,58 @@ m4_if([$1], [CXX], [ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) case $cc_basename in CC*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - esac - ;; - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - ;; - *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; esac ;; vxworks*) ;; *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ], [ if test "$GCC" = yes; then - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' case $host_os in aix*) # All AIX code is PIC. if test "$host_cpu" = ia64; then # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' - ;; - esac + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) + mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style # (--disable-auto-import) libraries m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) ;; darwin* | rhapsody*) # PIC is the default on this platform # Common symbols not allowed in MH_DYLIB files - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' - ;; - - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - _LT_TAGVAR(lt_prog_compiler_static, $1)= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' ;; interix[[3-9]]*) @@ -4270,57 +5326,17 @@ m4_if([$1], [CXX], [ msdosdjgpp*) # Just because we use GCC doesn't mean we suddenly get shared libraries # on systems that don't support them. - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no enable_shared=no ;; - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - sysv4*MP*) if test -d /usr/nec; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic fi ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - ;; - esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' - if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" - fi - ;; - esac - else - # PORTME Check for flag to pass linker flags through the system compiler. - case $host_os in - aix*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - if test "$host_cpu" = ia64; then - # AIX 5 now supports IA64 processor - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - else - _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' - fi - ;; - - mingw* | cygwin* | pw32* | os2* | cegcc*) - # This hack is so that the source file can tell whether it is being - # built for inclusion in a dll (and should export symbols for example). - m4_if([$1], [GCJ], [], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) - ;; - - hpux9* | hpux10* | hpux11*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + hpux*) # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but # not for PA HP-UX. case $host_cpu in @@ -4328,298 +5344,270 @@ m4_if([$1], [CXX], [ # +Z the default ;; *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' ;; esac # Is there a better lt_prog_compiler_static that works with the bundled CC? - _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' ;; irix5* | irix6* | nonstopux*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # PIC (with -KPIC) is the default. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux* | k*bsd*-gnu) case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' - _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' - ;; - nagfor*) - # NAG Fortran compiler - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; ccc*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All Alpha code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' - ;; *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='' - ;; - *Sun\ F* | *Sun*Fortran*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - ;; + case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' ;; - *Intel*\ [[CF]]*Compiler*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' - ;; - *Portland\ Group*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' ;; esac ;; esac ;; - newsos6) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' # All OSF/1 code is PIC. - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; rdos*) - _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' ;; solaris*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; *) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; esac ;; sunos4*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4 | sysv4.2uw2* | sysv4.3*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; sysv4*MP*) if test -d /usr/nec ;then - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' fi ;; sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; unicos*) - _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; uts4*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' - _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' ;; *) - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no ;; esac fi ]) -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - _LT_TAGVAR(lt_prog_compiler_pic, $1)= - ;; - *) - _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" - ;; -esac - -AC_CACHE_CHECK([for $compiler option to produce PIC], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], - [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) -_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) # # Check to make sure the PIC flag actually works. # -if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then - _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], - [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], - [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], - [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in "" | " "*) ;; - *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; esac], - [_LT_TAGVAR(lt_prog_compiler_pic, $1)= - _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) fi -_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], - [Additional compiler flags for building library objects]) +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac -_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], - [How to pass a linker flag through the compiler]) # # Check to make sure the static flag actually works. # -wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" -_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], - _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), $lt_tmp_static_flag, [], - [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) -_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], - [Compiler flag to prevent dynamic linking]) -])# _LT_COMPILER_PIC + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) -# _LT_LINKER_SHLIBS([TAGNAME]) -# ---------------------------- +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ # See if the linker supports building shared libraries. -m4_defun([_LT_LINKER_SHLIBS], -[AC_REQUIRE([LT_PATH_LD])dnl -AC_REQUIRE([LT_PATH_NM])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_DECL_SED])dnl -m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl -m4_require([_LT_TAG_COMPILER])dnl +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_REQUIRE([LT_AC_PROG_SED])dnl AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) -m4_if([$1], [CXX], [ - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' case $host_os in aix[[4-9]]*) # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global defined - # symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi ;; pw32*) - _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" - ;; - cygwin* | mingw* | cegcc*) - case $cc_basename in - cl*) - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - ;; - *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] - ;; - esac - ;; + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + ;; *) - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - ;; + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; esac -], [ + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +],[ runpath_var= - _LT_TAGVAR(allow_undefined_flag, $1)= - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(archive_cmds, $1)= - _LT_TAGVAR(archive_expsym_cmds, $1)= - _LT_TAGVAR(compiler_needs_object, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(hardcode_automatic, $1)=no - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(hardcode_libdir_separator, $1)= - _LT_TAGVAR(hardcode_minus_L, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported - _LT_TAGVAR(inherit_rpath, $1)=no - _LT_TAGVAR(link_all_deplibs, $1)=unknown - _LT_TAGVAR(module_cmds, $1)= - _LT_TAGVAR(module_expsym_cmds, $1)= - _LT_TAGVAR(old_archive_from_new_cmds, $1)= - _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= - _LT_TAGVAR(thread_safe_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list - _LT_TAGVAR(include_expsyms, $1)= + _LT_AC_TAGVAR(include_expsyms, $1)= # exclude_expsyms can be an extended regexp of symbols to exclude # it will be wrapped by ` (' and `)$', so one must not match beginning or # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', # as well as any symbol that contains `d'. - _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out # platforms (ab)use it in PIC code, but their linkers get confused if # the symbol is explicitly referenced. Since portable code cannot @@ -4628,9 +5616,10 @@ m4_if([$1], [CXX], [ # Exclude shared library initialization/finalization symbols. dnl Note also adjust exclude_expsyms for C++ above. extract_expsyms_cmds= - + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) case $host_os in - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. @@ -4647,34 +5636,8 @@ dnl Note also adjust exclude_expsyms for C++ above. ;; esac - _LT_TAGVAR(ld_shlibs, $1)=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no + _LT_AC_TAGVAR(ld_shlibs, $1)=yes if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; - *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' @@ -4682,17 +5645,16 @@ dnl Note also adjust exclude_expsyms for C++ above. # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - _LT_TAGVAR(whole_archive_flag_spec, $1)= + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; + case `$LD -v 2>/dev/null` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... @@ -4705,62 +5667,58 @@ dnl Note also adjust exclude_expsyms for C++ above. aix[[3-9]]*) # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 -*** Warning: the GNU linker, at least up to release 2.19, is reported +*** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. -_LT_EOF +EOF fi ;; amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' else - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' - _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; @@ -4768,118 +5726,79 @@ _LT_EOF fi~ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' else - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. # Instead, shared libraries are loaded at an image base (0x10000000 by # default) and relocated if they conflict, which is a slow very memory # consuming and fragmenting process. To avoid this, we pick a random, # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - _LT_TAGVAR(whole_archive_flag_spec, $1)= - tmp_sharedflag='--shared' ;; - xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; esac - _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi else - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then - _LT_TAGVAR(ld_shlibs, $1)=no - cat <<_LT_EOF 1>&2 + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool @@ -4888,19 +5807,19 @@ _LT_EOF *** your PATH or compiler configuration so that the native linker is *** used, and then restart. -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) case `$LD -v 2>&1` in *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no cat <<_LT_EOF 1>&2 *** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not @@ -4913,58 +5832,54 @@ _LT_EOF _LT_EOF ;; *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac ;; sunos4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' wlarc= - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; esac - if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then runpath_var= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= - _LT_TAGVAR(export_dynamic_flag_spec, $1)= - _LT_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= fi else # PORTME fill in a description of your system's linker (not GNU ld) case $host_os in aix3*) - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' # Note: this linker hardcodes the directories in LIBPATH if there # are no directories specified by -L. - _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then # Neither direct hardcoding nor static linking is supported with a # broken collect2. - _LT_TAGVAR(hardcode_direct, $1)=unsupported + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported fi ;; @@ -4978,12 +5893,10 @@ _LT_EOF else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' else - _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no @@ -4992,10 +5905,10 @@ _LT_EOF # need to do runtime linking. case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi done ;; esac @@ -5010,32 +5923,30 @@ _LT_EOF # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes if test "$GCC" = yes; then case $host_os in aix4.[[012]]|aix4.[[012]].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null then - # We have reworked collect2 - : + # We have reworked collect2 + : else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= fi ;; esac @@ -5046,8 +5957,8 @@ _LT_EOF else # not using gcc if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then @@ -5058,139 +5969,129 @@ _LT_EOF fi fi - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. - _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(always_export_symbols, $1)=yes if test "$aix_use_runtimelinking" = yes; then # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes # This is similar to how AIX traditionally builds its shared libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' fi fi ;; amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='' - ;; - m68k) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - ;; - esac + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; bsdi[[45]]*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - # FIXME: Should let the user specify the lib program. - _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - ;; - esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes ;; darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi ;; dgux*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor @@ -5198,112 +6099,106 @@ _LT_EOF # does not break anything, and helps significantly (at the cost of a little # extra space). freebsd2.2*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; hpux9*) if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' ;; hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes fi ;; hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then + if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else case $host_cpu in hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - m4_if($1, [], [ - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - _LT_LINKER_OPTION([if $CC understands -b], - _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], - [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], - [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi if test "$with_gnu_ld" = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: case $host_cpu in hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. - _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes ;; esac fi @@ -5311,236 +6206,194 @@ _LT_EOF irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], - [lt_cv_irix_exported_symbol], - [save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - AC_LINK_IFELSE( - [AC_LANG_SOURCE( - [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], - [C++], [[int foo (void) { return 0; }]], - [Fortran 77], [[ - subroutine foo - end]], - [Fortran], [[ - subroutine foo - end]])])], - [lt_cv_irix_exported_symbol=yes], - [lt_cv_irix_exported_symbol=no]) - LDFLAGS="$save_LDFLAGS"]) - if test "$lt_cv_irix_exported_symbol" = yes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else - _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; newsos6) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - - *nto* | *qnx*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; openbsd*) if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' else case $host_os in openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' ;; *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' ;; esac - fi + fi else - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no fi ;; os2*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' else - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' fi - _LT_TAGVAR(archive_cmds_need_lc, $1)='no' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: ;; solaris*) - _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' if test "$GCC" = yes; then wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no case $host_os in solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; *) # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) + # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' fi ;; esac - _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes ;; sunos4*) if test "x$host_vendor" = xsequent; then # Use $CC to link under sequent, because it throws in some extra .o # files that make .init and .fini sections work. - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' fi - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4) case $host_vendor in sni) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? ;; siemens) ## LD is ld it makes a PLAMLIB ## CC just makes a GrossModule. - _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' - _LT_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no ;; motorola) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie ;; esac runpath_var='LD_RUN_PATH' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; sysv4.3*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' ;; sysv4*MP*) if test -d /usr/nec; then - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var=LD_RUN_PATH hardcode_runpath_var=yes - _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes fi ;; sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; @@ -5551,65 +6404,50 @@ _LT_EOF # ever link correctly. If we're not using GNU ld we use -z text # though, which does catch some bad symbols but isn't as heavy-handed # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; uts4*) - _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no ;; *) - _LT_TAGVAR(ld_shlibs, $1)=no + _LT_AC_TAGVAR(ld_shlibs, $1)=no ;; esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym' - ;; - esac - fi fi ]) -AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) -test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - -_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld - -_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl -_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl -_LT_DECL([], [extract_expsyms_cmds], [2], - [The commands to extract the exported symbol list from a shared archive]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no # # Do we need to explicitly link libc? # -case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in x|xyes) # Assume -lc should be added - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes if test "$enable_shared" = yes && test "$GCC" = yes; then - case $_LT_TAGVAR(archive_cmds, $1) in + case $_LT_AC_TAGVAR(archive_cmds, $1) in *'~'*) # FIXME: we may have to deal with multi-command sequences. ;; @@ -5617,2091 +6455,144 @@ x|xyes) # Test whether the compiler implicitly links with -lc since on some # systems, -lgcc has to come before -lc. If gcc already passes -lc # to ld, don't add -lc before -lgcc. - AC_CACHE_CHECK([whether -lc should be explicitly linked in], - [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), - [$RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext - if AC_TRY_EVAL(ac_compile) 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) - pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) - _LT_TAGVAR(allow_undefined_flag, $1)= - if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) - then - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no - else - lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes - fi - _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - ]) - _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) - ;; - esac - fi - ;; -esac - -_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], - [Whether or not to add -lc for building shared libraries]) -_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], - [enable_shared_with_static_runtimes], [0], - [Whether or not to disallow shared libs when runtime libs are static]) -_LT_TAGDECL([], [export_dynamic_flag_spec], [1], - [Compiler flag to allow reflexive dlopens]) -_LT_TAGDECL([], [whole_archive_flag_spec], [1], - [Compiler flag to generate shared objects directly from archives]) -_LT_TAGDECL([], [compiler_needs_object], [1], - [Whether the compiler copes with passing no objects directly]) -_LT_TAGDECL([], [old_archive_from_new_cmds], [2], - [Create an old-style archive from a shared archive]) -_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], - [Create a temporary old-style archive to link instead of a shared archive]) -_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) -_LT_TAGDECL([], [archive_expsym_cmds], [2]) -_LT_TAGDECL([], [module_cmds], [2], - [Commands used to build a loadable module if different from building - a shared archive.]) -_LT_TAGDECL([], [module_expsym_cmds], [2]) -_LT_TAGDECL([], [with_gnu_ld], [1], - [Whether we are building with GNU ld or not]) -_LT_TAGDECL([], [allow_undefined_flag], [1], - [Flag that allows shared libraries with undefined symbols to be built]) -_LT_TAGDECL([], [no_undefined_flag], [1], - [Flag that enforces no undefined symbols]) -_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], - [Flag to hardcode $libdir into a binary during linking. - This must work even if $libdir does not exist]) -_LT_TAGDECL([], [hardcode_libdir_separator], [1], - [Whether we need a single "-rpath" flag with a separated argument]) -_LT_TAGDECL([], [hardcode_direct], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary]) -_LT_TAGDECL([], [hardcode_direct_absolute], [0], - [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes - DIR into the resulting binary and the resulting library dependency is - "absolute", i.e impossible to change by setting ${shlibpath_var} if the - library is relocated]) -_LT_TAGDECL([], [hardcode_minus_L], [0], - [Set to "yes" if using the -LDIR flag during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_shlibpath_var], [0], - [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR - into the resulting binary]) -_LT_TAGDECL([], [hardcode_automatic], [0], - [Set to "yes" if building a shared library automatically hardcodes DIR - into the library and all subsequent libraries and executables linked - against it]) -_LT_TAGDECL([], [inherit_rpath], [0], - [Set to yes if linker adds runtime paths of dependent libraries - to runtime path list]) -_LT_TAGDECL([], [link_all_deplibs], [0], - [Whether libtool must link a program against all its dependency libraries]) -_LT_TAGDECL([], [always_export_symbols], [0], - [Set to "yes" if exported symbols are required]) -_LT_TAGDECL([], [export_symbols_cmds], [2], - [The commands to list exported symbols]) -_LT_TAGDECL([], [exclude_expsyms], [1], - [Symbols that should not be listed in the preloaded symbols]) -_LT_TAGDECL([], [include_expsyms], [1], - [Symbols that must always be exported]) -_LT_TAGDECL([], [prelink_cmds], [2], - [Commands necessary for linking programs (against libraries) with templates]) -_LT_TAGDECL([], [postlink_cmds], [2], - [Commands necessary for finishing linking programs]) -_LT_TAGDECL([], [file_list_spec], [1], - [Specify filename containing input files]) -dnl FIXME: Not yet implemented -dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], -dnl [Compiler flag to generate thread safe objects]) -])# _LT_LINKER_SHLIBS - - -# _LT_LANG_C_CONFIG([TAG]) -# ------------------------ -# Ensure that the configuration variables for a C compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_C_CONFIG], -[m4_require([_LT_DECL_EGREP])dnl -lt_save_CC="$CC" -AC_LANG_PUSH(C) - -# Source file extension for C test sources. -ac_ext=c - -# Object file extension for compiled C test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="int some_variable = 0;" - -# Code to be used in simple link tests -lt_simple_link_test_code='int main(){return(0);}' - -_LT_TAG_COMPILER -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - LT_SYS_DLOPEN_SELF - _LT_CMD_STRIPLIB - - # Report which library types will actually be built - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_CONFIG($1) -fi -AC_LANG_POP -CC="$lt_save_CC" -])# _LT_LANG_C_CONFIG - - -# _LT_LANG_CXX_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a C++ compiler are suitably -# defined. These variables are subsequently used by _LT_CONFIG to write -# the compiler configuration to `libtool'. -m4_defun([_LT_LANG_CXX_CONFIG], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -m4_require([_LT_DECL_EGREP])dnl -m4_require([_LT_PATH_MANIFEST_TOOL])dnl -if test -n "$CXX" && ( test "X$CXX" != "Xno" && - ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || - (test "X$CXX" != "Xg++"))) ; then - AC_PROG_CXXCPP -else - _lt_caught_CXX_error=yes -fi - -AC_LANG_PUSH(C++) -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(compiler_needs_object, $1)=no -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for C++ test sources. -ac_ext=cpp - -# Object file extension for compiled C++ test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the CXX compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_caught_CXX_error" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="int some_variable = 0;" - - # Code to be used in simple link tests - lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC=$CC - lt_save_CFLAGS=$CFLAGS - lt_save_LD=$LD - lt_save_GCC=$GCC - GCC=$GXX - lt_save_with_gnu_ld=$with_gnu_ld - lt_save_path_LD=$lt_cv_path_LD - if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then - lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx - else - $as_unset lt_cv_prog_gnu_ld - fi - if test -n "${lt_cv_path_LDCXX+set}"; then - lt_cv_path_LD=$lt_cv_path_LDCXX - else - $as_unset lt_cv_path_LD - fi - test -z "${LDCXX+set}" || LD=$LDCXX - CC=${CXX-"c++"} - CFLAGS=$CXXFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - # We don't want -fno-exception when compiling C++ code, so set the - # no_builtin_flag separately - if test "$GXX" = yes; then - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' - else - _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= - fi - - if test "$GXX" = yes; then - # Set up default GNU C++ configuration - - LT_PATH_LD - - # Check if GNU C++ uses GNU ld as the underlying linker, since the - # archiving commands below assume that GNU ld is being used. - if test "$with_gnu_ld" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # If archive_cmds runs LD, not CC, wlarc should be empty - # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to - # investigate it a little bit more. (MM) - wlarc='${wl}' - - # ancient GNU ld didn't support --whole-archive et. al. - if eval "`$CC -print-prog-name=ld` --help 2>&1" | - $GREP 'no-whole-archive' > /dev/null; then - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no else - _LT_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag else - with_gnu_ld=no - wlarc= - - # A generic and very simple default shared library creation - # command for GNU C++ for the case where it uses the native - # linker, instead of GNU ld. If possible, this setting should - # overridden to take advantage of the native linker features on - # the platform it is being used on. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + cat conftest.err 1>&5 fi - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - GXX=no - with_gnu_ld=no - wlarc= - fi - - # PORTME: fill in a description of your system's C++ link characteristics - AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) - _LT_TAGVAR(ld_shlibs, $1)=yes - case $host_os in - aix3*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aix[[4-9]]*) - if test "$host_cpu" = ia64; then - # On IA64, the linker does run time linking by default, so we don't - # have to do anything special. - aix_use_runtimelinking=no - exp_sym_flag='-Bexport' - no_entry_flag="" - else - aix_use_runtimelinking=no - - # Test if we are trying to use run time linking or normal - # AIX style linking. If -brtl is somewhere in LDFLAGS, we - # need to do runtime linking. - case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) - for ld_flag in $LDFLAGS; do - case $ld_flag in - *-brtl*) - aix_use_runtimelinking=yes - break - ;; - esac - done - ;; - esac - - exp_sym_flag='-bexport' - no_entry_flag='-bnoentry' - fi - - # When large executables or shared objects are built, AIX ld can - # have problems creating the table of contents. If linking a library - # or program results in "error TOC overflow" add -mminimal-toc to - # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not - # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. - - _LT_TAGVAR(archive_cmds, $1)='' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='${wl}-f,' - - if test "$GXX" = yes; then - case $host_os in aix4.[[012]]|aix4.[[012]].*) - # We only want to do this on AIX 4.2 and lower, the check - # below for broken collect2 doesn't work under 4.3+ - collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null - then - # We have reworked collect2 - : - else - # We have old collect2 - _LT_TAGVAR(hardcode_direct, $1)=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - _LT_TAGVAR(hardcode_minus_L, $1)=yes - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)= - fi - esac - shared_flag='-shared' - if test "$aix_use_runtimelinking" = yes; then - shared_flag="$shared_flag "'${wl}-G' - fi - else - # not using gcc - if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: - shared_flag='-G' - else - if test "$aix_use_runtimelinking" = yes; then - shared_flag='${wl}-G' - else - shared_flag='${wl}-bM:SRE' - fi - fi - fi - - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall' - # It seems that -bexpall does not export symbols beginning with - # underscore (_), so it is better to generate a list of symbols to - # export. - _LT_TAGVAR(always_export_symbols, $1)=yes - if test "$aix_use_runtimelinking" = yes; then - # Warning - without using the other runtime loading flags (-brtl), - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(allow_undefined_flag, $1)='-berok' - # Determine the default libpath from the value encoded in an empty - # executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else - if test "$host_cpu" = ia64; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' - _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" - else - # Determine the default libpath from the value encoded in an - # empty executable. - _LT_SYS_MODULE_PATH_AIX([$1]) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" - # Warning - without using the other run time loading flags, - # -berok will link without error, but may produce a broken library. - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' - fi - _LT_TAGVAR(archive_cmds_need_lc, $1)=yes - # This is similar to how AIX traditionally builds its shared - # libraries. - _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' - fi - fi - ;; - - beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - # Joseph Beckenbach says some releases of gcc - # support --undefined. This deserves some investigation. FIXME - _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - chorus*) - case $cc_basename in - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - cygwin* | mingw* | pw32* | cegcc*) - case $GXX,$cc_basename in - ,cl* | no,cl*) - # Native MSVC - # hardcode_libdir_flag_spec is actually meaningless, as there is - # no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=yes - _LT_TAGVAR(file_list_spec, $1)='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - # Don't use ranlib - _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' - _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - func_to_tool_file "$lt_outputfile"~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # g++ - # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, - # as there is no search path for DLLs. - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols' - _LT_TAGVAR(allow_undefined_flag, $1)=unsupported - _LT_TAGVAR(always_export_symbols, $1)=no - _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes - - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - # If the export-symbols file already is a .def file (1st line - # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - cp $export_symbols $output_objdir/$soname.def; - else - echo EXPORTS > $output_objdir/$soname.def; - cat $export_symbols >> $output_objdir/$soname.def; - fi~ - $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - darwin* | rhapsody*) - _LT_DARWIN_LINKER_FEATURES($1) - ;; - - dgux*) - case $cc_basename in - ec++*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - ghcx*) - # Green Hills C++ Compiler - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - freebsd2.*) - # C++ shared libraries reported to be fairly broken before - # switch to ELF - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - freebsd-elf*) - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - ;; - - freebsd* | dragonfly*) - # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF - # conventions - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - gnu*) - ;; - - haiku*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - - hpux9*) - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - hpux10*|hpux11*) - if test $with_gnu_ld = no; then - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - case $host_cpu in - hppa*64*|ia64*) - ;; - *) - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - ;; - esac - fi - case $host_cpu in - hppa*64*|ia64*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - ;; - *) - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, - # but as the default - # location of the library. - ;; - esac - - case $cc_basename in - CC*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - aCC*) - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes; then - if test $with_gnu_ld = no; then - case $host_cpu in - hppa*64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - ia64*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - ;; - esac - fi - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - interix[[3-9]]*) - _LT_TAGVAR(hardcode_direct, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. - # Instead, shared libraries are loaded at an image base (0x10000000 by - # default) and relocated if they conflict, which is a slow very memory - # consuming and fragmenting process. To avoid this, we pick a random, - # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link - # time. Moving up from 0x10000000 also allows more sbrk(2) space. - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' - ;; - irix5* | irix6*) - case $cc_basename in - CC*) - # SGI C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - - # Archives containing C++ object files must be created using - # "CC -ar", where "CC" is the IRIX C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' - ;; - *) - if test "$GXX" = yes; then - if test "$with_gnu_ld" = no; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - else - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib' - fi - fi - _LT_TAGVAR(link_all_deplibs, $1)=yes - ;; - esac - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - _LT_TAGVAR(inherit_rpath, $1)=yes - ;; - - linux* | k*bsd*-gnu | kopensolaris*-gnu) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - - # Archives containing C++ object files must be created using - # "CC -Bstatic", where "CC" is the KAI C++ compiler. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' - ;; - icpc* | ecpc* ) - # Intel C++ - with_gnu_ld=yes - # version 8.0 and above of icpc choke on multiply defined symbols - # if we add $predep_objects and $postdep_objects, however 7.1 and - # earlier do not add the objects themselves. - case `$CC -V 2>&1` in - *"Version 7."*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - *) # Version 8.0 or newer - tmp_idyn= - case $host_cpu in - ia64*) tmp_idyn=' -i_dynamic';; - esac - _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' - ;; - esac - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - ;; - pgCC* | pgcpp*) - # Portland Group C++ compiler - case `$CC -V` in - *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) - _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ - compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' - _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ - $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ - $RANLIB $oldlib' - _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ - rm -rf $tpldir~ - $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ - $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - *) # Version 6 and above use weak symbols - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - ;; - cxx*) - # Compaq C++ - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' - - runpath_var=LD_RUN_PATH - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' - ;; - xl* | mpixl* | bgxl*) - # IBM XL 8.0 on PPC, with GNU ld - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' - _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - ;; - *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - _LT_TAGVAR(compiler_needs_object, $1)=yes - - # Not sure whether something based on - # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 - # would be better. - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - esac - ;; - esac - ;; - - lynxos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - m88k*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - mvs*) - case $cc_basename in - cxx*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' - wlarc= - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - fi - # Workaround some broken pre-1.5 toolchains - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' - ;; - - *nto* | *qnx*) - _LT_TAGVAR(ld_shlibs, $1)=yes - ;; - - openbsd2*) - # C++ shared libraries are fairly broken - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - openbsd*) - if test -f /usr/libexec/ld.so; then - _LT_TAGVAR(hardcode_direct, $1)=yes - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_direct_absolute, $1)=yes - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' - _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - fi - output_verbose_link_cmd=func_echo_all - else - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - - osf3* | osf4* | osf5*) - case $cc_basename in - KCC*) - # Kuck and Associates, Inc. (KAI) C++ Compiler - - # KCC will only create a shared library if the output file - # ends with ".so" (or ".sl" for HP-UX), so rename the library - # to its proper name (with version) after linking. - _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Archives containing C++ object files must be created using - # the KAI C++ compiler. - case $host in - osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; - *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; - esac - ;; - RCC*) - # Rational C++ 2.4.1 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - cxx*) - case $host in - osf3*) - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - ;; - *) - _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' - _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ - echo "-hidden">> $lib.exp~ - $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~ - $RM $lib.exp' - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - # - # There doesn't appear to be a way to prevent this compiler from - # explicitly linking system object files so we need to strip them - # from the output so that they don't get included in the library - # dependencies. - output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' - ;; - *) - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' - case $host in - osf3*) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - ;; - esac - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=: - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - - else - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - fi - ;; - esac - ;; - - psos*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - sunos4*) - case $cc_basename in - CC*) - # Sun C++ 4.x - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - lcc*) - # Lucid - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - solaris*) - case $cc_basename in - CC* | sunCC*) - # Sun C++ 4.2, 5.x and Centerline C++ - _LT_TAGVAR(archive_cmds_need_lc,$1)=yes - _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' - _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - # The compiler driver will combine and reorder linker options, - # but understands `-z linker_flag'. - # Supported since Solaris 2.6 (maybe 2.5.1?) - _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' - ;; - esac - _LT_TAGVAR(link_all_deplibs, $1)=yes - - output_verbose_link_cmd='func_echo_all' - - # Archives containing C++ object files must be created using - # "CC -xar", where "CC" is the Sun C++ compiler. This is - # necessary to make sure instantiated templates are included - # in the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' - ;; - gcx*) - # Green Hills C++ Compiler - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - - # The C++ compiler must be used to create the archive. - _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' - ;; - *) - # GNU C++ compiler with Solaris linker - if test "$GXX" = yes && test "$with_gnu_ld" = no; then - _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' - if $CC --version | $GREP -v '^2\.7' > /dev/null; then - _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - else - # g++ 2.7 appears to require `-G' NOT `-shared' on this - # platform. - _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' - _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' - - # Commands to make compiler produce verbose output that lists - # what "hidden" libraries, object files and flags are used when - # linking a shared library. - output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' - fi - - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' - case $host_os in - solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; - *) - _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' - ;; - esac - fi - ;; - esac - ;; - - sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) ;; - - sysv5* | sco3.2v5* | sco5v6*) - # Note: We can NOT use -z defs as we might desire, because we do not - # link with -lc, and that would cause any symbols used from libc to - # always be unresolved, which means just about no library would - # ever link correctly. If we're not using GNU ld we use -z text - # though, which does catch some bad symbols but isn't as heavy-handed - # as -z defs. - _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' - _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' - _LT_TAGVAR(archive_cmds_need_lc, $1)=no - _LT_TAGVAR(hardcode_shlibpath_var, $1)=no - _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir' - _LT_TAGVAR(hardcode_libdir_separator, $1)=':' - _LT_TAGVAR(link_all_deplibs, $1)=yes - _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' - runpath_var='LD_RUN_PATH' - - case $cc_basename in - CC*) - _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ - '"$_LT_TAGVAR(old_archive_cmds, $1)" - _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ - '"$_LT_TAGVAR(reload_cmds, $1)" - ;; - *) - _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - ;; - esac - ;; - - tandem*) - case $cc_basename in - NCC*) - # NonStop-UX NCC 3.20 - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - esac - ;; - - vxworks*) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; - - *) - # FIXME: insert proper C++ library support - _LT_TAGVAR(ld_shlibs, $1)=no - ;; esac - - AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) - test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no - - _LT_TAGVAR(GCC, $1)="$GXX" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS - LDCXX=$LD - LD=$lt_save_LD - GCC=$lt_save_GCC - with_gnu_ld=$lt_save_with_gnu_ld - lt_cv_path_LDCXX=$lt_cv_path_LD - lt_cv_path_LD=$lt_save_path_LD - lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld - lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld -fi # test "$_lt_caught_CXX_error" != yes - -AC_LANG_POP -])# _LT_LANG_CXX_CONFIG + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS -# _LT_FUNC_STRIPNAME_CNF -# ---------------------- -# func_stripname_cnf prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include # -# This function is identical to the (non-XSI) version of func_stripname, -# except this one can be used by m4 code that may be executed by configure, -# rather than the libtool script. -m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl -AC_REQUIRE([_LT_DECL_SED]) -AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) -func_stripname_cnf () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname_cnf -])# _LT_FUNC_STRIPNAME_CNF +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C -# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) # --------------------------------- -# Figure out "hidden" library dependencies from verbose -# compiler output when linking a shared library. -# Parse the compiler output and extract the necessary -# objects, libraries and library flags. -m4_defun([_LT_SYS_HIDDEN_LIBDEPS], -[m4_require([_LT_FILEUTILS_DEFAULTS])dnl -AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl -# Dependencies to place before and after the object being linked: -_LT_TAGVAR(predep_objects, $1)= -_LT_TAGVAR(postdep_objects, $1)= -_LT_TAGVAR(predeps, $1)= -_LT_TAGVAR(postdeps, $1)= -_LT_TAGVAR(compiler_lib_search_path, $1)= +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) -dnl we can't use the lt_simple_compile_test_code here, -dnl because it contains code intended for an executable, -dnl not a library. It's possible we should let each -dnl tag define a new lt_????_link_test_code variable, -dnl but it's only used here... -m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF -int a; -void foo (void) { a = 0; } -_LT_EOF -], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF -class Foo -{ -public: - Foo (void) { a = 0; } -private: - int a; -}; -_LT_EOF -], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer*4 a - a=0 - return - end -_LT_EOF -], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF - subroutine foo - implicit none - integer a - a=0 - return - end -_LT_EOF -], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF -public class foo { - private int a; - public void bar (void) { - a = 0; - } -}; -_LT_EOF -], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF -package foo -func foo() { -} -_LT_EOF + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) ]) -_lt_libdeps_save_CFLAGS=$CFLAGS -case "$CC $CFLAGS " in #( -*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; -*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; -*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; -esac - -dnl Parse the compiler output and extract the necessary -dnl objects, libraries and library flags. -if AC_TRY_EVAL(ac_compile); then - # Parse the compiler output and extract the necessary - # objects, libraries and library flags. - - # Sentinel used to keep track of whether or not we are before - # the conftest object file. - pre_test_object_deps_done=no - - for p in `eval "$output_verbose_link_cmd"`; do - case ${prev}${p} in - - -L* | -R* | -l*) - # Some compilers place space between "-{L,R}" and the path. - # Remove the space. - if test $p = "-L" || - test $p = "-R"; then - prev=$p - continue - fi - - # Expand the sysroot to ease extracting the directories later. - if test -z "$prev"; then - case $p in - -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; - -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; - -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; - esac - fi - case $p in - =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; - esac - if test "$pre_test_object_deps_done" = no; then - case ${prev} in - -L | -R) - # Internal compiler library paths should come after those - # provided the user. The postdeps already come after the - # user supplied libs so there is no need to process them. - if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then - _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}" - else - _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}" - fi - ;; - # The "-l" case would never come before the object being - # linked, so don't bother handling this case. - esac - else - if test -z "$_LT_TAGVAR(postdeps, $1)"; then - _LT_TAGVAR(postdeps, $1)="${prev}${p}" - else - _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}" - fi - fi - prev= - ;; - - *.lto.$objext) ;; # Ignore GCC LTO objects - *.$objext) - # This assumes that the test object file only shows up - # once in the compiler output. - if test "$p" = "conftest.$objext"; then - pre_test_object_deps_done=yes - continue - fi - - if test "$pre_test_object_deps_done" = no; then - if test -z "$_LT_TAGVAR(predep_objects, $1)"; then - _LT_TAGVAR(predep_objects, $1)="$p" - else - _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" - fi - else - if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then - _LT_TAGVAR(postdep_objects, $1)="$p" - else - _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" - fi - fi - ;; - - *) ;; # Ignore the rest. - - esac - done - - # Clean up. - rm -f a.out a.exe -else - echo "libtool.m4: error: problem compiling $1 test program" -fi - -$RM -f confest.$objext -CFLAGS=$_lt_libdeps_save_CFLAGS - -# PORTME: override above test on systems where it is broken -m4_if([$1], [CXX], -[case $host_os in -interix[[3-9]]*) - # Interix 3.5 installs completely hosed .la files for C++, so rather than - # hack all around it, let's just trust "g++" to DTRT. - _LT_TAGVAR(predep_objects,$1)= - _LT_TAGVAR(postdep_objects,$1)= - _LT_TAGVAR(postdeps,$1)= - ;; - -linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) - # Sun C++ 5.9 - - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; - -solaris*) - case $cc_basename in - CC* | sunCC*) - # The more standards-conforming stlport4 library is - # incompatible with the Cstd library. Avoid specifying - # it if it's in CXXFLAGS. Ignore libCrun as - # -library=stlport4 depends on it. - case " $CXX $CXXFLAGS " in - *" -library=stlport4 "*) - solaris_use_stlport4=yes - ;; - esac - - # Adding this requires a known-good setup of shared libraries for - # Sun compiler versions before 5.6, else PIC objects from an old - # archive will be linked into the output, leading to subtle bugs. - if test "$solaris_use_stlport4" != yes; then - _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' - fi - ;; - esac - ;; -esac -]) - -case " $_LT_TAGVAR(postdeps, $1) " in -*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; -esac - _LT_TAGVAR(compiler_lib_search_dirs, $1)= -if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then - _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` -fi -_LT_TAGDECL([], [compiler_lib_search_dirs], [1], - [The directories searched by this compiler when creating a shared library]) -_LT_TAGDECL([], [predep_objects], [1], - [Dependencies to place before and after the objects being linked to - create a shared library]) -_LT_TAGDECL([], [postdep_objects], [1]) -_LT_TAGDECL([], [predeps], [1]) -_LT_TAGDECL([], [postdeps], [1]) -_LT_TAGDECL([], [compiler_lib_search_path], [1], - [The library search path used internally by the compiler when linking - a shared library]) -])# _LT_SYS_HIDDEN_LIBDEPS - - -# _LT_LANG_F77_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for a Fortran 77 compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_F77_CONFIG], -[AC_LANG_PUSH(Fortran 77) -if test -z "$F77" || test "X$F77" = "Xno"; then - _lt_disable_F77=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for f77 test sources. -ac_ext=f - -# Object file extension for compiled f77 test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the F77 compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_F77" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${F77-"f77"} - CFLAGS=$FFLAGS - compiler=$CC - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - GCC=$G77 - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$G77" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC="$lt_save_CC" - CFLAGS="$lt_save_CFLAGS" -fi # test "$_lt_disable_F77" != yes - -AC_LANG_POP -])# _LT_LANG_F77_CONFIG - - -# _LT_LANG_FC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for a Fortran compiler are -# suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_FC_CONFIG], -[AC_LANG_PUSH(Fortran) - -if test -z "$FC" || test "X$FC" = "Xno"; then - _lt_disable_FC=yes -fi - -_LT_TAGVAR(archive_cmds_need_lc, $1)=no -_LT_TAGVAR(allow_undefined_flag, $1)= -_LT_TAGVAR(always_export_symbols, $1)=no -_LT_TAGVAR(archive_expsym_cmds, $1)= -_LT_TAGVAR(export_dynamic_flag_spec, $1)= -_LT_TAGVAR(hardcode_direct, $1)=no -_LT_TAGVAR(hardcode_direct_absolute, $1)=no -_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= -_LT_TAGVAR(hardcode_libdir_separator, $1)= -_LT_TAGVAR(hardcode_minus_L, $1)=no -_LT_TAGVAR(hardcode_automatic, $1)=no -_LT_TAGVAR(inherit_rpath, $1)=no -_LT_TAGVAR(module_cmds, $1)= -_LT_TAGVAR(module_expsym_cmds, $1)= -_LT_TAGVAR(link_all_deplibs, $1)=unknown -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds -_LT_TAGVAR(no_undefined_flag, $1)= -_LT_TAGVAR(whole_archive_flag_spec, $1)= -_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no - -# Source file extension for fc test sources. -ac_ext=${ac_fc_srcext-f} - -# Object file extension for compiled fc test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# No sense in running all these tests if we already determined that -# the FC compiler isn't working. Some variables (like enable_shared) -# are currently assumed to apply to all compilers on this platform, -# and will be corrupted by setting them based on a non-working compiler. -if test "$_lt_disable_FC" != yes; then - # Code to be used in simple compile tests - lt_simple_compile_test_code="\ - subroutine t - return - end -" - - # Code to be used in simple link tests - lt_simple_link_test_code="\ - program t - end -" - - # ltmain only uses $CC for tagged configurations so make sure $CC is set. - _LT_TAG_COMPILER - - # save warnings/boilerplate of simple test code - _LT_COMPILER_BOILERPLATE - _LT_LINKER_BOILERPLATE - - # Allow CC to be a program name with arguments. - lt_save_CC="$CC" - lt_save_GCC=$GCC - lt_save_CFLAGS=$CFLAGS - CC=${FC-"f95"} - CFLAGS=$FCFLAGS - compiler=$CC - GCC=$ac_cv_fc_compiler_gnu - - _LT_TAGVAR(compiler, $1)=$CC - _LT_CC_BASENAME([$compiler]) - - if test -n "$compiler"; then - AC_MSG_CHECKING([if libtool supports shared libraries]) - AC_MSG_RESULT([$can_build_shared]) - - AC_MSG_CHECKING([whether to build shared libraries]) - test "$can_build_shared" = "no" && enable_shared=no - - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) - test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi - ;; - aix[[4-9]]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - AC_MSG_RESULT([$enable_shared]) - - AC_MSG_CHECKING([whether to build static libraries]) - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - AC_MSG_RESULT([$enable_static]) - - _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu" - _LT_TAGVAR(LD, $1)="$LD" - - ## CAVEAT EMPTOR: - ## There is no encapsulation within the following macros, do not change - ## the running order or otherwise move them around unless you know exactly - ## what you are doing... - _LT_SYS_HIDDEN_LIBDEPS($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_SYS_DYNAMIC_LINKER($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) - fi # test -n "$compiler" - - GCC=$lt_save_GCC - CC=$lt_save_CC - CFLAGS=$lt_save_CFLAGS -fi # test "$_lt_disable_FC" != yes - -AC_LANG_POP -])# _LT_LANG_FC_CONFIG - - -# _LT_LANG_GCJ_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Java Compiler compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GCJ_CONFIG], -[AC_REQUIRE([LT_PROG_GCJ])dnl -AC_LANG_SAVE - -# Source file extension for Java test sources. -ac_ext=java - -# Object file extension for compiled Java test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="class foo {}" - -# Code to be used in simple link tests -lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GCJ-"gcj"} -CFLAGS=$GCJFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# GCJ did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GCJ_CONFIG - - -# _LT_LANG_GO_CONFIG([TAG]) -# -------------------------- -# Ensure that the configuration variables for the GNU Go compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_GO_CONFIG], -[AC_REQUIRE([LT_PROG_GO])dnl -AC_LANG_SAVE - -# Source file extension for Go test sources. -ac_ext=go - -# Object file extension for compiled Go test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code="package main; func main() { }" - -# Code to be used in simple link tests -lt_simple_link_test_code='package main; func main() { }' - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC=$CC -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC=yes -CC=${GOC-"gccgo"} -CFLAGS=$GOFLAGS -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_TAGVAR(LD, $1)="$LD" -_LT_CC_BASENAME([$compiler]) - -# Go did not exist at the time GCC didn't implicitly link libc in. -_LT_TAGVAR(archive_cmds_need_lc, $1)=no - -_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds -_LT_TAGVAR(reload_flag, $1)=$reload_flag -_LT_TAGVAR(reload_cmds, $1)=$reload_cmds - -if test -n "$compiler"; then - _LT_COMPILER_NO_RTTI($1) - _LT_COMPILER_PIC($1) - _LT_COMPILER_C_O($1) - _LT_COMPILER_FILE_LOCKS($1) - _LT_LINKER_SHLIBS($1) - _LT_LINKER_HARDCODE_LIBPATH($1) - - _LT_CONFIG($1) -fi - -AC_LANG_RESTORE - -GCC=$lt_save_GCC -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_GO_CONFIG - - -# _LT_LANG_RC_CONFIG([TAG]) -# ------------------------- -# Ensure that the configuration variables for the Windows resource compiler -# are suitably defined. These variables are subsequently used by _LT_CONFIG -# to write the compiler configuration to `libtool'. -m4_defun([_LT_LANG_RC_CONFIG], -[AC_REQUIRE([LT_PROG_RC])dnl -AC_LANG_SAVE - -# Source file extension for RC test sources. -ac_ext=rc - -# Object file extension for compiled RC test sources. -objext=o -_LT_TAGVAR(objext, $1)=$objext - -# Code to be used in simple compile tests -lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' - -# Code to be used in simple link tests -lt_simple_link_test_code="$lt_simple_compile_test_code" - -# ltmain only uses $CC for tagged configurations so make sure $CC is set. -_LT_TAG_COMPILER - -# save warnings/boilerplate of simple test code -_LT_COMPILER_BOILERPLATE -_LT_LINKER_BOILERPLATE - -# Allow CC to be a program name with arguments. -lt_save_CC="$CC" -lt_save_CFLAGS=$CFLAGS -lt_save_GCC=$GCC -GCC= -CC=${RC-"windres"} -CFLAGS= -compiler=$CC -_LT_TAGVAR(compiler, $1)=$CC -_LT_CC_BASENAME([$compiler]) -_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes - -if test -n "$compiler"; then - : - _LT_CONFIG($1) -fi - -GCC=$lt_save_GCC -AC_LANG_RESTORE -CC=$lt_save_CC -CFLAGS=$lt_save_CFLAGS -])# _LT_LANG_RC_CONFIG - - -# LT_PROG_GCJ -# ----------- -AC_DEFUN([LT_PROG_GCJ], -[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], - [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], - [AC_CHECK_TOOL(GCJ, gcj,) - test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" - AC_SUBST(GCJFLAGS)])])[]dnl -]) - -# Old name: -AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_GCJ], []) - - -# LT_PROG_GO -# ---------- -AC_DEFUN([LT_PROG_GO], -[AC_CHECK_TOOL(GOC, gccgo,) +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) ]) -# LT_PROG_RC -# ---------- -AC_DEFUN([LT_PROG_RC], -[AC_CHECK_TOOL(RC, windres,) -]) +# Cheap backport of AS_EXECUTABLE_P and required macros +# from Autoconf 2.59; we should not use $as_executable_p directly. -# Old name: -AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_RC], []) - - -# _LT_DECL_EGREP -# -------------- -# If we don't have a new enough Autoconf to choose the best grep -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_EGREP], -[AC_REQUIRE([AC_PROG_EGREP])dnl -AC_REQUIRE([AC_PROG_FGREP])dnl -test -z "$GREP" && GREP=grep -_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) -_LT_DECL([], [EGREP], [1], [An ERE matcher]) -_LT_DECL([], [FGREP], [1], [A literal string matcher]) -dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too -AC_SUBST([GREP]) -]) - - -# _LT_DECL_OBJDUMP -# -------------- -# If we don't have a new enough Autoconf to choose the best objdump -# available, choose the one first in the user's PATH. -m4_defun([_LT_DECL_OBJDUMP], -[AC_CHECK_TOOL(OBJDUMP, objdump, false) -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) -AC_SUBST([OBJDUMP]) -]) - -# _LT_DECL_DLLTOOL +# _AS_TEST_PREPARE # ---------------- -# Ensure DLLTOOL variable is set. -m4_defun([_LT_DECL_DLLTOOL], -[AC_CHECK_TOOL(DLLTOOL, dlltool, false) -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) -AC_SUBST([DLLTOOL]) -]) +m4_ifndef([_AS_TEST_PREPARE], +[m4_defun([_AS_TEST_PREPARE], +[if test -x / >/dev/null 2>&1; then + as_executable_p='test -x' +else + as_executable_p='test -f' +fi +])])# _AS_TEST_PREPARE -# _LT_DECL_SED -# ------------ -# Check for a fully-functional sed program, that truncates -# as few characters as possible. Prefer GNU sed if found. -m4_defun([_LT_DECL_SED], -[AC_PROG_SED -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" -_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) -_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], - [Sed that helps us avoid accidentally triggering echo(1) options like -n]) -])# _LT_DECL_SED +# AS_EXECUTABLE_P +# --------------- +# Check whether a file is executable. +m4_ifndef([AS_EXECUTABLE_P], +[m4_defun([AS_EXECUTABLE_P], +[AS_REQUIRE([_AS_TEST_PREPARE])dnl +$as_executable_p $1[]dnl +])])# AS_EXECUTABLE_P -m4_ifndef([AC_PROG_SED], [ # NOTE: This macro has been submitted for inclusion into # # GNU Autoconf as AC_PROG_SED. When it is available in # # a released version of Autoconf we should remove this # # macro and use it instead. # - -m4_defun([AC_PROG_SED], +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], [AC_MSG_CHECKING([for a sed that does not truncate output]) AC_CACHE_VAL(lt_cv_path_SED, [# Loop through the user's path and test for sed and gsed. @@ -7713,7 +6604,7 @@ do test -z "$as_dir" && as_dir=. for lt_ac_prog in sed gsed; do for ac_exec_ext in '' $ac_executable_extensions; do - if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" fi done @@ -7754,850 +6645,8 @@ done SED=$lt_cv_path_SED AC_SUBST([SED]) AC_MSG_RESULT([$SED]) -])#AC_PROG_SED -])#m4_ifndef - -# Old name: -AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([LT_AC_PROG_SED], []) - - -# _LT_CHECK_SHELL_FEATURES -# ------------------------ -# Find out whether the shell is Bourne or XSI compatible, -# or has some other useful features. -m4_defun([_LT_CHECK_SHELL_FEATURES], -[AC_MSG_CHECKING([whether the shell understands some XSI constructs]) -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -AC_MSG_RESULT([$xsi_shell]) -_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell']) - -AC_MSG_CHECKING([whether the shell understands "+="]) -lt_shell_append=no -( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -AC_MSG_RESULT([$lt_shell_append]) -_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append']) - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi -_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac -_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl -_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl -])# _LT_CHECK_SHELL_FEATURES - - -# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY) -# ------------------------------------------------------ -# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and -# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY. -m4_defun([_LT_PROG_FUNCTION_REPLACE], -[dnl { -sed -e '/^$1 ()$/,/^} # $1 /c\ -$1 ()\ -{\ -m4_bpatsubsts([$2], [$], [\\], [^\([ ]\)], [\\\1]) -} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: ]) - -# _LT_PROG_REPLACE_SHELLFNS -# ------------------------- -# Replace existing portable implementations of several shell functions with -# equivalent extended shell implementations where those features are available.. -m4_defun([_LT_PROG_REPLACE_SHELLFNS], -[if test x"$xsi_shell" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl - case ${1} in - */*) func_dirname_result="${1%/*}${2}" ;; - * ) func_dirname_result="${3}" ;; - esac - func_basename_result="${1##*/}"]) - - _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary parameter first. - func_stripname_result=${3} - func_stripname_result=${func_stripname_result#"${1}"} - func_stripname_result=${func_stripname_result%"${2}"}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl - func_split_long_opt_name=${1%%=*} - func_split_long_opt_arg=${1#*=}]) - - _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"}]) - - _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl - case ${1} in - *.lo) func_lo2o_result=${1%.lo}.${objext} ;; - *) func_lo2o_result=${1} ;; - esac]) - - _LT_PROG_FUNCTION_REPLACE([func_xform], [ func_xform_result=${1%.*}.lo]) - - _LT_PROG_FUNCTION_REPLACE([func_arith], [ func_arith_result=$(( $[*] ))]) - - _LT_PROG_FUNCTION_REPLACE([func_len], [ func_len_result=${#1}]) -fi - -if test x"$lt_shell_append" = xyes; then - _LT_PROG_FUNCTION_REPLACE([func_append], [ eval "${1}+=\\${2}"]) - - _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl - func_quote_for_eval "${2}" -dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \ - eval "${1}+=\\\\ \\$func_quote_for_eval_result"]) - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - AC_MSG_WARN([Unable to substitute extended shell functions in $ofile]) -fi -]) - -# _LT_PATH_CONVERSION_FUNCTIONS -# ----------------------------- -# Determine which file name conversion functions should be used by -# func_to_host_file (and, implicitly, by func_to_host_path). These are needed -# for certain cross-compile configurations and native mingw. -m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -AC_REQUIRE([AC_CANONICAL_BUILD])dnl -AC_MSG_CHECKING([how to convert $build file names to $host format]) -AC_CACHE_VAL(lt_cv_to_host_file_cmd, -[case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -]) -to_host_file_cmd=$lt_cv_to_host_file_cmd -AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) -_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], - [0], [convert $build file names to $host format])dnl - -AC_MSG_CHECKING([how to convert $build file names to toolchain format]) -AC_CACHE_VAL(lt_cv_to_tool_file_cmd, -[#assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac -]) -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) -_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], - [0], [convert $build files to toolchain format])dnl -])# _LT_PATH_CONVERSION_FUNCTIONS - -# Helper functions for option handling. -*- Autoconf -*- -# -# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation, -# Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 7 ltoptions.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) - - -# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) -# ------------------------------------------ -m4_define([_LT_MANGLE_OPTION], -[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) - - -# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) -# --------------------------------------- -# Set option OPTION-NAME for macro MACRO-NAME, and if there is a -# matching handler defined, dispatch to it. Other OPTION-NAMEs are -# saved as a flag. -m4_define([_LT_SET_OPTION], -[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl -m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), - _LT_MANGLE_DEFUN([$1], [$2]), - [m4_warning([Unknown $1 option `$2'])])[]dnl -]) - - -# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) -# ------------------------------------------------------------ -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -m4_define([_LT_IF_OPTION], -[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) - - -# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) -# ------------------------------------------------------- -# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME -# are set. -m4_define([_LT_UNLESS_OPTIONS], -[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), - [m4_define([$0_found])])])[]dnl -m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 -])[]dnl -]) - - -# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) -# ---------------------------------------- -# OPTION-LIST is a space-separated list of Libtool options associated -# with MACRO-NAME. If any OPTION has a matching handler declared with -# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about -# the unknown option and exit. -m4_defun([_LT_SET_OPTIONS], -[# Set options -m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), - [_LT_SET_OPTION([$1], _LT_Option)]) - -m4_if([$1],[LT_INIT],[ - dnl - dnl Simply set some default values (i.e off) if boolean options were not - dnl specified: - _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no - ]) - _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no - ]) - dnl - dnl If no reference was made to various pairs of opposing options, then - dnl we run the default mode handler for the pair. For example, if neither - dnl `shared' nor `disable-shared' was passed, we enable building of shared - dnl archives by default: - _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) - _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) - _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], - [_LT_ENABLE_FAST_INSTALL]) - ]) -])# _LT_SET_OPTIONS - - - -# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) -# ----------------------------------------- -m4_define([_LT_MANGLE_DEFUN], -[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) - - -# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) -# ----------------------------------------------- -m4_define([LT_OPTION_DEFINE], -[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl -])# LT_OPTION_DEFINE - - -# dlopen -# ------ -LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes -]) - -AU_DEFUN([AC_LIBTOOL_DLOPEN], -[_LT_SET_OPTION([LT_INIT], [dlopen]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `dlopen' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) - - -# win32-dll -# --------- -# Declare package support for building win32 dll's. -LT_OPTION_DEFINE([LT_INIT], [win32-dll], -[enable_win32_dll=yes - -case $host in -*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) - AC_CHECK_TOOL(AS, as, false) - AC_CHECK_TOOL(DLLTOOL, dlltool, false) - AC_CHECK_TOOL(OBJDUMP, objdump, false) - ;; -esac - -test -z "$AS" && AS=as -_LT_DECL([], [AS], [1], [Assembler program])dnl - -test -z "$DLLTOOL" && DLLTOOL=dlltool -_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl - -test -z "$OBJDUMP" && OBJDUMP=objdump -_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl -])# win32-dll - -AU_DEFUN([AC_LIBTOOL_WIN32_DLL], -[AC_REQUIRE([AC_CANONICAL_HOST])dnl -_LT_SET_OPTION([LT_INIT], [win32-dll]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `win32-dll' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) - - -# _LT_ENABLE_SHARED([DEFAULT]) -# ---------------------------- -# implement the --enable-shared flag, and supports the `shared' and -# `disable-shared' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_SHARED], -[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([shared], - [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], - [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) - - _LT_DECL([build_libtool_libs], [enable_shared], [0], - [Whether or not to build shared libraries]) -])# _LT_ENABLE_SHARED - -LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) -]) - -AC_DEFUN([AC_DISABLE_SHARED], -[_LT_SET_OPTION([LT_INIT], [disable-shared]) -]) - -AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) -AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_SHARED], []) -dnl AC_DEFUN([AM_DISABLE_SHARED], []) - - - -# _LT_ENABLE_STATIC([DEFAULT]) -# ---------------------------- -# implement the --enable-static flag, and support the `static' and -# `disable-static' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_STATIC], -[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([static], - [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], - [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_static=]_LT_ENABLE_STATIC_DEFAULT) - - _LT_DECL([build_old_libs], [enable_static], [0], - [Whether or not to build static libraries]) -])# _LT_ENABLE_STATIC - -LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) - -# Old names: -AC_DEFUN([AC_ENABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) -]) - -AC_DEFUN([AC_DISABLE_STATIC], -[_LT_SET_OPTION([LT_INIT], [disable-static]) -]) - -AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) -AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AM_ENABLE_STATIC], []) -dnl AC_DEFUN([AM_DISABLE_STATIC], []) - - - -# _LT_ENABLE_FAST_INSTALL([DEFAULT]) -# ---------------------------------- -# implement the --enable-fast-install flag, and support the `fast-install' -# and `disable-fast-install' LT_INIT options. -# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. -m4_define([_LT_ENABLE_FAST_INSTALL], -[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl -AC_ARG_ENABLE([fast-install], - [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], - [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], - [p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) - -_LT_DECL([fast_install], [enable_fast_install], [0], - [Whether or not to optimize for fast installation])dnl -])# _LT_ENABLE_FAST_INSTALL - -LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) -LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) - -# Old names: -AU_DEFUN([AC_ENABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `fast-install' option into LT_INIT's first parameter.]) -]) - -AU_DEFUN([AC_DISABLE_FAST_INSTALL], -[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you put -the `disable-fast-install' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) -dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) - - -# _LT_WITH_PIC([MODE]) -# -------------------- -# implement the --with-pic flag, and support the `pic-only' and `no-pic' -# LT_INIT options. -# MODE is either `yes' or `no'. If omitted, it defaults to `both'. -m4_define([_LT_WITH_PIC], -[AC_ARG_WITH([pic], - [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], - [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], - [lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac], - [pic_mode=default]) - -test -z "$pic_mode" && pic_mode=m4_default([$1], [default]) - -_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl -])# _LT_WITH_PIC - -LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) -LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) - -# Old name: -AU_DEFUN([AC_LIBTOOL_PICMODE], -[_LT_SET_OPTION([LT_INIT], [pic-only]) -AC_DIAGNOSE([obsolete], -[$0: Remove this warning and the call to _LT_SET_OPTION when you -put the `pic-only' option into LT_INIT's first parameter.]) -]) - -dnl aclocal-1.4 backwards compatibility: -dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) - - -m4_define([_LTDL_MODE], []) -LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], - [m4_define([_LTDL_MODE], [nonrecursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [recursive], - [m4_define([_LTDL_MODE], [recursive])]) -LT_OPTION_DEFINE([LTDL_INIT], [subproject], - [m4_define([_LTDL_MODE], [subproject])]) - -m4_define([_LTDL_TYPE], []) -LT_OPTION_DEFINE([LTDL_INIT], [installable], - [m4_define([_LTDL_TYPE], [installable])]) -LT_OPTION_DEFINE([LTDL_INIT], [convenience], - [m4_define([_LTDL_TYPE], [convenience])]) - -# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc. -# Written by Gary V. Vaughan, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 6 ltsugar.m4 - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) - - -# lt_join(SEP, ARG1, [ARG2...]) -# ----------------------------- -# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their -# associated separator. -# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier -# versions in m4sugar had bugs. -m4_define([lt_join], -[m4_if([$#], [1], [], - [$#], [2], [[$2]], - [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) -m4_define([_lt_join], -[m4_if([$#$2], [2], [], - [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) - - -# lt_car(LIST) -# lt_cdr(LIST) -# ------------ -# Manipulate m4 lists. -# These macros are necessary as long as will still need to support -# Autoconf-2.59 which quotes differently. -m4_define([lt_car], [[$1]]) -m4_define([lt_cdr], -[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], - [$#], 1, [], - [m4_dquote(m4_shift($@))])]) -m4_define([lt_unquote], $1) - - -# lt_append(MACRO-NAME, STRING, [SEPARATOR]) -# ------------------------------------------ -# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'. -# Note that neither SEPARATOR nor STRING are expanded; they are appended -# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). -# No SEPARATOR is output if MACRO-NAME was previously undefined (different -# than defined and empty). -# -# This macro is needed until we can rely on Autoconf 2.62, since earlier -# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. -m4_define([lt_append], -[m4_define([$1], - m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) - - - -# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) -# ---------------------------------------------------------- -# Produce a SEP delimited list of all paired combinations of elements of -# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list -# has the form PREFIXmINFIXSUFFIXn. -# Needed until we can rely on m4_combine added in Autoconf 2.62. -m4_define([lt_combine], -[m4_if(m4_eval([$# > 3]), [1], - [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl -[[m4_foreach([_Lt_prefix], [$2], - [m4_foreach([_Lt_suffix], - ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, - [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) - - -# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) -# ----------------------------------------------------------------------- -# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited -# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. -m4_define([lt_if_append_uniq], -[m4_ifdef([$1], - [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], - [lt_append([$1], [$2], [$3])$4], - [$5])], - [lt_append([$1], [$2], [$3])$4])]) - - -# lt_dict_add(DICT, KEY, VALUE) -# ----------------------------- -m4_define([lt_dict_add], -[m4_define([$1($2)], [$3])]) - - -# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) -# -------------------------------------------- -m4_define([lt_dict_add_subkey], -[m4_define([$1($2:$3)], [$4])]) - - -# lt_dict_fetch(DICT, KEY, [SUBKEY]) -# ---------------------------------- -m4_define([lt_dict_fetch], -[m4_ifval([$3], - m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), - m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) - - -# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) -# ----------------------------------------------------------------- -m4_define([lt_if_dict_fetch], -[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], - [$5], - [$6])]) - - -# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) -# -------------------------------------------------------------- -m4_define([lt_dict_filter], -[m4_if([$5], [], [], - [lt_join(m4_quote(m4_default([$4], [[, ]])), - lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), - [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl -]) - -# ltversion.m4 -- version numbers -*- Autoconf -*- -# -# Copyright (C) 2004 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004 -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# @configure_input@ - -# serial 3337 ltversion.m4 -# This file is part of GNU Libtool - -m4_define([LT_PACKAGE_VERSION], [2.4.2]) -m4_define([LT_PACKAGE_REVISION], [1.3337]) - -AC_DEFUN([LTVERSION_VERSION], -[macro_version='2.4.2' -macro_revision='1.3337' -_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) -_LT_DECL(, macro_revision, 0) -]) - -# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- -# -# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc. -# Written by Scott James Remnant, 2004. -# -# This file is free software; the Free Software Foundation gives -# unlimited permission to copy and/or distribute it, with or without -# modifications, as long as this notice is preserved. - -# serial 5 lt~obsolete.m4 - -# These exist entirely to fool aclocal when bootstrapping libtool. -# -# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN) -# which have later been changed to m4_define as they aren't part of the -# exported API, or moved to Autoconf or Automake where they belong. -# -# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN -# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us -# using a macro with the same name in our local m4/libtool.m4 it'll -# pull the old libtool.m4 in (it doesn't see our shiny new m4_define -# and doesn't know about Autoconf macros at all.) -# -# So we provide this file, which has a silly filename so it's always -# included after everything else. This provides aclocal with the -# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything -# because those macros already exist, or will be overwritten later. -# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. -# -# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. -# Yes, that means every name once taken will need to remain here until -# we give up compatibility with versions before 1.7, at which point -# we need to keep only those names which we still refer to. - -# This is to help aclocal find these macros, as it can't see m4_define. -AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) - -m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) -m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) -m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) -m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) -m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) -m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) -m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) -m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) -m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) -m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) -m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) -m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) -m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) -m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) -m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) -m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) -m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) -m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) -m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) -m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) -m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) -m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) -m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) -m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) -m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) -m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) -m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) -m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) -m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) -m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) -m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) -m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) -m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) -m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) -m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) -m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) -m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) -m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) -m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) -m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) -m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) -m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) -m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) -m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) -m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) -m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) -m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) -m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) -m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) -m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) -m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) -m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) -m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) -m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) -m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) - # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . @@ -9085,6 +7134,18 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 8 + +# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS. +AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)]) + # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 @@ -9315,34 +7376,6 @@ AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) -# Copyright (C) 1999, 2000, 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - -# AM_PROG_CC_C_O -# -------------- -# Like AC_PROG_CC_C_O, but changed for automake. -AC_DEFUN([AM_PROG_CC_C_O], -[AC_REQUIRE([AC_PROG_CC_C_O])dnl -AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` -if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" -fi -]) - # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 @@ -9598,28 +7631,34 @@ AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR -dnl xorg-macros.m4. Generated from xorg-macros.m4.in xorgversion.m4 by configure. +dnl xorg-macros.m4. Generated from xorg-macros.m4.in:xorgversion.m4 by configure. dnl -dnl Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +dnl Copyright 2005-2006 Sun Microsystems, Inc. All rights reserved. dnl dnl Permission is hereby granted, free of charge, to any person obtaining a -dnl copy of this software and associated documentation files (the "Software"), -dnl to deal in the Software without restriction, including without limitation -dnl the rights to use, copy, modify, merge, publish, distribute, sublicense, -dnl and/or sell copies of the Software, and to permit persons to whom the -dnl Software is furnished to do so, subject to the following conditions: +dnl copy of this software and associated documentation files (the +dnl "Software"), to deal in the Software without restriction, including +dnl without limitation the rights to use, copy, modify, merge, publish, +dnl distribute, and/or sell copies of the Software, and to permit persons +dnl to whom the Software is furnished to do so, provided that the above +dnl copyright notice(s) and this permission notice appear in all copies of +dnl the Software and that both the above copyright notice(s) and this +dnl permission notice appear in supporting documentation. dnl -dnl The above copyright notice and this permission notice (including the next -dnl paragraph) shall be included in all copies or substantial portions of the -dnl Software. +dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +dnl OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +dnl OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +dnl HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL +dnl INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING +dnl FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, +dnl NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION +dnl WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. dnl -dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -dnl IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -dnl FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL -dnl THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER -dnl DEALINGS IN THE SOFTWARE. +dnl Except as contained in this notice, the name of a copyright holder +dnl shall not be used in advertising or otherwise to promote the sale, use +dnl or other dealings in this Software without prior written authorization +dnl of the copyright holder. # XORG_MACROS_VERSION(required-version) # ------------------------------------- @@ -9629,24 +7668,27 @@ dnl DEALINGS IN THE SOFTWARE. # your configure.ac with the minimum required version, such as: # XORG_MACROS_VERSION(1.1) # -# To ensure that this macro is defined, also add: -# m4_ifndef([XORG_MACROS_VERSION], -# [m4_fatal([must install xorg-macros 1.1 or later before running autoconf/autogen])]) +# To force at least a version with this macro defined, also add: +# m4_ifndef([XORG_MACROS_VERSION], [AC_FATAL([must install xorg-macros 1.1 or later before running autoconf/autogen])]) # # # See the "minimum version" comment for each macro you use to see what # version you require. -m4_defun([XORG_MACROS_VERSION],[ -m4_define([vers_have], [1.16.0]) -m4_define([maj_have], m4_substr(vers_have, 0, m4_index(vers_have, [.]))) -m4_define([maj_needed], m4_substr([$1], 0, m4_index([$1], [.]))) -m4_if(m4_cmp(maj_have, maj_needed), 0,, - [m4_fatal([xorg-macros major version ]maj_needed[ is required but ]vers_have[ found])]) -m4_if(m4_version_compare(vers_have, [$1]), -1, - [m4_fatal([xorg-macros version $1 or higher is required but ]vers_have[ found])]) -m4_undefine([vers_have]) -m4_undefine([maj_have]) -m4_undefine([maj_needed]) +AC_DEFUN([XORG_MACROS_VERSION],[ + [XORG_MACROS_needed_version=$1 + XORG_MACROS_needed_major=`echo $XORG_MACROS_needed_version | sed 's/\..*$//'` + XORG_MACROS_needed_minor=`echo $XORG_MACROS_needed_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`] + AC_MSG_CHECKING([if xorg-macros used to generate configure is at least ${XORG_MACROS_needed_major}.${XORG_MACROS_needed_minor}]) + [XORG_MACROS_version=1.2.1 + XORG_MACROS_major=`echo $XORG_MACROS_version | sed 's/\..*$//'` + XORG_MACROS_minor=`echo $XORG_MACROS_version | sed -e 's/^[0-9]*\.//' -e 's/\..*$//'`] + if test $XORG_MACROS_major -ne $XORG_MACROS_needed_major ; then + AC_MSG_ERROR([configure built with incompatible version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.x]) + fi + if test $XORG_MACROS_minor -lt $XORG_MACROS_needed_minor ; then + AC_MSG_ERROR([configure built with too old of a version of xorg-macros.m4 - requires version ${XORG_MACROS_major}.${XORG_MACROS_minor}.0 or newer]) + fi + AC_MSG_RESULT([yes, $XORG_MACROS_version]) ]) # XORG_MACROS_VERSION # XORG_PROG_RAWCPP() @@ -9664,7 +7706,7 @@ AC_PATH_PROGS(RAWCPP, [cpp], [${CPP}], # which is not the best choice for supporting other OS'es, but covers most # of the ones we need for now. AC_MSG_CHECKING([if $RAWCPP requires -undef]) -AC_LANG_CONFTEST([AC_LANG_SOURCE([[Does cpp redefine unix ?]])]) +AC_LANG_CONFTEST([Does cpp redefine unix ?]) if test `${RAWCPP} < conftest.$ac_ext | grep -c 'unix'` -eq 1 ; then AC_MSG_RESULT([no]) else @@ -9682,7 +7724,7 @@ fi rm -f conftest.$ac_ext AC_MSG_CHECKING([if $RAWCPP requires -traditional]) -AC_LANG_CONFTEST([AC_LANG_SOURCE([[Does cpp preserve "whitespace"?]])]) +AC_LANG_CONFTEST([Does cpp preserve "whitespace"?]) if test `${RAWCPP} < conftest.$ac_ext | grep -c 'preserve \"'` -eq 1 ; then AC_MSG_RESULT([no]) else @@ -9705,12 +7747,9 @@ AC_SUBST(RAWCPPFLAGS) # on this OS - replaces *ManSuffix settings in old Imake *.cf per-os files. # Not sure if there's any better way than just hardcoding by OS name. # Override default settings by setting environment variables -# Added MAN_SUBSTS in version 1.8 -# Added AC_PROG_SED in version 1.8 AC_DEFUN([XORG_MANPAGE_SECTIONS],[ AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_SED]) if test x$APP_MAN_SUFFIX = x ; then APP_MAN_SUFFIX=1 @@ -9779,60 +7818,8 @@ AC_SUBST([FILE_MAN_DIR]) AC_SUBST([MISC_MAN_DIR]) AC_SUBST([DRIVER_MAN_DIR]) AC_SUBST([ADMIN_MAN_DIR]) - -XORG_MAN_PAGE="X Version 11" -AC_SUBST([XORG_MAN_PAGE]) -MAN_SUBSTS="\ - -e 's|__vendorversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ - -e 's|__xorgversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ - -e 's|__xservername__|Xorg|g' \ - -e 's|__xconfigfile__|xorg.conf|g' \ - -e 's|__projectroot__|\$(prefix)|g' \ - -e 's|__apploaddir__|\$(appdefaultdir)|g' \ - -e 's|__appmansuffix__|\$(APP_MAN_SUFFIX)|g' \ - -e 's|__drivermansuffix__|\$(DRIVER_MAN_SUFFIX)|g' \ - -e 's|__adminmansuffix__|\$(ADMIN_MAN_SUFFIX)|g' \ - -e 's|__libmansuffix__|\$(LIB_MAN_SUFFIX)|g' \ - -e 's|__miscmansuffix__|\$(MISC_MAN_SUFFIX)|g' \ - -e 's|__filemansuffix__|\$(FILE_MAN_SUFFIX)|g'" -AC_SUBST([MAN_SUBSTS]) - ]) # XORG_MANPAGE_SECTIONS -# XORG_CHECK_SGML_DOCTOOLS([MIN-VERSION]) -# ------------------------ -# Minimum version: 1.7.0 -# -# Defines the variable XORG_SGML_PATH containing the location of X11/defs.ent -# provided by xorg-sgml-doctools, if installed. -AC_DEFUN([XORG_CHECK_SGML_DOCTOOLS],[ -AC_MSG_CHECKING([for X.Org SGML entities m4_ifval([$1],[>= $1])]) -XORG_SGML_PATH= -PKG_CHECK_EXISTS([xorg-sgml-doctools m4_ifval([$1],[>= $1])], - [XORG_SGML_PATH=`$PKG_CONFIG --variable=sgmlrootdir xorg-sgml-doctools`], - [m4_ifval([$1],[:], - [if test x"$cross_compiling" != x"yes" ; then - AC_CHECK_FILE([$prefix/share/sgml/X11/defs.ent], - [XORG_SGML_PATH=$prefix/share/sgml]) - fi]) - ]) - -# Define variables STYLESHEET_SRCDIR and XSL_STYLESHEET containing -# the path and the name of the doc stylesheet -if test "x$XORG_SGML_PATH" != "x" ; then - AC_MSG_RESULT([$XORG_SGML_PATH]) - STYLESHEET_SRCDIR=$XORG_SGML_PATH/X11 - XSL_STYLESHEET=$STYLESHEET_SRCDIR/xorg.xsl -else - AC_MSG_RESULT([no]) -fi - -AC_SUBST(XORG_SGML_PATH) -AC_SUBST(STYLESHEET_SRCDIR) -AC_SUBST(XSL_STYLESHEET) -AM_CONDITIONAL([HAVE_STYLESHEETS], [test "x$XSL_STYLESHEET" != "x"]) -]) # XORG_CHECK_SGML_DOCTOOLS - # XORG_CHECK_LINUXDOC # ------------------- # Minimum version: 1.0.0 @@ -9842,14 +7829,23 @@ AM_CONDITIONAL([HAVE_STYLESHEETS], [test "x$XSL_STYLESHEET" != "x"]) # Whether or not the necessary tools and files are found can be checked # with the AM_CONDITIONAL "BUILD_LINUXDOC" AC_DEFUN([XORG_CHECK_LINUXDOC],[ -AC_REQUIRE([XORG_CHECK_SGML_DOCTOOLS]) -AC_REQUIRE([XORG_WITH_PS2PDF]) +if test x$XORG_SGML_PATH = x ; then + XORG_SGML_PATH=$prefix/share/sgml +fi +HAVE_DEFS_ENT= + +if test x"$cross_compiling" = x"yes" ; then + HAVE_DEFS_ENT=no +else + AC_CHECK_FILE([$XORG_SGML_PATH/X11/defs.ent], [HAVE_DEFS_ENT=yes]) +fi AC_PATH_PROG(LINUXDOC, linuxdoc) +AC_PATH_PROG(PS2PDF, ps2pdf) -AC_MSG_CHECKING([whether to build documentation]) +AC_MSG_CHECKING([Whether to build documentation]) -if test x$XORG_SGML_PATH != x && test x$LINUXDOC != x ; then +if test x$HAVE_DEFS_ENT != x && test x$LINUXDOC != x ; then BUILDDOC=yes else BUILDDOC=no @@ -9859,9 +7855,9 @@ AM_CONDITIONAL(BUILD_LINUXDOC, [test x$BUILDDOC = xyes]) AC_MSG_RESULT([$BUILDDOC]) -AC_MSG_CHECKING([whether to build pdf documentation]) +AC_MSG_CHECKING([Whether to build pdf documentation]) -if test x$have_ps2pdf != xno && test x$BUILD_PDFDOC != xno; then +if test x$PS2PDF != x && test x$BUILD_PDFDOC != xno; then BUILDPDFDOC=yes else BUILDPDFDOC=no @@ -9871,7 +7867,7 @@ AM_CONDITIONAL(BUILD_PDFDOC, [test x$BUILDPDFDOC = xyes]) AC_MSG_RESULT([$BUILDPDFDOC]) -MAKE_TEXT="SGML_SEARCH_PATH=$XORG_SGML_PATH GROFF_NO_SGR=y $LINUXDOC -B txt -f" +MAKE_TEXT="SGML_SEARCH_PATH=$XORG_SGML_PATH GROFF_NO_SGR=y $LINUXDOC -B txt" MAKE_PS="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC -B latex --papersize=letter --output=ps" MAKE_PDF="$PS2PDF" MAKE_HTML="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC -B html --split=0" @@ -9891,44 +7887,48 @@ AC_SUBST(MAKE_HTML) # indicates whether the necessary tools and files are found and, if set, # $(MAKE_XXX) blah.sgml will produce blah.xxx. AC_DEFUN([XORG_CHECK_DOCBOOK],[ -AC_REQUIRE([XORG_CHECK_SGML_DOCTOOLS]) - +if test x$XORG_SGML_PATH = x ; then + XORG_SGML_PATH=$prefix/share/sgml +fi +HAVE_DEFS_ENT= BUILDTXTDOC=no BUILDPDFDOC=no BUILDPSDOC=no BUILDHTMLDOC=no +AC_CHECK_FILE([$XORG_SGML_PATH/X11/defs.ent], [HAVE_DEFS_ENT=yes]) + AC_PATH_PROG(DOCBOOKPS, docbook2ps) AC_PATH_PROG(DOCBOOKPDF, docbook2pdf) AC_PATH_PROG(DOCBOOKHTML, docbook2html) AC_PATH_PROG(DOCBOOKTXT, docbook2txt) -AC_MSG_CHECKING([whether to build text documentation]) -if test x$XORG_SGML_PATH != x && test x$DOCBOOKTXT != x && +AC_MSG_CHECKING([Whether to build text documentation]) +if test x$HAVE_DEFS_ENT != x && test x$DOCBOOKTXT != x && test x$BUILD_TXTDOC != xno; then BUILDTXTDOC=yes fi AM_CONDITIONAL(BUILD_TXTDOC, [test x$BUILDTXTDOC = xyes]) AC_MSG_RESULT([$BUILDTXTDOC]) -AC_MSG_CHECKING([whether to build PDF documentation]) -if test x$XORG_SGML_PATH != x && test x$DOCBOOKPDF != x && +AC_MSG_CHECKING([Whether to build PDF documentation]) +if test x$HAVE_DEFS_ENT != x && test x$DOCBOOKPDF != x && test x$BUILD_PDFDOC != xno; then BUILDPDFDOC=yes fi AM_CONDITIONAL(BUILD_PDFDOC, [test x$BUILDPDFDOC = xyes]) AC_MSG_RESULT([$BUILDPDFDOC]) -AC_MSG_CHECKING([whether to build PostScript documentation]) -if test x$XORG_SGML_PATH != x && test x$DOCBOOKPS != x && +AC_MSG_CHECKING([Whether to build PostScript documentation]) +if test x$HAVE_DEFS_ENT != x && test x$DOCBOOKPS != x && test x$BUILD_PSDOC != xno; then BUILDPSDOC=yes fi AM_CONDITIONAL(BUILD_PSDOC, [test x$BUILDPSDOC = xyes]) AC_MSG_RESULT([$BUILDPSDOC]) -AC_MSG_CHECKING([whether to build HTML documentation]) -if test x$XORG_SGML_PATH != x && test x$DOCBOOKHTML != x && +AC_MSG_CHECKING([Whether to build HTML documentation]) +if test x$HAVE_DEFS_ENT != x && test x$DOCBOOKHTML != x && test x$BUILD_HTMLDOC != xno; then BUILDHTMLDOC=yes fi @@ -9946,927 +7946,6 @@ AC_SUBST(MAKE_PDF) AC_SUBST(MAKE_HTML) ]) # XORG_CHECK_DOCBOOK -# XORG_WITH_XMLTO([MIN-VERSION], [DEFAULT]) -# ---------------- -# Minimum version: 1.5.0 -# Minimum version for optional DEFAULT argument: 1.11.0 -# -# Documentation tools are not always available on all platforms and sometimes -# not at the appropriate level. This macro enables a module to test for the -# presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-xmlto option, it allows maximum flexibilty in making decisions -# as whether or not to use the xmlto package. When DEFAULT is not specified, -# --with-xmlto assumes 'auto'. -# -# Interface to module: -# HAVE_XMLTO: used in makefiles to conditionally generate documentation -# XMLTO: returns the path of the xmlto program found -# returns the path set by the user in the environment -# --with-xmlto: 'yes' user instructs the module to use xmlto -# 'no' user instructs the module not to use xmlto -# -# Added in version 1.10.0 -# HAVE_XMLTO_TEXT: used in makefiles to conditionally generate text documentation -# xmlto for text output requires either lynx, links, or w3m browsers -# -# If the user sets the value of XMLTO, AC_PATH_PROG skips testing the path. -# -AC_DEFUN([XORG_WITH_XMLTO],[ -AC_ARG_VAR([XMLTO], [Path to xmlto command]) -m4_define([_defopt], m4_default([$2], [auto])) -AC_ARG_WITH(xmlto, - AS_HELP_STRING([--with-xmlto], - [Use xmlto to regenerate documentation (default: ]_defopt[)]), - [use_xmlto=$withval], [use_xmlto=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_xmlto" = x"auto"; then - AC_PATH_PROG([XMLTO], [xmlto]) - if test "x$XMLTO" = "x"; then - AC_MSG_WARN([xmlto not found - documentation targets will be skipped]) - have_xmlto=no - else - have_xmlto=yes - fi -elif test "x$use_xmlto" = x"yes" ; then - AC_PATH_PROG([XMLTO], [xmlto]) - if test "x$XMLTO" = "x"; then - AC_MSG_ERROR([--with-xmlto=yes specified but xmlto not found in PATH]) - fi - have_xmlto=yes -elif test "x$use_xmlto" = x"no" ; then - if test "x$XMLTO" != "x"; then - AC_MSG_WARN([ignoring XMLTO environment variable since --with-xmlto=no was specified]) - fi - have_xmlto=no -else - AC_MSG_ERROR([--with-xmlto expects 'yes' or 'no']) -fi - -# Test for a minimum version of xmlto, if provided. -m4_ifval([$1], -[if test "$have_xmlto" = yes; then - # scrape the xmlto version - AC_MSG_CHECKING([the xmlto version]) - xmlto_version=`$XMLTO --version 2>/dev/null | cut -d' ' -f3` - AC_MSG_RESULT([$xmlto_version]) - AS_VERSION_COMPARE([$xmlto_version], [$1], - [if test "x$use_xmlto" = xauto; then - AC_MSG_WARN([xmlto version $xmlto_version found, but $1 needed]) - have_xmlto=no - else - AC_MSG_ERROR([xmlto version $xmlto_version found, but $1 needed]) - fi]) -fi]) - -# Test for the ability of xmlto to generate a text target -have_xmlto_text=no -cat > conftest.xml << "EOF" -EOF -AS_IF([test "$have_xmlto" = yes], - [AS_IF([$XMLTO --skip-validation txt conftest.xml >/dev/null 2>&1], - [have_xmlto_text=yes], - [AC_MSG_WARN([xmlto cannot generate text format, this format skipped])])]) -rm -f conftest.xml -AM_CONDITIONAL([HAVE_XMLTO_TEXT], [test $have_xmlto_text = yes]) -AM_CONDITIONAL([HAVE_XMLTO], [test "$have_xmlto" = yes]) -]) # XORG_WITH_XMLTO - -# XORG_WITH_XSLTPROC([MIN-VERSION], [DEFAULT]) -# -------------------------------------------- -# Minimum version: 1.12.0 -# Minimum version for optional DEFAULT argument: 1.12.0 -# -# XSLT (Extensible Stylesheet Language Transformations) is a declarative, -# XML-based language used for the transformation of XML documents. -# The xsltproc command line tool is for applying XSLT stylesheets to XML documents. -# It is used under the cover by xmlto to generate html files from DocBook/XML. -# The XSLT processor is often used as a standalone tool for transformations. -# It should not be assumed that this tool is used only to work with documnetation. -# When DEFAULT is not specified, --with-xsltproc assumes 'auto'. -# -# Interface to module: -# HAVE_XSLTPROC: used in makefiles to conditionally generate documentation -# XSLTPROC: returns the path of the xsltproc program found -# returns the path set by the user in the environment -# --with-xsltproc: 'yes' user instructs the module to use xsltproc -# 'no' user instructs the module not to use xsltproc -# have_xsltproc: returns yes if xsltproc found in PATH or no -# -# If the user sets the value of XSLTPROC, AC_PATH_PROG skips testing the path. -# -AC_DEFUN([XORG_WITH_XSLTPROC],[ -AC_ARG_VAR([XSLTPROC], [Path to xsltproc command]) -# Preserves the interface, should it be implemented later -m4_ifval([$1], [m4_warn([syntax], [Checking for xsltproc MIN-VERSION is not implemented])]) -m4_define([_defopt], m4_default([$2], [auto])) -AC_ARG_WITH(xsltproc, - AS_HELP_STRING([--with-xsltproc], - [Use xsltproc for the transformation of XML documents (default: ]_defopt[)]), - [use_xsltproc=$withval], [use_xsltproc=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_xsltproc" = x"auto"; then - AC_PATH_PROG([XSLTPROC], [xsltproc]) - if test "x$XSLTPROC" = "x"; then - AC_MSG_WARN([xsltproc not found - cannot transform XML documents]) - have_xsltproc=no - else - have_xsltproc=yes - fi -elif test "x$use_xsltproc" = x"yes" ; then - AC_PATH_PROG([XSLTPROC], [xsltproc]) - if test "x$XSLTPROC" = "x"; then - AC_MSG_ERROR([--with-xsltproc=yes specified but xsltproc not found in PATH]) - fi - have_xsltproc=yes -elif test "x$use_xsltproc" = x"no" ; then - if test "x$XSLTPROC" != "x"; then - AC_MSG_WARN([ignoring XSLTPROC environment variable since --with-xsltproc=no was specified]) - fi - have_xsltproc=no -else - AC_MSG_ERROR([--with-xsltproc expects 'yes' or 'no']) -fi - -AM_CONDITIONAL([HAVE_XSLTPROC], [test "$have_xsltproc" = yes]) -]) # XORG_WITH_XSLTPROC - -# XORG_WITH_PERL([MIN-VERSION], [DEFAULT]) -# ---------------------------------------- -# Minimum version: 1.15.0 -# -# PERL (Practical Extraction and Report Language) is a language optimized for -# scanning arbitrary text files, extracting information from those text files, -# and printing reports based on that information. -# -# When DEFAULT is not specified, --with-perl assumes 'auto'. -# -# Interface to module: -# HAVE_PERL: used in makefiles to conditionally scan text files -# PERL: returns the path of the perl program found -# returns the path set by the user in the environment -# --with-perl: 'yes' user instructs the module to use perl -# 'no' user instructs the module not to use perl -# have_perl: returns yes if perl found in PATH or no -# -# If the user sets the value of PERL, AC_PATH_PROG skips testing the path. -# -AC_DEFUN([XORG_WITH_PERL],[ -AC_ARG_VAR([PERL], [Path to perl command]) -# Preserves the interface, should it be implemented later -m4_ifval([$1], [m4_warn([syntax], [Checking for perl MIN-VERSION is not implemented])]) -m4_define([_defopt], m4_default([$2], [auto])) -AC_ARG_WITH(perl, - AS_HELP_STRING([--with-perl], - [Use perl for extracting information from files (default: ]_defopt[)]), - [use_perl=$withval], [use_perl=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_perl" = x"auto"; then - AC_PATH_PROG([PERL], [perl]) - if test "x$PERL" = "x"; then - AC_MSG_WARN([perl not found - cannot extract information and report]) - have_perl=no - else - have_perl=yes - fi -elif test "x$use_perl" = x"yes" ; then - AC_PATH_PROG([PERL], [perl]) - if test "x$PERL" = "x"; then - AC_MSG_ERROR([--with-perl=yes specified but perl not found in PATH]) - fi - have_perl=yes -elif test "x$use_perl" = x"no" ; then - if test "x$PERL" != "x"; then - AC_MSG_WARN([ignoring PERL environment variable since --with-perl=no was specified]) - fi - have_perl=no -else - AC_MSG_ERROR([--with-perl expects 'yes' or 'no']) -fi - -AM_CONDITIONAL([HAVE_PERL], [test "$have_perl" = yes]) -]) # XORG_WITH_PERL - -# XORG_WITH_ASCIIDOC([MIN-VERSION], [DEFAULT]) -# ---------------- -# Minimum version: 1.5.0 -# Minimum version for optional DEFAULT argument: 1.11.0 -# -# Documentation tools are not always available on all platforms and sometimes -# not at the appropriate level. This macro enables a module to test for the -# presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-asciidoc option, it allows maximum flexibilty in making decisions -# as whether or not to use the asciidoc package. When DEFAULT is not specified, -# --with-asciidoc assumes 'auto'. -# -# Interface to module: -# HAVE_ASCIIDOC: used in makefiles to conditionally generate documentation -# ASCIIDOC: returns the path of the asciidoc program found -# returns the path set by the user in the environment -# --with-asciidoc: 'yes' user instructs the module to use asciidoc -# 'no' user instructs the module not to use asciidoc -# -# If the user sets the value of ASCIIDOC, AC_PATH_PROG skips testing the path. -# -AC_DEFUN([XORG_WITH_ASCIIDOC],[ -AC_ARG_VAR([ASCIIDOC], [Path to asciidoc command]) -m4_define([_defopt], m4_default([$2], [auto])) -AC_ARG_WITH(asciidoc, - AS_HELP_STRING([--with-asciidoc], - [Use asciidoc to regenerate documentation (default: ]_defopt[)]), - [use_asciidoc=$withval], [use_asciidoc=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_asciidoc" = x"auto"; then - AC_PATH_PROG([ASCIIDOC], [asciidoc]) - if test "x$ASCIIDOC" = "x"; then - AC_MSG_WARN([asciidoc not found - documentation targets will be skipped]) - have_asciidoc=no - else - have_asciidoc=yes - fi -elif test "x$use_asciidoc" = x"yes" ; then - AC_PATH_PROG([ASCIIDOC], [asciidoc]) - if test "x$ASCIIDOC" = "x"; then - AC_MSG_ERROR([--with-asciidoc=yes specified but asciidoc not found in PATH]) - fi - have_asciidoc=yes -elif test "x$use_asciidoc" = x"no" ; then - if test "x$ASCIIDOC" != "x"; then - AC_MSG_WARN([ignoring ASCIIDOC environment variable since --with-asciidoc=no was specified]) - fi - have_asciidoc=no -else - AC_MSG_ERROR([--with-asciidoc expects 'yes' or 'no']) -fi -m4_ifval([$1], -[if test "$have_asciidoc" = yes; then - # scrape the asciidoc version - AC_MSG_CHECKING([the asciidoc version]) - asciidoc_version=`$ASCIIDOC --version 2>/dev/null | cut -d' ' -f2` - AC_MSG_RESULT([$asciidoc_version]) - AS_VERSION_COMPARE([$asciidoc_version], [$1], - [if test "x$use_asciidoc" = xauto; then - AC_MSG_WARN([asciidoc version $asciidoc_version found, but $1 needed]) - have_asciidoc=no - else - AC_MSG_ERROR([asciidoc version $asciidoc_version found, but $1 needed]) - fi]) -fi]) -AM_CONDITIONAL([HAVE_ASCIIDOC], [test "$have_asciidoc" = yes]) -]) # XORG_WITH_ASCIIDOC - -# XORG_WITH_DOXYGEN([MIN-VERSION], [DEFAULT]) -# -------------------------------- -# Minimum version: 1.5.0 -# Minimum version for optional DEFAULT argument: 1.11.0 -# -# Documentation tools are not always available on all platforms and sometimes -# not at the appropriate level. This macro enables a module to test for the -# presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-doxygen option, it allows maximum flexibilty in making decisions -# as whether or not to use the doxygen package. When DEFAULT is not specified, -# --with-doxygen assumes 'auto'. -# -# Interface to module: -# HAVE_DOXYGEN: used in makefiles to conditionally generate documentation -# DOXYGEN: returns the path of the doxygen program found -# returns the path set by the user in the environment -# --with-doxygen: 'yes' user instructs the module to use doxygen -# 'no' user instructs the module not to use doxygen -# -# If the user sets the value of DOXYGEN, AC_PATH_PROG skips testing the path. -# -AC_DEFUN([XORG_WITH_DOXYGEN],[ -AC_ARG_VAR([DOXYGEN], [Path to doxygen command]) -m4_define([_defopt], m4_default([$2], [auto])) -AC_ARG_WITH(doxygen, - AS_HELP_STRING([--with-doxygen], - [Use doxygen to regenerate documentation (default: ]_defopt[)]), - [use_doxygen=$withval], [use_doxygen=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_doxygen" = x"auto"; then - AC_PATH_PROG([DOXYGEN], [doxygen]) - if test "x$DOXYGEN" = "x"; then - AC_MSG_WARN([doxygen not found - documentation targets will be skipped]) - have_doxygen=no - else - have_doxygen=yes - fi -elif test "x$use_doxygen" = x"yes" ; then - AC_PATH_PROG([DOXYGEN], [doxygen]) - if test "x$DOXYGEN" = "x"; then - AC_MSG_ERROR([--with-doxygen=yes specified but doxygen not found in PATH]) - fi - have_doxygen=yes -elif test "x$use_doxygen" = x"no" ; then - if test "x$DOXYGEN" != "x"; then - AC_MSG_WARN([ignoring DOXYGEN environment variable since --with-doxygen=no was specified]) - fi - have_doxygen=no -else - AC_MSG_ERROR([--with-doxygen expects 'yes' or 'no']) -fi -m4_ifval([$1], -[if test "$have_doxygen" = yes; then - # scrape the doxygen version - AC_MSG_CHECKING([the doxygen version]) - doxygen_version=`$DOXYGEN --version 2>/dev/null` - AC_MSG_RESULT([$doxygen_version]) - AS_VERSION_COMPARE([$doxygen_version], [$1], - [if test "x$use_doxygen" = xauto; then - AC_MSG_WARN([doxygen version $doxygen_version found, but $1 needed]) - have_doxygen=no - else - AC_MSG_ERROR([doxygen version $doxygen_version found, but $1 needed]) - fi]) -fi]) -AM_CONDITIONAL([HAVE_DOXYGEN], [test "$have_doxygen" = yes]) -]) # XORG_WITH_DOXYGEN - -# XORG_WITH_GROFF([DEFAULT]) -# ---------------- -# Minimum version: 1.6.0 -# Minimum version for optional DEFAULT argument: 1.11.0 -# -# Documentation tools are not always available on all platforms and sometimes -# not at the appropriate level. This macro enables a module to test for the -# presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-groff option, it allows maximum flexibilty in making decisions -# as whether or not to use the groff package. When DEFAULT is not specified, -# --with-groff assumes 'auto'. -# -# Interface to module: -# HAVE_GROFF: used in makefiles to conditionally generate documentation -# HAVE_GROFF_MM: the memorandum macros (-mm) package -# HAVE_GROFF_MS: the -ms macros package -# GROFF: returns the path of the groff program found -# returns the path set by the user in the environment -# --with-groff: 'yes' user instructs the module to use groff -# 'no' user instructs the module not to use groff -# -# Added in version 1.9.0: -# HAVE_GROFF_HTML: groff has dependencies to output HTML format: -# pnmcut pnmcrop pnmtopng pnmtops from the netpbm package. -# psselect from the psutils package. -# the ghostcript package. Refer to the grohtml man pages -# -# If the user sets the value of GROFF, AC_PATH_PROG skips testing the path. -# -# OS and distros often splits groff in a basic and full package, the former -# having the groff program and the later having devices, fonts and macros -# Checking for the groff executable is not enough. -# -# If macros are missing, we cannot assume that groff is useless, so we don't -# unset HAVE_GROFF or GROFF env variables. -# HAVE_GROFF_?? can never be true while HAVE_GROFF is false. -# -AC_DEFUN([XORG_WITH_GROFF],[ -AC_ARG_VAR([GROFF], [Path to groff command]) -m4_define([_defopt], m4_default([$1], [auto])) -AC_ARG_WITH(groff, - AS_HELP_STRING([--with-groff], - [Use groff to regenerate documentation (default: ]_defopt[)]), - [use_groff=$withval], [use_groff=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_groff" = x"auto"; then - AC_PATH_PROG([GROFF], [groff]) - if test "x$GROFF" = "x"; then - AC_MSG_WARN([groff not found - documentation targets will be skipped]) - have_groff=no - else - have_groff=yes - fi -elif test "x$use_groff" = x"yes" ; then - AC_PATH_PROG([GROFF], [groff]) - if test "x$GROFF" = "x"; then - AC_MSG_ERROR([--with-groff=yes specified but groff not found in PATH]) - fi - have_groff=yes -elif test "x$use_groff" = x"no" ; then - if test "x$GROFF" != "x"; then - AC_MSG_WARN([ignoring GROFF environment variable since --with-groff=no was specified]) - fi - have_groff=no -else - AC_MSG_ERROR([--with-groff expects 'yes' or 'no']) -fi - -# We have groff, test for the presence of the macro packages -if test "x$have_groff" = x"yes"; then - AC_MSG_CHECKING([for ${GROFF} -ms macros]) - if ${GROFF} -ms -I. /dev/null >/dev/null 2>&1 ; then - groff_ms_works=yes - else - groff_ms_works=no - fi - AC_MSG_RESULT([$groff_ms_works]) - AC_MSG_CHECKING([for ${GROFF} -mm macros]) - if ${GROFF} -mm -I. /dev/null >/dev/null 2>&1 ; then - groff_mm_works=yes - else - groff_mm_works=no - fi - AC_MSG_RESULT([$groff_mm_works]) -fi - -# We have groff, test for HTML dependencies, one command per package -if test "x$have_groff" = x"yes"; then - AC_PATH_PROGS(GS_PATH, [gs gswin32c]) - AC_PATH_PROG(PNMTOPNG_PATH, [pnmtopng]) - AC_PATH_PROG(PSSELECT_PATH, [psselect]) - if test "x$GS_PATH" != "x" -a "x$PNMTOPNG_PATH" != "x" -a "x$PSSELECT_PATH" != "x"; then - have_groff_html=yes - else - have_groff_html=no - AC_MSG_WARN([grohtml dependencies not found - HTML Documentation skipped. Refer to grohtml man pages]) - fi -fi - -# Set Automake conditionals for Makefiles -AM_CONDITIONAL([HAVE_GROFF], [test "$have_groff" = yes]) -AM_CONDITIONAL([HAVE_GROFF_MS], [test "$groff_ms_works" = yes]) -AM_CONDITIONAL([HAVE_GROFF_MM], [test "$groff_mm_works" = yes]) -AM_CONDITIONAL([HAVE_GROFF_HTML], [test "$have_groff_html" = yes]) -]) # XORG_WITH_GROFF - -# XORG_WITH_FOP([MIN-VERSION], [DEFAULT]) -# --------------------------------------- -# Minimum version: 1.6.0 -# Minimum version for optional DEFAULT argument: 1.11.0 -# Minimum version for optional MIN-VERSION argument: 1.15.0 -# -# Documentation tools are not always available on all platforms and sometimes -# not at the appropriate level. This macro enables a module to test for the -# presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-fop option, it allows maximum flexibilty in making decisions -# as whether or not to use the fop package. When DEFAULT is not specified, -# --with-fop assumes 'auto'. -# -# Interface to module: -# HAVE_FOP: used in makefiles to conditionally generate documentation -# FOP: returns the path of the fop program found -# returns the path set by the user in the environment -# --with-fop: 'yes' user instructs the module to use fop -# 'no' user instructs the module not to use fop -# -# If the user sets the value of FOP, AC_PATH_PROG skips testing the path. -# -AC_DEFUN([XORG_WITH_FOP],[ -AC_ARG_VAR([FOP], [Path to fop command]) -m4_define([_defopt], m4_default([$2], [auto])) -AC_ARG_WITH(fop, - AS_HELP_STRING([--with-fop], - [Use fop to regenerate documentation (default: ]_defopt[)]), - [use_fop=$withval], [use_fop=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_fop" = x"auto"; then - AC_PATH_PROG([FOP], [fop]) - if test "x$FOP" = "x"; then - AC_MSG_WARN([fop not found - documentation targets will be skipped]) - have_fop=no - else - have_fop=yes - fi -elif test "x$use_fop" = x"yes" ; then - AC_PATH_PROG([FOP], [fop]) - if test "x$FOP" = "x"; then - AC_MSG_ERROR([--with-fop=yes specified but fop not found in PATH]) - fi - have_fop=yes -elif test "x$use_fop" = x"no" ; then - if test "x$FOP" != "x"; then - AC_MSG_WARN([ignoring FOP environment variable since --with-fop=no was specified]) - fi - have_fop=no -else - AC_MSG_ERROR([--with-fop expects 'yes' or 'no']) -fi - -# Test for a minimum version of fop, if provided. -m4_ifval([$1], -[if test "$have_fop" = yes; then - # scrape the fop version - AC_MSG_CHECKING([for fop minimum version]) - fop_version=`$FOP -version 2>/dev/null | cut -d' ' -f3` - AC_MSG_RESULT([$fop_version]) - AS_VERSION_COMPARE([$fop_version], [$1], - [if test "x$use_fop" = xauto; then - AC_MSG_WARN([fop version $fop_version found, but $1 needed]) - have_fop=no - else - AC_MSG_ERROR([fop version $fop_version found, but $1 needed]) - fi]) -fi]) -AM_CONDITIONAL([HAVE_FOP], [test "$have_fop" = yes]) -]) # XORG_WITH_FOP - -# XORG_WITH_PS2PDF([DEFAULT]) -# ---------------- -# Minimum version: 1.6.0 -# Minimum version for optional DEFAULT argument: 1.11.0 -# -# Documentation tools are not always available on all platforms and sometimes -# not at the appropriate level. This macro enables a module to test for the -# presence of the tool and obtain it's path in separate variables. Coupled with -# the --with-ps2pdf option, it allows maximum flexibilty in making decisions -# as whether or not to use the ps2pdf package. When DEFAULT is not specified, -# --with-ps2pdf assumes 'auto'. -# -# Interface to module: -# HAVE_PS2PDF: used in makefiles to conditionally generate documentation -# PS2PDF: returns the path of the ps2pdf program found -# returns the path set by the user in the environment -# --with-ps2pdf: 'yes' user instructs the module to use ps2pdf -# 'no' user instructs the module not to use ps2pdf -# -# If the user sets the value of PS2PDF, AC_PATH_PROG skips testing the path. -# -AC_DEFUN([XORG_WITH_PS2PDF],[ -AC_ARG_VAR([PS2PDF], [Path to ps2pdf command]) -m4_define([_defopt], m4_default([$1], [auto])) -AC_ARG_WITH(ps2pdf, - AS_HELP_STRING([--with-ps2pdf], - [Use ps2pdf to regenerate documentation (default: ]_defopt[)]), - [use_ps2pdf=$withval], [use_ps2pdf=]_defopt) -m4_undefine([_defopt]) - -if test "x$use_ps2pdf" = x"auto"; then - AC_PATH_PROG([PS2PDF], [ps2pdf]) - if test "x$PS2PDF" = "x"; then - AC_MSG_WARN([ps2pdf not found - documentation targets will be skipped]) - have_ps2pdf=no - else - have_ps2pdf=yes - fi -elif test "x$use_ps2pdf" = x"yes" ; then - AC_PATH_PROG([PS2PDF], [ps2pdf]) - if test "x$PS2PDF" = "x"; then - AC_MSG_ERROR([--with-ps2pdf=yes specified but ps2pdf not found in PATH]) - fi - have_ps2pdf=yes -elif test "x$use_ps2pdf" = x"no" ; then - if test "x$PS2PDF" != "x"; then - AC_MSG_WARN([ignoring PS2PDF environment variable since --with-ps2pdf=no was specified]) - fi - have_ps2pdf=no -else - AC_MSG_ERROR([--with-ps2pdf expects 'yes' or 'no']) -fi -AM_CONDITIONAL([HAVE_PS2PDF], [test "$have_ps2pdf" = yes]) -]) # XORG_WITH_PS2PDF - -# XORG_ENABLE_DOCS (enable_docs=yes) -# ---------------- -# Minimum version: 1.6.0 -# -# Documentation tools are not always available on all platforms and sometimes -# not at the appropriate level. This macro enables a builder to skip all -# documentation targets except traditional man pages. -# Combined with the specific tool checking macros XORG_WITH_*, it provides -# maximum flexibilty in controlling documentation building. -# Refer to: -# XORG_WITH_XMLTO --with-xmlto -# XORG_WITH_ASCIIDOC --with-asciidoc -# XORG_WITH_DOXYGEN --with-doxygen -# XORG_WITH_FOP --with-fop -# XORG_WITH_GROFF --with-groff -# XORG_WITH_PS2PDF --with-ps2pdf -# -# Interface to module: -# ENABLE_DOCS: used in makefiles to conditionally generate documentation -# --enable-docs: 'yes' user instructs the module to generate docs -# 'no' user instructs the module not to generate docs -# parm1: specify the default value, yes or no. -# -AC_DEFUN([XORG_ENABLE_DOCS],[ -m4_define([docs_default], m4_default([$1], [yes])) -AC_ARG_ENABLE(docs, - AS_HELP_STRING([--enable-docs], - [Enable building the documentation (default: ]docs_default[)]), - [build_docs=$enableval], [build_docs=]docs_default) -m4_undefine([docs_default]) -AM_CONDITIONAL(ENABLE_DOCS, [test x$build_docs = xyes]) -AC_MSG_CHECKING([whether to build documentation]) -AC_MSG_RESULT([$build_docs]) -]) # XORG_ENABLE_DOCS - -# XORG_ENABLE_DEVEL_DOCS (enable_devel_docs=yes) -# ---------------- -# Minimum version: 1.6.0 -# -# This macro enables a builder to skip all developer documentation. -# Combined with the specific tool checking macros XORG_WITH_*, it provides -# maximum flexibilty in controlling documentation building. -# Refer to: -# XORG_WITH_XMLTO --with-xmlto -# XORG_WITH_ASCIIDOC --with-asciidoc -# XORG_WITH_DOXYGEN --with-doxygen -# XORG_WITH_FOP --with-fop -# XORG_WITH_GROFF --with-groff -# XORG_WITH_PS2PDF --with-ps2pdf -# -# Interface to module: -# ENABLE_DEVEL_DOCS: used in makefiles to conditionally generate developer docs -# --enable-devel-docs: 'yes' user instructs the module to generate developer docs -# 'no' user instructs the module not to generate developer docs -# parm1: specify the default value, yes or no. -# -AC_DEFUN([XORG_ENABLE_DEVEL_DOCS],[ -m4_define([devel_default], m4_default([$1], [yes])) -AC_ARG_ENABLE(devel-docs, - AS_HELP_STRING([--enable-devel-docs], - [Enable building the developer documentation (default: ]devel_default[)]), - [build_devel_docs=$enableval], [build_devel_docs=]devel_default) -m4_undefine([devel_default]) -AM_CONDITIONAL(ENABLE_DEVEL_DOCS, [test x$build_devel_docs = xyes]) -AC_MSG_CHECKING([whether to build developer documentation]) -AC_MSG_RESULT([$build_devel_docs]) -]) # XORG_ENABLE_DEVEL_DOCS - -# XORG_ENABLE_SPECS (enable_specs=yes) -# ---------------- -# Minimum version: 1.6.0 -# -# This macro enables a builder to skip all functional specification targets. -# Combined with the specific tool checking macros XORG_WITH_*, it provides -# maximum flexibilty in controlling documentation building. -# Refer to: -# XORG_WITH_XMLTO --with-xmlto -# XORG_WITH_ASCIIDOC --with-asciidoc -# XORG_WITH_DOXYGEN --with-doxygen -# XORG_WITH_FOP --with-fop -# XORG_WITH_GROFF --with-groff -# XORG_WITH_PS2PDF --with-ps2pdf -# -# Interface to module: -# ENABLE_SPECS: used in makefiles to conditionally generate specs -# --enable-specs: 'yes' user instructs the module to generate specs -# 'no' user instructs the module not to generate specs -# parm1: specify the default value, yes or no. -# -AC_DEFUN([XORG_ENABLE_SPECS],[ -m4_define([spec_default], m4_default([$1], [yes])) -AC_ARG_ENABLE(specs, - AS_HELP_STRING([--enable-specs], - [Enable building the specs (default: ]spec_default[)]), - [build_specs=$enableval], [build_specs=]spec_default) -m4_undefine([spec_default]) -AM_CONDITIONAL(ENABLE_SPECS, [test x$build_specs = xyes]) -AC_MSG_CHECKING([whether to build functional specifications]) -AC_MSG_RESULT([$build_specs]) -]) # XORG_ENABLE_SPECS - -# XORG_ENABLE_UNIT_TESTS (enable_unit_tests=auto) -# ---------------------------------------------- -# Minimum version: 1.13.0 -# -# This macro enables a builder to enable/disable unit testing -# It makes no assumption about the test cases implementation -# Test cases may or may not use Automake "Support for test suites" -# They may or may not use the software utility library GLib -# -# When used in conjunction with XORG_WITH_GLIB, use both AM_CONDITIONAL -# ENABLE_UNIT_TESTS and HAVE_GLIB. Not all unit tests may use glib. -# The variable enable_unit_tests is used by other macros in this file. -# -# Interface to module: -# ENABLE_UNIT_TESTS: used in makefiles to conditionally build tests -# enable_unit_tests: used in configure.ac for additional configuration -# --enable-unit-tests: 'yes' user instructs the module to build tests -# 'no' user instructs the module not to build tests -# parm1: specify the default value, yes or no. -# -AC_DEFUN([XORG_ENABLE_UNIT_TESTS],[ -AC_BEFORE([$0], [XORG_WITH_GLIB]) -AC_BEFORE([$0], [XORG_LD_WRAP]) -AC_REQUIRE([XORG_MEMORY_CHECK_FLAGS]) -m4_define([_defopt], m4_default([$1], [auto])) -AC_ARG_ENABLE(unit-tests, AS_HELP_STRING([--enable-unit-tests], - [Enable building unit test cases (default: ]_defopt[)]), - [enable_unit_tests=$enableval], [enable_unit_tests=]_defopt) -m4_undefine([_defopt]) -AM_CONDITIONAL(ENABLE_UNIT_TESTS, [test "x$enable_unit_tests" != xno]) -AC_MSG_CHECKING([whether to build unit test cases]) -AC_MSG_RESULT([$enable_unit_tests]) -]) # XORG_ENABLE_UNIT_TESTS - -# XORG_WITH_GLIB([MIN-VERSION], [DEFAULT]) -# ---------------------------------------- -# Minimum version: 1.13.0 -# -# GLib is a library which provides advanced data structures and functions. -# This macro enables a module to test for the presence of Glib. -# -# When used with ENABLE_UNIT_TESTS, it is assumed GLib is used for unit testing. -# Otherwise the value of $enable_unit_tests is blank. -# -# Interface to module: -# HAVE_GLIB: used in makefiles to conditionally build targets -# with_glib: used in configure.ac to know if GLib has been found -# --with-glib: 'yes' user instructs the module to use glib -# 'no' user instructs the module not to use glib -# -AC_DEFUN([XORG_WITH_GLIB],[ -AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -m4_define([_defopt], m4_default([$2], [auto])) -AC_ARG_WITH(glib, AS_HELP_STRING([--with-glib], - [Use GLib library for unit testing (default: ]_defopt[)]), - [with_glib=$withval], [with_glib=]_defopt) -m4_undefine([_defopt]) - -have_glib=no -# Do not probe GLib if user explicitly disabled unit testing -if test "x$enable_unit_tests" != x"no"; then - # Do not probe GLib if user explicitly disabled it - if test "x$with_glib" != x"no"; then - m4_ifval( - [$1], - [PKG_CHECK_MODULES([GLIB], [glib-2.0 >= $1], [have_glib=yes], [have_glib=no])], - [PKG_CHECK_MODULES([GLIB], [glib-2.0], [have_glib=yes], [have_glib=no])] - ) - fi -fi - -# Not having GLib when unit testing has been explicitly requested is an error -if test "x$enable_unit_tests" = x"yes"; then - if test "x$have_glib" = x"no"; then - AC_MSG_ERROR([--enable-unit-tests=yes specified but glib-2.0 not found]) - fi -fi - -# Having unit testing disabled when GLib has been explicitly requested is an error -if test "x$enable_unit_tests" = x"no"; then - if test "x$with_glib" = x"yes"; then - AC_MSG_ERROR([--enable-unit-tests=yes specified but glib-2.0 not found]) - fi -fi - -# Not having GLib when it has been explicitly requested is an error -if test "x$with_glib" = x"yes"; then - if test "x$have_glib" = x"no"; then - AC_MSG_ERROR([--with-glib=yes specified but glib-2.0 not found]) - fi -fi - -AM_CONDITIONAL([HAVE_GLIB], [test "$have_glib" = yes]) -]) # XORG_WITH_GLIB - -# XORG_LD_WRAP([required|optional]) -# --------------------------------- -# Minimum version: 1.13.0 -# -# Check if linker supports -wrap, passed via compiler flags -# -# When used with ENABLE_UNIT_TESTS, it is assumed -wrap is used for unit testing. -# Otherwise the value of $enable_unit_tests is blank. -# -# Argument added in 1.16.0 - default is "required", to match existing behavior -# of returning an error if enable_unit_tests is yes, and ld -wrap is not -# available, an argument of "optional" allows use when some unit tests require -# ld -wrap and others do not. -# -AC_DEFUN([XORG_LD_WRAP],[ -XORG_CHECK_LINKER_FLAGS([-Wl,-wrap,exit],[have_ld_wrap=yes],[have_ld_wrap=no], - [AC_LANG_PROGRAM([#include - void __wrap_exit(int status) { return; }], - [exit(0);])]) -# Not having ld wrap when unit testing has been explicitly requested is an error -if test "x$enable_unit_tests" = x"yes" -a "x$1" != "xoptional"; then - if test "x$have_ld_wrap" = x"no"; then - AC_MSG_ERROR([--enable-unit-tests=yes specified but ld -wrap support is not available]) - fi -fi -AM_CONDITIONAL([HAVE_LD_WRAP], [test "$have_ld_wrap" = yes]) -# -]) # XORG_LD_WRAP - -# XORG_CHECK_LINKER_FLAGS -# ----------------------- -# SYNOPSIS -# -# XORG_CHECK_LINKER_FLAGS(FLAGS, [ACTION-SUCCESS], [ACTION-FAILURE], [PROGRAM-SOURCE]) -# -# DESCRIPTION -# -# Check whether the given linker FLAGS work with the current language's -# linker, or whether they give an error. -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# PROGRAM-SOURCE is the program source to link with, if needed -# -# NOTE: Based on AX_CHECK_COMPILER_FLAGS. -# -# LICENSE -# -# Copyright (c) 2009 Mike Frysinger -# Copyright (c) 2009 Steven G. Johnson -# Copyright (c) 2009 Matteo Frigo -# -# 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 3 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, see . -# -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well.# -AC_DEFUN([XORG_CHECK_LINKER_FLAGS], -[AC_MSG_CHECKING([whether the linker accepts $1]) -dnl Some hackery here since AC_CACHE_VAL can't handle a non-literal varname: -AS_LITERAL_IF([$1], - [AC_CACHE_VAL(AS_TR_SH(xorg_cv_linker_flags_[$1]), [ - ax_save_FLAGS=$LDFLAGS - LDFLAGS="$1" - AC_LINK_IFELSE([m4_default([$4],[AC_LANG_PROGRAM()])], - AS_TR_SH(xorg_cv_linker_flags_[$1])=yes, - AS_TR_SH(xorg_cv_linker_flags_[$1])=no) - LDFLAGS=$ax_save_FLAGS])], - [ax_save_FLAGS=$LDFLAGS - LDFLAGS="$1" - AC_LINK_IFELSE([AC_LANG_PROGRAM()], - eval AS_TR_SH(xorg_cv_linker_flags_[$1])=yes, - eval AS_TR_SH(xorg_cv_linker_flags_[$1])=no) - LDFLAGS=$ax_save_FLAGS]) -eval xorg_check_linker_flags=$AS_TR_SH(xorg_cv_linker_flags_[$1]) -AC_MSG_RESULT($xorg_check_linker_flags) -if test "x$xorg_check_linker_flags" = xyes; then - m4_default([$2], :) -else - m4_default([$3], :) -fi -]) # XORG_CHECK_LINKER_FLAGS - -# XORG_MEMORY_CHECK_FLAGS -# ----------------------- -# Minimum version: 1.16.0 -# -# This macro attempts to find appropriate memory checking functionality -# for various platforms which unit testing code may use to catch various -# forms of memory allocation and access errors in testing. -# -# Interface to module: -# XORG_MALLOC_DEBUG_ENV - environment variables to set to enable debugging -# Usually added to TESTS_ENVIRONMENT in Makefile.am -# -# If the user sets the value of XORG_MALLOC_DEBUG_ENV, it is used verbatim. -# -AC_DEFUN([XORG_MEMORY_CHECK_FLAGS],[ - -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_ARG_VAR([XORG_MALLOC_DEBUG_ENV], - [Environment variables to enable memory checking in tests]) - -# Check for different types of support on different platforms -case $host_os in - solaris*) - AC_CHECK_LIB([umem], [umem_alloc], - [malloc_debug_env='LD_PRELOAD=libumem.so UMEM_DEBUG=default']) - ;; - *-gnu*) # GNU libc - Value is used as a single byte bit pattern, - # both directly and inverted, so should not be 0 or 255. - malloc_debug_env='MALLOC_PERTURB_=15' - ;; - darwin*) - malloc_debug_env='MallocPreScribble=1 MallocScribble=1 DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib' - ;; - *bsd*) - malloc_debug_env='MallocPreScribble=1 MallocScribble=1' - ;; -esac - -# User supplied flags override default flags -if test "x$XORG_MALLOC_DEBUG_ENV" != "x"; then - malloc_debug_env="$XORG_MALLOC_DEBUG_ENV" -fi - -AC_SUBST([XORG_MALLOC_DEBUG_ENV],[$malloc_debug_env]) -]) # XORG_WITH_LINT - # XORG_CHECK_MALLOC_ZERO # ---------------------- # Minimum version: 1.0.0 @@ -10876,26 +7955,27 @@ AC_SUBST([XORG_MALLOC_DEBUG_ENV],[$malloc_debug_env]) # their AM_CFLAGS (or other appropriate *_CFLAGS) to use them. AC_DEFUN([XORG_CHECK_MALLOC_ZERO],[ AC_ARG_ENABLE(malloc0returnsnull, - AS_HELP_STRING([--enable-malloc0returnsnull], + AC_HELP_STRING([--enable-malloc0returnsnull], [malloc(0) returns NULL (default: auto)]), [MALLOC_ZERO_RETURNS_NULL=$enableval], [MALLOC_ZERO_RETURNS_NULL=auto]) AC_MSG_CHECKING([whether malloc(0) returns NULL]) if test "x$MALLOC_ZERO_RETURNS_NULL" = xauto; then - AC_RUN_IFELSE([AC_LANG_PROGRAM([ -#include -],[ + AC_RUN_IFELSE([ +char *malloc(); +char *realloc(); +char *calloc(); +main() { char *m0, *r0, *c0, *p; m0 = malloc(0); p = malloc(10); r0 = realloc(p,0); - c0 = calloc(0,10); - exit((m0 == 0 || r0 == 0 || c0 == 0) ? 0 : 1); -])], + c0 = calloc(0); + exit(m0 == 0 || r0 == 0 || c0 == 0 ? 0 : 1); +}], [MALLOC_ZERO_RETURNS_NULL=yes], - [MALLOC_ZERO_RETURNS_NULL=no], - [MALLOC_ZERO_RETURNS_NULL=yes]) + [MALLOC_ZERO_RETURNS_NULL=no]) fi AC_MSG_RESULT([$MALLOC_ZERO_RETURNS_NULL]) @@ -10918,69 +7998,38 @@ AC_SUBST([XTMALLOC_ZERO_CFLAGS]) # ---------------- # Minimum version: 1.1.0 # -# This macro enables the use of a tool that flags some suspicious and -# non-portable constructs (likely to be bugs) in C language source code. -# It will attempt to locate the tool and use appropriate options. -# There are various lint type tools on different platforms. -# -# Interface to module: -# LINT: returns the path to the tool found on the platform -# or the value set to LINT on the configure cmd line -# also an Automake conditional -# LINT_FLAGS: an Automake variable with appropriate flags -# -# --with-lint: 'yes' user instructs the module to use lint -# 'no' user instructs the module not to use lint (default) -# -# If the user sets the value of LINT, AC_PATH_PROG skips testing the path. -# If the user sets the value of LINT_FLAGS, they are used verbatim. +# Sets up flags for source checkers such as lint and sparse if --with-lint +# is specified. (Use --with-lint=sparse for sparse.) +# Sets $LINT to name of source checker passed with --with-lint (default: lint) +# Sets $LINT_FLAGS to flags to pass to source checker +# Sets LINT automake conditional if enabled (default: disabled) # AC_DEFUN([XORG_WITH_LINT],[ -AC_ARG_VAR([LINT], [Path to a lint-style command]) -AC_ARG_VAR([LINT_FLAGS], [Flags for the lint-style command]) -AC_ARG_WITH(lint, [AS_HELP_STRING([--with-lint], +# Allow checking code with lint, sparse, etc. +AC_ARG_WITH(lint, [AC_HELP_STRING([--with-lint], [Use a lint-style source code checker (default: disabled)])], [use_lint=$withval], [use_lint=no]) - -# Obtain platform specific info like program name and options -# The lint program on FreeBSD and NetBSD is different from the one on Solaris -case $host_os in - *linux* | *openbsd* | kfreebsd*-gnu | darwin* | cygwin*) - lint_name=splint - lint_options="-badflag" - ;; - *freebsd* | *netbsd*) - lint_name=lint - lint_options="-u -b" - ;; - *solaris*) - lint_name=lint - lint_options="-u -b -h -erroff=E_INDISTING_FROM_TRUNC2" - ;; -esac - -# Test for the presence of the program (either guessed by the code or spelled out by the user) -if test "x$use_lint" = x"yes" ; then - AC_PATH_PROG([LINT], [$lint_name]) - if test "x$LINT" = "x"; then - AC_MSG_ERROR([--with-lint=yes specified but lint-style tool not found in PATH]) - fi -elif test "x$use_lint" = x"no" ; then - if test "x$LINT" != "x"; then - AC_MSG_WARN([ignoring LINT environment variable since --with-lint=no was specified]) - fi +if test "x$use_lint" = "xyes" ; then + LINT="lint" else - AC_MSG_ERROR([--with-lint expects 'yes' or 'no'. Use LINT variable to specify path.]) + LINT="$use_lint" +fi +if test "x$LINT_FLAGS" = "x" -a "x$LINT" != "xno" ; then + case $LINT in + lint|*/lint) + case $host_os in + solaris*) + LINT_FLAGS="-u -b -h -erroff=E_INDISTING_FROM_TRUNC2" + ;; + esac + ;; + esac fi -# User supplied flags override default flags -if test "x$LINT_FLAGS" != "x"; then - lint_options=$LINT_FLAGS -fi - -AC_SUBST([LINT_FLAGS],[$lint_options]) -AM_CONDITIONAL(LINT, [test "x$LINT" != x]) +AC_SUBST(LINT) +AC_SUBST(LINT_FLAGS) +AM_CONDITIONAL(LINT, [test x$LINT != xno]) ]) # XORG_WITH_LINT @@ -10990,308 +8039,58 @@ AM_CONDITIONAL(LINT, [test "x$LINT" != x]) # # Sets up flags for building lint libraries for checking programs that call # functions in the library. +# Disabled by default, enable with --enable-lint-library +# Sets: +# @LINTLIB@ - name of lint library file to make +# MAKE_LINT_LIB - automake conditional # -# Interface to module: -# LINTLIB - Automake variable with the name of lint library file to make -# MAKE_LINT_LIB - Automake conditional -# -# --enable-lint-library: - 'yes' user instructs the module to created a lint library -# - 'no' user instructs the module not to create a lint library (default) AC_DEFUN([XORG_LINT_LIBRARY],[ AC_REQUIRE([XORG_WITH_LINT]) -AC_ARG_ENABLE(lint-library, [AS_HELP_STRING([--enable-lint-library], +# Build lint "library" for more indepth checks of programs calling this library +AC_ARG_ENABLE(lint-library, [AC_HELP_STRING([--enable-lint-library], [Create lint library (default: disabled)])], [make_lint_lib=$enableval], [make_lint_lib=no]) - -if test "x$make_lint_lib" = x"yes" ; then - LINTLIB=llib-l$1.ln - if test "x$LINT" = "x"; then - AC_MSG_ERROR([Cannot make lint library without --with-lint]) - fi -elif test "x$make_lint_lib" != x"no" ; then - AC_MSG_ERROR([--enable-lint-library expects 'yes' or 'no'.]) +if test "x$make_lint_lib" != "xno" ; then + if test "x$LINT" = "xno" ; then + AC_MSG_ERROR([Cannot make lint library without --with-lint]) + fi + if test "x$make_lint_lib" = "xyes" ; then + LINTLIB=llib-l$1.ln + else + LINTLIB=$make_lint_lib + fi fi - AC_SUBST(LINTLIB) AM_CONDITIONAL(MAKE_LINT_LIB, [test x$make_lint_lib != xno]) ]) # XORG_LINT_LIBRARY -# XORG_COMPILER_BRAND -# ------------------- -# Minimum version: 1.14.0 -# -# Checks for various brands of compilers and sets flags as appropriate: -# GNU gcc - relies on AC_PROG_CC (via AC_PROG_CC_C99) to set GCC to "yes" -# clang compiler - sets CLANGCC to "yes" -# Intel compiler - sets INTELCC to "yes" -# Sun/Oracle Solaris Studio cc - sets SUNCC to "yes" -# -AC_DEFUN([XORG_COMPILER_BRAND], [ -AC_REQUIRE([AC_PROG_CC_C99]) -AC_CHECK_DECL([__clang__], [CLANGCC="yes"], [CLANGCC="no"]) -AC_CHECK_DECL([__INTEL_COMPILER], [INTELCC="yes"], [INTELCC="no"]) -AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"]) -]) # XORG_COMPILER_BRAND - -# XORG_TESTSET_CFLAG(, , [, ...]) -# --------------- -# Minimum version: 1.16.0 -# -# Test if the compiler works when passed the given flag as a command line argument. -# If it succeeds, the flag is appeneded to the given variable. If not, it tries the -# next flag in the list until there are no more options. -# -# Note that this does not guarantee that the compiler supports the flag as some -# compilers will simply ignore arguments that they do not understand, but we do -# attempt to weed out false positives by using -Werror=unknown-warning-option and -# -Werror=unused-command-line-argument -# -AC_DEFUN([XORG_TESTSET_CFLAG], [ -AC_REQUIRE([AC_PROG_CC_C99]) -m4_if([$#], 0, [m4_fatal([XORG_TESTSET_CFLAG was given with an unsupported number of arguments])]) -m4_if([$#], 1, [m4_fatal([XORG_TESTSET_CFLAG was given with an unsupported number of arguments])]) - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - AC_MSG_CHECKING([if $CC supports -Werror=unknown-warning-option]) - AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], - [xorg_testset_unknown_warning_option=yes], - [xorg_testset_unknown_warning_option=no]) - AC_MSG_RESULT([$xorg_testset_unknown_warning_option]) - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - AC_MSG_CHECKING([if $CC supports -Werror=unused-command-line-argument]) - AC_COMPILE_IFELSE([AC_LANG_SOURCE([int i;])], - [xorg_testset_unused_command_line_argument=yes], - [xorg_testset_unused_command_line_argument=no]) - AC_MSG_RESULT([$xorg_testset_unused_command_line_argument]) - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" -m4_foreach([flag], m4_cdr($@), [ - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS ]flag[" - - AC_MSG_CHECKING([if $CC supports ]flag[]) - AC_LINK_IFELSE([AC_LANG_PROGRAM([int i;])], - [supported=yes], [supported=no]) - AC_MSG_RESULT([$supported]) - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - $1="$$1 ]flag[" - found="yes" - fi - fi -]) -]) # XORG_TESTSET_CFLAG - -# XORG_COMPILER_FLAGS -# --------------- -# Minimum version: 1.16.0 -# -# Defines BASE_CFLAGS to contain a set of command line arguments supported -# by the selected compiler which do NOT alter the generated code. These -# arguments will cause the compiler to print various warnings during -# compilation AND turn a conservative set of warnings into errors. -# -# The set of flags supported by BASE_CFLAGS will grow in future -# versions of util-macros as options are added to new compilers. -# -AC_DEFUN([XORG_COMPILER_FLAGS], [ -AC_REQUIRE([XORG_COMPILER_BRAND]) - -AC_ARG_ENABLE(selective-werror, - AS_HELP_STRING([--disable-selective-werror], - [Turn off selective compiler errors. (default: enabled)]), - [SELECTIVE_WERROR=$enableval], - [SELECTIVE_WERROR=yes]) - -# -v is too short to test reliably with XORG_TESTSET_CFLAG -if test "x$SUNCC" = "xyes"; then - BASE_CFLAGS="-v" -else - BASE_CFLAGS="" -fi - -# This chunk of warnings were those that existed in the legacy CWARNFLAGS -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wall]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wpointer-arith]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wstrict-prototypes]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wmissing-prototypes]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wmissing-declarations]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wnested-externs]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wbad-function-cast]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wformat=2], [-Wformat]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wold-style-definition]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wdeclaration-after-statement]) - -# This chunk adds additional warnings that could catch undesired effects. -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wunused]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wuninitialized]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wshadow]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wcast-qual]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wmissing-noreturn]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wmissing-format-attribute]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wredundant-decls]) - -# These are currently disabled because they are noisy. They will be enabled -# in the future once the codebase is sufficiently modernized to silence -# them. For now, I don't want them to drown out the other warnings. -# XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wlogical-op]) -# XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wparentheses]) -# XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wcast-align]) - -# Turn some warnings into errors, so we don't accidently get successful builds -# when there are problems that should be fixed. - -if test "x$SELECTIVE_WERROR" = "xyes" ; then -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=implicit], [-errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=nonnull]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=init-self]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=main]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=missing-braces]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=sequence-point]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=return-type], [-errwarn=E_FUNC_HAS_NO_RETURN_STMT]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=trigraphs]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=array-bounds]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=write-strings]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=address]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=int-to-pointer-cast], [-errwarn=E_BAD_PTR_INT_COMBINATION]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Werror=pointer-to-int-cast]) # Also -errwarn=E_BAD_PTR_INT_COMBINATION -else -AC_MSG_WARN([You have chosen not to turn some select compiler warnings into errors. This should not be necessary. Please report why you needed to do so in a bug report at $PACKAGE_BUGREPORT]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wimplicit]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wnonnull]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Winit-self]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wmain]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wmissing-braces]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wsequence-point]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wreturn-type]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wtrigraphs]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Warray-bounds]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wwrite-strings]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Waddress]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wint-to-pointer-cast]) -XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wpointer-to-int-cast]) -fi - -AC_SUBST([BASE_CFLAGS]) -]) # XORG_COMPILER_FLAGS - # XORG_CWARNFLAGS # --------------- # Minimum version: 1.2.0 -# Deprecated since: 1.16.0 (Use XORG_COMPILER_FLAGS instead) # # Defines CWARNFLAGS to enable C compiler warnings. # -# This function is deprecated because it defines -fno-strict-aliasing -# which alters the code generated by the compiler. If -fno-strict-aliasing -# is needed, then it should be added explicitly in the module when -# it is updated to use BASE_CFLAGS. -# AC_DEFUN([XORG_CWARNFLAGS], [ -AC_REQUIRE([XORG_COMPILER_FLAGS]) -AC_REQUIRE([XORG_COMPILER_BRAND]) -CWARNFLAGS="$BASE_CFLAGS" +AC_REQUIRE([AC_PROG_CC]) if test "x$GCC" = xyes ; then - CWARNFLAGS="$CWARNFLAGS -fno-strict-aliasing" + CWARNFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes \ +-Wmissing-declarations -Wnested-externs -fno-strict-aliasing \ +-Wbad-function-cast" + case `gcc -dumpversion` in + 3.4.* | 4.*) + CWARNFLAGS+=" -Wold-style-definition -Wdeclaration-after-statement" + ;; + esac +else + AC_CHECK_DECL([__SUNPRO_C], [SUNCC="yes"], [SUNCC="no"]) + if test "x$SUNCC" = "xyes"; then + CWARNFLAGS="-v" + fi fi AC_SUBST(CWARNFLAGS) ]) # XORG_CWARNFLAGS - -# XORG_STRICT_OPTION -# ----------------------- -# Minimum version: 1.3.0 -# -# Add configure option to enable strict compilation flags, such as treating -# warnings as fatal errors. -# If --enable-strict-compilation is passed to configure, adds strict flags to -# $BASE_CFLAGS and the deprecated $CWARNFLAGS. -# -# Starting in 1.14.0 also exports $STRICT_CFLAGS for use in other tests or -# when strict compilation is unconditionally desired. -AC_DEFUN([XORG_STRICT_OPTION], [ -AC_REQUIRE([XORG_CWARNFLAGS]) -AC_REQUIRE([XORG_COMPILER_FLAGS]) - -AC_ARG_ENABLE(strict-compilation, - AS_HELP_STRING([--enable-strict-compilation], - [Enable all warnings from compiler and make them errors (default: disabled)]), - [STRICT_COMPILE=$enableval], [STRICT_COMPILE=no]) - -STRICT_CFLAGS="" -XORG_TESTSET_CFLAG([STRICT_CFLAGS], [-pedantic]) -XORG_TESTSET_CFLAG([STRICT_CFLAGS], [-Werror], [-errwarn]) - -# Earlier versions of gcc (eg: 4.2) support -Werror=attributes, but do not -# activate it with -Werror, so we add it here explicitly. -XORG_TESTSET_CFLAG([STRICT_CFLAGS], [-Werror=attributes]) - -if test "x$STRICT_COMPILE" = "xyes"; then - BASE_CFLAGS="$BASE_CFLAGS $STRICT_CFLAGS" - CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS" -fi -AC_SUBST([STRICT_CFLAGS]) -AC_SUBST([BASE_CFLAGS]) -AC_SUBST([CWARNFLAGS]) -]) # XORG_STRICT_OPTION - -# XORG_DEFAULT_OPTIONS -# -------------------- -# Minimum version: 1.3.0 -# -# Defines default options for X.Org modules. -# -AC_DEFUN([XORG_DEFAULT_OPTIONS], [ -AC_REQUIRE([AC_PROG_INSTALL]) -XORG_COMPILER_FLAGS -XORG_CWARNFLAGS -XORG_STRICT_OPTION -XORG_RELEASE_VERSION -XORG_CHANGELOG -XORG_INSTALL -XORG_MANPAGE_SECTIONS -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])], - [AC_SUBST([AM_DEFAULT_VERBOSITY], [1])]) -]) # XORG_DEFAULT_OPTIONS - -# XORG_INSTALL() -# ---------------- -# Minimum version: 1.4.0 -# -# Defines the variable INSTALL_CMD as the command to copy -# INSTALL from $prefix/share/util-macros. -# -AC_DEFUN([XORG_INSTALL], [ -AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -macros_datadir=`$PKG_CONFIG --print-errors --variable=pkgdatadir xorg-macros` -INSTALL_CMD="(cp -f "$macros_datadir/INSTALL" \$(top_srcdir)/.INSTALL.tmp && \ -mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \ -|| (rm -f \$(top_srcdir)/.INSTALL.tmp; touch \$(top_srcdir)/INSTALL; \ -echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)" -AC_SUBST([INSTALL_CMD]) -]) # XORG_INSTALL dnl Copyright 2005 Red Hat, Inc dnl dnl Permission to use, copy, modify, distribute, and sell this software and its @@ -11319,9 +8118,22 @@ dnl # XORG_RELEASE_VERSION # -------------------- -# Defines PACKAGE_VERSION_{MAJOR,MINOR,PATCHLEVEL} for modules to use. +# Adds --with/without-release-string and changes the PACKAGE and +# PACKAGE_TARNAME to use "$PACKAGE{_TARNAME}-$RELEASE_VERSION". If +# no option is given, PACKAGE and PACKAGE_TARNAME are unchanged. Also +# defines PACKAGE_VERSION_{MAJOR,MINOR,PATCHLEVEL} for modules to use. AC_DEFUN([XORG_RELEASE_VERSION],[ + AC_ARG_WITH(release-version, + AC_HELP_STRING([--with-release-version=STRING], + [Use release version string in package name]), + [RELEASE_VERSION="$withval"], + [RELEASE_VERSION=""]) + if test "x$RELEASE_VERSION" != "x"; then + PACKAGE="$PACKAGE-$RELEASE_VERSION" + PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION" + AC_MSG_NOTICE([Building with package name set to $PACKAGE]) + fi AC_DEFINE_UNQUOTED([PACKAGE_VERSION_MAJOR], [`echo $PACKAGE_VERSION | cut -d . -f 1`], [Major version of this package]) @@ -11348,13 +8160,14 @@ AC_DEFUN([XORG_RELEASE_VERSION],[ # Defines the variable CHANGELOG_CMD as the command to generate # ChangeLog from git. # +# Arrange that distcleancheck ignores ChangeLog left over by distclean. # AC_DEFUN([XORG_CHANGELOG], [ -CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > \$(top_srcdir)/.changelog.tmp && \ -mv \$(top_srcdir)/.changelog.tmp \$(top_srcdir)/ChangeLog) \ -|| (rm -f \$(top_srcdir)/.changelog.tmp; touch \$(top_srcdir)/ChangeLog; \ +CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > .changelog.tmp && \ +mv .changelog.tmp ChangeLog) || (rm -f .changelog.tmp; touch ChangeLog; \ echo 'git directory not found: installing possibly empty changelog.' >&2)" AC_SUBST([CHANGELOG_CMD]) +AC_SUBST([distcleancheck_listfiles], ['find . -type f ! -name ChangeLog -print']) ]) # XORG_CHANGELOG dnl Copyright 2005 Red Hat, Inc @@ -11388,9 +8201,8 @@ dnl # is defined, then add $1 to $REQUIRED_MODULES. AC_DEFUN([XORG_DRIVER_CHECK_EXT],[ - AC_REQUIRE([PKG_PROG_PKG_CONFIG]) SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -I`$PKG_CONFIG --variable=sdkdir xorg-server`" + CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include "xorg-server.h" #if !defined $1 diff --git a/driver/xf86-video-ati/compile b/driver/xf86-video-ati/compile deleted file mode 100644 index 1b1d23216..000000000 --- a/driver/xf86-video-ati/compile +++ /dev/null @@ -1,142 +0,0 @@ -#! /bin/sh -# Wrapper for compilers which do not understand `-c -o'. - -scriptversion=2005-05-14.22 - -# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc. -# Written by Tom Tromey . -# -# 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, 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. - -# As a special exception to the GNU General Public License, if you -# distribute this file as part of a program that contains a -# configuration script generated by Autoconf, you may include it under -# the same distribution terms that you use for the rest of that program. - -# This file is maintained in Automake, please report -# bugs to or send patches to -# . - -case $1 in - '') - echo "$0: No command. Try \`$0 --help' for more information." 1>&2 - exit 1; - ;; - -h | --h*) - cat <<\EOF -Usage: compile [--help] [--version] PROGRAM [ARGS] - -Wrapper for compilers which do not understand `-c -o'. -Remove `-o dest.o' from ARGS, run PROGRAM with the remaining -arguments, and rename the output as expected. - -If you are trying to build a whole package this is not the -right script to run: please start by reading the file `INSTALL'. - -Report bugs to . -EOF - exit $? - ;; - -v | --v*) - echo "compile $scriptversion" - exit $? - ;; -esac - -ofile= -cfile= -eat= - -for arg -do - if test -n "$eat"; then - eat= - else - case $1 in - -o) - # configure might choose to run compile as `compile cc -o foo foo.c'. - # So we strip `-o arg' only if arg is an object. - eat=1 - case $2 in - *.o | *.obj) - ofile=$2 - ;; - *) - set x "$@" -o "$2" - shift - ;; - esac - ;; - *.c) - cfile=$1 - set x "$@" "$1" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift -done - -if test -z "$ofile" || test -z "$cfile"; then - # If no `-o' option was seen then we might have been invoked from a - # pattern rule where we don't need one. That is ok -- this is a - # normal compilation that the losing compiler can handle. If no - # `.c' file was seen then we are probably linking. That is also - # ok. - exec "$@" -fi - -# Name of file we expect compiler to create. -cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'` - -# Create the lock directory. -# Note: use `[/.-]' here to ensure that we don't use the same name -# that we are using for the .o file. Also, base the name on the expected -# object file name, since that is what matters with a parallel build. -lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d -while true; do - if mkdir "$lockdir" >/dev/null 2>&1; then - break - fi - sleep 1 -done -# FIXME: race condition here if user kills between mkdir and trap. -trap "rmdir '$lockdir'; exit 1" 1 2 15 - -# Run the compile. -"$@" -ret=$? - -if test -f "$cofile"; then - mv "$cofile" "$ofile" -elif test -f "${cofile}bj"; then - mv "${cofile}bj" "$ofile" -fi - -rmdir "$lockdir" -exit $ret - -# Local Variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-end: "$" -# End: diff --git a/driver/xf86-video-ati/config.h.in b/driver/xf86-video-ati/config.h.in index 74ceff764..1fcf21640 100644 --- a/driver/xf86-video-ati/config.h.in +++ b/driver/xf86-video-ati/config.h.in @@ -20,12 +20,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -/* libudev support */ -#undef HAVE_LIBUDEV - -/* Define to 1 if you have the header file. */ -#undef HAVE_LIST_H - /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H @@ -53,9 +47,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H -/* xextproto 7.1 available */ -#undef HAVE_XEXTPROTO_71 - /* Have xf86_crtc_clip_video_helper prototype */ #undef HAVE_XF86CRTCCLIPVIDEOHELPER @@ -65,13 +56,6 @@ /* Have xf86XVFillKeyHelperDrawable prototype */ #undef HAVE_XV_DRAWABLE_HELPER -/* Define to the sub-directory in which libtool stores uninstalled libraries. - */ -#undef LT_OBJDIR - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#undef NO_MINUS_C_MINUS_O - /* Name of package */ #undef PACKAGE @@ -99,9 +83,6 @@ /* Patch version of this package */ #undef PACKAGE_VERSION_PATCHLEVEL -/* Enable DRI2 code */ -#undef RADEON_DRI2 - /* Define to 1 if you have the ANSI C header files. */ #undef STDC_HEADERS @@ -123,14 +104,8 @@ /* Enable developmental DRI driver support */ #undef XF86DRI_DEVEL -/* DRM kernel modesetting */ -#undef XF86DRM_MODE - -/* Number of bits in a file offset, on hosts where this is settable. */ -#undef _FILE_OFFSET_BITS - -/* Define for large files, on AIX-style hosts. */ -#undef _LARGE_FILES +/* X server has built-in mode code */ +#undef XMODES /* Define to 16-bit byteswap macro */ #undef bswap_16 diff --git a/driver/xf86-video-ati/configure b/driver/xf86-video-ati/configure index 1da42edd2..c616b3fa0 100644 --- a/driver/xf86-video-ati/configure +++ b/driver/xf86-video-ati/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.62 for xf86-video-ati 6.14.3. +# Generated by GNU Autoconf 2.62 for xf86-video-ati 6.12.2. # # Report bugs to . # @@ -235,15 +235,6 @@ test \$exitcode = 0) || { (exit 1); exit 1; } as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } - -( - test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\ - || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" )) || { (exit 1); exit 1; } ") 2> /dev/null; then : else @@ -360,15 +351,6 @@ test $exitcode = 0) || { (exit 1); exit 1; } test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } -( - test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( - ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO - ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - PATH=/empty FPATH=/empty; export PATH FPATH - test "X`printf %s $ECHO`" = "X$ECHO" \ - || test "X`print -r -- $ECHO`" = "X$ECHO" )) || { (exit 1); exit 1; } - _ASEOF }; then break @@ -590,8 +572,160 @@ as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# Check that we are running under the correct shell. SHELL=${CONFIG_SHELL-/bin/sh} +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 exec 7<&0 &1 @@ -616,8 +750,8 @@ SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='xf86-video-ati' PACKAGE_TARNAME='xf86-video-ati' -PACKAGE_VERSION='6.14.3' -PACKAGE_STRING='xf86-video-ati 6.14.3' +PACKAGE_VERSION='6.12.2' +PACKAGE_STRING='xf86-video-ati 6.12.2' PACKAGE_BUGREPORT='https://bugs.freedesktop.org/enter_bug.cgi?product=xorg' ac_unique_file="Makefile.am" @@ -697,46 +831,6 @@ target_alias INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA -CC -CFLAGS -LDFLAGS -CPPFLAGS -ac_ct_CC -EXEEXT -OBJEXT -CPP -GREP -EGREP -BASE_CFLAGS -CWARNFLAGS -STRICT_CFLAGS -CHANGELOG_CMD -PKG_CONFIG -INSTALL_CMD -build -build_cpu -build_vendor -build_os -host -host_cpu -host_vendor -host_os -SED -APP_MAN_SUFFIX -LIB_MAN_SUFFIX -FILE_MAN_SUFFIX -MISC_MAN_SUFFIX -DRIVER_MAN_SUFFIX -ADMIN_MAN_SUFFIX -APP_MAN_DIR -LIB_MAN_DIR -FILE_MAN_DIR -MISC_MAN_DIR -DRIVER_MAN_DIR -ADMIN_MAN_DIR -XORG_MAN_PAGE -MAN_SUBSTS -AM_DEFAULT_VERBOSITY CYGPATH_W PACKAGE VERSION @@ -755,6 +849,24 @@ am__leading_dot AMTAR am__tar am__untar +MAINTAINER_MODE_TRUE +MAINTAINER_MODE_FALSE +MAINT +build +build_cpu +build_vendor +build_os +host +host_cpu +host_vendor +host_os +CC +CFLAGS +LDFLAGS +CPPFLAGS +ac_ct_CC +EXEEXT +OBJEXT DEPDIR am__include am__quote @@ -764,76 +876,86 @@ AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE -MAINTAINER_MODE_TRUE -MAINTAINER_MODE_FALSE -MAINT -LIBTOOL -FGREP -LD -DUMPBIN -ac_ct_DUMPBIN -NM +SED +GREP +EGREP LN_S -OBJDUMP -DLLTOOL +ECHO AR -ac_ct_AR RANLIB -MANIFEST_TOOL DSYMUTIL NMEDIT -LIPO -OTOOL -OTOOL64 +CPP +CXX +CXXFLAGS +ac_ct_CXX +CXXDEPMODE +am__fastdepCXX_TRUE +am__fastdepCXX_FALSE +CXXCPP +F77 +FFLAGS +ac_ct_F77 +LIBTOOL +PKG_CONFIG XORG_CFLAGS XORG_LIBS -XEXT_CFLAGS -XEXT_LIBS -HAVE_XEXTPROTO_71_TRUE -HAVE_XEXTPROTO_71_FALSE -DRI_CFLAGS -DRI_LIBS DRI_TRUE DRI_FALSE -LIBDRM_RADEON_CFLAGS -LIBDRM_RADEON_LIBS -LIBUDEV_CFLAGS -LIBUDEV_LIBS -DRM_MODE_TRUE -DRM_MODE_FALSE -LIBUDEV_TRUE -LIBUDEV_FALSE +DRI_CFLAGS +DRI_LIBS +XMODES_TRUE +XMODES_FALSE +XMODES_CFLAGS USE_EXA_TRUE USE_EXA_FALSE -XF86DRM_MODE_TRUE -XF86DRM_MODE_FALSE PCIACCESS_CFLAGS PCIACCESS_LIBS XSERVER_LIBPCIACCESS_TRUE XSERVER_LIBPCIACCESS_FALSE moduledir DRIVER_NAME +APP_MAN_SUFFIX +LIB_MAN_SUFFIX +FILE_MAN_SUFFIX +MISC_MAN_SUFFIX +DRIVER_MAN_SUFFIX +ADMIN_MAN_SUFFIX +APP_MAN_DIR +LIB_MAN_DIR +FILE_MAN_DIR +MISC_MAN_DIR +DRIVER_MAN_DIR +ADMIN_MAN_DIR +LINUXDOC +PS2PDF +BUILD_LINUXDOC_TRUE +BUILD_LINUXDOC_FALSE +BUILD_PDFDOC_TRUE +BUILD_PDFDOC_FALSE +MAKE_TEXT +MAKE_PS +MAKE_PDF +MAKE_HTML LIBOBJS LTLIBOBJS' ac_subst_files='' ac_user_opts=' enable_option_checking -enable_selective_werror -enable_strict_compilation -enable_dependency_tracking -enable_largefile enable_maintainer_mode enable_static enable_shared -with_pic enable_fast_install +enable_dependency_tracking with_gnu_ld -with_sysroot enable_libtool_lock +with_pic +with_tags with_xorg_module_dir enable_dri enable_exa -enable_kms +with_xserver_source +with_release_version ' ac_precious_vars='build_alias host_alias @@ -844,17 +966,17 @@ LDFLAGS LIBS CPPFLAGS CPP +CXX +CXXFLAGS +CCC +CXXCPP +F77 +FFLAGS PKG_CONFIG XORG_CFLAGS XORG_LIBS -XEXT_CFLAGS -XEXT_LIBS DRI_CFLAGS DRI_LIBS -LIBDRM_RADEON_CFLAGS -LIBDRM_RADEON_LIBS -LIBUDEV_CFLAGS -LIBUDEV_LIBS PCIACCESS_CFLAGS PCIACCESS_LIBS' @@ -1409,7 +1531,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures xf86-video-ati 6.14.3 to adapt to many kinds of systems. +\`configure' configures xf86-video-ati 6.12.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1479,7 +1601,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of xf86-video-ati 6.14.3:";; + short | recursive ) echo "Configuration of xf86-video-ati 6.12.2:";; esac cat <<\_ACEOF @@ -1487,37 +1609,32 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --disable-selective-werror - Turn off selective compiler errors. (default: - enabled) - --enable-strict-compilation - Enable all warnings from compiler and make them - errors (default: disabled) - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - --disable-largefile omit support for large files --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --enable-static[=PKGS] build static libraries [default=no] --enable-shared[=PKGS] build shared libraries [default=yes] --enable-fast-install[=PKGS] optimize for fast installation [default=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors --disable-libtool-lock avoid locking (might break parallel builds) --disable-dri Disable DRI support [default=auto] --disable-exa Disable EXA support [default=enabled] - --disable-kms Disable KMS support [default=enabled] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use - both] --with-gnu-ld assume the C compiler uses GNU ld [default=no] - --with-sysroot=DIR Search for dependent libraries within DIR - (or the compiler's sysroot if not specified). + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] include additional configurations [automatic] --with-xorg-module-dir=DIR Default xorg module directory [default=$libdir/xorg/modules] + --with-xserver-source=XSERVER_SOURCE + Path to X server source tree + --with-release-version=STRING + Use release version string in package name Some influential environment variables: CC C compiler command @@ -1528,21 +1645,16 @@ Some influential environment variables: CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags PKG_CONFIG path to pkg-config utility XORG_CFLAGS C compiler flags for XORG, overriding pkg-config XORG_LIBS linker flags for XORG, overriding pkg-config - XEXT_CFLAGS C compiler flags for XEXT, overriding pkg-config - XEXT_LIBS linker flags for XEXT, overriding pkg-config DRI_CFLAGS C compiler flags for DRI, overriding pkg-config DRI_LIBS linker flags for DRI, overriding pkg-config - LIBDRM_RADEON_CFLAGS - C compiler flags for LIBDRM_RADEON, overriding pkg-config - LIBDRM_RADEON_LIBS - linker flags for LIBDRM_RADEON, overriding pkg-config - LIBUDEV_CFLAGS - C compiler flags for LIBUDEV, overriding pkg-config - LIBUDEV_LIBS - linker flags for LIBUDEV, overriding pkg-config PCIACCESS_CFLAGS C compiler flags for PCIACCESS, overriding pkg-config PCIACCESS_LIBS @@ -1614,7 +1726,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -xf86-video-ati configure 6.14.3 +xf86-video-ati configure 6.12.2 generated by GNU Autoconf 2.62 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, @@ -1628,7 +1740,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by xf86-video-ati $as_me 6.14.3, which was +It was created by xf86-video-ati $as_me 6.12.2, which was generated by GNU Autoconf 2.62. Invocation command line was $ $0 $@ @@ -1998,21 +2110,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" - -# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS - - - - - - - - - - - ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do +for ac_dir in . "$srcdir"/.; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" @@ -2028,8 +2127,8 @@ for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do fi done if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in . \"$srcdir\"/." >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in . \"$srcdir\"/." >&2;} { (exit 1); exit 1; }; } fi @@ -2042,6 +2141,8 @@ ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + +am__api_version="1.9" # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: @@ -2135,6 +2236,558 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # We used to keeping the `.' as first argument, in order to + # allow $(mkdir_p) to be used without argument. As in + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. However this is wrong + # for two reasons: + # 1. if the package is installed by a user who cannot write `.' + # make install will fail, + # 2. the above comment should most certainly read + # $(mkdir_p) $(DESTDIR)$(somedir) + # so it does not work when $(somedir) is undefined and + # $(DESTDIR) is not. + # To support the latter case, we have to write + # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), + # so the `.' trick is pointless. + mkdir_p='mkdir -p --' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(SHELL) $(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='xf86-video-ati' + VERSION='6.12.2' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + + +{ $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 +$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } + # Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval +else + USE_MAINTAINER_MODE=no +fi + + { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 +$as_echo "$USE_MAINTAINER_MODE" >&6; } + + +if test $USE_MAINTAINER_MODE = yes; then + MAINTAINER_MODE_TRUE= + MAINTAINER_MODE_FALSE='#' +else + MAINTAINER_MODE_TRUE='#' + MAINTAINER_MODE_FALSE= +fi + + MAINT=$MAINTAINER_MODE_TRUE + + + +# Checks for programs. +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=no +fi + + + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +esac +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build +else + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac + + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -3066,168 +3719,867 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu - { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C99" >&5 -$as_echo_n "checking for $CC option to accept ISO C99... " >&6; } -if test "${ac_cv_prog_cc_c99+set}" = set; then +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else - ac_cv_prog_cc_c99=no -ac_save_CC=$CC -cat >conftest.$ac_ext <<_ACEOF + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${lt_cv_path_SED+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done + +fi + +SED=$lt_cv_path_SED + +{ $as_echo "$as_me:$LINENO: result: $SED" >&5 +$as_echo "$SED" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + ac_count=`expr $ac_count + 1` + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done +done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + +{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +$as_echo_n "checking for BSD-compatible nm... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +NM="$lt_cv_path_NM" + +{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 4456 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include -#include -#include -#include -#include - -// Check varargs macros. These examples are taken from C99 6.10.3.5. -#define debug(...) fprintf (stderr, __VA_ARGS__) -#define showlist(...) puts (#__VA_ARGS__) -#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__)) -static void -test_varargs_macros (void) -{ - int x = 1234; - int y = 5678; - debug ("Flag"); - debug ("X = %d\n", x); - showlist (The first, second, and third items.); - report (x>y, "x is %d but y is %d", x, y); -} - -// Check long long types. -#define BIG64 18446744073709551615ull -#define BIG32 4294967295ul -#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0) -#if !BIG_OK - your preprocessor is broken; -#endif -#if BIG_OK -#else - your preprocessor is broken; -#endif -static long long int bignum = -9223372036854775807LL; -static unsigned long long int ubignum = BIG64; - -struct incomplete_array -{ - int datasize; - double data[]; -}; - -struct named_init { - int number; - const wchar_t *name; - double average; -}; - -typedef const char *ccp; - -static inline int -test_restrict (ccp restrict text) -{ - // See if C++-style comments work. - // Iterate through items via the restricted pointer. - // Also check for declarations in for loops. - for (unsigned int i = 0; *(text+i) != '\0'; ++i) - continue; - return 0; -} - -// Check varargs and va_copy. -static void -test_varargs (const char *format, ...) -{ - va_list args; - va_start (args, format); - va_list args_copy; - va_copy (args_copy, args); - - const char *str; - int number; - float fnumber; - - while (*format) - { - switch (*format++) - { - case 's': // string - str = va_arg (args_copy, const char *); - break; - case 'd': // int - number = va_arg (args_copy, int); - break; - case 'f': // float - fnumber = va_arg (args_copy, double); - break; - default: - break; - } - } - va_end (args_copy); - va_end (args); -} int main () { - // Check bool. - _Bool success = false; - - // Check restrict. - if (test_restrict ("String literal") == 0) - success = true; - char *restrict newvar = "Another string"; - - // Check varargs. - test_varargs ("s, d' f .", "string", 65, 34.234); - test_varargs_macros (); - - // Check flexible array members. - struct incomplete_array *ia = - malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10)); - ia->datasize = 10; - for (int i = 0; i < ia->datasize; ++i) - ia->data[i] = i * 1.234; - - // Check named initializers. - struct named_init ni = { - .number = 34, - .name = L"Test wide string", - .average = 543.34343, - }; - - ni.number = 58; - - int dynamic_array[ni.number]; - dynamic_array[ni.number - 1] = 543; - - // work around unused variable warnings - return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x' - || dynamic_array[ni.number - 1] != 543); - ; return 0; } _ACEOF -for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -xc99=all -qlanglvl=extc99 -do - CC="$ac_save_CC $ac_arg" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 + (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 @@ -3236,37 +4588,63 @@ $as_echo "$ac_try_echo") >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cc_c99=$ac_arg + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_cc_needs_belf=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - + lt_cv_cc_needs_belf=no fi -rm -f core conftest.err conftest.$ac_objext - test "x$ac_cv_prog_cc_c99" != "xno" && break -done -rm -f conftest.$ac_ext -CC=$ac_save_CC +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu fi -# AC_CACHE_VAL -case "x$ac_cv_prog_cc_c99" in - x) - { $as_echo "$as_me:$LINENO: result: none needed" >&5 -$as_echo "none needed" >&6; } ;; - xno) - { $as_echo "$as_me:$LINENO: result: unsupported" >&5 -$as_echo "unsupported" >&6; } ;; - *) - CC="$CC $ac_cv_prog_cc_c99" - { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c99" >&5 -$as_echo "$ac_cv_prog_cc_c99" >&6; } ;; +{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + + esac - +need_locks="$enable_libtool_lock" ac_ext=c @@ -3504,140 +4882,6 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if test "${ac_cv_path_GREP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done -done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 -$as_echo_n "checking for egrep... " >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - if test -z "$EGREP"; then - ac_path_EGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue -# Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_EGREP_found && break 3 - done - done -done -IFS=$as_save_IFS - if test -z "$ac_cv_path_EGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_EGREP=$EGREP -fi - - fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -$as_echo "$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then @@ -3889,29 +5133,31 @@ done - -{ $as_echo "$as_me:$LINENO: checking whether __clang__ is declared" >&5 -$as_echo_n "checking whether __clang__ is declared... " >&6; } -if test "${ac_cv_have_decl___clang__+set}" = set; then +for ac_header in dlfcn.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } else - cat >conftest.$ac_ext <<_ACEOF + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default -int -main () -{ -#ifndef __clang__ - (void) __clang__; -#endif - - ; - return 0; -} +#include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" @@ -3931,167 +5177,141 @@ $as_echo "$ac_try_echo") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_have_decl___clang__=yes + ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_have_decl___clang__=no + ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___clang__" >&5 -$as_echo "$ac_cv_have_decl___clang__" >&6; } -if test $ac_cv_have_decl___clang__ = yes; then - CLANGCC="yes" -else - CLANGCC="no" -fi +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } -{ $as_echo "$as_me:$LINENO: checking whether __INTEL_COMPILER is declared" >&5 -$as_echo_n "checking whether __INTEL_COMPILER is declared... " >&6; } -if test "${ac_cv_have_decl___INTEL_COMPILER+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -$ac_includes_default -int -main () -{ -#ifndef __INTEL_COMPILER - (void) __INTEL_COMPILER; -#endif - - ; - return 0; -} +#include <$ac_header> _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" +if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl___INTEL_COMPILER=yes + }; then + ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_have_decl___INTEL_COMPILER=no + ac_header_preproc=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___INTEL_COMPILER" >&5 -$as_echo "$ac_cv_have_decl___INTEL_COMPILER" >&6; } -if test $ac_cv_have_decl___INTEL_COMPILER = yes; then - INTELCC="yes" -else - INTELCC="no" -fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } -{ $as_echo "$as_me:$LINENO: checking whether __SUNPRO_C is declared" >&5 -$as_echo_n "checking whether __SUNPRO_C is declared... " >&6; } -if test "${ac_cv_have_decl___SUNPRO_C+set}" = set; then +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ---------------------------------------------------------------------- ## +## Report this to https://bugs.freedesktop.org/enter_bug.cgi?product=xorg ## +## ---------------------------------------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +if test `eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -int -main () -{ -#ifndef __SUNPRO_C - (void) __SUNPRO_C; -#endif - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_have_decl___SUNPRO_C=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_have_decl___SUNPRO_C=no fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl___SUNPRO_C" >&5 -$as_echo "$ac_cv_have_decl___SUNPRO_C" >&6; } -if test $ac_cv_have_decl___SUNPRO_C = yes; then - SUNCC="yes" -else - SUNCC="no" -fi +done - - - -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. -set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PKG_CONFIG+set}" = set; then +if test "${ac_cv_prog_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else - case $PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -4099,8777 +5319,34 @@ done done IFS=$as_save_IFS - ;; -esac fi -PKG_CONFIG=$ac_cv_path_PKG_CONFIG -if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi -fi -if test -z "$ac_cv_path_PKG_CONFIG"; then - ac_pt_PKG_CONFIG=$PKG_CONFIG - # Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then - $as_echo_n "(cached) " >&6 -else - case $ac_pt_PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG -if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_PKG_CONFIG" = x; then - PKG_CONFIG="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - PKG_CONFIG=$ac_pt_PKG_CONFIG - fi -else - PKG_CONFIG="$ac_cv_path_PKG_CONFIG" -fi - -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=0.9.0 - { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - PKG_CONFIG="" - fi - -fi -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 -$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} - { (exit 1); exit 1; }; } - -{ $as_echo "$as_me:$LINENO: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - { { $as_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 -$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} - { (exit 1); exit 1; }; } -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} - { (exit 1); exit 1; }; } - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 -$as_echo "$as_me: error: invalid value of canonical build" >&2;} - { (exit 1); exit 1; }; };; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:$LINENO: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 -$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} - { (exit 1); exit 1; }; } -fi - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 -$as_echo "$as_me: error: invalid value of canonical host" >&2;} - { (exit 1); exit 1; }; };; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - $as_unset ac_script || ac_script= - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break + test -n "$CXX" && break done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done -done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 -$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_SED=$SED fi - -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - - - - - - -# Check whether --enable-selective-werror was given. -if test "${enable_selective_werror+set}" = set; then - enableval=$enable_selective_werror; SELECTIVE_WERROR=$enableval -else - SELECTIVE_WERROR=yes -fi - - -# -v is too short to test reliably with XORG_TESTSET_CFLAG -if test "x$SUNCC" = "xyes"; then - BASE_CFLAGS="-v" -else - BASE_CFLAGS="" -fi - -# This chunk of warnings were those that existed in the legacy CWARNFLAGS - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wall" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wall" >&5 -$as_echo_n "checking if $CC supports -Wall... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wall" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wpointer-arith" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wpointer-arith" >&5 -$as_echo_n "checking if $CC supports -Wpointer-arith... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wpointer-arith" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wstrict-prototypes" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wstrict-prototypes" >&5 -$as_echo_n "checking if $CC supports -Wstrict-prototypes... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wstrict-prototypes" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wmissing-prototypes" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wmissing-prototypes" >&5 -$as_echo_n "checking if $CC supports -Wmissing-prototypes... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wmissing-prototypes" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wmissing-declarations" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wmissing-declarations" >&5 -$as_echo_n "checking if $CC supports -Wmissing-declarations... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wmissing-declarations" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wnested-externs" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wnested-externs" >&5 -$as_echo_n "checking if $CC supports -Wnested-externs... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wnested-externs" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wbad-function-cast" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wbad-function-cast" >&5 -$as_echo_n "checking if $CC supports -Wbad-function-cast... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wbad-function-cast" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wformat=2" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wformat=2" >&5 -$as_echo_n "checking if $CC supports -Wformat=2... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wformat=2" - found="yes" - fi - fi - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wformat" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wformat" >&5 -$as_echo_n "checking if $CC supports -Wformat... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wformat" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wold-style-definition" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wold-style-definition" >&5 -$as_echo_n "checking if $CC supports -Wold-style-definition... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wold-style-definition" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wdeclaration-after-statement" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wdeclaration-after-statement" >&5 -$as_echo_n "checking if $CC supports -Wdeclaration-after-statement... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wdeclaration-after-statement" - found="yes" - fi - fi - - - -# This chunk adds additional warnings that could catch undesired effects. - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wunused" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wunused" >&5 -$as_echo_n "checking if $CC supports -Wunused... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wunused" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wuninitialized" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wuninitialized" >&5 -$as_echo_n "checking if $CC supports -Wuninitialized... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wuninitialized" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wshadow" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wshadow" >&5 -$as_echo_n "checking if $CC supports -Wshadow... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wshadow" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wcast-qual" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wcast-qual" >&5 -$as_echo_n "checking if $CC supports -Wcast-qual... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wcast-qual" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wmissing-noreturn" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wmissing-noreturn" >&5 -$as_echo_n "checking if $CC supports -Wmissing-noreturn... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wmissing-noreturn" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wmissing-format-attribute" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wmissing-format-attribute" >&5 -$as_echo_n "checking if $CC supports -Wmissing-format-attribute... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wmissing-format-attribute" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wredundant-decls" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wredundant-decls" >&5 -$as_echo_n "checking if $CC supports -Wredundant-decls... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wredundant-decls" - found="yes" - fi - fi - - - -# These are currently disabled because they are noisy. They will be enabled -# in the future once the codebase is sufficiently modernized to silence -# them. For now, I don't want them to drown out the other warnings. -# XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wlogical-op]) -# XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wparentheses]) -# XORG_TESTSET_CFLAG([BASE_CFLAGS], [-Wcast-align]) - -# Turn some warnings into errors, so we don't accidently get successful builds -# when there are problems that should be fixed. - -if test "x$SELECTIVE_WERROR" = "xyes" ; then - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=implicit" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=implicit" >&5 -$as_echo_n "checking if $CC supports -Werror=implicit... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=implicit" - found="yes" - fi - fi - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED" >&5 -$as_echo_n "checking if $CC supports -errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -errwarn=E_NO_EXPLICIT_TYPE_GIVEN -errwarn=E_NO_IMPLICIT_DECL_ALLOWED" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=nonnull" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=nonnull" >&5 -$as_echo_n "checking if $CC supports -Werror=nonnull... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=nonnull" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=init-self" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=init-self" >&5 -$as_echo_n "checking if $CC supports -Werror=init-self... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=init-self" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=main" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=main" >&5 -$as_echo_n "checking if $CC supports -Werror=main... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=main" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=missing-braces" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=missing-braces" >&5 -$as_echo_n "checking if $CC supports -Werror=missing-braces... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=missing-braces" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=sequence-point" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=sequence-point" >&5 -$as_echo_n "checking if $CC supports -Werror=sequence-point... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=sequence-point" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=return-type" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=return-type" >&5 -$as_echo_n "checking if $CC supports -Werror=return-type... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=return-type" - found="yes" - fi - fi - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -errwarn=E_FUNC_HAS_NO_RETURN_STMT" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -errwarn=E_FUNC_HAS_NO_RETURN_STMT" >&5 -$as_echo_n "checking if $CC supports -errwarn=E_FUNC_HAS_NO_RETURN_STMT... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -errwarn=E_FUNC_HAS_NO_RETURN_STMT" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=trigraphs" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=trigraphs" >&5 -$as_echo_n "checking if $CC supports -Werror=trigraphs... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=trigraphs" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=array-bounds" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=array-bounds" >&5 -$as_echo_n "checking if $CC supports -Werror=array-bounds... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=array-bounds" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=write-strings" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=write-strings" >&5 -$as_echo_n "checking if $CC supports -Werror=write-strings... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=write-strings" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=address" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=address" >&5 -$as_echo_n "checking if $CC supports -Werror=address... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=address" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=int-to-pointer-cast" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=int-to-pointer-cast" >&5 -$as_echo_n "checking if $CC supports -Werror=int-to-pointer-cast... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=int-to-pointer-cast" - found="yes" - fi - fi - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -errwarn=E_BAD_PTR_INT_COMBINATION" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -errwarn=E_BAD_PTR_INT_COMBINATION" >&5 -$as_echo_n "checking if $CC supports -errwarn=E_BAD_PTR_INT_COMBINATION... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -errwarn=E_BAD_PTR_INT_COMBINATION" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=pointer-to-int-cast" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=pointer-to-int-cast" >&5 -$as_echo_n "checking if $CC supports -Werror=pointer-to-int-cast... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Werror=pointer-to-int-cast" - found="yes" - fi - fi - - # Also -errwarn=E_BAD_PTR_INT_COMBINATION -else -{ $as_echo "$as_me:$LINENO: WARNING: You have chosen not to turn some select compiler warnings into errors. This should not be necessary. Please report why you needed to do so in a bug report at $PACKAGE_BUGREPORT" >&5 -$as_echo "$as_me: WARNING: You have chosen not to turn some select compiler warnings into errors. This should not be necessary. Please report why you needed to do so in a bug report at $PACKAGE_BUGREPORT" >&2;} - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wimplicit" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wimplicit" >&5 -$as_echo_n "checking if $CC supports -Wimplicit... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wimplicit" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wnonnull" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wnonnull" >&5 -$as_echo_n "checking if $CC supports -Wnonnull... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wnonnull" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Winit-self" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Winit-self" >&5 -$as_echo_n "checking if $CC supports -Winit-self... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Winit-self" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wmain" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wmain" >&5 -$as_echo_n "checking if $CC supports -Wmain... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wmain" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wmissing-braces" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wmissing-braces" >&5 -$as_echo_n "checking if $CC supports -Wmissing-braces... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wmissing-braces" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wsequence-point" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wsequence-point" >&5 -$as_echo_n "checking if $CC supports -Wsequence-point... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wsequence-point" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wreturn-type" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wreturn-type" >&5 -$as_echo_n "checking if $CC supports -Wreturn-type... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wreturn-type" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wtrigraphs" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wtrigraphs" >&5 -$as_echo_n "checking if $CC supports -Wtrigraphs... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wtrigraphs" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Warray-bounds" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Warray-bounds" >&5 -$as_echo_n "checking if $CC supports -Warray-bounds... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Warray-bounds" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wwrite-strings" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wwrite-strings" >&5 -$as_echo_n "checking if $CC supports -Wwrite-strings... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wwrite-strings" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Waddress" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Waddress" >&5 -$as_echo_n "checking if $CC supports -Waddress... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Waddress" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wint-to-pointer-cast" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wint-to-pointer-cast" >&5 -$as_echo_n "checking if $CC supports -Wint-to-pointer-cast... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wint-to-pointer-cast" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Wpointer-to-int-cast" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Wpointer-to-int-cast" >&5 -$as_echo_n "checking if $CC supports -Wpointer-to-int-cast... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - BASE_CFLAGS="$BASE_CFLAGS -Wpointer-to-int-cast" - found="yes" - fi - fi - - -fi - - - - - - -CWARNFLAGS="$BASE_CFLAGS" -if test "x$GCC" = xyes ; then - CWARNFLAGS="$CWARNFLAGS -fno-strict-aliasing" -fi - - - - - - -# Check whether --enable-strict-compilation was given. -if test "${enable_strict_compilation+set}" = set; then - enableval=$enable_strict_compilation; STRICT_COMPILE=$enableval -else - STRICT_COMPILE=no -fi - - -STRICT_CFLAGS="" - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -pedantic" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -pedantic" >&5 -$as_echo_n "checking if $CC supports -pedantic... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - STRICT_CFLAGS="$STRICT_CFLAGS -pedantic" - found="yes" - fi - fi - - - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror" >&5 -$as_echo_n "checking if $CC supports -Werror... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - STRICT_CFLAGS="$STRICT_CFLAGS -Werror" - found="yes" - fi - fi - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -errwarn" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -errwarn" >&5 -$as_echo_n "checking if $CC supports -errwarn... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - STRICT_CFLAGS="$STRICT_CFLAGS -errwarn" - found="yes" - fi - fi - - - -# Earlier versions of gcc (eg: 4.2) support -Werror=attributes, but do not -# activate it with -Werror, so we add it here explicitly. - - - - - -xorg_testset_save_CFLAGS="$CFLAGS" - -if test "x$xorg_testset_unknown_warning_option" = "x" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unknown-warning-option" >&5 -$as_echo_n "checking if $CC supports -Werror=unknown-warning-option... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unknown_warning_option=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unknown_warning_option=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unknown_warning_option" >&5 -$as_echo "$xorg_testset_unknown_warning_option" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -if test "x$xorg_testset_unused_command_line_argument" = "x" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=unused-command-line-argument" >&5 -$as_echo_n "checking if $CC supports -Werror=unused-command-line-argument... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - xorg_testset_unused_command_line_argument=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - xorg_testset_unused_command_line_argument=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $xorg_testset_unused_command_line_argument" >&5 -$as_echo "$xorg_testset_unused_command_line_argument" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" -fi - -found="no" - - if test $found = "no" ; then - if test "x$xorg_testset_unknown_warning_option" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unknown-warning-option" - fi - - if test "x$xorg_testset_unused_command_line_argument" = "xyes" ; then - CFLAGS="$CFLAGS -Werror=unused-command-line-argument" - fi - - CFLAGS="$CFLAGS -Werror=attributes" - - { $as_echo "$as_me:$LINENO: checking if $CC supports -Werror=attributes" >&5 -$as_echo_n "checking if $CC supports -Werror=attributes... " >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int i; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - supported=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - supported=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - { $as_echo "$as_me:$LINENO: result: $supported" >&5 -$as_echo "$supported" >&6; } - CFLAGS="$xorg_testset_save_CFLAGS" - - if test "$supported" = "yes" ; then - STRICT_CFLAGS="$STRICT_CFLAGS -Werror=attributes" - found="yes" - fi - fi - - - -if test "x$STRICT_COMPILE" = "xyes"; then - BASE_CFLAGS="$BASE_CFLAGS $STRICT_CFLAGS" - CWARNFLAGS="$CWARNFLAGS $STRICT_CFLAGS" -fi - - - - - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` -_ACEOF - - PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` - if test "x$PVM" = "x"; then - PVM="0" - fi - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION_MINOR $PVM -_ACEOF - - PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` - if test "x$PVP" = "x"; then - PVP="0" - fi - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION_PATCHLEVEL $PVP -_ACEOF - - - -CHANGELOG_CMD="(GIT_DIR=\$(top_srcdir)/.git git log > \$(top_srcdir)/.changelog.tmp && \ -mv \$(top_srcdir)/.changelog.tmp \$(top_srcdir)/ChangeLog) \ -|| (rm -f \$(top_srcdir)/.changelog.tmp; touch \$(top_srcdir)/ChangeLog; \ -echo 'git directory not found: installing possibly empty changelog.' >&2)" - - - - -macros_datadir=`$PKG_CONFIG --print-errors --variable=pkgdatadir xorg-macros` -INSTALL_CMD="(cp -f "$macros_datadir/INSTALL" \$(top_srcdir)/.INSTALL.tmp && \ -mv \$(top_srcdir)/.INSTALL.tmp \$(top_srcdir)/INSTALL) \ -|| (rm -f \$(top_srcdir)/.INSTALL.tmp; touch \$(top_srcdir)/INSTALL; \ -echo 'util-macros \"pkgdatadir\" from xorg-macros.pc not found: installing possibly empty INSTALL.' >&2)" - - - - - - -if test x$APP_MAN_SUFFIX = x ; then - APP_MAN_SUFFIX=1 -fi -if test x$APP_MAN_DIR = x ; then - APP_MAN_DIR='$(mandir)/man$(APP_MAN_SUFFIX)' -fi - -if test x$LIB_MAN_SUFFIX = x ; then - LIB_MAN_SUFFIX=3 -fi -if test x$LIB_MAN_DIR = x ; then - LIB_MAN_DIR='$(mandir)/man$(LIB_MAN_SUFFIX)' -fi - -if test x$FILE_MAN_SUFFIX = x ; then - case $host_os in - solaris*) FILE_MAN_SUFFIX=4 ;; - *) FILE_MAN_SUFFIX=5 ;; - esac -fi -if test x$FILE_MAN_DIR = x ; then - FILE_MAN_DIR='$(mandir)/man$(FILE_MAN_SUFFIX)' -fi - -if test x$MISC_MAN_SUFFIX = x ; then - case $host_os in - solaris*) MISC_MAN_SUFFIX=5 ;; - *) MISC_MAN_SUFFIX=7 ;; - esac -fi -if test x$MISC_MAN_DIR = x ; then - MISC_MAN_DIR='$(mandir)/man$(MISC_MAN_SUFFIX)' -fi - -if test x$DRIVER_MAN_SUFFIX = x ; then - case $host_os in - solaris*) DRIVER_MAN_SUFFIX=7 ;; - *) DRIVER_MAN_SUFFIX=4 ;; - esac -fi -if test x$DRIVER_MAN_DIR = x ; then - DRIVER_MAN_DIR='$(mandir)/man$(DRIVER_MAN_SUFFIX)' -fi - -if test x$ADMIN_MAN_SUFFIX = x ; then - case $host_os in - solaris*) ADMIN_MAN_SUFFIX=1m ;; - *) ADMIN_MAN_SUFFIX=8 ;; - esac -fi -if test x$ADMIN_MAN_DIR = x ; then - ADMIN_MAN_DIR='$(mandir)/man$(ADMIN_MAN_SUFFIX)' -fi - - - - - - - - - - - - - - - -XORG_MAN_PAGE="X Version 11" - -MAN_SUBSTS="\ - -e 's|__vendorversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ - -e 's|__xorgversion__|\"\$(PACKAGE_STRING)\" \"\$(XORG_MAN_PAGE)\"|' \ - -e 's|__xservername__|Xorg|g' \ - -e 's|__xconfigfile__|xorg.conf|g' \ - -e 's|__projectroot__|\$(prefix)|g' \ - -e 's|__apploaddir__|\$(appdefaultdir)|g' \ - -e 's|__appmansuffix__|\$(APP_MAN_SUFFIX)|g' \ - -e 's|__drivermansuffix__|\$(DRIVER_MAN_SUFFIX)|g' \ - -e 's|__adminmansuffix__|\$(ADMIN_MAN_SUFFIX)|g' \ - -e 's|__libmansuffix__|\$(LIB_MAN_SUFFIX)|g' \ - -e 's|__miscmansuffix__|\$(MISC_MAN_SUFFIX)|g' \ - -e 's|__filemansuffix__|\$(FILE_MAN_SUFFIX)|g'" - - - -AM_DEFAULT_VERBOSITY=1 - - - -ac_aux_dir= -for ac_dir in . "$srcdir"/.; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in . \"$srcdir\"/." >&5 -$as_echo "$as_me: error: cannot find install-sh or install.sh in . \"$srcdir\"/." >&2;} - { (exit 1); exit 1; }; } -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - - -# Initialize Automake -am__api_version="1.9" -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. -# By default was `s,x,x', remove it if useless. -ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' -program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(SHELL) $(install_sh) -d' - fi -fi - -for ac_prog in gawk mawk nawk awk +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then $as_echo_n "(cached) " >&6 else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -12878,7 +5355,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" + ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -12888,258 +5365,21 @@ IFS=$as_save_IFS fi fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:$LINENO: result: $AWK" >&5 -$as_echo "$AWK" >&6; } +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$AWK" && break + test -n "$ac_ct_CXX" && break done -{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } -set x ${MAKE-make} -ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - SET_MAKE= -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo done -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -$as_echo_n "checking for style of include used by $am_make... " >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi -fi - - -{ $as_echo "$as_me:$LINENO: result: $_am_result" >&5 -$as_echo "$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi - - -if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -$as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE='xf86-video-ati' - VERSION='6.14.3' - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -install_sh=${install_sh-"$am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" + if test "x$ac_ct_CXX" = x; then + CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) @@ -13151,31 +5391,278 @@ whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac - STRIP=$ac_ct_STRIP + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" fi else - STRIP="$ac_cv_prog_STRIP" + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. - -AMTAR=${AMTAR-"${am_missing_run}tar"} - -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - - - -depcc="$CC" am_compiler_list= +depcc="$CXX" am_compiler_list= { $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } -if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then @@ -13197,7 +5684,7 @@ else # directory. mkdir sub - am_cv_CC_dependencies_compiler_type=none + am_cv_CXX_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi @@ -13250,7 +5737,7 @@ else # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CC_dependencies_compiler_type=$depmode + am_cv_CXX_dependencies_compiler_type=$depmode break fi fi @@ -13259,892 +5746,281 @@ else cd .. rm -rf conftest.dir else - am_cv_CC_dependencies_compiler_type=none + am_cv_CXX_dependencies_compiler_type=none fi fi -{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 -$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } -CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type +{ $as_echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then - am__fastdepCC_TRUE= - am__fastdepCC_FALSE='#' + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' else - am__fastdepCC_TRUE='#' - am__fastdepCC_FALSE= + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= fi -# Check whether --enable-largefile was given. -if test "${enable_largefile+set}" = set; then - enableval=$enable_largefile; -fi -if test "$enable_largefile" != no; then - - { $as_echo "$as_me:$LINENO: checking for special C compiler options needed for large files" >&5 -$as_echo_n "checking for special C compiler options needed for large files... " >&6; } -if test "${ac_cv_sys_largefile_CC+set}" = set; then +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then $as_echo_n "(cached) " >&6 else - ac_cv_sys_largefile_CC=no - if test "$GCC" != yes; then - ac_save_CC=$CC - while :; do - # IRIX 6.2 and later do not support large files by default, - # so use the C compiler's -n32 option if that helps. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - break -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - CC="$CC -n32" - rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_sys_largefile_CC=' -n32'; break -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext - break - done - CC=$ac_save_CC - rm -f conftest.$ac_ext - fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_largefile_CC" >&5 -$as_echo "$ac_cv_sys_largefile_CC" >&6; } - if test "$ac_cv_sys_largefile_CC" != no; then - CC=$CC$ac_cv_sys_largefile_CC - fi - - { $as_echo "$as_me:$LINENO: checking for _FILE_OFFSET_BITS value needed for large files" >&5 -$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; } -if test "${ac_cv_sys_file_offset_bits+set}" = set; then - $as_echo_n "(cached) " >&6 -else - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_sys_file_offset_bits=no; break -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#define _FILE_OFFSET_BITS 64 -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_sys_file_offset_bits=64; break -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_sys_file_offset_bits=unknown - break -done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_file_offset_bits" >&5 -$as_echo "$ac_cv_sys_file_offset_bits" >&6; } -case $ac_cv_sys_file_offset_bits in #( - no | unknown) ;; - *) -cat >>confdefs.h <<_ACEOF -#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits -_ACEOF -;; -esac -rm -rf conftest* - if test $ac_cv_sys_file_offset_bits = unknown; then - { $as_echo "$as_me:$LINENO: checking for _LARGE_FILES value needed for large files" >&5 -$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; } -if test "${ac_cv_sys_large_files+set}" = set; then - $as_echo_n "(cached) " >&6 -else - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_sys_large_files=no; break -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#define _LARGE_FILES 1 -#include - /* Check that off_t can represent 2**63 - 1 correctly. - We can't simply define LARGE_OFF_T to be 9223372036854775807, - since some C++ compilers masquerading as C compilers - incorrectly reject 9223372036854775807. */ -#define LARGE_OFF_T (((off_t) 1 << 62) - 1 + ((off_t) 1 << 62)) - int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721 - && LARGE_OFF_T % 2147483647 == 1) - ? 1 : -1]; -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_sys_large_files=1; break -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cv_sys_large_files=unknown - break -done -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_sys_large_files" >&5 -$as_echo "$ac_cv_sys_large_files" >&6; } -case $ac_cv_sys_large_files in #( - no | unknown) ;; - *) -cat >>confdefs.h <<_ACEOF -#define _LARGE_FILES $ac_cv_sys_large_files -_ACEOF -;; -esac -rm -rf conftest* - fi -fi - - -{ $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 -$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } - # Check whether --enable-maintainer-mode was given. -if test "${enable_maintainer_mode+set}" = set; then - enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval -else - USE_MAINTAINER_MODE=no -fi - - { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 -$as_echo "$USE_MAINTAINER_MODE" >&6; } - - -if test $USE_MAINTAINER_MODE = yes; then - MAINTAINER_MODE_TRUE= - MAINTAINER_MODE_FALSE='#' -else - MAINTAINER_MODE_TRUE='#' - MAINTAINER_MODE_FALSE= -fi - - MAINT=$MAINTAINER_MODE_TRUE - - - -# Initialize libtool -# Check whether --enable-static was given. -if test "${enable_static+set}" = set; then - enableval=$enable_static; p=${PACKAGE-default} - case $enableval in - yes) enable_static=yes ;; - no) enable_static=no ;; - *) - enable_static=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_static=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_static=no -fi - - - - - - - - - -case `pwd` in - *\ * | *\ *) - { $as_echo "$as_me:$LINENO: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5 -$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;; -esac - - - -macro_version='2.4.2' -macro_revision='1.3337' - - - - - - - - - - - - - -ltmain="$ac_aux_dir/ltmain.sh" - -# Backslashify metacharacters that are still active within -# double-quoted strings. -sed_quote_subst='s/\(["`$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution to delay expansion of an escaped shell variable in a -# double_quote_subst'ed string. -delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' - -# Sed substitution to delay expansion of an escaped single quote. -delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' - -# Sed substitution to avoid accidental globbing in evaled expressions -no_glob_subst='s/\*/\\\*/g' - -ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO -ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO - -{ $as_echo "$as_me:$LINENO: checking how to print strings" >&5 -$as_echo_n "checking how to print strings... " >&6; } -# Test print first, because it will be a builtin if present. -if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ - test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='print -r --' -elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then - ECHO='printf %s\n' -else - # Use this function as a fallback that always works. - func_fallback_echo () - { - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' - } - ECHO='func_fallback_echo' -fi - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "" -} - -case "$ECHO" in - printf*) { $as_echo "$as_me:$LINENO: result: printf" >&5 -$as_echo "printf" >&6; } ;; - print*) { $as_echo "$as_me:$LINENO: result: print -r" >&5 -$as_echo "print -r" >&6; } ;; - *) { $as_echo "$as_me:$LINENO: result: cat" >&5 -$as_echo "cat" >&6; } ;; -esac - - - - - - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if test "${ac_cv_path_SED+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - $as_unset ac_script || ac_script= - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext - $ac_path_SED_found && break 3 - done - done done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable sed could be found in \$PATH" >&5 -$as_echo "$as_me: error: no acceptable sed could be found in \$PATH" >&2;} - { (exit 1); exit 1; }; } - fi -else - ac_cv_path_SED=$SED +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break fi + done + ac_cv_prog_CXXCPP=$CXXCPP + fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - -test -z "$SED" && SED=sed -Xsed="$SED -e 1s/^X//" - - - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking for fgrep" >&5 -$as_echo_n "checking for fgrep... " >&6; } -if test "${ac_cv_path_FGREP+set}" = set; then - $as_echo_n "(cached) " >&6 + CXXCPP=$ac_cv_prog_CXXCPP else - if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1 - then ac_cv_path_FGREP="$GREP -F" - else - if test -z "$FGREP"; then - ac_path_FGREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in fgrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue -# Check for GNU ac_path_FGREP and select it if it is found. - # Check for GNU $ac_path_FGREP -case `"$ac_path_FGREP" --version 2>&1` in -*GNU*) - ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'FGREP' >> "conftest.nl" - "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_FGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_FGREP="$ac_path_FGREP" - ac_path_FGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext - $ac_path_FGREP_found && break 3 - done - done done -IFS=$as_save_IFS - if test -z "$ac_cv_path_FGREP"; then - { { $as_echo "$as_me:$LINENO: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -$as_echo "$as_me: error: no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; } - fi -else - ac_cv_path_FGREP=$FGREP fi - fi -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_FGREP" >&5 -$as_echo "$ac_cv_path_FGREP" >&6; } - FGREP="$ac_cv_path_FGREP" +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - -test -z "$GREP" && GREP=grep - - - - - - - - - - - - - - - - - - - -# Check whether --with-gnu-ld was given. -if test "${with_gnu_ld+set}" = set; then - withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes -else - with_gnu_ld=no fi -ac_prog=ld -if test "$GCC" = yes; then - # Check if gcc -print-prog-name=ld gives a path. - { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 -$as_echo_n "checking for ld used by $CC... " >&6; } - case $host in - *-*-mingw*) - # gcc leaves a trailing carriage return which upsets mingw - ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; - *) - ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; - esac - case $ac_prog in - # Accept absolute paths. - [\\/]* | ?:[\\/]*) - re_direlt='/[^/][^/]*/\.\./' - # Canonicalize the pathname of ld - ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` - while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do - ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` - done - test -z "$LD" && LD="$ac_prog" - ;; - "") - # If it fails, then pretend we aren't using GCC. - ac_prog=ld - ;; - *) - # If it is relative, then search for the first ld in PATH. - with_gnu_ld=unknown - ;; - esac -elif test "$with_gnu_ld" = yes; then - { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 -$as_echo_n "checking for GNU ld... " >&6; } -else - { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 -$as_echo_n "checking for non-GNU ld... " >&6; } -fi -if test "${lt_cv_path_LD+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -z "$LD"; then - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then - lt_cv_path_LD="$ac_dir/$ac_prog" - # Check to see if the program is GNU ld. I'd rather use --version, - # but apparently some variants of GNU ld only accept -v. - # Break only if it was the GNU/non-GNU ld that we prefer. - case `"$lt_cv_path_LD" -v 2>&1 &5 -$as_echo "$LD" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi -test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 -$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} - { (exit 1); exit 1; }; } -{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 -$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } -if test "${lt_cv_prog_gnu_ld+set}" = set; then - $as_echo_n "(cached) " >&6 -else - # I'd rather use --version here, but apparently some GNU lds only accept -v. -case `$LD -v 2>&1 &5 -$as_echo "$lt_cv_prog_gnu_ld" >&6; } -with_gnu_ld=$lt_cv_prog_gnu_ld - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking for BSD- or MS-compatible name lister (nm)" >&5 -$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; } -if test "${lt_cv_path_NM+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$NM"; then - # Let the user override the test. - lt_cv_path_NM="$NM" -else - lt_nm_to_check="${ac_tool_prefix}nm" - if test -n "$ac_tool_prefix" && test "$build" = "$host"; then - lt_nm_to_check="$lt_nm_to_check nm" - fi - for lt_tmp_nm in $lt_nm_to_check; do - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - tmp_nm="$ac_dir/$lt_tmp_nm" - if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then - # Check to see if the nm accepts a BSD-compat flag. - # Adding the `sed 1q' prevents false positives on HP-UX, which says: - # nm: unknown option "B" ignored - # Tru64's nm complains that /dev/null is an invalid object file - case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in - */dev/null* | *'Invalid file or object type'*) - lt_cv_path_NM="$tmp_nm -B" - break - ;; - *) - case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in - */dev/null*) - lt_cv_path_NM="$tmp_nm -p" - break - ;; - *) - lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but - continue # so that we can try to find one that supports BSD flags - ;; - esac - ;; - esac - fi - done - IFS="$lt_save_ifs" - done - : ${lt_cv_path_NM=no} -fi -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 -$as_echo "$lt_cv_path_NM" >&6; } -if test "$lt_cv_path_NM" != "no"; then - NM="$lt_cv_path_NM" -else - # Didn't find any BSD compatible name lister, look for dumpbin. - if test -n "$DUMPBIN"; then : - # Let the user override the test. - else - if test -n "$ac_tool_prefix"; then - for ac_prog in dumpbin "link -dump" +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DUMPBIN+set}" = set; then +if test "${ac_cv_prog_F77+set}" = set; then $as_echo_n "(cached) " >&6 else - if test -n "$DUMPBIN"; then - ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test. + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -14153,7 +6029,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog" + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -14163,32 +6039,32 @@ IFS=$as_save_IFS fi fi -DUMPBIN=$ac_cv_prog_DUMPBIN -if test -n "$DUMPBIN"; then - { $as_echo "$as_me:$LINENO: result: $DUMPBIN" >&5 -$as_echo "$DUMPBIN" >&6; } +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:$LINENO: result: $F77" >&5 +$as_echo "$F77" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$DUMPBIN" && break + test -n "$F77" && break done fi -if test -z "$DUMPBIN"; then - ac_ct_DUMPBIN=$DUMPBIN - for ac_prog in dumpbin "link -dump" +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DUMPBIN+set}" = set; then +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_DUMPBIN"; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test. + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -14197,7 +6073,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DUMPBIN="$ac_prog" + ac_cv_prog_ac_ct_F77="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -14207,21 +6083,21 @@ IFS=$as_save_IFS fi fi -ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN -if test -n "$ac_ct_DUMPBIN"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_DUMPBIN" >&5 -$as_echo "$ac_ct_DUMPBIN" >&6; } +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$ac_ct_DUMPBIN" && break + test -n "$ac_ct_F77" && break done - if test "x$ac_ct_DUMPBIN" = x; then - DUMPBIN=":" + if test "x$ac_ct_F77" = x; then + F77="" else case $cross_compiling:$ac_tool_warned in yes:) @@ -14233,65 +6109,175 @@ whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac - DUMPBIN=$ac_ct_DUMPBIN + F77=$ac_ct_F77 fi fi - case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in - *COFF*) - DUMPBIN="$DUMPBIN -symbols" - ;; - *) - DUMPBIN=: - ;; - esac - fi - if test "$DUMPBIN" != ":"; then - NM="$DUMPBIN" - fi -fi -test -z "$NM" && NM=nm +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out - - - - - -{ $as_echo "$as_me:$LINENO: checking the name lister ($NM) interface" >&5 -$as_echo_n "checking the name lister ($NM) interface... " >&6; } -if test "${lt_cv_nm_interface+set}" = set; then +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if test "${ac_cv_f77_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else - lt_cv_nm_interface="BSD nm" - echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5) - (eval "$ac_compile" 2>conftest.err) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5) - (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) - cat conftest.err >&5 - (eval echo "\"\$as_me:$LINENO: output\"" >&5) - cat conftest.out >&5 - if $GREP 'External.*some_variable' conftest.out > /dev/null; then - lt_cv_nm_interface="MS dumpbin" - fi - rm -f conftest* -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_nm_interface" >&5 -$as_echo "$lt_cv_nm_interface" >&6; } + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif -{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 -$as_echo_n "checking whether ln -s works... " >&6; } -LN_S=$as_ln_s -if test "$LN_S" = "ln -s"; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } + end +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes else - { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 -$as_echo "no, using $LN_S" >&6; } + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if test "${ac_cv_prog_f77_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_f77_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_f77_g=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! # find the maximum length of command line arguments { $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 $as_echo_n "checking the maximum length of command line arguments... " >&6; } @@ -14317,7 +6303,7 @@ else lt_cv_sys_max_cmd_len=-1; ;; - cygwin* | mingw* | cegcc*) + cygwin* | mingw*) # On Win9x/ME, this test blows up -- it succeeds, but takes # about 5 minutes as the teststring grows exponentially. # Worse, since 9x/ME are not pre-emptively multitasking, @@ -14328,11 +6314,6 @@ else lt_cv_sys_max_cmd_len=8192; ;; - mint*) - # On MiNT this can take a long time and run out of memory. - lt_cv_sys_max_cmd_len=8192; - ;; - amigaos*) # On AmigaOS with pdksh, this test takes hours, literally. # So we just punt and use a minimum line length of 8192. @@ -14358,11 +6339,6 @@ else lt_cv_sys_max_cmd_len=196608 ;; - os2*) - # The test takes a long time on OS/2. - lt_cv_sys_max_cmd_len=8192 - ;; - osf*) # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not @@ -14382,7 +6358,7 @@ else sysv5* | sco5v6* | sysv4.2uw2*) kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` if test -n "$kargmax"; then - lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` else lt_cv_sys_max_cmd_len=32768 fi @@ -14393,28 +6369,20 @@ else lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` else - # Make teststring a little bigger before we do anything with it. - # a 1K string should be a reasonable start. - for i in 1 2 3 4 5 6 7 8 ; do - teststring=$teststring$teststring - done SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} - # If test is not a shell built-in, we'll probably end up computing a - # maximum length that is only half of the actual maximum length, but - # we can't tell. - while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \ - = "X$teststring$teststring"; } >/dev/null 2>&1 && + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && test $i != 17 # 1/2 MB should be enough do i=`expr $i + 1` teststring=$teststring$teststring done - # Only check the string length outside the loop. - lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` teststring= - # Add a significant safety factor because C++ compilers can tack on - # massive amounts of additional arguments before passing them to the - # linker. It appears as though 1/2 is a usable value. + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` fi ;; @@ -14429,684 +6397,291 @@ else { $as_echo "$as_me:$LINENO: result: none" >&5 $as_echo "none" >&6; } fi -max_cmd_len=$lt_cv_sys_max_cmd_len - -: ${CP="cp -f"} -: ${MV="mv -f"} -: ${RM="rm -f"} - -{ $as_echo "$as_me:$LINENO: checking whether the shell understands some XSI constructs" >&5 -$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; } -# Try some XSI features -xsi_shell=no -( _lt_dummy="a/b/c" - test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \ - = c,a/b,b/c, \ - && eval 'test $(( 1 + 1 )) -eq 2 \ - && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \ - && xsi_shell=yes -{ $as_echo "$as_me:$LINENO: result: $xsi_shell" >&5 -$as_echo "$xsi_shell" >&6; } - - -{ $as_echo "$as_me:$LINENO: checking whether the shell understands \"+=\"" >&5 -$as_echo_n "checking whether the shell understands \"+=\"... " >&6; } -lt_shell_append=no -( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \ - >/dev/null 2>&1 \ - && lt_shell_append=yes -{ $as_echo "$as_me:$LINENO: result: $lt_shell_append" >&5 -$as_echo "$lt_shell_append" >&6; } - - -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - lt_unset=unset -else - lt_unset=false -fi - - - - - -# test EBCDIC or ASCII -case `echo X|tr X '\101'` in - A) # ASCII based system - # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr - lt_SP2NL='tr \040 \012' - lt_NL2SP='tr \015\012 \040\040' - ;; - *) # EBCDIC based system - lt_SP2NL='tr \100 \n' - lt_NL2SP='tr \r\n \100\100' - ;; -esac - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking how to convert $build file names to $host format" >&5 -$as_echo_n "checking how to convert $build file names to $host format... " >&6; } -if test "${lt_cv_to_host_file_cmd+set}" = set; then +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then $as_echo_n "(cached) " >&6 else - case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 - ;; - esac - ;; - *-*-cygwin* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin - ;; - *-*-cygwin* ) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; - * ) # otherwise, assume *nix - lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin - ;; - esac - ;; - * ) # unhandled hosts (and "normal" native builds) - lt_cv_to_host_file_cmd=func_convert_file_noop - ;; -esac -fi +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] -to_host_file_cmd=$lt_cv_to_host_file_cmd -{ $as_echo "$as_me:$LINENO: result: $lt_cv_to_host_file_cmd" >&5 -$as_echo "$lt_cv_to_host_file_cmd" >&6; } +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" - -{ $as_echo "$as_me:$LINENO: checking how to convert $build file names to toolchain format" >&5 -$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; } -if test "${lt_cv_to_tool_file_cmd+set}" = set; then - $as_echo_n "(cached) " >&6 -else - #assume ordinary cross tools, or native build. -lt_cv_to_tool_file_cmd=func_convert_file_noop -case $host in - *-*-mingw* ) - case $build in - *-*-mingw* ) # actually msys - lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 - ;; - esac - ;; -esac - -fi - -to_tool_file_cmd=$lt_cv_to_tool_file_cmd -{ $as_echo "$as_me:$LINENO: result: $lt_cv_to_tool_file_cmd" >&5 -$as_echo "$lt_cv_to_tool_file_cmd" >&6; } - - - - - -{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 -$as_echo_n "checking for $LD option to reload object files... " >&6; } -if test "${lt_cv_ld_reload_flag+set}" = set; then - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_reload_flag='-r' -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 -$as_echo "$lt_cv_ld_reload_flag" >&6; } -reload_flag=$lt_cv_ld_reload_flag -case $reload_flag in -"" | " "*) ;; -*) reload_flag=" $reload_flag" ;; -esac -reload_cmds='$LD$reload_flag -o $output$reload_objs' +# Define system-specific variables. case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - if test "$GCC" != yes; then - reload_cmds=false - fi - ;; - darwin*) - if test "$GCC" = yes; then - reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' - else - reload_cmds='$LD$reload_flag -o $output$reload_objs' - fi - ;; -esac - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. -set dummy ${ac_tool_prefix}objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OBJDUMP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$OBJDUMP"; then - ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' fi -done -done -IFS=$as_save_IFS - -fi -fi -OBJDUMP=$ac_cv_prog_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OBJDUMP"; then - ac_ct_OBJDUMP=$OBJDUMP - # Extract the first word of "objdump", so it can be a program name with args. -set dummy objdump; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OBJDUMP"; then - ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OBJDUMP="objdump" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP -if test -n "$ac_ct_OBJDUMP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 -$as_echo "$ac_ct_OBJDUMP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OBJDUMP" = x; then - OBJDUMP="false" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - OBJDUMP=$ac_ct_OBJDUMP - fi -else - OBJDUMP="$ac_cv_prog_OBJDUMP" -fi - -test -z "$OBJDUMP" && OBJDUMP=objdump - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 -$as_echo_n "checking how to recognize dependent libraries... " >&6; } -if test "${lt_cv_deplibs_check_method+set}" = set; then - $as_echo_n "(cached) " >&6 -else - lt_cv_file_magic_cmd='$MAGIC_CMD' -lt_cv_file_magic_test_file= -lt_cv_deplibs_check_method='unknown' -# Need to set the preceding variable on all platforms that support -# interlibrary dependencies. -# 'none' -- dependencies not supported. -# `unknown' -- same as none, but documents that we really don't know. -# 'pass_all' -- all dependencies passed with no checks. -# 'test_compile' -- check by making test program. -# 'file_magic [[regex]]' -- check by looking for files in library path -# which responds to the $file_magic_cmd with a given extended regex. -# If you have `file' or equivalent on your system and you're not sure -# whether `pass_all' will *always* work, you probably want this one. - -case $host_os in -aix[4-9]*) - lt_cv_deplibs_check_method=pass_all + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" ;; - -beos*) - lt_cv_deplibs_check_method=pass_all - ;; - -bsdi[45]*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' - lt_cv_file_magic_cmd='/usr/bin/file -L' - lt_cv_file_magic_test_file=/shlib/libc.so - ;; - -cygwin*) - # func_win32_libid is a shell function defined in ltmain.sh - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - ;; - -mingw* | pw32*) - # Base MSYS/MinGW do not provide the 'file' command needed by - # func_win32_libid shell function, so use a weaker test based on 'objdump', - # unless we find 'file', for example because we are cross-compiling. - # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin. - if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then - lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' - lt_cv_file_magic_cmd='func_win32_libid' - else - # Keep this pattern in sync with the one in func_win32_libid. - lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' - lt_cv_file_magic_cmd='$OBJDUMP -f' +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[ABCDGIRSTW]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" fi ;; - -cegcc*) - # use the weaker test based on 'objdump'. See mingw*. - lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' - lt_cv_file_magic_cmd='$OBJDUMP -f' +irix* | nonstopux*) + symcode='[BCDEGRST]' ;; - -darwin* | rhapsody*) - lt_cv_deplibs_check_method=pass_all +osf*) + symcode='[BCDEGQRST]' ;; - -freebsd* | dragonfly*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - case $host_cpu in - i*86 ) - # Not sure whether the presence of OpenBSD here was a mistake. - # Let's accept both of them until this is cleared up. - lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` - ;; - esac - else - lt_cv_deplibs_check_method=pass_all - fi - ;; - -gnu*) - lt_cv_deplibs_check_method=pass_all - ;; - -haiku*) - lt_cv_deplibs_check_method=pass_all - ;; - -hpux10.20* | hpux11*) - lt_cv_file_magic_cmd=/usr/bin/file - case $host_cpu in - ia64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' - lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so - ;; - hppa*64*) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]' - lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl - ;; - *) - lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library' - lt_cv_file_magic_test_file=/usr/lib/libc.sl - ;; - esac - ;; - -interix[3-9]*) - # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' - ;; - -irix5* | irix6* | nonstopux*) - case $LD in - *-32|*"-32 ") libmagic=32-bit;; - *-n32|*"-n32 ") libmagic=N32;; - *-64|*"-64 ") libmagic=64-bit;; - *) libmagic=never-match;; - esac - lt_cv_deplibs_check_method=pass_all - ;; - -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - lt_cv_deplibs_check_method=pass_all - ;; - -netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' - fi - ;; - -newos6*) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' - lt_cv_file_magic_cmd=/usr/bin/file - lt_cv_file_magic_test_file=/usr/lib/libnls.so - ;; - -*nto* | *qnx*) - lt_cv_deplibs_check_method=pass_all - ;; - -openbsd*) - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' - else - lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' - fi - ;; - -osf3* | osf4* | osf5*) - lt_cv_deplibs_check_method=pass_all - ;; - -rdos*) - lt_cv_deplibs_check_method=pass_all - ;; - solaris*) - lt_cv_deplibs_check_method=pass_all + symcode='[BDRT]' ;; - -sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) - lt_cv_deplibs_check_method=pass_all +sco3.2v5*) + symcode='[DT]' ;; - -sysv4 | sysv4.3*) - case $host_vendor in - motorola) - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' - lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` - ;; - ncr) - lt_cv_deplibs_check_method=pass_all - ;; - sequent) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' - ;; - sni) - lt_cv_file_magic_cmd='/bin/file' - lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" - lt_cv_file_magic_test_file=/lib/libc.so - ;; - siemens) - lt_cv_deplibs_check_method=pass_all - ;; - pc) - lt_cv_deplibs_check_method=pass_all - ;; - esac +sysv4.2uw2*) + symcode='[DT]' ;; - -tpf*) - lt_cv_deplibs_check_method=pass_all +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' ;; esac -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 -$as_echo "$lt_cv_deplibs_check_method" >&6; } +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac -file_magic_glob= -want_nocaseglob=no -if test "$build" = "$host"; then - case $host_os in - mingw* | pw32*) - if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then - want_nocaseglob=yes +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi else - file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"` + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 fi - ;; - esac -fi - -file_magic_cmd=$lt_cv_file_magic_cmd -deplibs_check_method=$lt_cv_deplibs_check_method -test -z "$deplibs_check_method" && deplibs_check_method=unknown - - - - - - - - - - - - - - - - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. -set dummy ${ac_tool_prefix}dlltool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_DLLTOOL+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$DLLTOOL"; then - ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -DLLTOOL=$ac_cv_prog_DLLTOOL -if test -n "$DLLTOOL"; then - { $as_echo "$as_me:$LINENO: result: $DLLTOOL" >&5 -$as_echo "$DLLTOOL" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_DLLTOOL"; then - ac_ct_DLLTOOL=$DLLTOOL - # Extract the first word of "dlltool", so it can be a program name with args. -set dummy dlltool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_DLLTOOL"; then - ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_DLLTOOL="dlltool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL -if test -n "$ac_ct_DLLTOOL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5 -$as_echo "$ac_ct_DLLTOOL" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_DLLTOOL" = x; then - DLLTOOL="false" else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - DLLTOOL=$ac_ct_DLLTOOL + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 fi -else - DLLTOOL="$ac_cv_prog_DLLTOOL" + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + fi -test -z "$DLLTOOL" && DLLTOOL=dlltool +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:$LINENO: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } +fi - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking how to associate runtime and link libraries" >&5 -$as_echo_n "checking how to associate runtime and link libraries... " >&6; } -if test "${lt_cv_sharedlib_from_linklib_cmd+set}" = set; then +{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then $as_echo_n "(cached) " >&6 else - lt_cv_sharedlib_from_linklib_cmd='unknown' + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + case $host_os in -cygwin* | mingw* | pw32* | cegcc*) - # two different shell functions defined in ltmain.sh - # decide which to use based on capabilities of $DLLTOOL - case `$DLLTOOL --help 2>&1` in - *--identify-strict*) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib - ;; - *) - lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback - ;; - esac - ;; -*) - # fallback: assume linklib IS sharedlib - lt_cv_sharedlib_from_linklib_cmd="$ECHO" +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi ;; esac -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_sharedlib_from_linklib_cmd" >&5 -$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; } -sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd -test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +# Constants: +rm="rm -f" +# Global variables: +default_ofile=libtool +can_build_shared=yes +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" if test -n "$ac_tool_prefix"; then - for ac_prog in ar - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AR+set}" = set; then @@ -15122,7 +6697,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="$ac_tool_prefix$ac_prog" + ac_cv_prog_AR="${ac_tool_prefix}ar" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -15142,15 +6717,11 @@ $as_echo "no" >&6; } fi - test -n "$AR" && break - done fi -if test -z "$AR"; then +if test -z "$ac_cv_prog_AR"; then ac_ct_AR=$AR - for ac_prog in ar -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_AR+set}" = set; then @@ -15166,7 +6737,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_AR="$ac_prog" + ac_cv_prog_ac_ct_AR="ar" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -15185,10 +6756,6 @@ else $as_echo "no" >&6; } fi - - test -n "$ac_ct_AR" && break -done - if test "x$ac_ct_AR" = x; then AR="false" else @@ -15204,209 +6771,10 @@ ac_tool_warned=yes ;; esac AR=$ac_ct_AR fi -fi - -: ${AR=ar} -: ${AR_FLAGS=cru} - - - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking for archiver @FILE support" >&5 -$as_echo_n "checking for archiver @FILE support... " >&6; } -if test "${lt_cv_ar_at_file+set}" = set; then - $as_echo_n "(cached) " >&6 else - lt_cv_ar_at_file=no - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - echo conftest.$ac_objext > conftest.lst - lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5' - { (eval echo "$as_me:$LINENO: \"$lt_ar_try\"") >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - if test "$ac_status" -eq 0; then - # Ensure the archiver fails upon bogus file names. - rm -f conftest.$ac_objext libconftest.a - { (eval echo "$as_me:$LINENO: \"$lt_ar_try\"") >&5 - (eval $lt_ar_try) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - if test "$ac_status" -ne 0; then - lt_cv_ar_at_file=@ - fi - fi - rm -f conftest.* libconftest.a - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - + AR="$ac_cv_prog_AR" fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_ar_at_file" >&5 -$as_echo "$lt_cv_ar_at_file" >&6; } - -if test "x$lt_cv_ar_at_file" = xno; then - archiver_list_spec= -else - archiver_list_spec=$lt_cv_ar_at_file -fi - - - - - - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 -$as_echo "$STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -$as_echo "$ac_ct_STRIP" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -test -z "$STRIP" && STRIP=: - - - - - - if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 @@ -15503,644 +6871,16 @@ else RANLIB="$ac_cv_prog_RANLIB" fi -test -z "$RANLIB" && RANLIB=: - - - - - - -# Determine commands to create old-style static archives. -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' -old_postinstall_cmds='chmod 644 $oldlib' -old_postuninstall_cmds= - -if test -n "$RANLIB"; then - case $host_os in - openbsd*) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" - ;; - *) - old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" - ;; - esac - old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" -fi - -case $host_os in - darwin*) - lock_old_archive_extraction=yes ;; - *) - lock_old_archive_extraction=no ;; -esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# If no C compiler was specified, use CC. -LTCC=${LTCC-"$CC"} - -# If no C compiler flags were specified, use CFLAGS. -LTCFLAGS=${LTCFLAGS-"$CFLAGS"} - -# Allow CC to be a program name with arguments. -compiler=$CC - - -# Check for command to grab the raw symbol name followed by C symbol from nm. -{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 -$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } -if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then - $as_echo_n "(cached) " >&6 -else - -# These are sane defaults that work on at least a few old systems. -# [They come from Ultrix. What could be older than Ultrix?!! ;)] - -# Character class describing NM global symbol codes. -symcode='[BCDEGRST]' - -# Regexp to match symbols that can be accessed directly from C. -sympat='\([_A-Za-z][_A-Za-z0-9]*\)' - -# Define system-specific variables. -case $host_os in -aix*) - symcode='[BCDT]' - ;; -cygwin* | mingw* | pw32* | cegcc*) - symcode='[ABCDGISTW]' - ;; -hpux*) - if test "$host_cpu" = ia64; then - symcode='[ABCDEGRST]' - fi - ;; -irix* | nonstopux*) - symcode='[BCDEGRST]' - ;; -osf*) - symcode='[BCDEGQRST]' - ;; -solaris*) - symcode='[BDRT]' - ;; -sco3.2v5*) - symcode='[DT]' - ;; -sysv4.2uw2*) - symcode='[DT]' - ;; -sysv5* | sco5v6* | unixware* | OpenUNIX*) - symcode='[ABDT]' - ;; -sysv4) - symcode='[DFNSTU]' - ;; -esac - -# If we're using GNU nm, then use its standard symbol codes. -case `$NM -V 2>&1` in -*GNU* | *'with BFD'*) - symcode='[ABCDGIRSTW]' ;; -esac - -# Transform an extracted symbol line into a proper C declaration. -# Some systems (esp. on ia64) link data and code symbols differently, -# so use this general approach. -lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" - -# Transform an extracted symbol line into symbol name and symbol address -lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (void *) \&\2},/p'" -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/ {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/ {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"lib\2\", (void *) \&\2},/p'" - -# Handle CRLF in mingw tool chain -opt_cr= -case $build_os in -mingw*) - opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp - ;; -esac - -# Try without a prefix underscore, then with it. -for ac_symprfx in "" "_"; do - - # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. - symxfrm="\\1 $ac_symprfx\\2 \\2" - - # Write the raw and C identifiers. - if test "$lt_cv_nm_interface" = "MS dumpbin"; then - # Fake it for dumpbin and say T for any non-static function - # and D for any global variable. - # Also find C++ and __fastcall symbols from MSVC++, - # which start with @ or ?. - lt_cv_sys_global_symbol_pipe="$AWK '"\ -" {last_section=section; section=\$ 3};"\ -" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ -" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ -" \$ 0!~/External *\|/{next};"\ -" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ -" {if(hide[section]) next};"\ -" {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\ -" {split(\$ 0, a, /\||\r/); split(a[2], s)};"\ -" s[1]~/^[@?]/{print s[1], s[1]; next};"\ -" s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\ -" ' prfx=^$ac_symprfx" - else - lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" - fi - lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" - - # Check to see that the pipe works correctly. - pipe_works=no - - rm -f conftest* - cat > conftest.$ac_ext <<_LT_EOF -#ifdef __cplusplus -extern "C" { -#endif -char nm_test_var; -void nm_test_func(void); -void nm_test_func(void){} -#ifdef __cplusplus -} -#endif -int main(){nm_test_var='a';nm_test_func();return(0);} -_LT_EOF - - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Now try to grab the symbols. - nlist=conftest.nm - if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\"") >&5 - (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s "$nlist"; then - # Try sorting and uniquifying the output. - if sort "$nlist" | uniq > "$nlist"T; then - mv -f "$nlist"T "$nlist" - else - rm -f "$nlist"T - fi - - # Make sure that we snagged all the symbols we need. - if $GREP ' nm_test_var$' "$nlist" >/dev/null; then - if $GREP ' nm_test_func$' "$nlist" >/dev/null; then - cat <<_LT_EOF > conftest.$ac_ext -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -_LT_EOF - # Now generate the symbol file. - eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' - - cat <<_LT_EOF >> conftest.$ac_ext - -/* The mapping between symbol names and symbols. */ -LT_DLSYM_CONST struct { - const char *name; - void *address; -} -lt__PROGRAM__LTX_preloaded_symbols[] = -{ - { "@PROGRAM@", (void *) 0 }, -_LT_EOF - $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext - cat <<\_LT_EOF >> conftest.$ac_ext - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt__PROGRAM__LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif -_LT_EOF - # Now try linking the two files. - mv conftest.$ac_objext conftstm.$ac_objext - lt_globsym_save_LIBS=$LIBS - lt_globsym_save_CFLAGS=$CFLAGS - LIBS="conftstm.$ac_objext" - CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" - if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && test -s conftest${ac_exeext}; then - pipe_works=yes - fi - LIBS=$lt_globsym_save_LIBS - CFLAGS=$lt_globsym_save_CFLAGS - else - echo "cannot find nm_test_func in $nlist" >&5 - fi - else - echo "cannot find nm_test_var in $nlist" >&5 - fi - else - echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 - fi - else - echo "$progname: failed program was:" >&5 - cat conftest.$ac_ext >&5 - fi - rm -rf conftest* conftst* - - # Do not use the global_symbol_pipe unless it works. - if test "$pipe_works" = yes; then - break - else - lt_cv_sys_global_symbol_pipe= - fi -done - -fi - -if test -z "$lt_cv_sys_global_symbol_pipe"; then - lt_cv_sys_global_symbol_to_cdecl= -fi -if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then - { $as_echo "$as_me:$LINENO: result: failed" >&5 -$as_echo "failed" >&6; } -else - { $as_echo "$as_me:$LINENO: result: ok" >&5 -$as_echo "ok" >&6; } -fi - -# Response file support. -if test "$lt_cv_nm_interface" = "MS dumpbin"; then - nm_file_list_spec='@' -elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then - nm_file_list_spec='@' -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - -{ $as_echo "$as_me:$LINENO: checking for sysroot" >&5 -$as_echo_n "checking for sysroot... " >&6; } - -# Check whether --with-sysroot was given. -if test "${with_sysroot+set}" = set; then - withval=$with_sysroot; -else - with_sysroot=no -fi - - -lt_sysroot= -case ${with_sysroot} in #( - yes) - if test "$GCC" = yes; then - lt_sysroot=`$CC --print-sysroot 2>/dev/null` - fi - ;; #( - /*) - lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` - ;; #( - no|'') - ;; #( - *) - { $as_echo "$as_me:$LINENO: result: ${with_sysroot}" >&5 -$as_echo "${with_sysroot}" >&6; } - { { $as_echo "$as_me:$LINENO: error: The sysroot must be an absolute path." >&5 -$as_echo "$as_me: error: The sysroot must be an absolute path." >&2;} - { (exit 1); exit 1; }; } - ;; -esac - - { $as_echo "$as_me:$LINENO: result: ${lt_sysroot:-no}" >&5 -$as_echo "${lt_sysroot:-no}" >&6; } - - - - - -# Check whether --enable-libtool-lock was given. -if test "${enable_libtool_lock+set}" = set; then - enableval=$enable_libtool_lock; -fi - -test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes - -# Some flags need to be propagated to the compiler or linker for good -# libtool support. -case $host in -ia64-*-hpux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.$ac_objext` in - *ELF-32*) - HPUX_IA64_MODE="32" - ;; - *ELF-64*) - HPUX_IA64_MODE="64" - ;; - esac - fi - rm -rf conftest* - ;; -*-*-irix6*) - # Find out which ABI we are using. - echo '#line '$LINENO' "configure"' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - if test "$lt_cv_prog_gnu_ld" = yes; then - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -melf32bsmip" - ;; - *N32*) - LD="${LD-ld} -melf32bmipn32" - ;; - *64-bit*) - LD="${LD-ld} -melf64bmip" - ;; - esac - else - case `/usr/bin/file conftest.$ac_objext` in - *32-bit*) - LD="${LD-ld} -32" - ;; - *N32*) - LD="${LD-ld} -n32" - ;; - *64-bit*) - LD="${LD-ld} -64" - ;; - esac - fi - fi - rm -rf conftest* - ;; - -x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ -s390*-*linux*|s390*-*tpf*|sparc*-*linux*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.o` in - *32-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_i386_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_i386" - ;; - ppc64-*linux*|powerpc64-*linux*) - LD="${LD-ld} -m elf32ppclinux" - ;; - s390x-*linux*) - LD="${LD-ld} -m elf_s390" - ;; - sparc64-*linux*) - LD="${LD-ld} -m elf32_sparc" - ;; - esac - ;; - *64-bit*) - case $host in - x86_64-*kfreebsd*-gnu) - LD="${LD-ld} -m elf_x86_64_fbsd" - ;; - x86_64-*linux*) - LD="${LD-ld} -m elf_x86_64" - ;; - ppc*-*linux*|powerpc*-*linux*) - LD="${LD-ld} -m elf64ppc" - ;; - s390*-*linux*|s390*-*tpf*) - LD="${LD-ld} -m elf64_s390" - ;; - sparc*-*linux*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; - -*-*-sco3.2v5*) - # On SCO OpenServer 5, we need -belf to get full-featured binaries. - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -belf" - { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 -$as_echo_n "checking whether the C compiler needs -belf... " >&6; } -if test "${lt_cv_cc_needs_belf+set}" = set; then - $as_echo_n "(cached) " >&6 -else - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - lt_cv_cc_needs_belf=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - lt_cv_cc_needs_belf=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 -$as_echo "$lt_cv_cc_needs_belf" >&6; } - if test x"$lt_cv_cc_needs_belf" != x"yes"; then - # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf - CFLAGS="$SAVE_CFLAGS" - fi - ;; -*-*solaris*) - # Find out which ABI we are using. - echo 'int i;' > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 - (eval $ac_compile) 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - case `/usr/bin/file conftest.o` in - *64-bit*) - case $lt_cv_prog_gnu_ld in - yes*) - case $host in - i?86-*-solaris*) - LD="${LD-ld} -m elf_x86_64" - ;; - sparc*-*-solaris*) - LD="${LD-ld} -m elf64_sparc" - ;; - esac - # GNU ld 2.21 introduced _sol2 emulations. Use them if available. - if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then - LD="${LD-ld}_sol2" - fi - ;; - *) - if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then - LD="${LD-ld} -64" - fi - ;; - esac - ;; - esac - fi - rm -rf conftest* - ;; -esac - -need_locks="$enable_libtool_lock" - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args. -set dummy ${ac_tool_prefix}mt; ac_word=$2 + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_MANIFEST_TOOL+set}" = set; then +if test "${ac_cv_prog_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else - if test -n "$MANIFEST_TOOL"; then - ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test. + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -16149,7 +6889,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt" + ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -16159,10 +6899,10 @@ IFS=$as_save_IFS fi fi -MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL -if test -n "$MANIFEST_TOOL"; then - { $as_echo "$as_me:$LINENO: result: $MANIFEST_TOOL" >&5 -$as_echo "$MANIFEST_TOOL" >&6; } +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } @@ -16170,17 +6910,17 @@ fi fi -if test -z "$ac_cv_prog_MANIFEST_TOOL"; then - ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL - # Extract the first word of "mt", so it can be a program name with args. -set dummy mt; ac_word=$2 +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_MANIFEST_TOOL+set}" = set; then +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else - if test -n "$ac_ct_MANIFEST_TOOL"; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test. + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH @@ -16189,7 +6929,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_MANIFEST_TOOL="mt" + ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -16199,17 +6939,17 @@ IFS=$as_save_IFS fi fi -ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL -if test -n "$ac_ct_MANIFEST_TOOL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_MANIFEST_TOOL" >&5 -$as_echo "$ac_ct_MANIFEST_TOOL" >&6; } +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi - if test "x$ac_ct_MANIFEST_TOOL" = x; then - MANIFEST_TOOL=":" + if test "x$ac_ct_STRIP" = x; then + STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) @@ -16221,36 +6961,196 @@ whose name does not start with the host triplet. If you think this configuration is useful to you, please write to autoconf@gnu.org." >&2;} ac_tool_warned=yes ;; esac - MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL + STRIP=$ac_ct_STRIP fi else - MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL" + STRIP="$ac_cv_prog_STRIP" fi -test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt -{ $as_echo "$as_me:$LINENO: checking if $MANIFEST_TOOL is a manifest tool" >&5 -$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; } -if test "${lt_cv_path_mainfest_tool+set}" = set; then + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then $as_echo_n "(cached) " >&6 else - lt_cv_path_mainfest_tool=no - echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5 - $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out - cat conftest.err >&5 - if $GREP 'Manifest Tool' conftest.out > /dev/null; then - lt_cv_path_mainfest_tool=yes + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:$LINENO: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + else + MAGIC_CMD=: fi - rm -f conftest* -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_mainfest_tool" >&5 -$as_echo "$lt_cv_path_mainfest_tool" >&6; } -if test "x$lt_cv_path_mainfest_tool" != xyes; then - MANIFEST_TOOL=: fi - - - + fi + ;; +esac case $host_os in @@ -16446,319 +7346,6 @@ esac else NMEDIT="$ac_cv_prog_NMEDIT" fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args. -set dummy ${ac_tool_prefix}lipo; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_LIPO+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$LIPO"; then - ac_cv_prog_LIPO="$LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_LIPO="${ac_tool_prefix}lipo" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -LIPO=$ac_cv_prog_LIPO -if test -n "$LIPO"; then - { $as_echo "$as_me:$LINENO: result: $LIPO" >&5 -$as_echo "$LIPO" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_LIPO"; then - ac_ct_LIPO=$LIPO - # Extract the first word of "lipo", so it can be a program name with args. -set dummy lipo; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_LIPO+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_LIPO"; then - ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_LIPO="lipo" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO -if test -n "$ac_ct_LIPO"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_LIPO" >&5 -$as_echo "$ac_ct_LIPO" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_LIPO" = x; then - LIPO=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - LIPO=$ac_ct_LIPO - fi -else - LIPO="$ac_cv_prog_LIPO" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL"; then - ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL="${ac_tool_prefix}otool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -OTOOL=$ac_cv_prog_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:$LINENO: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL"; then - ac_ct_OTOOL=$OTOOL - # Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL"; then - ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL="otool" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL -if test -n "$ac_ct_OTOOL"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL" >&5 -$as_echo "$ac_ct_OTOOL" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL" = x; then - OTOOL=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - OTOOL=$ac_ct_OTOOL - fi -else - OTOOL="$ac_cv_prog_OTOOL" -fi - - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args. -set dummy ${ac_tool_prefix}otool64; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_OTOOL64+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$OTOOL64"; then - ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -OTOOL64=$ac_cv_prog_OTOOL64 -if test -n "$OTOOL64"; then - { $as_echo "$as_me:$LINENO: result: $OTOOL64" >&5 -$as_echo "$OTOOL64" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_OTOOL64"; then - ac_ct_OTOOL64=$OTOOL64 - # Extract the first word of "otool64", so it can be a program name with args. -set dummy otool64; ac_word=$2 -{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_ac_ct_OTOOL64+set}" = set; then - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_OTOOL64"; then - ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_OTOOL64="otool64" - $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64 -if test -n "$ac_ct_OTOOL64"; then - { $as_echo "$as_me:$LINENO: result: $ac_ct_OTOOL64" >&5 -$as_echo "$ac_ct_OTOOL64" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_OTOOL64" = x; then - OTOOL64=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - OTOOL64=$ac_ct_OTOOL64 - fi -else - OTOOL64="$ac_cv_prog_OTOOL64" -fi - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 @@ -16768,35 +7355,22 @@ if test "${lt_cv_apple_cc_single_mod+set}" = set; then else lt_cv_apple_cc_single_mod=no if test -z "${LT_MULTI_MODULE}"; then - # By default we will add the -single_module flag. You can override - # by either setting the environment variable LT_MULTI_MODULE - # non-empty at configure time, or by adding -multi_module to the - # link flags. - rm -rf libconftest.dylib* - echo "int foo(void){return 1;}" > conftest.c - echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ --dynamiclib -Wl,-single_module conftest.c" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ - -dynamiclib -Wl,-single_module conftest.c 2>conftest.err - _lt_result=$? - # If there is a non-empty error log, and "single_module" - # appears in it, assume the flag caused a linker warning - if test -s conftest.err && $GREP single_module conftest.err; then - cat conftest.err >&5 - # Otherwise, if the output was created with a 0 exit code from - # the compiler, it worked. - elif test -f libconftest.dylib && test $_lt_result -eq 0; then - lt_cv_apple_cc_single_mod=yes - else - cat conftest.err >&5 - fi - rm -rf libconftest.dylib* - rm -f conftest.* + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c fi fi { $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 $as_echo "$lt_cv_apple_cc_single_mod" >&6; } - { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 $as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } if test "${lt_cv_ld_exported_symbols_list+set}" = set; then @@ -16853,62 +7427,27 @@ fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" + LDFLAGS="$save_LDFLAGS" fi { $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 $as_echo "$lt_cv_ld_exported_symbols_list" >&6; } - - { $as_echo "$as_me:$LINENO: checking for -force_load linker flag" >&5 -$as_echo_n "checking for -force_load linker flag... " >&6; } -if test "${lt_cv_ld_force_load+set}" = set; then - $as_echo_n "(cached) " >&6 -else - lt_cv_ld_force_load=no - cat > conftest.c << _LT_EOF -int forced_loaded() { return 2;} -_LT_EOF - echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5 - $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5 - echo "$AR cru libconftest.a conftest.o" >&5 - $AR cru libconftest.a conftest.o 2>&5 - echo "$RANLIB libconftest.a" >&5 - $RANLIB libconftest.a 2>&5 - cat > conftest.c << _LT_EOF -int main() { return 0;} -_LT_EOF - echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5 - $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err - _lt_result=$? - if test -s conftest.err && $GREP force_load conftest.err; then - cat conftest.err >&5 - elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then - lt_cv_ld_force_load=yes - else - cat conftest.err >&5 - fi - rm -f conftest.err libconftest.a conftest conftest.c - rm -rf conftest.dSYM - -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_force_load" >&5 -$as_echo "$lt_cv_ld_force_load" >&6; } case $host_os in - rhapsody* | darwin1.[012]) + rhapsody* | darwin1.[0123]) _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; darwin1.*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - darwin*) # darwin 5.x on + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) # if running on 10.5 or later, the deployment target defaults # to the OS version, if on x86, and 10.4, the deployment # target defaults to 10.4. Don't you love it? case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in - 10.0,*86*-darwin8*|10.0,*-darwin[91]*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; - 10.[012]*) - _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; - 10.*) - _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; esac ;; esac @@ -16918,10 +7457,10 @@ $as_echo "$lt_cv_ld_force_load" >&6; } if test "$lt_cv_ld_exported_symbols_list" = "yes"; then _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' else - _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}' + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" fi - if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then - _lt_dsymutil='~$DSYMUTIL $lib || :' + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" else _lt_dsymutil= fi @@ -16929,447 +7468,28 @@ $as_echo "$lt_cv_ld_force_load" >&6; } esac -for ac_header in dlfcn.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default +enable_dlopen=no +enable_win32_dll=no -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if test `eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - - - - -# Set options - - - - enable_dlopen=no - - - enable_win32_dll=no - - - # Check whether --enable-shared was given. -if test "${enable_shared+set}" = set; then - enableval=$enable_shared; p=${PACKAGE-default} - case $enableval in - yes) enable_shared=yes ;; - no) enable_shared=no ;; - *) - enable_shared=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_shared=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_shared=yes -fi - - - - - - - - - +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes # Check whether --with-pic was given. if test "${with_pic+set}" = set; then - withval=$with_pic; lt_p=${PACKAGE-default} - case $withval in - yes|no) pic_mode=$withval ;; - *) - pic_mode=default - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for lt_pkg in $withval; do - IFS="$lt_save_ifs" - if test "X$lt_pkg" = "X$lt_p"; then - pic_mode=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac + withval=$with_pic; pic_mode="$withval" else pic_mode=default fi - test -z "$pic_mode" && pic_mode=default - - - - - - - # Check whether --enable-fast-install was given. -if test "${enable_fast_install+set}" = set; then - enableval=$enable_fast_install; p=${PACKAGE-default} - case $enableval in - yes) enable_fast_install=yes ;; - no) enable_fast_install=no ;; - *) - enable_fast_install=no - # Look at the argument we got. We use all the common list separators. - lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," - for pkg in $enableval; do - IFS="$lt_save_ifs" - if test "X$pkg" = "X$p"; then - enable_fast_install=yes - fi - done - IFS="$lt_save_ifs" - ;; - esac -else - enable_fast_install=yes -fi - - - - - - - - - - - -# This can be used to rebuild libtool when needed -LIBTOOL_DEPS="$ltmain" - -# Always use our own libtool. -LIBTOOL='$(SHELL) $(top_builddir)/libtool' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -test -z "$LN_S" && LN_S="ln -s" - - - - - - - - - - - - - - -if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - -{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 -$as_echo_n "checking for objdir... " >&6; } -if test "${lt_cv_objdir+set}" = set; then - $as_echo_n "(cached) " >&6 -else - rm -f .libs 2>/dev/null -mkdir .libs 2>/dev/null -if test -d .libs; then - lt_cv_objdir=.libs -else - # MS-DOS does not allow filenames that begin with a dot. - lt_cv_objdir=_libs -fi -rmdir .libs 2>/dev/null -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 -$as_echo "$lt_cv_objdir" >&6; } -objdir=$lt_cv_objdir - - - - - -cat >>confdefs.h <<_ACEOF -#define LT_OBJDIR "$lt_cv_objdir/" -_ACEOF - - - - -case $host_os in -aix3*) - # AIX sometimes has problems with the GCC collect2 program. For some - # reason, if we set the COLLECT_NAMES environment variable, the problems - # vanish in a puff of smoke. - if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES - fi - ;; -esac - -# Global variables: -ofile=libtool -can_build_shared=yes - -# All known linkers require a `.a' archive for static linking (except MSVC, -# which needs '.lib'). -libext=a - -with_gnu_ld="$lt_cv_prog_gnu_ld" - -old_CC="$CC" -old_CFLAGS="$CFLAGS" - -# Set sane defaults for various variables -test -z "$CC" && CC=cc -test -z "$LTCC" && LTCC=$CC -test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS -test -z "$LD" && LD=ld -test -z "$ac_objext" && ac_objext=o - -for cc_temp in $compiler""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac -done -cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` - - -# Only perform the check for file, if the check method requires it -test -z "$MAGIC_CMD" && MAGIC_CMD=file -case $deplibs_check_method in -file_magic*) - if test "$file_magic_cmd" = '$MAGIC_CMD'; then - { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 -$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/${ac_tool_prefix}file; then - lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - - -if test -z "$lt_cv_path_MAGIC_CMD"; then - if test -n "$ac_tool_prefix"; then - { $as_echo "$as_me:$LINENO: checking for file" >&5 -$as_echo_n "checking for file... " >&6; } -if test "${lt_cv_path_MAGIC_CMD+set}" = set; then - $as_echo_n "(cached) " >&6 -else - case $MAGIC_CMD in -[\\/*] | ?:[\\/]*) - lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. - ;; -*) - lt_save_MAGIC_CMD="$MAGIC_CMD" - lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR - ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" - for ac_dir in $ac_dummy; do - IFS="$lt_save_ifs" - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/file; then - lt_cv_path_MAGIC_CMD="$ac_dir/file" - if test -n "$file_magic_test_file"; then - case $deplibs_check_method in - "file_magic "*) - file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` - MAGIC_CMD="$lt_cv_path_MAGIC_CMD" - if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | - $EGREP "$file_magic_regex" > /dev/null; then - : - else - cat <<_LT_EOF 1>&2 - -*** Warning: the command libtool uses to detect shared libraries, -*** $file_magic_cmd, produces output that libtool cannot recognize. -*** The result is that libtool may fail to recognize shared libraries -*** as such. This will affect the creation of libtool libraries that -*** depend on shared libraries, but programs linked with such libtool -*** libraries will work regardless of this problem. Nevertheless, you -*** may want to report the problem to your system manager and/or to -*** bug-libtool@gnu.org - -_LT_EOF - fi ;; - esac - fi - break - fi - done - IFS="$lt_save_ifs" - MAGIC_CMD="$lt_save_MAGIC_CMD" - ;; -esac -fi - -MAGIC_CMD="$lt_cv_path_MAGIC_CMD" -if test -n "$MAGIC_CMD"; then - { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 -$as_echo "$MAGIC_CMD" >&6; } -else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } -fi - - - else - MAGIC_CMD=: - fi -fi - - fi - ;; -esac - # Use C for the default configuration in the libtool script - +tagname= lt_save_CC="$CC" ac_ext=c ac_cpp='$CPP $CPPFLAGS' @@ -17392,11 +7512,6 @@ lt_simple_compile_test_code="int some_variable = 0;" lt_simple_link_test_code='int main(){return(0);}' - - - - - # If no C compiler was specified, use CC. LTCC=${LTCC-"$CC"} @@ -17406,43 +7521,35 @@ LTCFLAGS=${LTCFLAGS-"$CFLAGS"} # Allow CC to be a program name with arguments. compiler=$CC -# Save the default compiler, since it gets overwritten when the other -# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. -compiler_DEFAULT=$CC # save warnings/boilerplate of simple test code ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" >conftest.$ac_ext eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_compiler_boilerplate=`cat conftest.err` -$RM conftest* +$rm conftest* ac_outfile=conftest.$ac_objext echo "$lt_simple_link_test_code" >conftest.$ac_ext eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err _lt_linker_boilerplate=`cat conftest.err` -$RM -r conftest* +$rm -r conftest* -if test -n "$compiler"; then lt_prog_compiler_no_builtin_flag= if test "$GCC" = yes; then - case $cc_basename in - nvcc*) - lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;; - *) - lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;; - esac + lt_prog_compiler_no_builtin_flag=' -fno-builtin' - { $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 $as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_rtti_exceptions=no - ac_outfile=conftest.$ac_objext + ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="-fno-rtti -fno-exceptions" # Insert the option either (1) after the last *FLAGS variable, or @@ -17454,21 +7561,21 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7564: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + echo "$as_me:7568: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_rtti_exceptions=yes fi fi - $RM conftest* + $rm conftest* fi { $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 @@ -17482,15 +7589,12 @@ fi fi - - - - - - lt_prog_compiler_wl= +lt_prog_compiler_wl= lt_prog_compiler_pic= lt_prog_compiler_static= +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } if test "$GCC" = yes; then lt_prog_compiler_wl='-Wl,' @@ -17506,25 +7610,17 @@ lt_prog_compiler_static= ;; amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - lt_prog_compiler_pic='-fPIC' - ;; - m68k) - # FIXME: we need at least 68020 code to build shared libraries, but - # adding the `-m68020' flag to GCC prevents building anything better, - # like `-m68040'. - lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' - ;; - esac + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' ;; beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) # PIC is the default for these OSes. ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) + mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). # Although the cygwin gcc ignores -fPIC, still need this for old-style @@ -17538,26 +7634,6 @@ lt_prog_compiler_static= lt_prog_compiler_pic='-fno-common' ;; - haiku*) - # PIC is the default for Haiku. - # The "-static" flag exists, but is broken. - lt_prog_compiler_static= - ;; - - hpux*) - # PIC is the default for 64-bit PA HP-UX, but not for 32-bit - # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag - # sets the default TLS model and affects inlining. - case $host_cpu in - hppa*64*) - # +Z the default - ;; - *) - lt_prog_compiler_pic='-fPIC' - ;; - esac - ;; - interix[3-9]*) # Interix 3.x gcc -fpic/-fPIC options generate broken code. # Instead, we relocate shared libraries at runtime. @@ -17570,31 +7646,29 @@ lt_prog_compiler_static= enable_shared=no ;; - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - sysv4*MP*) if test -d /usr/nec; then lt_prog_compiler_pic=-Kconform_pic fi ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + *) lt_prog_compiler_pic='-fPIC' ;; esac - - case $cc_basename in - nvcc*) # Cuda Compiler Driver 2.2 - lt_prog_compiler_wl='-Xlinker ' - if test -n "$lt_prog_compiler_pic"; then - lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic" - fi - ;; - esac else # PORTME Check for flag to pass linker flags through the system compiler. case $host_os in @@ -17607,8 +7681,18 @@ lt_prog_compiler_static= lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' fi ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; - mingw* | cygwin* | pw32* | os2* | cegcc*) + mingw* | cygwin* | pw32* | os2*) # This hack is so that the source file can tell whether it is being # built for inclusion in a dll (and should export symbols for example). lt_prog_compiler_pic='-DDLL_EXPORT' @@ -17636,34 +7720,19 @@ lt_prog_compiler_static= lt_prog_compiler_static='-non_shared' ;; - linux* | k*bsd*-gnu | kopensolaris*-gnu) + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux* | k*bsd*-gnu) case $cc_basename in - # old Intel for x86_64 which still supported -KPIC. - ecc*) + icc* | ecc*) lt_prog_compiler_wl='-Wl,' lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-static' ;; - # icc used to be incompatible with GCC. - # ICC 10 doesn't accept -KPIC any more. - icc* | ifort*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - # Lahey Fortran 8.1. - lf95*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='--shared' - lt_prog_compiler_static='--static' - ;; - nagfor*) - # NAG Fortran compiler - lt_prog_compiler_wl='-Wl,-Wl,,' - lt_prog_compiler_pic='-PIC' - lt_prog_compiler_static='-Bstatic' - ;; - pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + pgcc* | pgf77* | pgf90* | pgf95*) # Portland Group compilers (*not* the Pentium gcc compiler, # which looks to be a dead project) lt_prog_compiler_wl='-Wl,' @@ -17675,57 +7744,25 @@ lt_prog_compiler_static= # All Alpha code is PIC. lt_prog_compiler_static='-non_shared' ;; - xl* | bgxl* | bgf* | mpixl*) - # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-qpic' - lt_prog_compiler_static='-qstaticlink' - ;; *) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*) - # Sun Fortran 8.3 passes all unrecognized flags to the linker - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='' - ;; - *Sun\ F* | *Sun*Fortran*) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - lt_prog_compiler_wl='-Qoption ld ' - ;; + case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' lt_prog_compiler_wl='-Wl,' ;; - *Intel*\ [CF]*Compiler*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fPIC' - lt_prog_compiler_static='-static' - ;; - *Portland\ Group*) - lt_prog_compiler_wl='-Wl,' - lt_prog_compiler_pic='-fpic' + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' ;; esac ;; esac ;; - newsos6) - lt_prog_compiler_pic='-KPIC' - lt_prog_compiler_static='-Bstatic' - ;; - - *nto* | *qnx*) - # QNX uses GNU C++, but need to define -shared option too, otherwise - # it will coredump. - lt_prog_compiler_pic='-fPIC -shared' - ;; - osf3* | osf4* | osf5*) lt_prog_compiler_wl='-Wl,' # All OSF/1 code is PIC. @@ -17740,7 +7777,7 @@ lt_prog_compiler_static= lt_prog_compiler_pic='-KPIC' lt_prog_compiler_static='-Bstatic' case $cc_basename in - f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + f77* | f90* | f95*) lt_prog_compiler_wl='-Qoption ld ';; *) lt_prog_compiler_wl='-Wl,';; @@ -17788,38 +7825,21 @@ lt_prog_compiler_static= esac fi -case $host_os in - # For platforms which do not support PIC, -DPIC is meaningless: - *djgpp*) - lt_prog_compiler_pic= - ;; - *) - lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" - ;; -esac - -{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 -$as_echo_n "checking for $compiler option to produce PIC... " >&6; } -if test "${lt_cv_prog_compiler_pic+set}" = set; then - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_pic=$lt_prog_compiler_pic -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic" >&5 -$as_echo "$lt_cv_prog_compiler_pic" >&6; } -lt_prog_compiler_pic=$lt_cv_prog_compiler_pic +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } # # Check to make sure the PIC flag actually works. # if test -n "$lt_prog_compiler_pic"; then - { $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 $as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } if test "${lt_cv_prog_compiler_pic_works+set}" = set; then $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_pic_works=no - ac_outfile=conftest.$ac_objext + ac_outfile=conftest.$ac_objext echo "$lt_simple_compile_test_code" > conftest.$ac_ext lt_compiler_flag="$lt_prog_compiler_pic -DPIC" # Insert the option either (1) after the last *FLAGS variable, or @@ -17831,21 +7851,21 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7854: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + echo "$as_me:7858: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_pic_works=yes fi fi - $RM conftest* + $rm conftest* fi { $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 @@ -17862,16 +7882,15 @@ else fi fi - - - - - - - - - - +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac # # Check to make sure the static flag actually works. @@ -17892,7 +7911,7 @@ else if test -s conftest.err; then # Append any errors to the config.log. cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 if diff conftest.exp conftest.er2 >/dev/null; then lt_cv_prog_compiler_static_works=yes @@ -17901,7 +7920,7 @@ else lt_cv_prog_compiler_static_works=yes fi fi - $RM -r conftest* + $rm -r conftest* LDFLAGS="$save_LDFLAGS" fi @@ -17915,18 +7934,13 @@ else fi - - - - - - { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 $as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } if test "${lt_cv_prog_compiler_c_o+set}" = set; then $as_echo_n "(cached) " >&6 else lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null + $rm -r conftest 2>/dev/null mkdir conftest cd conftest mkdir out @@ -17941,100 +7955,43 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7958: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 + echo "$as_me:7962: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then lt_cv_prog_compiler_c_o=yes fi fi chmod u+w . 2>&5 - $RM conftest* + $rm conftest* # SGI C++ compiler will create directory out/ii_files/ for # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out cd .. - $RM -r conftest - $RM conftest* + rmdir conftest + $rm conftest* fi { $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 $as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - - { $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 -$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } -if test "${lt_cv_prog_compiler_c_o+set}" = set; then - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler_c_o=no - $RM -r conftest 2>/dev/null - mkdir conftest - cd conftest - mkdir out - echo "$lt_simple_compile_test_code" > conftest.$ac_ext - - lt_compiler_flag="-o out/conftest2.$ac_objext" - # Insert the option either (1) after the last *FLAGS variable, or - # (2) before a word containing "conftest.", or (3) at the end. - # Note that $ac_compile itself does not contain backslashes and begins - # with a dollar sign (not a hyphen), so the echo should work correctly. - lt_compile=`echo "$ac_compile" | $SED \ - -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ - -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ - -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5) - (eval "$lt_compile" 2>out/conftest.err) - ac_status=$? - cat out/conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - if (exit $ac_status) && test -s out/conftest2.$ac_objext - then - # The compiler can only warn and ignore the option if not recognized - # So say no if there are warnings - $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp - $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 - if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then - lt_cv_prog_compiler_c_o=yes - fi - fi - chmod u+w . 2>&5 - $RM conftest* - # SGI C++ compiler will create directory out/ii_files/ for - # template instantiation - test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files - $RM out/* && rmdir out - cd .. - $RM -r conftest - $RM conftest* - -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 -$as_echo "$lt_cv_prog_compiler_c_o" >&6; } - - - - hard_links="nottested" if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then # do not overwrite the value of need_locks provided by the user { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 $as_echo_n "checking if we can lock with hard links... " >&6; } hard_links=yes - $RM conftest* + $rm conftest* ln conftest.a conftest.b 2>/dev/null && hard_links=no touch conftest.a ln conftest.a conftest.b 2>&5 || hard_links=no @@ -18050,38 +8007,31 @@ else need_locks=no fi - - - - - - { $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 $as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } runpath_var= allow_undefined_flag= - always_export_symbols=no + enable_shared_with_static_runtimes=no archive_cmds= archive_expsym_cmds= - compiler_needs_object=no - enable_shared_with_static_runtimes=no + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= export_dynamic_flag_spec= - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' - hardcode_automatic=no - hardcode_direct=no - hardcode_direct_absolute=no + whole_archive_flag_spec= + thread_safe_flag_spec= hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= hardcode_libdir_separator= + hardcode_direct=no hardcode_minus_L=no hardcode_shlibpath_var=unsupported - inherit_rpath=no link_all_deplibs=unknown + hardcode_automatic=no module_cmds= module_expsym_cmds= - old_archive_from_new_cmds= - old_archive_from_expsyms_cmds= - thread_safe_flag_spec= - whole_archive_flag_spec= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' # include_expsyms should be a list of space-separated symbols to be *always* # included in the symbol list include_expsyms= @@ -18097,9 +8047,19 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie # preloaded symbol tables. # Exclude shared library initialization/finalization symbols. extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` case $host_os in - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | pw32*) # FIXME: the MSVC++ port hasn't been tested in a loooong time # When not using gcc, we currently assume that we are using # Microsoft Visual C++. @@ -18117,33 +8077,7 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie esac ld_shlibs=yes - - # On some targets, GNU ld is compatible enough with the native linker - # that we're better off using the native interface for both. - lt_use_gnu_ld_interface=no if test "$with_gnu_ld" = yes; then - case $host_os in - aix*) - # The AIX port of GNU ld has always aspired to compatibility - # with the native linker. However, as the warning in the GNU ld - # block says, versions before 2.19.5* couldn't really create working - # shared libraries, regardless of the interface used. - case `$LD -v 2>&1` in - *\ \(GNU\ Binutils\)\ 2.19.5*) ;; - *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;; - *\ \(GNU\ Binutils\)\ [3-9]*) ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - ;; - *) - lt_use_gnu_ld_interface=yes - ;; - esac - fi - - if test "$lt_use_gnu_ld_interface" = yes; then # If archive_cmds runs LD, not CC, wlarc should be empty wlarc='${wl}' @@ -18151,17 +8085,16 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie # are reset later if shared libraries are not supported. Putting them # here allows them to be overridden if necessary. runpath_var=LD_RUN_PATH - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' export_dynamic_flag_spec='${wl}--export-dynamic' # ancient GNU ld didn't support --whole-archive et. al. - if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then - whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' - else - whole_archive_flag_spec= + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= fi supports_anon_versioning=no - case `$LD -v 2>&1` in - *GNU\ gold*) supports_anon_versioning=yes ;; + case `$LD -v 2>/dev/null` in *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... @@ -18175,36 +8108,34 @@ $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie # On AIX/PPC, the GNU linker is very broken if test "$host_cpu" != ia64; then ld_shlibs=no - cat <<_LT_EOF 1>&2 + cat <&2 -*** Warning: the GNU linker, at least up to release 2.19, is reported +*** Warning: the GNU linker, at least up to release 2.9.1, is reported *** to be unable to reliably create shared libraries on AIX. *** Therefore, libtool is disabling shared libraries support. If you -*** really care for shared libraries, you may want to install binutils -*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. -*** You will then need to restart the configuration process. +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. -_LT_EOF +EOF fi ;; amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no ;; beos*) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then allow_undefined_flag=unsupported # Joseph Beckenbach says some releases of gcc # support --undefined. This deserves some investigation. FIXME @@ -18214,18 +8145,16 @@ _LT_EOF fi ;; - cygwin* | mingw* | pw32* | cegcc*) - # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, # as there is no search path for DLLs. hardcode_libdir_flag_spec='-L$libdir' - export_dynamic_flag_spec='${wl}--export-all-symbols' allow_undefined_flag=unsupported always_export_symbols=no enable_shared_with_static_runtimes=yes - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols' - exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname' + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... @@ -18241,11 +8170,6 @@ _LT_EOF fi ;; - haiku*) - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - link_all_deplibs=yes - ;; - interix[3-9]*) hardcode_direct=no hardcode_shlibpath_var=no @@ -18261,94 +8185,60 @@ _LT_EOF archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' ;; - gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) - tmp_diet=no - if test "$host_os" = linux-dietlibc; then - case $cc_basename in - diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) - esac - fi - if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ - && test "$tmp_diet" = no - then - tmp_addflag=' $pic_flag' - tmp_sharedflag='-shared' + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= case $cc_basename,$host_cpu in - pgcc*) # Portland Group C compiler - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag' ;; - pgf77* | pgf90* | pgf95* | pgfortran*) - # Portland Group f77 and f90 compilers - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_addflag=' $pic_flag -Mnomain' ;; - ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 tmp_addflag=' -i_dynamic' ;; efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 tmp_addflag=' -i_dynamic -nofor_main' ;; ifc* | ifort*) # Intel Fortran compiler tmp_addflag=' -nofor_main' ;; - lf95*) # Lahey Fortran 8.1 - whole_archive_flag_spec= - tmp_sharedflag='--shared' ;; - xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below) - tmp_sharedflag='-qmkshrobj' - tmp_addflag= ;; - nvcc*) # Cuda Compiler Driver 2.2 - whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes - ;; esac case `$CC -V 2>&1 | sed 5q` in *Sun\ C*) # Sun C 5.9 - whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive' - compiler_needs_object=yes + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' tmp_sharedflag='-G' ;; *Sun\ F*) # Sun Fortran 8.3 tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; esac archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' - fi - - case $cc_basename in - xlf* | bgf* | bgxlf* | mpixlf*) - # IBM XL Fortran 10.1 on PPC cannot create shared libs itself - whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive' - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' - if test "x$supports_anon_versioning" = xyes; then - archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~ - cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ - echo "local: *; };" >> $output_objdir/$libname.ver~ - $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' - fi - ;; - esac + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi else - ld_shlibs=no + ld_shlibs=no fi ;; netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' wlarc= else - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' fi ;; solaris*) - if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then ld_shlibs=no - cat <<_LT_EOF 1>&2 + cat <&2 *** Warning: The releases 2.8.* of the GNU linker cannot reliably *** create shared libraries on Solaris systems. Therefore, libtool @@ -18357,10 +8247,10 @@ _LT_EOF *** your PATH or compiler configuration so that the native linker is *** used, and then restart. -_LT_EOF - elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi @@ -18382,14 +8272,10 @@ _LT_EOF _LT_EOF ;; *) - # For security reasons, it is highly recommended that you always - # use absolute paths for naming shared libraries, and exclude the - # DT_RUNPATH tag from executables and libraries. But doing so - # requires that you compile everything twice, which is a pain. - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' else ld_shlibs=no fi @@ -18405,9 +8291,9 @@ _LT_EOF ;; *) - if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' else ld_shlibs=no fi @@ -18447,12 +8333,10 @@ _LT_EOF else # If we're using GNU nm, then we don't want the "-C" option. # -C means demangle to AIX nm, but means don't demangle with GNU nm - # Also, AIX nm treats weak defined symbols like other global - # defined symbols, whereas GNU nm marks them as "W". - if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then - export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' else - export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols' + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' fi aix_use_runtimelinking=no @@ -18461,10 +8345,10 @@ _LT_EOF # need to do runtime linking. case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) for ld_flag in $LDFLAGS; do - if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then - aix_use_runtimelinking=yes - break - fi + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi done ;; esac @@ -18481,30 +8365,28 @@ _LT_EOF archive_cmds='' hardcode_direct=yes - hardcode_direct_absolute=yes hardcode_libdir_separator=':' link_all_deplibs=yes - file_list_spec='${wl}-f,' if test "$GCC" = yes; then case $host_os in aix4.[012]|aix4.[012].*) # We only want to do this on AIX 4.2 and lower, the check # below for broken collect2 doesn't work under 4.3+ collect2name=`${CC} -print-prog-name=collect2` - if test -f "$collect2name" && - strings "$collect2name" | $GREP resolve_lib_name >/dev/null + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null then - # We have reworked collect2 - : + # We have reworked collect2 + : else - # We have old collect2 - hardcode_direct=unsupported - # It fails to find uninstalled libraries when the uninstalled - # path is not listed in the libpath. Setting hardcode_minus_L - # to unsupported forces relinking - hardcode_minus_L=yes - hardcode_libdir_flag_spec='-L$libdir' - hardcode_libdir_separator= + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= fi ;; esac @@ -18515,8 +8397,8 @@ _LT_EOF else # not using gcc if test "$host_cpu" = ia64; then - # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release - # chokes on -Wl,-G. The following line is correct: + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: shared_flag='-G' else if test "$aix_use_runtimelinking" = yes; then @@ -18527,7 +8409,6 @@ _LT_EOF fi fi - export_dynamic_flag_spec='${wl}-bexpall' # It seems that -bexpall does not export symbols beginning with # underscore (_), so it is better to generate a list of symbols to export. always_export_symbols=yes @@ -18535,15 +8416,8 @@ _LT_EOF # Warning - without using the other runtime loading flags (-brtl), # -berok will link without error, but may produce a broken library. allow_undefined_flag='-berok' - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if test "${lt_cv_aix_libpath_+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -18580,18 +8454,18 @@ $as_echo "$ac_try_echo") >&5 $as_test_x conftest$ac_exeext }; then - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -18602,32 +8476,18 @@ fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi - - hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" - archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" - else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else if test "$host_cpu" = ia64; then hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' allow_undefined_flag="-z nodefs" archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" else - # Determine the default libpath from the value encoded in an - # empty executable. - if test "${lt_cv_aix_libpath+set}" = set; then - aix_libpath=$lt_cv_aix_libpath -else - if test "${lt_cv_aix_libpath_+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -18664,18 +8524,18 @@ $as_echo "$ac_try_echo") >&5 $as_test_x conftest$ac_exeext }; then - lt_aix_libpath_sed=' - /Import File Strings/,/^$/ { - /^0/ { - s/^0 *\([^ ]*\) *$/\1/ - p - } - }' - lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - # Check for a 64-bit object if we didn't find anything. - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` - fi +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 @@ -18686,27 +8546,15 @@ fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext - if test -z "$lt_cv_aix_libpath_"; then - lt_cv_aix_libpath_="/usr/lib:/lib" - fi - -fi - - aix_libpath=$lt_cv_aix_libpath_ -fi +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" # Warning - without using the other run time loading flags, # -berok will link without error, but may produce a broken library. no_undefined_flag=' ${wl}-bernotok' allow_undefined_flag=' ${wl}-berok' - if test "$with_gnu_ld" = yes; then - # We only use this code for GNU lds that support --whole-archive. - whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive' - else - # Exported symbols can be pulled into shared objects from archives - whole_archive_flag_spec='$convenience' - fi + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' archive_cmds_need_lc=yes # This is similar to how AIX traditionally builds its shared libraries. archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' @@ -18715,119 +8563,85 @@ fi ;; amigaos*) - case $host_cpu in - powerpc) - # see comment about AmigaOS4 .so support - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' - archive_expsym_cmds='' - ;; - m68k) - archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' - hardcode_libdir_flag_spec='-L$libdir' - hardcode_minus_L=yes - ;; - esac + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no ;; bsdi[45]*) export_dynamic_flag_spec=-rdynamic ;; - cygwin* | mingw* | pw32* | cegcc*) + cygwin* | mingw* | pw32*) # When not using gcc, we currently assume that we are using # Microsoft Visual C++. # hardcode_libdir_flag_spec is actually meaningless, as there is # no search path for DLLs. - case $cc_basename in - cl*) - # Native MSVC - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - always_export_symbols=yes - file_list_spec='@' - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then - sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; - else - sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; - fi~ - $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ - linknames=' - # The linker will not automatically build a static lib if we build a DLL. - # _LT_TAGVAR(old_archive_from_new_cmds, )='true' - enable_shared_with_static_runtimes=yes - exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' - export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' - # Don't use ranlib - old_postinstall_cmds='chmod 644 $oldlib' - postlink_cmds='lt_outputfile="@OUTPUT@"~ - lt_tool_outputfile="@TOOL_OUTPUT@"~ - case $lt_outputfile in - *.exe|*.EXE) ;; - *) - lt_outputfile="$lt_outputfile.exe" - lt_tool_outputfile="$lt_tool_outputfile.exe" - ;; - esac~ - if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then - $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; - $RM "$lt_outputfile.manifest"; - fi' - ;; - *) - # Assume MSVC wrapper - hardcode_libdir_flag_spec=' ' - allow_undefined_flag=unsupported - # Tell ltmain to make .lib files, not .a files. - libext=lib - # Tell ltmain to make .dll files, not .so files. - shrext_cmds=".dll" - # FIXME: Setting linknames here is a bad hack. - archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' - # The linker will automatically build a .lib file if we build a DLL. - old_archive_from_new_cmds='true' - # FIXME: Should let the user specify the lib program. - old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' - enable_shared_with_static_runtimes=yes - ;; - esac + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes ;; darwin* | rhapsody*) - - - archive_cmds_need_lc=no - hardcode_direct=no - hardcode_automatic=yes - hardcode_shlibpath_var=unsupported - if test "$lt_cv_ld_force_load" = "yes"; then - whole_archive_flag_spec='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' - - else - whole_archive_flag_spec='' - fi - link_all_deplibs=yes - allow_undefined_flag="$_lt_dar_allow_undefined" - case $cc_basename in - ifort*) _lt_dar_can_shared=yes ;; - *) _lt_dar_can_shared=$GCC ;; - esac - if test "$_lt_dar_can_shared" = "yes"; then - output_verbose_link_cmd=func_echo_all - archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" - module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" - archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" - module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" - - else - ld_shlibs=no - fi - + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac + fi ;; dgux*) @@ -18836,6 +8650,10 @@ fi hardcode_shlibpath_var=no ;; + freebsd1*) + ld_shlibs=no + ;; + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor # support. Future versions do this automatically, but an explicit c++rt0.o # does not break anything, and helps significantly (at the cost of a little @@ -18848,7 +8666,7 @@ fi ;; # Unfortunately, older versions of FreeBSD 2 do not have this feature. - freebsd2.*) + freebsd2*) archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' hardcode_direct=yes hardcode_minus_L=yes @@ -18857,7 +8675,7 @@ fi # FreeBSD 3 and greater uses gcc -shared to do shared libraries. freebsd* | dragonfly*) - archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' hardcode_libdir_flag_spec='-R$libdir' hardcode_direct=yes hardcode_shlibpath_var=no @@ -18865,9 +8683,9 @@ fi hpux9*) if test "$GCC" = yes; then - archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' else - archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' fi hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: @@ -18880,17 +8698,18 @@ fi ;; hpux10*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' else archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' fi if test "$with_gnu_ld" = no; then hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' hardcode_libdir_separator=: + hardcode_direct=yes - hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' + # hardcode_minus_L: Not really in the search PATH, # but as the default location of the library. hardcode_minus_L=yes @@ -18898,16 +8717,16 @@ fi ;; hpux11*) - if test "$GCC" = yes && test "$with_gnu_ld" = no; then + if test "$GCC" = yes -a "$with_gnu_ld" = no; then case $host_cpu in hppa*64*) archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' ;; ia64*) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac else @@ -18919,46 +8738,7 @@ fi archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' ;; *) - - # Older versions of the 11.00 compiler do not understand -b yet - # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) - { $as_echo "$as_me:$LINENO: checking if $CC understands -b" >&5 -$as_echo_n "checking if $CC understands -b... " >&6; } -if test "${lt_cv_prog_compiler__b+set}" = set; then - $as_echo_n "(cached) " >&6 -else - lt_cv_prog_compiler__b=no - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -b" - echo "$lt_simple_link_test_code" > conftest.$ac_ext - if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then - # The linker can only warn and ignore the option if not recognized - # So say no if there are warnings - if test -s conftest.err; then - # Append any errors to the config.log. - cat conftest.err 1>&5 - $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp - $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 - if diff conftest.exp conftest.er2 >/dev/null; then - lt_cv_prog_compiler__b=yes - fi - else - lt_cv_prog_compiler__b=yes - fi - fi - $RM -r conftest* - LDFLAGS="$save_LDFLAGS" - -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler__b" >&5 -$as_echo "$lt_cv_prog_compiler__b" >&6; } - -if test x"$lt_cv_prog_compiler__b" = xyes; then - archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' -else - archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' -fi - + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' ;; esac fi @@ -18968,12 +8748,12 @@ fi case $host_cpu in hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld='+b $libdir' hardcode_direct=no hardcode_shlibpath_var=no ;; *) hardcode_direct=yes - hardcode_direct_absolute=yes export_dynamic_flag_spec='${wl}-E' # hardcode_minus_L: Not really in the search PATH, @@ -18986,78 +8766,18 @@ fi irix5* | irix6* | nonstopux*) if test "$GCC" = yes; then - archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' - # Try to use the -exported_symbol ld option, if it does not - # work, assume that -exports_file does not work either and - # implicitly export all symbols. - # This should be the same for all languages, so no per-tag cache variable. - { $as_echo "$as_me:$LINENO: checking whether the $host_os linker accepts -exported_symbol" >&5 -$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; } -if test "${lt_cv_irix_exported_symbol+set}" = set; then - $as_echo_n "(cached) " >&6 -else - save_LDFLAGS="$LDFLAGS" - LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -int foo (void) { return 0; } -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - lt_cv_irix_exported_symbol=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - lt_cv_irix_exported_symbol=no -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS="$save_LDFLAGS" -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_irix_exported_symbol" >&5 -$as_echo "$lt_cv_irix_exported_symbol" >&6; } - if test "$lt_cv_irix_exported_symbol" = yes; then - archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib' - fi + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else - archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib' + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' fi - archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: - inherit_rpath=yes link_all_deplibs=yes ;; netbsd*) - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out else archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF @@ -19075,15 +8795,11 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } hardcode_shlibpath_var=no ;; - *nto* | *qnx*) - ;; - openbsd*) if test -f /usr/libexec/ld.so; then hardcode_direct=yes hardcode_shlibpath_var=no - hardcode_direct_absolute=yes - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' hardcode_libdir_flag_spec='${wl}-rpath,$libdir' @@ -19099,7 +8815,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } hardcode_libdir_flag_spec='${wl}-rpath,$libdir' ;; esac - fi + fi else ld_shlibs=no fi @@ -19109,19 +8825,18 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } hardcode_libdir_flag_spec='-L$libdir' hardcode_minus_L=yes allow_undefined_flag=unsupported - archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' - old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' ;; osf3*) if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' fi - archive_cmds_need_lc='no' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' hardcode_libdir_separator=: ;; @@ -19129,43 +8844,32 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } osf4* | osf5*) # as osf3* with the addition of -msym flag if test "$GCC" = yes; then allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' - archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' else allow_undefined_flag=' -expect_unresolved \*' - archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib' - archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ - $CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' # Both c and cxx compiler support -rpath directly hardcode_libdir_flag_spec='-rpath $libdir' fi - archive_cmds_need_lc='no' hardcode_libdir_separator=: ;; solaris*) - no_undefined_flag=' -z defs' + no_undefined_flag=' -z text' if test "$GCC" = yes; then wlarc='${wl}' - archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' else - case `$CC -V 2>&1` in - *"Compilers 5.0"*) - wlarc='' - archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' - ;; - *) - wlarc='${wl}' - archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ - $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' - ;; - esac + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' fi hardcode_libdir_flag_spec='-R$libdir' hardcode_shlibpath_var=no @@ -19175,7 +8879,7 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } # The compiler driver will combine and reorder linker options, # but understands `-z linker_flag'. GCC discards it without `$wl', # but is careful enough not to reorder. - # Supported since Solaris 2.6 (maybe 2.5.1?) + # Supported since Solaris 2.6 (maybe 2.5.1?) if test "$GCC" = yes; then whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' else @@ -19264,18 +8968,18 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } allow_undefined_flag='${wl}-z,nodefs' archive_cmds_need_lc=no hardcode_shlibpath_var=no - hardcode_libdir_flag_spec='${wl}-R,$libdir' + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' hardcode_libdir_separator=':' link_all_deplibs=yes export_dynamic_flag_spec='${wl}-Bexport' runpath_var='LD_RUN_PATH' if test "$GCC" = yes; then - archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' else - archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' - archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' fi ;; @@ -19289,36 +8993,12 @@ $as_echo "$lt_cv_irix_exported_symbol" >&6; } ld_shlibs=no ;; esac - - if test x$host_vendor = xsni; then - case $host in - sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) - export_dynamic_flag_spec='${wl}-Blargedynsym' - ;; - esac - fi fi { $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 $as_echo "$ld_shlibs" >&6; } test "$ld_shlibs" = no && can_build_shared=no -with_gnu_ld=$with_gnu_ld - - - - - - - - - - - - - - - # # Do we need to explicitly link libc? # @@ -19338,232 +9018,81 @@ x|xyes) # to ld, don't add -lc before -lgcc. { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 $as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } -if test "${lt_cv_archive_cmds_need_lc+set}" = set; then - $as_echo_n "(cached) " >&6 -else - $RM conftest* - echo "$lt_simple_compile_test_code" > conftest.$ac_ext + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext - if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 (eval $ac_compile) 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } 2>conftest.err; then - soname=conftest - lib=conftest - libobjs=conftest.$ac_objext - deplibs= - wl=$lt_prog_compiler_wl - pic_flag=$lt_prog_compiler_pic - compiler_flags=-v - linker_flags=-v - verstring= - output_objdir=. - libname=conftest - lt_save_allow_undefined_flag=$allow_undefined_flag - allow_undefined_flag= - if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\"") >&5 - (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5 + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } - then - lt_cv_archive_cmds_need_lc=no - else - lt_cv_archive_cmds_need_lc=yes - fi - allow_undefined_flag=$lt_save_allow_undefined_flag - else - cat conftest.err 1>&5 - fi - $RM conftest* - -fi -{ $as_echo "$as_me:$LINENO: result: $lt_cv_archive_cmds_need_lc" >&5 -$as_echo "$lt_cv_archive_cmds_need_lc" >&6; } - archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } ;; esac fi ;; esac - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 $as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" if test "$GCC" = yes; then case $host_os in darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; *) lt_awk_arg="/^libraries:/" ;; esac - case $host_os in - mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;; - *) lt_sed_strip_eq="s,=/,/,g" ;; - esac - lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` - case $lt_search_path_spec in - *\;*) + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then # if the path contains ";" then we assume it to be the separator # otherwise default to the standard path separator (i.e. ":") - it is # assumed that no part of a normal pathname contains ";" but that should # okay in the real world where ";" in dirpaths is itself problematic. - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` - ;; - *) - lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` - ;; - esac + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi # Ok, now we have the path, separated by spaces, we can step through it # and add multilib dir if necessary. lt_tmp_lt_search_path_spec= @@ -19576,7 +9105,7 @@ if test "$GCC" = yes; then lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" fi done - lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' BEGIN {RS=" "; FS="/|\n";} { lt_foo=""; lt_count=0; @@ -19596,29 +9125,10 @@ BEGIN {RS=" "; FS="/|\n";} { if (lt_foo != "") { lt_freq[lt_foo]++; } if (lt_freq[lt_foo] == 1) { print lt_foo; } }'` - # AWK program above erroneously prepends '/' to C:/dos/paths - # for these hosts. - case $host_os in - mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ - $SED 's,/\([A-Za-z]:\),\1,g'` ;; - esac - sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` + sys_lib_search_path_spec=`echo $lt_search_path_spec` else sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" fi -library_names_spec= -libname_spec='lib$name' -soname_spec= -shrext_cmds=".so" -postinstall_cmds= -postuninstall_cmds= -finish_cmds= -finish_eval= -shlibpath_var= -shlibpath_overrides_runpath=unknown -version_type=none -dynamic_linker="$host_os ld.so" -sys_lib_dlsearch_path_spec="/lib /usr/lib" need_lib_prefix=unknown hardcode_into_libs=no @@ -19628,7 +9138,7 @@ need_version=unknown case $host_os in aix3*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' shlibpath_var=LIBPATH @@ -19637,7 +9147,7 @@ aix3*) ;; aix[4-9]*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no hardcode_into_libs=yes @@ -19655,7 +9165,7 @@ aix[4-9]*) aix4 | aix4.[01] | aix4.[01].*) if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' echo ' yes ' - echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then : else can_build_shared=no @@ -19681,18 +9191,9 @@ aix[4-9]*) ;; amigaos*) - case $host_cpu in - powerpc) - # Since July 2007 AmigaOS4 officially supports .so libraries. - # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - ;; - m68k) - library_names_spec='$libname.ixlibrary $libname.a' - # Create ${libname}_ixlibrary.a entries in /sys/libs. - finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' - ;; - esac + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' ;; beos*) @@ -19702,7 +9203,7 @@ beos*) ;; bsdi[45]*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' @@ -19715,112 +9216,61 @@ bsdi[45]*) # libtool to hard-code these into programs ;; -cygwin* | mingw* | pw32* | cegcc*) +cygwin* | mingw* | pw32*) version_type=windows shrext_cmds=".dll" need_version=no need_lib_prefix=no - case $GCC,$cc_basename in - yes,*) - # gcc + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) library_names_spec='$libname.dll.a' # DLL is installed to $(libdir)/../bin by postinstall_cmds postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ dldir=$destdir/`dirname \$dlpath`~ test -d \$dldir || mkdir -p \$dldir~ $install_prog $dir/$dlname \$dldir/$dlname~ - chmod a+x \$dldir/$dlname~ - if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then - eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; - fi' + chmod a+x \$dldir/$dlname' postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ dlpath=$dir/\$dldll~ - $RM \$dlpath' + $rm \$dlpath' shlibpath_overrides_runpath=yes case $host_os in cygwin*) # Cygwin DLLs use 'cyg' prefix rather than 'lib' soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - - sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api" + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" ;; - mingw* | cegcc*) + mingw*) # MinGW DLLs use traditional 'lib' prefix soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi ;; pw32*) # pw32 DLLs use 'pw' prefix rather than 'lib' library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' ;; esac - dynamic_linker='Win32 ld.exe' - ;; - - *,cl*) - # Native MSVC - libname_spec='$name' - soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' - library_names_spec='${libname}.dll.lib' - - case $build_os in - mingw*) - sys_lib_search_path_spec= - lt_save_ifs=$IFS - IFS=';' - for lt_path in $LIB - do - IFS=$lt_save_ifs - # Let DOS variable expansion print the short 8.3 style file name. - lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` - sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" - done - IFS=$lt_save_ifs - # Convert to MSYS style. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'` - ;; - cygwin*) - # Convert to unix form, then to dos form, then back to unix form - # but this time dos style (no spaces!) so that the unix form looks - # like /cygdrive/c/PROGRA~1:/cygdr... - sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` - sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` - sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - ;; - *) - sys_lib_search_path_spec="$LIB" - if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then - # It is most probably a Windows format PATH. - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` - else - sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` - fi - # FIXME: find the short name or the path components, as spaces are - # common. (e.g. "Program Files" -> "PROGRA~1") - ;; - esac - - # DLL is installed to $(libdir)/../bin by postinstall_cmds - postinstall_cmds='base_file=`basename \${file}`~ - dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~ - dldir=$destdir/`dirname \$dlpath`~ - test -d \$dldir || mkdir -p \$dldir~ - $install_prog $dir/$dlname \$dldir/$dlname' - postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ - dlpath=$dir/\$dldll~ - $RM \$dlpath' - shlibpath_overrides_runpath=yes - dynamic_linker='Win32 link.exe' ;; *) - # Assume MSVC wrapper library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' - dynamic_linker='Win32 ld.exe' ;; esac + dynamic_linker='Win32 ld.exe' # FIXME: first we should search . and the directory the executable is in shlibpath_var=PATH ;; @@ -19830,7 +9280,7 @@ darwin* | rhapsody*) version_type=darwin need_lib_prefix=no need_version=no - library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext' + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' soname_spec='${libname}${release}${major}$shared_ext' shlibpath_overrides_runpath=yes shlibpath_var=DYLD_LIBRARY_PATH @@ -19841,7 +9291,7 @@ darwin* | rhapsody*) ;; dgux*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' @@ -19849,6 +9299,10 @@ dgux*) shlibpath_var=LD_LIBRARY_PATH ;; +freebsd1*) + dynamic_linker=no + ;; + freebsd* | dragonfly*) # DragonFly does not have aout. When/if they implement a new # versioning mechanism, adjust this. @@ -19856,7 +9310,7 @@ freebsd* | dragonfly*) objformat=`/usr/bin/objformat` else case $host_os in - freebsd[23].*) objformat=aout ;; + freebsd[123]*) objformat=aout ;; *) objformat=elf ;; esac fi @@ -19874,7 +9328,7 @@ freebsd* | dragonfly*) esac shlibpath_var=LD_LIBRARY_PATH case $host_os in - freebsd2.*) + freebsd2*) shlibpath_overrides_runpath=yes ;; freebsd3.[01]* | freebsdelf3.[01]*) @@ -19894,26 +9348,12 @@ freebsd* | dragonfly*) ;; gnu*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - -haiku*) - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - dynamic_linker="$host_os runtime_loader" - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - shlibpath_var=LIBRARY_PATH - shlibpath_overrides_runpath=yes - sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' hardcode_into_libs=yes ;; @@ -19939,18 +9379,18 @@ hpux9* | hpux10* | hpux11*) fi sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec ;; - hppa*64*) - shrext_cmds='.sl' - hardcode_into_libs=yes - dynamic_linker="$host_os dld.sl" - shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH - shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - soname_spec='${libname}${release}${shared_ext}$major' - sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" - sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec - ;; - *) + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) shrext_cmds='.sl' dynamic_linker="$host_os dld.sl" shlibpath_var=SHLIB_PATH @@ -19959,14 +9399,12 @@ hpux9* | hpux10* | hpux11*) soname_spec='${libname}${release}${shared_ext}$major' ;; esac - # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + # HP-UX runs *really* slowly unless shared libraries are mode 555. postinstall_cmds='chmod 555 $lib' - # or fails outright, so override atomically: - install_override_mode=555 ;; interix[3-9]*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' @@ -19982,7 +9420,7 @@ irix5* | irix6* | nonstopux*) nonstopux*) version_type=nonstopux ;; *) if test "$lt_cv_prog_gnu_ld" = yes; then - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux else version_type=irix fi ;; @@ -20019,9 +9457,9 @@ linux*oldld* | linux*aout* | linux*coff*) dynamic_linker=no ;; -# This must be glibc/ELF. -linux* | k*bsd*-gnu | kopensolaris*-gnu) - version_type=linux # correct to gnu/linux during the next big refactor +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -20029,73 +9467,6 @@ linux* | k*bsd*-gnu | kopensolaris*-gnu) finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=no - - # Some binutils ld are patched to set DT_RUNPATH - if test "${lt_cv_shlibpath_overrides_runpath+set}" = set; then - $as_echo_n "(cached) " >&6 -else - lt_cv_shlibpath_overrides_runpath=no - save_LDFLAGS=$LDFLAGS - save_libdir=$libdir - eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \ - LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\"" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && { - test "$cross_compiling" = yes || - $as_test_x conftest$ac_exeext - }; then - if ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then - lt_cv_shlibpath_overrides_runpath=yes -fi - -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -rf conftest.dSYM -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext - LDFLAGS=$save_LDFLAGS - libdir=$save_libdir - -fi - - shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath - # This implies no fast_install, which is unacceptable. # Some rework will be needed to allow for fast_install # before this can be enabled. @@ -20103,7 +9474,7 @@ fi # Append ld.so.conf contents to the search path if test -f /etc/ld.so.conf; then - lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" fi @@ -20120,7 +9491,7 @@ netbsd*) version_type=sunos need_lib_prefix=no need_version=no - if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' dynamic_linker='NetBSD (a.out) ld.so' @@ -20135,22 +9506,20 @@ netbsd*) ;; newsos6) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' shlibpath_var=LD_LIBRARY_PATH shlibpath_overrides_runpath=yes ;; -*nto* | *qnx*) - version_type=qnx +nto-qnx*) + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - dynamic_linker='ldqnx.so' + shlibpath_overrides_runpath=yes ;; openbsd*) @@ -20159,13 +9528,13 @@ openbsd*) need_lib_prefix=no # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. case $host_os in - openbsd3.3 | openbsd3.3.*) need_version=yes ;; - *) need_version=no ;; + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; esac library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' shlibpath_var=LD_LIBRARY_PATH - if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then case $host_os in openbsd2.[89] | openbsd2.[89].*) shlibpath_overrides_runpath=no @@ -20204,7 +9573,7 @@ rdos*) ;; solaris*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux need_lib_prefix=no need_version=no library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' @@ -20229,7 +9598,7 @@ sunos4*) ;; sysv4 | sysv4.3*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -20237,6 +9606,7 @@ sysv4 | sysv4.3*) sni) shlibpath_overrides_runpath=no need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' runpath_var=LD_RUN_PATH ;; siemens) @@ -20253,7 +9623,7 @@ sysv4 | sysv4.3*) sysv4*MP*) if test -d /usr/nec ;then - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' soname_spec='$libname${shared_ext}.$major' shlibpath_var=LD_LIBRARY_PATH @@ -20267,12 +9637,13 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=yes hardcode_into_libs=yes if test "$with_gnu_ld" = yes; then sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no else sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes case $host_os in sco3.2v5*) sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" @@ -20282,19 +9653,8 @@ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) sys_lib_dlsearch_path_spec='/usr/lib' ;; -tpf*) - # TPF is a cross-target only. Preferred cross-host = GNU/Linux. - version_type=linux # correct to gnu/linux during the next big refactor - need_lib_prefix=no - need_version=no - library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' - shlibpath_var=LD_LIBRARY_PATH - shlibpath_overrides_runpath=no - hardcode_into_libs=yes - ;; - uts4*) - version_type=linux # correct to gnu/linux during the next big refactor + version_type=linux library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' soname_spec='${libname}${release}${shared_ext}$major' shlibpath_var=LD_LIBRARY_PATH @@ -20308,122 +9668,39 @@ esac $as_echo "$dynamic_linker" >&6; } test "$dynamic_linker" = no && can_build_shared=no +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + variables_saved_for_relink="PATH $shlibpath_var $runpath_var" if test "$GCC" = yes; then variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" fi -if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then - sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" -fi -if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then - sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" -fi - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - { $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 $as_echo_n "checking how to hardcode library paths into programs... " >&6; } hardcode_action= -if test -n "$hardcode_libdir_flag_spec" || - test -n "$runpath_var" || +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var" || \ test "X$hardcode_automatic" = "Xyes" ; then - # We can hardcode non-existent directories. + # We can hardcode non-existant directories. if test "$hardcode_direct" != no && # If the only mechanism to avoid hardcoding is shlibpath_var, we # have to relink, otherwise we might link with an installed library # when we should be linking with a yet-to-be-installed one - ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no && + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && test "$hardcode_minus_L" != no; then # Linking always hardcodes the temporary library directory. hardcode_action=relink @@ -20439,8 +9716,7 @@ fi { $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 $as_echo "$hardcode_action" >&6; } -if test "$hardcode_action" = relink || - test "$inherit_rpath" = yes; then +if test "$hardcode_action" = relink; then # Fast installation is not supported enable_fast_install=no elif test "$shlibpath_overrides_runpath" = yes || @@ -20449,12 +9725,37 @@ elif test "$shlibpath_overrides_runpath" = yes || enable_fast_install=needless fi +striplib= +old_striplib= +{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi - - - - - if test "x$enable_dlopen" != xyes; then +if test "x$enable_dlopen" != xyes; then enable_dlopen=unknown enable_dlopen_self=unknown enable_dlopen_self_static=unknown @@ -20469,15 +9770,15 @@ else lt_cv_dlopen_self=yes ;; - mingw* | pw32* | cegcc*) + mingw* | pw32*) lt_cv_dlopen="LoadLibrary" lt_cv_dlopen_libs= - ;; + ;; cygwin*) lt_cv_dlopen="dlopen" lt_cv_dlopen_libs= - ;; + ;; darwin*) # if libdl is installed we need to link against it @@ -20556,7 +9857,7 @@ else fi - ;; + ;; *) { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 @@ -21053,8 +10354,8 @@ else else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" + cat > conftest.$ac_ext <= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); +#ifdef __cplusplus +extern "C" void exit (int); #endif -int fnord () { return 42; } +void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -21110,19 +10409,15 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); - return status; + exit (status); } -_LT_EOF +EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? @@ -21159,8 +10454,8 @@ else else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF -#line $LINENO "configure" + cat > conftest.$ac_ext <= 3)) || (__GNUC__ > 3)) -int fnord () __attribute__((visibility("default"))); +#ifdef __cplusplus +extern "C" void exit (int); #endif -int fnord () { return 42; } +void fnord() { int i=42;} int main () { void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); @@ -21216,19 +10509,15 @@ int main () if (self) { if (dlsym (self,"fnord")) status = $lt_dlno_uscore; - else - { - if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; - else puts (dlerror ()); - } + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; /* dlclose (self); */ } else puts (dlerror ()); - return status; + exit (status); } -_LT_EOF +EOF if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 (eval $ac_link) 2>&5 ac_status=$? @@ -21272,103 +10561,530 @@ $as_echo "$lt_cv_dlopen_self_static" >&6; } fi - - - - - - - - - - - - - - - -striplib= -old_striplib= -{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 -$as_echo_n "checking whether stripping libraries is possible... " >&6; } -if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then - test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" - test -z "$striplib" && striplib="$STRIP --strip-unneeded" - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } -else -# FIXME - insert some real tests, host_os isn't really good enough - case $host_os in - darwin*) - if test -n "$STRIP" ; then - striplib="$STRIP -x" - old_striplib="$STRIP -S" - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - fi - ;; - *) - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - ;; - esac -fi - - - - - - - - - - - - - # Report which library types will actually be built - { $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +# Report which library types will actually be built +{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 $as_echo_n "checking if libtool supports shared libraries... " >&6; } - { $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 $as_echo "$can_build_shared" >&6; } - { $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 $as_echo_n "checking whether to build shared libraries... " >&6; } - test "$can_build_shared" = "no" && enable_shared=no +test "$can_build_shared" = "no" && enable_shared=no - # On AIX, shared libraries and static libraries use the same namespace, and - # are all built from PIC. - case $host_os in - aix3*) +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then test "$enable_shared" = yes && enable_static=no - if test -n "$RANLIB"; then - archive_cmds="$archive_cmds~\$RANLIB \$lib" - postinstall_cmds='$RANLIB $lib' - fi + fi ;; - - aix[4-9]*) - if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then - test "$enable_shared" = yes && enable_static=no - fi - ;; - esac - { $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +esac +{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 $as_echo "$enable_shared" >&6; } - { $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 $as_echo_n "checking whether to build static libraries... " >&6; } - # Make sure either enable_shared or enable_static is yes. - test "$enable_shared" = yes || enable_static=yes - { $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 $as_echo "$enable_static" >&6; } +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + compiler_lib_search_dirs \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + fix_srcfile_path \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { $as_echo "$as_me:$LINENO: creating $ofile" >&5 +$as_echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# 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. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -21378,42 +11094,434 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu CC="$lt_save_CC" - - - - - - - - - - - - - - ac_config_commands="$ac_config_commands libtool" - - - - -# Only expand once: - - - -# Checks for programs. -if test "x$CC" != xcc; then - { $as_echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5 -$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } -else - { $as_echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5 -$as_echo_n "checking whether cc understands -c and -o together... " >&6; } +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then + withval=$with_tags; tagnames="$withval" fi -set dummy $CC; ac_cc=`$as_echo "$2" | - sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then + + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { $as_echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { $as_echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +$as_echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { $as_echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +$as_echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= +compiler_lib_search_dirs_CXX= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then $as_echo_n "(cached) " >&6 else - cat >conftest.$ac_ext <<_ACEOF + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -21428,109 +11536,9217 @@ main () return 0; } _ACEOF -# Make sure it works both with $CC and with simple cc. -# We do the test twice because some compilers refuse to overwrite an -# existing .o file with -o, though they will create one. -ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' -rm -f conftest2.* -if { (case "(($ac_try" in +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 + (eval "$ac_link") 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest2.$ac_objext && { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; -then - eval ac_cv_prog_cc_${ac_cc}_c_o=yes - if test "x$CC" != xcc; then - # Test first that cc exists at all. - if { ac_try='cc -c conftest.$ac_ext >&5' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' - rm -f conftest2.* - if { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && - test -f conftest2.$ac_objext && { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; - then - # cc works too. - : - else - # cc exists but doesn't like -o. - eval ac_cv_prog_cc_${ac_cc}_c_o=no - fi - fi - fi -else - eval ac_cv_prog_cc_${ac_cc}_c_o=no + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` fi -rm -f core conftest* +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + ld_shlibs_CXX=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +compiler_lib_search_dirs_CXX= +if test -n "$compiler_lib_search_path_CXX"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12867: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:12871: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12971: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:12975: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + compiler_lib_search_dirs_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + fix_srcfile_path_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + return + end +" + +# Code to be used in simple link tests +lt_simple_link_test_code="\ + program t + end +" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +$as_echo "$lt_prog_compiler_pic_F77" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14554: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:14558: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_F77=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_F77=yes + fi + else + lt_cv_prog_compiler_static_works_F77=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then + : +else + lt_prog_compiler_static_F77= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14658: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:14662: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + interix[3-9]*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_F77=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = no; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_F77='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_F77=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_F77='${wl}-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='${wl}-z,text' + allow_undefined_flag_F77='${wl}-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +$as_echo "$archive_cmds_need_lc_F77" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + compiler_lib_search_dirs_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + fix_srcfile_path_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + +old_archive_cmds_GCJ=$old_archive_cmds + + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16873: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:16877: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-fpic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + lt_prog_compiler_wl_GCJ='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_GCJ='-Qoption ld ';; + *) + lt_prog_compiler_wl_GCJ='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_can_build_shared_GCJ=no + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17163: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:17167: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_GCJ" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_GCJ=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_GCJ=yes + fi + else + lt_cv_prog_compiler_static_works_GCJ=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_GCJ" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then + : +else + lt_prog_compiler_static_GCJ= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17267: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:17271: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + interix[3-9]*) + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_GCJ=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_GCJ=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = no; then + runpath_var= + hardcode_libdir_flag_spec_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ='$convenience' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + *) + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_GCJ=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_GCJ='${wl}-z,text' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_GCJ='${wl}-z,text' + allow_undefined_flag_GCJ='${wl}-z,nodefs' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +$as_echo "$ld_shlibs_GCJ" >&6; } +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + pic_flag=$lt_prog_compiler_pic_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +$as_echo "$archive_cmds_need_lc_GCJ" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +$as_echo "$hardcode_action_GCJ" >&6; } + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + compiler_lib_search_dirs_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + fix_srcfile_path_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + compiler_lib_search_dirs_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + fix_srcfile_path_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +CC="$lt_save_CC" + + ;; + + *) + { { $as_echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +$as_echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { $as_echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +$as_echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } +fi -cat >>confdefs.h <<\_ACEOF -#define NO_MINUS_C_MINUS_O 1 + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ _ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -# FIXME: we rely on the cache variable name because -# there is no other way. -set dummy $CC -ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` -if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then - # Losing compiler, so override with the script. - # FIXME: It is wrong to rewrite CC. - # But if we don't then we get into trouble of one sort or another. - # A longer-term fix would be to have automake use am__CC in this case, - # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" - CC="$am_aux_dir/compile $CC" +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + if test "x$GCC" = "xyes"; then CPPFLAGS="$CPPFLAGS -Wall" @@ -21539,7 +20755,6 @@ fi -# Define a configure option for an alternate module directory # Check whether --with-xorg-module-dir was given. if test "${with_xorg_module_dir+set}" = set; then @@ -21565,19 +20780,78 @@ else fi -# Check whether --enable-kms was given. -if test "${enable_kms+set}" = set; then - enableval=$enable_kms; DRM_MODE="$enableval" + +# Check whether --with-xserver-source was given. +if test "${with_xserver_source+set}" = set; then + withval=$with_xserver_source; XSERVER_SOURCE="$withval" else - DRM_MODE=yes + XSERVER_SOURCE="" fi -# Store the list of server defined optional extensions in REQUIRED_MODULES +# Checks for extensions + + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include "xorg-server.h" +#if !defined XINERAMA +#error XINERAMA not defined +#endif + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + _EXT_CHECK=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + _EXT_CHECK=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + CFLAGS="$SAVE_CFLAGS" + { $as_echo "$as_me:$LINENO: checking if XINERAMA is defined" >&5 +$as_echo_n "checking if XINERAMA is defined... " >&6; } + { $as_echo "$as_me:$LINENO: result: $_EXT_CHECK" >&5 +$as_echo "$_EXT_CHECK" >&6; } + if test "$_EXT_CHECK" != no; then + REQUIRED_MODULES="$REQUIRED_MODULES xineramaproto" + fi SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -I`$PKG_CONFIG --variable=sdkdir xorg-server`" + CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -21635,9 +20909,8 @@ $as_echo "$_EXT_CHECK" >&6; } fi - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -I`$PKG_CONFIG --variable=sdkdir xorg-server`" + CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -21695,9 +20968,8 @@ $as_echo "$_EXT_CHECK" >&6; } fi - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -I`$PKG_CONFIG --variable=sdkdir xorg-server`" + CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -21755,9 +21027,8 @@ $as_echo "$_EXT_CHECK" >&6; } fi - SAVE_CFLAGS="$CFLAGS" - CFLAGS="$CFLAGS -I`$PKG_CONFIG --variable=sdkdir xorg-server`" + CFLAGS="$CFLAGS -I`pkg-config --variable=sdkdir xorg-server`" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF @@ -21815,7 +21086,127 @@ $as_echo "$_EXT_CHECK" >&6; } fi -# Obtain compiler/linker options for the driver dependencies +# Checks for pkg-config packages + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&5 +$as_echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools +whose name does not start with the host triplet. If you think this +configuration is useful to you, please write to autoconf@gnu.org." >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + +fi pkg_failed=no { $as_echo "$as_me:$LINENO: checking for XORG" >&5 @@ -21826,12 +21217,12 @@ if test -n "$PKG_CONFIG"; then pkg_cv_XORG_CFLAGS="$XORG_CFLAGS" else if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xorg-server >= 1.3 xproto fontsproto \$REQUIRED_MODULES\"") >&5 - ($PKG_CONFIG --exists --print-errors "xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES") 2>&5 + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xorg-server >= 1.2 xproto fontsproto \$REQUIRED_MODULES\"") >&5 + ($PKG_CONFIG --exists --print-errors "xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - pkg_cv_XORG_CFLAGS=`$PKG_CONFIG --cflags "xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES" 2>/dev/null` + pkg_cv_XORG_CFLAGS=`$PKG_CONFIG --cflags "xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES" 2>/dev/null` else pkg_failed=yes fi @@ -21844,12 +21235,12 @@ if test -n "$PKG_CONFIG"; then pkg_cv_XORG_LIBS="$XORG_LIBS" else if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xorg-server >= 1.3 xproto fontsproto \$REQUIRED_MODULES\"") >&5 - ($PKG_CONFIG --exists --print-errors "xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES") 2>&5 + { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xorg-server >= 1.2 xproto fontsproto \$REQUIRED_MODULES\"") >&5 + ($PKG_CONFIG --exists --print-errors "xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then - pkg_cv_XORG_LIBS=`$PKG_CONFIG --libs "xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES" 2>/dev/null` + pkg_cv_XORG_LIBS=`$PKG_CONFIG --libs "xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES" 2>/dev/null` else pkg_failed=yes fi @@ -21868,14 +21259,14 @@ else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then - XORG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES"` + XORG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES"` else - XORG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES"` + XORG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES"` fi # Put the nasty error message in config.log where it belongs echo "$XORG_PKG_ERRORS" >&5 - { { $as_echo "$as_me:$LINENO: error: Package requirements (xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES) were not met: + { { $as_echo "$as_me:$LINENO: error: Package requirements (xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES) were not met: $XORG_PKG_ERRORS @@ -21886,7 +21277,7 @@ Alternatively, you may set the environment variables XORG_CFLAGS and XORG_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&5 -$as_echo "$as_me: error: Package requirements (xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES) were not met: +$as_echo "$as_me: error: Package requirements (xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES) were not met: $XORG_PKG_ERRORS @@ -21927,96 +21318,326 @@ else $as_echo "yes" >&6; } : fi +sdkdir=$(pkg-config --variable=sdkdir xorg-server) -pkg_failed=no -{ $as_echo "$as_me:$LINENO: checking for XEXT" >&5 -$as_echo_n "checking for XEXT... " >&6; } +# Checks for libraries. -if test -n "$PKG_CONFIG"; then - if test -n "$XEXT_CFLAGS"; then - pkg_cv_XEXT_CFLAGS="$XEXT_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xextproto >= 7.0.99.1\"") >&5 - ($PKG_CONFIG --exists --print-errors "xextproto >= 7.0.99.1") 2>&5 +# Checks for header files. +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_XEXT_CFLAGS=`$PKG_CONFIG --cflags "xextproto >= 7.0.99.1" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi -if test -n "$PKG_CONFIG"; then - if test -n "$XEXT_LIBS"; then - pkg_cv_XEXT_LIBS="$XEXT_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xextproto >= 7.0.99.1\"") >&5 - ($PKG_CONFIG --exists --print-errors "xextproto >= 7.0.99.1") 2>&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_XEXT_LIBS=`$PKG_CONFIG --libs "xextproto >= 7.0.99.1" 2>/dev/null` + (exit $ac_status); }; }; then + : else - pkg_failed=yes + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no fi - fi -else - pkg_failed=untried +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi - -if test $pkg_failed = yes; then - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no fi - if test $_pkg_short_errors_supported = yes; then - XEXT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xextproto >= 7.0.99.1"` - else - XEXT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xextproto >= 7.0.99.1"` - fi - # Put the nasty error message in config.log where it belongs - echo "$XEXT_PKG_ERRORS" >&5 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - HAVE_XEXTPROTO_71="no" -elif test $pkg_failed = untried; then - HAVE_XEXTPROTO_71="no" -else - XEXT_CFLAGS=$pkg_cv_XEXT_CFLAGS - XEXT_LIBS=$pkg_cv_XEXT_LIBS - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - HAVE_XEXTPROTO_71="yes"; cat >>confdefs.h <<\_ACEOF -#define HAVE_XEXTPROTO_71 1 +#define STDC_HEADERS 1 _ACEOF fi -if test "$HAVE_XEXTPROTO_71" = "yes" ; then - HAVE_XEXTPROTO_71_TRUE= - HAVE_XEXTPROTO_71_FALSE='#' +if test "$DRI" != no; then + as_ac_File=`$as_echo "ac_cv_file_${sdkdir}/dri.h" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for ${sdkdir}/dri.h" >&5 +$as_echo_n "checking for ${sdkdir}/dri.h... " >&6; } +if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 else - HAVE_XEXTPROTO_71_TRUE='#' - HAVE_XEXTPROTO_71_FALSE= + test "$cross_compiling" = yes && + { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +$as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "${sdkdir}/dri.h"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +ac_res=`eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` = yes; then + have_dri_h="yes" +else + have_dri_h="no" fi + as_ac_File=`$as_echo "ac_cv_file_${sdkdir}/sarea.h" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for ${sdkdir}/sarea.h" >&5 +$as_echo_n "checking for ${sdkdir}/sarea.h... " >&6; } +if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +$as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "${sdkdir}/sarea.h"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +ac_res=`eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` = yes; then + have_sarea_h="yes" +else + have_sarea_h="no" +fi -# Checks for libraries. + as_ac_File=`$as_echo "ac_cv_file_${sdkdir}/dristruct.h" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for ${sdkdir}/dristruct.h" >&5 +$as_echo_n "checking for ${sdkdir}/dristruct.h... " >&6; } +if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +$as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "${sdkdir}/dristruct.h"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +ac_res=`eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` = yes; then + have_dristruct_h="yes" +else + have_dristruct_h="no" +fi + + as_ac_File=`$as_echo "ac_cv_file_${sdkdir}/damage.h" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for ${sdkdir}/damage.h" >&5 +$as_echo_n "checking for ${sdkdir}/damage.h... " >&6; } +if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +$as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "${sdkdir}/damage.h"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +ac_res=`eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` = yes; then + have_damage_h="yes" +else + have_damage_h="no" +fi + +fi + +{ $as_echo "$as_me:$LINENO: checking whether to include DRI support" >&5 +$as_echo_n "checking whether to include DRI support... " >&6; } +if test x$DRI = xauto; then + if test "$have_dri_h" = yes -a \ + "$have_sarea_h" = yes -a \ + "$have_dristruct_h" = yes; then + DRI="yes" + else + DRI="no" + fi +fi +{ $as_echo "$as_me:$LINENO: result: $DRI" >&5 +$as_echo "$DRI" >&6; } -if test "$DRI" != no; then + +if test x$DRI = xyes; then + DRI_TRUE= + DRI_FALSE='#' +else + DRI_TRUE='#' + DRI_FALSE= +fi + +if test "$DRI" = yes; then pkg_failed=no { $as_echo "$as_me:$LINENO: checking for DRI" >&5 @@ -22128,227 +21749,6 @@ else $as_echo "yes" >&6; } : fi - save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$XORG_CFLAGS $DRI_CFLAGS" - { $as_echo "$as_me:$LINENO: checking for dri.h" >&5 -$as_echo_n "checking for dri.h... " >&6; } -if test "${ac_cv_header_dri_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_cv_header_dri_h=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_dri_h=no -fi - -rm -f conftest.err conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_dri_h" >&5 -$as_echo "$ac_cv_header_dri_h" >&6; } -if test $ac_cv_header_dri_h = yes; then - have_dri_h="yes" -else - have_dri_h="no" -fi - - - { $as_echo "$as_me:$LINENO: checking for sarea.h" >&5 -$as_echo_n "checking for sarea.h... " >&6; } -if test "${ac_cv_header_sarea_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_cv_header_sarea_h=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_sarea_h=no -fi - -rm -f conftest.err conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sarea_h" >&5 -$as_echo "$ac_cv_header_sarea_h" >&6; } -if test $ac_cv_header_sarea_h = yes; then - have_sarea_h="yes" -else - have_sarea_h="no" -fi - - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - have_dristruct_h="yes" -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - have_dristruct_h="no" -fi - -rm -f conftest.err conftest.$ac_ext - { $as_echo "$as_me:$LINENO: checking for damage.h" >&5 -$as_echo_n "checking for damage.h... " >&6; } -if test "${ac_cv_header_damage_h+set}" = set; then - $as_echo_n "(cached) " >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || - test ! -s conftest.err - }; then - ac_cv_header_damage_h=yes -else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_damage_h=no -fi - -rm -f conftest.err conftest.$ac_ext -fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_damage_h" >&5 -$as_echo "$ac_cv_header_damage_h" >&6; } -if test $ac_cv_header_damage_h = yes; then - have_damage_h="yes" -else - have_damage_h="no" -fi - - - CPPFLAGS="$save_CPPFLAGS" -fi - -{ $as_echo "$as_me:$LINENO: checking whether to include DRI support" >&5 -$as_echo_n "checking whether to include DRI support... " >&6; } -if test x$DRI = xauto; then - if test "$have_dri_h" = yes -a \ - "$have_sarea_h" = yes -a \ - "$have_dristruct_h" = yes; then - DRI="yes" - else - DRI="no" - fi -fi -{ $as_echo "$as_me:$LINENO: result: $DRI" >&5 -$as_echo "$DRI" >&6; } - - - -if test x$DRI = xyes; then - DRI_TRUE= - DRI_FALSE='#' -else - DRI_TRUE='#' - DRI_FALSE= -fi - -if test "$DRI" = yes; then cat >>confdefs.h <<\_ACEOF #define XF86DRI 1 @@ -22366,13 +21766,13 @@ cat >>confdefs.h <<\_ACEOF _ACEOF fi +fi - save_CFLAGS="$CFLAGS" - CFLAGS="$XORG_CFLAGS $DRI_CFLAGS $CFLAGS" - if test "$DRM_MODE" = yes; then - { $as_echo "$as_me:$LINENO: checking for xf86drmMode.h" >&5 -$as_echo_n "checking for xf86drmMode.h... " >&6; } -if test "${ac_cv_header_xf86drmMode_h+set}" = set; then +save_CFLAGS="$CFLAGS" +CFLAGS="$XORG_CFLAGS" +{ $as_echo "$as_me:$LINENO: checking for xf86Modes.h" >&5 +$as_echo_n "checking for xf86Modes.h... " >&6; } +if test "${ac_cv_header_xf86Modes_h+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF @@ -22381,10 +21781,9 @@ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ -#include -#include +#include "xorg-server.h" -#include +#include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" @@ -22404,216 +21803,26 @@ $as_echo "$ac_try_echo") >&5 test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then - ac_cv_header_xf86drmMode_h=yes + ac_cv_header_xf86Modes_h=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 - ac_cv_header_xf86drmMode_h=no + ac_cv_header_xf86Modes_h=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi -{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_xf86drmMode_h" >&5 -$as_echo "$ac_cv_header_xf86drmMode_h" >&6; } -if test $ac_cv_header_xf86drmMode_h = yes; then - DRM_MODE=yes +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_xf86Modes_h" >&5 +$as_echo "$ac_cv_header_xf86Modes_h" >&6; } +if test $ac_cv_header_xf86Modes_h = yes; then + XMODES=yes else - DRM_MODE=no + XMODES=no fi - if test "x$DRM_MODE" = xyes; then - -pkg_failed=no -{ $as_echo "$as_me:$LINENO: checking for LIBDRM_RADEON" >&5 -$as_echo_n "checking for LIBDRM_RADEON... " >&6; } - -if test -n "$PKG_CONFIG"; then - if test -n "$LIBDRM_RADEON_CFLAGS"; then - pkg_cv_LIBDRM_RADEON_CFLAGS="$LIBDRM_RADEON_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xorg-server >= 1.6.2 libdrm_radeon\"") >&5 - ($PKG_CONFIG --exists --print-errors "xorg-server >= 1.6.2 libdrm_radeon") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_LIBDRM_RADEON_CFLAGS=`$PKG_CONFIG --cflags "xorg-server >= 1.6.2 libdrm_radeon" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi -if test -n "$PKG_CONFIG"; then - if test -n "$LIBDRM_RADEON_LIBS"; then - pkg_cv_LIBDRM_RADEON_LIBS="$LIBDRM_RADEON_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"xorg-server >= 1.6.2 libdrm_radeon\"") >&5 - ($PKG_CONFIG --exists --print-errors "xorg-server >= 1.6.2 libdrm_radeon") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_LIBDRM_RADEON_LIBS=`$PKG_CONFIG --libs "xorg-server >= 1.6.2 libdrm_radeon" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi - - - -if test $pkg_failed = yes; then - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi - if test $_pkg_short_errors_supported = yes; then - LIBDRM_RADEON_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xorg-server >= 1.6.2 libdrm_radeon"` - else - LIBDRM_RADEON_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xorg-server >= 1.6.2 libdrm_radeon"` - fi - # Put the nasty error message in config.log where it belongs - echo "$LIBDRM_RADEON_PKG_ERRORS" >&5 - - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - LIBDRM_RADEON=no -elif test $pkg_failed = untried; then - LIBDRM_RADEON=no -else - LIBDRM_RADEON_CFLAGS=$pkg_cv_LIBDRM_RADEON_CFLAGS - LIBDRM_RADEON_LIBS=$pkg_cv_LIBDRM_RADEON_LIBS - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - LIBDRM_RADEON=yes -fi - - if test "x$LIBDRM_RADEON" = xyes; then - -cat >>confdefs.h <<\_ACEOF -#define XF86DRM_MODE 1 -_ACEOF - - -cat >>confdefs.h <<\_ACEOF -#define RADEON_DRI2 1 -_ACEOF - - else - DRM_MODE=no - fi - -pkg_failed=no -{ $as_echo "$as_me:$LINENO: checking for LIBUDEV" >&5 -$as_echo_n "checking for LIBUDEV... " >&6; } - -if test -n "$PKG_CONFIG"; then - if test -n "$LIBUDEV_CFLAGS"; then - pkg_cv_LIBUDEV_CFLAGS="$LIBUDEV_CFLAGS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libudev\"") >&5 - ($PKG_CONFIG --exists --print-errors "libudev") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_LIBUDEV_CFLAGS=`$PKG_CONFIG --cflags "libudev" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi -if test -n "$PKG_CONFIG"; then - if test -n "$LIBUDEV_LIBS"; then - pkg_cv_LIBUDEV_LIBS="$LIBUDEV_LIBS" - else - if test -n "$PKG_CONFIG" && \ - { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libudev\"") >&5 - ($PKG_CONFIG --exists --print-errors "libudev") 2>&5 - ac_status=$? - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - pkg_cv_LIBUDEV_LIBS=`$PKG_CONFIG --libs "libudev" 2>/dev/null` -else - pkg_failed=yes -fi - fi -else - pkg_failed=untried -fi - - - -if test $pkg_failed = yes; then - -if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then - _pkg_short_errors_supported=yes -else - _pkg_short_errors_supported=no -fi - if test $_pkg_short_errors_supported = yes; then - LIBUDEV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libudev"` - else - LIBUDEV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libudev"` - fi - # Put the nasty error message in config.log where it belongs - echo "$LIBUDEV_PKG_ERRORS" >&5 - - { $as_echo "$as_me:$LINENO: result: no" >&5 -$as_echo "no" >&6; } - LIBUDEV=no -elif test $pkg_failed = untried; then - LIBUDEV=no -else - LIBUDEV_CFLAGS=$pkg_cv_LIBUDEV_CFLAGS - LIBUDEV_LIBS=$pkg_cv_LIBUDEV_LIBS - { $as_echo "$as_me:$LINENO: result: yes" >&5 -$as_echo "yes" >&6; } - LIBUDEV=yes -fi - if test "x$LIBUDEV" = xyes; then - -cat >>confdefs.h <<\_ACEOF -#define HAVE_LIBUDEV 1 -_ACEOF - - fi - fi - fi - CFLAGS="$save_CFLAGS" -else - DRM_MODE=no -fi - - -if test x$DRM_MODE = xyes; then - DRM_MODE_TRUE= - DRM_MODE_FALSE='#' -else - DRM_MODE_TRUE='#' - DRM_MODE_FALSE= -fi - - - -if test x$LIBUDEV = xyes; then - LIBUDEV_TRUE= - LIBUDEV_FALSE='#' -else - LIBUDEV_TRUE='#' - LIBUDEV_FALSE= -fi - +CFLAGS="$save_CFLAGS" cat >>confdefs.h <<\_ACEOF @@ -23221,66 +22430,62 @@ fi -for ac_header in list.h -do -as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 -$as_echo_n "checking for $ac_header... " >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - $as_echo_n "(cached) " >&6 + +if test "x$XMODES" = xno; then + XMODES_TRUE= + XMODES_FALSE='#' else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #include "xorg-server.h" + XMODES_TRUE='#' + XMODES_FALSE= +fi -#include <$ac_header> + +if test "x$XSERVER_SOURCE" = x; then + if test -d ../../xserver; then + XSERVER_SOURCE="`cd ../../xserver && pwd`" + fi +fi + +if test -d "$XSERVER_SOURCE"; then + case "$XSERVER_SOURCE" in + /*) + ;; + *) + XSERVER_SOURCE="`cd $XSERVER_SOURCE && pwd`" + esac + if test -f src/modes/xf86Modes.h; then + : + else + ln -sf $XSERVER_SOURCE/hw/xfree86/modes src/modes + fi + + if test -f src/parser/xf86Parser.h; then + : + else + ln -sf $XSERVER_SOURCE/hw/xfree86/parser src/parser + fi +fi +if test "x$XMODES" = xyes; then + { $as_echo "$as_me:$LINENO: X server has new mode code" >&5 +$as_echo "$as_me: X server has new mode code" >&6;} + +cat >>confdefs.h <<\_ACEOF +#define XMODES 1 _ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" -$as_echo "$ac_try_echo") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_c_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" + + XMODES_CFLAGS= else - $as_echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" + if test -f src/modes/xf86Modes.h -a -f src/parser/xf86Parser.h; then + { $as_echo "$as_me:$LINENO: X server is missing new mode code, using local copy" >&5 +$as_echo "$as_me: X server is missing new mode code, using local copy" >&6;} + else + { { $as_echo "$as_me:$LINENO: error: Must have X server >= 1.3 source tree for mode setting code. Please specify --with-xserver-source" >&5 +$as_echo "$as_me: error: Must have X server >= 1.3 source tree for mode setting code. Please specify --with-xserver-source" >&2;} + { (exit 1); exit 1; }; } + fi + XMODES_CFLAGS='-DXF86_MODES_RENAME -I$(top_srcdir)/src -I$(top_srcdir)/src/modes -I$(top_srcdir)/src/parser' fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` - { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } -if test `eval 'as_val=${'$as_ac_Header'} - $as_echo "$as_val"'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done CPPFLAGS="$SAVE_CPPFLAGS" @@ -23296,17 +22501,6 @@ else fi - - -if test "x$LIBDRM_RADEON" = xyes; then - XF86DRM_MODE_TRUE= - XF86DRM_MODE_FALSE='#' -else - XF86DRM_MODE_TRUE='#' - XF86DRM_MODE_FALSE= -fi - - if test "x$XSERVER_LIBPCIACCESS" = xyes; then pkg_failed=no @@ -23898,9 +23092,295 @@ esac + + DRIVER_NAME=ati + + + +if test x$APP_MAN_SUFFIX = x ; then + APP_MAN_SUFFIX=1 +fi +if test x$APP_MAN_DIR = x ; then + APP_MAN_DIR='$(mandir)/man$(APP_MAN_SUFFIX)' +fi + +if test x$LIB_MAN_SUFFIX = x ; then + LIB_MAN_SUFFIX=3 +fi +if test x$LIB_MAN_DIR = x ; then + LIB_MAN_DIR='$(mandir)/man$(LIB_MAN_SUFFIX)' +fi + +if test x$FILE_MAN_SUFFIX = x ; then + case $host_os in + solaris*) FILE_MAN_SUFFIX=4 ;; + *) FILE_MAN_SUFFIX=5 ;; + esac +fi +if test x$FILE_MAN_DIR = x ; then + FILE_MAN_DIR='$(mandir)/man$(FILE_MAN_SUFFIX)' +fi + +if test x$MISC_MAN_SUFFIX = x ; then + case $host_os in + solaris*) MISC_MAN_SUFFIX=5 ;; + *) MISC_MAN_SUFFIX=7 ;; + esac +fi +if test x$MISC_MAN_DIR = x ; then + MISC_MAN_DIR='$(mandir)/man$(MISC_MAN_SUFFIX)' +fi + +if test x$DRIVER_MAN_SUFFIX = x ; then + case $host_os in + solaris*) DRIVER_MAN_SUFFIX=7 ;; + *) DRIVER_MAN_SUFFIX=4 ;; + esac +fi +if test x$DRIVER_MAN_DIR = x ; then + DRIVER_MAN_DIR='$(mandir)/man$(DRIVER_MAN_SUFFIX)' +fi + +if test x$ADMIN_MAN_SUFFIX = x ; then + case $host_os in + solaris*) ADMIN_MAN_SUFFIX=1m ;; + *) ADMIN_MAN_SUFFIX=8 ;; + esac +fi +if test x$ADMIN_MAN_DIR = x ; then + ADMIN_MAN_DIR='$(mandir)/man$(ADMIN_MAN_SUFFIX)' +fi + + + + + + + + + + + + + + + + + +# Check whether --with-release-version was given. +if test "${with_release_version+set}" = set; then + withval=$with_release_version; RELEASE_VERSION="$withval" +else + RELEASE_VERSION="" +fi + + if test "x$RELEASE_VERSION" != "x"; then + PACKAGE="$PACKAGE-$RELEASE_VERSION" + PACKAGE_TARNAME="$PACKAGE_TARNAME-$RELEASE_VERSION" + { $as_echo "$as_me:$LINENO: Building with package name set to $PACKAGE" >&5 +$as_echo "$as_me: Building with package name set to $PACKAGE" >&6;} + fi + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION_MAJOR `echo $PACKAGE_VERSION | cut -d . -f 1` +_ACEOF + + PVM=`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1` + if test "x$PVM" = "x"; then + PVM="0" + fi + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION_MINOR $PVM +_ACEOF + + PVP=`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1` + if test "x$PVP" = "x"; then + PVP="0" + fi + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION_PATCHLEVEL $PVP +_ACEOF + + + +if test x$XORG_SGML_PATH = x ; then + XORG_SGML_PATH=$prefix/share/sgml +fi +HAVE_DEFS_ENT= + +if test x"$cross_compiling" = x"yes" ; then + HAVE_DEFS_ENT=no +else + as_ac_File=`$as_echo "ac_cv_file_$XORG_SGML_PATH/X11/defs.ent" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $XORG_SGML_PATH/X11/defs.ent" >&5 +$as_echo_n "checking for $XORG_SGML_PATH/X11/defs.ent... " >&6; } +if { as_var=$as_ac_File; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +$as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "$XORG_SGML_PATH/X11/defs.ent"; then + eval "$as_ac_File=yes" +else + eval "$as_ac_File=no" +fi +fi +ac_res=`eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +if test `eval 'as_val=${'$as_ac_File'} + $as_echo "$as_val"'` = yes; then + HAVE_DEFS_ENT=yes +fi + +fi + +# Extract the first word of "linuxdoc", so it can be a program name with args. +set dummy linuxdoc; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_LINUXDOC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $LINUXDOC in + [\\/]* | ?:[\\/]*) + ac_cv_path_LINUXDOC="$LINUXDOC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LINUXDOC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +LINUXDOC=$ac_cv_path_LINUXDOC +if test -n "$LINUXDOC"; then + { $as_echo "$as_me:$LINENO: result: $LINUXDOC" >&5 +$as_echo "$LINUXDOC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "ps2pdf", so it can be a program name with args. +set dummy ps2pdf; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PS2PDF+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $PS2PDF in + [\\/]* | ?:[\\/]*) + ac_cv_path_PS2PDF="$PS2PDF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PS2PDF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +PS2PDF=$ac_cv_path_PS2PDF +if test -n "$PS2PDF"; then + { $as_echo "$as_me:$LINENO: result: $PS2PDF" >&5 +$as_echo "$PS2PDF" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +{ $as_echo "$as_me:$LINENO: checking Whether to build documentation" >&5 +$as_echo_n "checking Whether to build documentation... " >&6; } + +if test x$HAVE_DEFS_ENT != x && test x$LINUXDOC != x ; then + BUILDDOC=yes +else + BUILDDOC=no +fi + + + +if test x$BUILDDOC = xyes; then + BUILD_LINUXDOC_TRUE= + BUILD_LINUXDOC_FALSE='#' +else + BUILD_LINUXDOC_TRUE='#' + BUILD_LINUXDOC_FALSE= +fi + + +{ $as_echo "$as_me:$LINENO: result: $BUILDDOC" >&5 +$as_echo "$BUILDDOC" >&6; } + +{ $as_echo "$as_me:$LINENO: checking Whether to build pdf documentation" >&5 +$as_echo_n "checking Whether to build pdf documentation... " >&6; } + +if test x$PS2PDF != x && test x$BUILD_PDFDOC != xno; then + BUILDPDFDOC=yes +else + BUILDPDFDOC=no +fi + + + +if test x$BUILDPDFDOC = xyes; then + BUILD_PDFDOC_TRUE= + BUILD_PDFDOC_FALSE='#' +else + BUILD_PDFDOC_TRUE='#' + BUILD_PDFDOC_FALSE= +fi + + +{ $as_echo "$as_me:$LINENO: result: $BUILDPDFDOC" >&5 +$as_echo "$BUILDPDFDOC" >&6; } + +MAKE_TEXT="SGML_SEARCH_PATH=$XORG_SGML_PATH GROFF_NO_SGR=y $LINUXDOC -B txt" +MAKE_PS="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC -B latex --papersize=letter --output=ps" +MAKE_PDF="$PS2PDF" +MAKE_HTML="SGML_SEARCH_PATH=$XORG_SGML_PATH $LINUXDOC -B html --split=0" + + + + + + + { $as_echo "$as_me:$LINENO: The atimisc sub-driver has been split out to xf86-video-mach64: git://anongit.freedesktop.org/git/xorg/driver/xf86-video-mach64 Please install that driver as well for mach64-based cards. @@ -24018,6 +23498,13 @@ LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs +if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 @@ -24032,17 +23519,17 @@ $as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi -if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. +$as_echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi -if test -z "${HAVE_XEXTPROTO_71_TRUE}" && test -z "${HAVE_XEXTPROTO_71_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_XEXTPROTO_71\" was never defined. +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"HAVE_XEXTPROTO_71\" was never defined. +$as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi @@ -24053,17 +23540,10 @@ $as_echo "$as_me: error: conditional \"DRI\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi -if test -z "${DRM_MODE_TRUE}" && test -z "${DRM_MODE_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"DRM_MODE\" was never defined. +if test -z "${XMODES_TRUE}" && test -z "${XMODES_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"XMODES\" was never defined. Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"DRM_MODE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${LIBUDEV_TRUE}" && test -z "${LIBUDEV_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"LIBUDEV\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"LIBUDEV\" was never defined. +$as_echo "$as_me: error: conditional \"XMODES\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi @@ -24074,13 +23554,6 @@ $as_echo "$as_me: error: conditional \"USE_EXA\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi -if test -z "${XF86DRM_MODE_TRUE}" && test -z "${XF86DRM_MODE_FALSE}"; then - { { $as_echo "$as_me:$LINENO: error: conditional \"XF86DRM_MODE\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -$as_echo "$as_me: error: conditional \"XF86DRM_MODE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi if test -z "${XSERVER_LIBPCIACCESS_TRUE}" && test -z "${XSERVER_LIBPCIACCESS_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"XSERVER_LIBPCIACCESS\" was never defined. Usually this means the macro was only invoked conditionally." >&5 @@ -24088,6 +23561,20 @@ $as_echo "$as_me: error: conditional \"XSERVER_LIBPCIACCESS\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi +if test -z "${BUILD_LINUXDOC_TRUE}" && test -z "${BUILD_LINUXDOC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_LINUXDOC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_LINUXDOC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${BUILD_PDFDOC_TRUE}" && test -z "${BUILD_PDFDOC_FALSE}"; then + { { $as_echo "$as_me:$LINENO: error: conditional \"BUILD_PDFDOC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +$as_echo "$as_me: error: conditional \"BUILD_PDFDOC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 @@ -24410,7 +23897,7 @@ exec 6>&1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by xf86-video-ati $as_me 6.14.3, which was +This file was extended by xf86-video-ati $as_me 6.12.2, which was generated by GNU Autoconf 2.62. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -24463,7 +23950,7 @@ Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ -xf86-video-ati config.status 6.14.3 +xf86-video-ati config.status 6.12.2 configured by $0, generated by GNU Autoconf 2.62, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" @@ -24577,283 +24064,6 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -sed_quote_subst='$sed_quote_subst' -double_quote_subst='$double_quote_subst' -delay_variable_subst='$delay_variable_subst' -enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`' -macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`' -macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`' -enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`' -pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`' -enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`' -SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`' -ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`' -PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`' -host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`' -host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`' -host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`' -build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`' -build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`' -build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`' -SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`' -Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`' -GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`' -EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`' -FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`' -LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`' -NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`' -LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`' -max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`' -ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`' -exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`' -lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`' -lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`' -lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`' -lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`' -lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`' -reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`' -reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`' -OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`' -deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`' -file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`' -file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`' -want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`' -DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`' -sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`' -AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`' -AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`' -archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`' -STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`' -RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`' -old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`' -old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`' -lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`' -CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`' -CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`' -compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`' -GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`' -nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`' -lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`' -objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`' -MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`' -lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`' -lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`' -need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`' -MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`' -DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`' -NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`' -LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`' -OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`' -OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`' -libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`' -shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`' -extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`' -enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`' -export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`' -whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`' -compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`' -old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`' -old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`' -archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`' -archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`' -module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`' -module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`' -with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`' -allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`' -no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`' -hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`' -hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`' -hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`' -hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`' -hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`' -hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`' -inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`' -link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`' -always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`' -export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`' -exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`' -include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`' -prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`' -postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`' -file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`' -variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`' -need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`' -need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`' -version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`' -runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`' -shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`' -libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`' -library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`' -soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`' -install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`' -postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`' -postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`' -finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`' -finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`' -hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`' -sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`' -sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`' -hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`' -enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`' -enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`' -old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`' -striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`' - -LTCC='$LTCC' -LTCFLAGS='$LTCFLAGS' -compiler='$compiler_DEFAULT' - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - -# Quote evaled strings. -for var in SHELL \ -ECHO \ -PATH_SEPARATOR \ -SED \ -GREP \ -EGREP \ -FGREP \ -LD \ -NM \ -LN_S \ -lt_SP2NL \ -lt_NL2SP \ -reload_flag \ -OBJDUMP \ -deplibs_check_method \ -file_magic_cmd \ -file_magic_glob \ -want_nocaseglob \ -DLLTOOL \ -sharedlib_from_linklib_cmd \ -AR \ -AR_FLAGS \ -archiver_list_spec \ -STRIP \ -RANLIB \ -CC \ -CFLAGS \ -compiler \ -lt_cv_sys_global_symbol_pipe \ -lt_cv_sys_global_symbol_to_cdecl \ -lt_cv_sys_global_symbol_to_c_name_address \ -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \ -nm_file_list_spec \ -lt_prog_compiler_no_builtin_flag \ -lt_prog_compiler_pic \ -lt_prog_compiler_wl \ -lt_prog_compiler_static \ -lt_cv_prog_compiler_c_o \ -need_locks \ -MANIFEST_TOOL \ -DSYMUTIL \ -NMEDIT \ -LIPO \ -OTOOL \ -OTOOL64 \ -shrext_cmds \ -export_dynamic_flag_spec \ -whole_archive_flag_spec \ -compiler_needs_object \ -with_gnu_ld \ -allow_undefined_flag \ -no_undefined_flag \ -hardcode_libdir_flag_spec \ -hardcode_libdir_separator \ -exclude_expsyms \ -include_expsyms \ -file_list_spec \ -variables_saved_for_relink \ -libname_spec \ -library_names_spec \ -soname_spec \ -install_override_mode \ -finish_eval \ -old_striplib \ -striplib; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -# Double-quote double-evaled strings. -for var in reload_cmds \ -old_postinstall_cmds \ -old_postuninstall_cmds \ -old_archive_cmds \ -extract_expsyms_cmds \ -old_archive_from_new_cmds \ -old_archive_from_expsyms_cmds \ -archive_cmds \ -archive_expsym_cmds \ -module_cmds \ -module_expsym_cmds \ -export_symbols_cmds \ -prelink_cmds \ -postlink_cmds \ -postinstall_cmds \ -postuninstall_cmds \ -finish_cmds \ -sys_lib_search_path_spec \ -sys_lib_dlsearch_path_spec; do - case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in - *[\\\\\\\`\\"\\\$]*) - eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" - ;; - *) - eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" - ;; - esac -done - -ac_aux_dir='$ac_aux_dir' -xsi_shell='$xsi_shell' -lt_shell_append='$lt_shell_append' - -# See if we are running on zsh, and set the options which allow our -# commands through without removal of \ escapes INIT. -if test -n "\${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST -fi - - - PACKAGE='$PACKAGE' - VERSION='$VERSION' - TIMESTAMP='$TIMESTAMP' - RM='$RM' - ofile='$ofile' - - - - _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 @@ -24864,7 +24074,6 @@ do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; @@ -25636,636 +24845,6 @@ $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} echo '# dummy' > "$dirpart/$file" done done - ;; - "libtool":C) - - # See if we are running on zsh, and set the options which allow our - # commands through without removal of \ escapes. - if test -n "${ZSH_VERSION+set}" ; then - setopt NO_GLOB_SUBST - fi - - cfgfile="${ofile}T" - trap "$RM \"$cfgfile\"; exit 1" 1 2 15 - $RM "$cfgfile" - - cat <<_LT_EOF >> "$cfgfile" -#! $SHELL - -# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. -# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION -# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# NOTE: Changes made to this file will be lost: look at ltmain.sh. -# -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, -# 2006, 2007, 2008, 2009, 2010, 2011 Free Software -# Foundation, Inc. -# Written by Gordon Matzigkeit, 1996 -# -# This file is part of GNU Libtool. -# -# GNU Libtool 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. -# -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, or -# obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - -# The names of the tagged configurations supported by this script. -available_tags="" - -# ### BEGIN LIBTOOL CONFIG - -# Whether or not to build static libraries. -build_old_libs=$enable_static - -# Which release of libtool.m4 was used? -macro_version=$macro_version -macro_revision=$macro_revision - -# Whether or not to build shared libraries. -build_libtool_libs=$enable_shared - -# What type of objects to build. -pic_mode=$pic_mode - -# Whether or not to optimize for fast installation. -fast_install=$enable_fast_install - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# The host system. -host_alias=$host_alias -host=$host -host_os=$host_os - -# The build system. -build_alias=$build_alias -build=$build -build_os=$build_os - -# A sed program that does not truncate output. -SED=$lt_SED - -# Sed that helps us avoid accidentally triggering echo(1) options like -n. -Xsed="\$SED -e 1s/^X//" - -# A grep program that handles long lines. -GREP=$lt_GREP - -# An ERE matcher. -EGREP=$lt_EGREP - -# A literal string matcher. -FGREP=$lt_FGREP - -# A BSD- or MS-compatible name lister. -NM=$lt_NM - -# Whether we need soft or hard links. -LN_S=$lt_LN_S - -# What is the maximum length of a command? -max_cmd_len=$max_cmd_len - -# Object file suffix (normally "o"). -objext=$ac_objext - -# Executable file suffix (normally ""). -exeext=$exeext - -# whether the shell understands "unset". -lt_unset=$lt_unset - -# turn spaces into newlines. -SP2NL=$lt_lt_SP2NL - -# turn newlines into spaces. -NL2SP=$lt_lt_NL2SP - -# convert \$build file names to \$host format. -to_host_file_cmd=$lt_cv_to_host_file_cmd - -# convert \$build files to toolchain format. -to_tool_file_cmd=$lt_cv_to_tool_file_cmd - -# An object symbol dumper. -OBJDUMP=$lt_OBJDUMP - -# Method to check whether dependent libraries are shared objects. -deplibs_check_method=$lt_deplibs_check_method - -# Command to use when deplibs_check_method = "file_magic". -file_magic_cmd=$lt_file_magic_cmd - -# How to find potential files when deplibs_check_method = "file_magic". -file_magic_glob=$lt_file_magic_glob - -# Find potential files using nocaseglob when deplibs_check_method = "file_magic". -want_nocaseglob=$lt_want_nocaseglob - -# DLL creation program. -DLLTOOL=$lt_DLLTOOL - -# Command to associate shared and link libraries. -sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd - -# The archiver. -AR=$lt_AR - -# Flags to create an archive. -AR_FLAGS=$lt_AR_FLAGS - -# How to feed a file listing to the archiver. -archiver_list_spec=$lt_archiver_list_spec - -# A symbol stripping program. -STRIP=$lt_STRIP - -# Commands used to install an old-style archive. -RANLIB=$lt_RANLIB -old_postinstall_cmds=$lt_old_postinstall_cmds -old_postuninstall_cmds=$lt_old_postuninstall_cmds - -# Whether to use a lock for old archive extraction. -lock_old_archive_extraction=$lock_old_archive_extraction - -# A C compiler. -LTCC=$lt_CC - -# LTCC compiler flags. -LTCFLAGS=$lt_CFLAGS - -# Take the output of nm and produce a listing of raw symbols and C names. -global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe - -# Transform the output of nm in a proper C declaration. -global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl - -# Transform the output of nm in a C name address pair. -global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address - -# Transform the output of nm in a C name address pair when lib prefix is needed. -global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix - -# Specify filename containing input files for \$NM. -nm_file_list_spec=$lt_nm_file_list_spec - -# The root where to search for dependent libraries,and in which our libraries should be installed. -lt_sysroot=$lt_sysroot - -# The name of the directory that contains temporary libtool files. -objdir=$objdir - -# Used to examine libraries when file_magic_cmd begins with "file". -MAGIC_CMD=$MAGIC_CMD - -# Must we lock files when doing compilation? -need_locks=$lt_need_locks - -# Manifest tool. -MANIFEST_TOOL=$lt_MANIFEST_TOOL - -# Tool to manipulate archived DWARF debug symbol files on Mac OS X. -DSYMUTIL=$lt_DSYMUTIL - -# Tool to change global to local symbols on Mac OS X. -NMEDIT=$lt_NMEDIT - -# Tool to manipulate fat objects and archives on Mac OS X. -LIPO=$lt_LIPO - -# ldd/readelf like tool for Mach-O binaries on Mac OS X. -OTOOL=$lt_OTOOL - -# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. -OTOOL64=$lt_OTOOL64 - -# Old archive suffix (normally "a"). -libext=$libext - -# Shared library suffix (normally ".so"). -shrext_cmds=$lt_shrext_cmds - -# The commands to extract the exported symbol list from a shared archive. -extract_expsyms_cmds=$lt_extract_expsyms_cmds - -# Variables whose values should be saved in libtool wrapper scripts and -# restored at link time. -variables_saved_for_relink=$lt_variables_saved_for_relink - -# Do we need the "lib" prefix for modules? -need_lib_prefix=$need_lib_prefix - -# Do we need a version for libraries? -need_version=$need_version - -# Library versioning type. -version_type=$version_type - -# Shared library runtime path variable. -runpath_var=$runpath_var - -# Shared library path variable. -shlibpath_var=$shlibpath_var - -# Is shlibpath searched before the hard-coded library search path? -shlibpath_overrides_runpath=$shlibpath_overrides_runpath - -# Format of library name prefix. -libname_spec=$lt_libname_spec - -# List of archive names. First name is the real one, the rest are links. -# The last name is the one that the linker finds with -lNAME -library_names_spec=$lt_library_names_spec - -# The coded name of the library, if different from the real name. -soname_spec=$lt_soname_spec - -# Permission mode override for installation of shared libraries. -install_override_mode=$lt_install_override_mode - -# Command to use after installation of a shared archive. -postinstall_cmds=$lt_postinstall_cmds - -# Command to use after uninstallation of a shared archive. -postuninstall_cmds=$lt_postuninstall_cmds - -# Commands used to finish a libtool library installation in a directory. -finish_cmds=$lt_finish_cmds - -# As "finish_cmds", except a single script fragment to be evaled but -# not shown. -finish_eval=$lt_finish_eval - -# Whether we should hardcode library paths into libraries. -hardcode_into_libs=$hardcode_into_libs - -# Compile-time system search path for libraries. -sys_lib_search_path_spec=$lt_sys_lib_search_path_spec - -# Run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec - -# Whether dlopen is supported. -dlopen_support=$enable_dlopen - -# Whether dlopen of programs is supported. -dlopen_self=$enable_dlopen_self - -# Whether dlopen of statically linked programs is supported. -dlopen_self_static=$enable_dlopen_self_static - -# Commands to strip libraries. -old_striplib=$lt_old_striplib -striplib=$lt_striplib - - -# The linker used to build libraries. -LD=$lt_LD - -# How to create reloadable object files. -reload_flag=$lt_reload_flag -reload_cmds=$lt_reload_cmds - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds - -# A language specific compiler. -CC=$lt_compiler - -# Is the compiler the GNU compiler? -with_gcc=$GCC - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds -archive_expsym_cmds=$lt_archive_expsym_cmds - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds -module_expsym_cmds=$lt_module_expsym_cmds - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag - -# Flag to hardcode \$libdir into a binary during linking. -# This must work even if \$libdir does not exist -hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct - -# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes -# DIR into the resulting binary and the resulting library dependency is -# "absolute",i.e impossible to change by setting \${shlibpath_var} if the -# library is relocated. -hardcode_direct_absolute=$hardcode_direct_absolute - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var - -# Set to "yes" if building a shared library automatically hardcodes DIR -# into the library and all subsequent libraries and executables linked -# against it. -hardcode_automatic=$hardcode_automatic - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action - -# ### END LIBTOOL CONFIG - -_LT_EOF - - case $host_os in - aix3*) - cat <<\_LT_EOF >> "$cfgfile" -# AIX sometimes has problems with the GCC collect2 program. For some -# reason, if we set the COLLECT_NAMES environment variable, the problems -# vanish in a puff of smoke. -if test "X${COLLECT_NAMES+set}" != Xset; then - COLLECT_NAMES= - export COLLECT_NAMES -fi -_LT_EOF - ;; - esac - - -ltmain="$ac_aux_dir/ltmain.sh" - - - # We use sed instead of cat because bash on DJGPP gets confused if - # if finds mixed CR/LF and LF-only lines. Since sed operates in - # text mode, it properly converts lines to CR/LF. This bash problem - # is reportedly fixed, but why not run on old versions too? - sed '$q' "$ltmain" >> "$cfgfile" \ - || (rm -f "$cfgfile"; exit 1) - - if test x"$xsi_shell" = xyes; then - sed -e '/^func_dirname ()$/,/^} # func_dirname /c\ -func_dirname ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_basename ()$/,/^} # func_basename /c\ -func_basename ()\ -{\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\ -func_dirname_and_basename ()\ -{\ -\ case ${1} in\ -\ */*) func_dirname_result="${1%/*}${2}" ;;\ -\ * ) func_dirname_result="${3}" ;;\ -\ esac\ -\ func_basename_result="${1##*/}"\ -} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_stripname ()$/,/^} # func_stripname /c\ -func_stripname ()\ -{\ -\ # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\ -\ # positional parameters, so assign one to ordinary parameter first.\ -\ func_stripname_result=${3}\ -\ func_stripname_result=${func_stripname_result#"${1}"}\ -\ func_stripname_result=${func_stripname_result%"${2}"}\ -} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\ -func_split_long_opt ()\ -{\ -\ func_split_long_opt_name=${1%%=*}\ -\ func_split_long_opt_arg=${1#*=}\ -} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\ -func_split_short_opt ()\ -{\ -\ func_split_short_opt_arg=${1#??}\ -\ func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\ -} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\ -func_lo2o ()\ -{\ -\ case ${1} in\ -\ *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\ -\ *) func_lo2o_result=${1} ;;\ -\ esac\ -} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_xform ()$/,/^} # func_xform /c\ -func_xform ()\ -{\ - func_xform_result=${1%.*}.lo\ -} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_arith ()$/,/^} # func_arith /c\ -func_arith ()\ -{\ - func_arith_result=$(( $* ))\ -} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_len ()$/,/^} # func_len /c\ -func_len ()\ -{\ - func_len_result=${#1}\ -} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - -fi - -if test x"$lt_shell_append" = xyes; then - sed -e '/^func_append ()$/,/^} # func_append /c\ -func_append ()\ -{\ - eval "${1}+=\\${2}"\ -} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\ -func_append_quoted ()\ -{\ -\ func_quote_for_eval "${2}"\ -\ eval "${1}+=\\\\ \\$func_quote_for_eval_result"\ -} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") -test 0 -eq $? || _lt_function_replace_fail=: - - - # Save a `func_append' function call where possible by direct use of '+=' - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -else - # Save a `func_append' function call even when '+=' is not available - sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \ - && mv -f "$cfgfile.tmp" "$cfgfile" \ - || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp") - test 0 -eq $? || _lt_function_replace_fail=: -fi - -if test x"$_lt_function_replace_fail" = x":"; then - { $as_echo "$as_me:$LINENO: WARNING: Unable to substitute extended shell functions in $ofile" >&5 -$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;} -fi - - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - ;; esac @@ -26308,22 +24887,3 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then $as_echo "$as_me: WARNING: Unrecognized options: $ac_unrecognized_opts" >&2;} fi - -echo "" -echo " prefix: $prefix" -echo " exec_prefix: $exec_prefix" -echo " libdir: $libdir" -echo " includedir: $includedir" - - -echo "" -echo " Kernel modesetting: $DRM_MODE" - -echo "" -echo " CFLAGS: $CFLAGS" -echo " CXXFLAGS: $CXXFLAGS" -echo " Macros: $DEFINES" - -echo "" -echo " Run '${MAKE-make}' to build xf86-video-ati" -echo "" diff --git a/driver/xf86-video-ati/configure.ac b/driver/xf86-video-ati/configure.ac index 167432cc2..709fb1916 100644 --- a/driver/xf86-video-ati/configure.ac +++ b/driver/xf86-video-ati/configure.ac @@ -20,36 +20,24 @@ # # Process this file with autoconf to produce a configure script -# Initialize Autoconf -AC_PREREQ([2.60]) +AC_PREREQ(2.57) AC_INIT([xf86-video-ati], - [6.14.3], + 6.12.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], - [xf86-video-ati]) + xf86-video-ati) AC_CONFIG_SRCDIR([Makefile.am]) -AC_CONFIG_HEADERS([config.h]) - -# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS -m4_ifndef([XORG_MACROS_VERSION], - [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) -XORG_MACROS_VERSION(1.8) -XORG_DEFAULT_OPTIONS - +AM_CONFIG_HEADER([config.h]) AC_CONFIG_AUX_DIR(.) -# Initialize Automake -AM_INIT_AUTOMAKE([foreign dist-bzip2]) -AC_SYS_LARGEFILE +AM_INIT_AUTOMAKE([dist-bzip2]) AM_MAINTAINER_MODE -# Initialize libtool +# Checks for programs. AC_DISABLE_STATIC AC_PROG_LIBTOOL - -# Checks for programs. -AM_PROG_CC_C_O +AC_PROG_CC if test "x$GCC" = "xyes"; then CPPFLAGS="$CPPFLAGS -Wall" @@ -57,62 +45,53 @@ fi AH_TOP([#include "xorg-server.h"]) -# Define a configure option for an alternate module directory AC_ARG_WITH(xorg-module-dir, - AS_HELP_STRING([--with-xorg-module-dir=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, AS_HELP_STRING([--disable-dri], +AC_ARG_ENABLE(dri, AC_HELP_STRING([--disable-dri], [Disable DRI support [[default=auto]]]), [DRI="$enableval"], [DRI=auto]) AC_ARG_ENABLE(exa, - AS_HELP_STRING([--disable-exa], + AC_HELP_STRING([--disable-exa], [Disable EXA support [[default=enabled]]]), [EXA="$enableval"], [EXA=yes]) -AC_ARG_ENABLE(kms, - AS_HELP_STRING([--disable-kms], - [Disable KMS support [[default=enabled]]]), - [DRM_MODE="$enableval"], - [DRM_MODE=yes]) +AC_ARG_WITH(xserver-source,AC_HELP_STRING([--with-xserver-source=XSERVER_SOURCE], + [Path to X server source tree]), + [ XSERVER_SOURCE="$withval" ], + [ XSERVER_SOURCE="" ]) -# Store the list of server defined optional extensions in REQUIRED_MODULES +# 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) -# Obtain compiler/linker options for the driver dependencies -PKG_CHECK_MODULES(XORG, [xorg-server >= 1.3 xproto fontsproto $REQUIRED_MODULES]) -PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1], - HAVE_XEXTPROTO_71="yes"; AC_DEFINE(HAVE_XEXTPROTO_71, 1, [xextproto 7.1 available]), - HAVE_XEXTPROTO_71="no") -AM_CONDITIONAL(HAVE_XEXTPROTO_71, [ test "$HAVE_XEXTPROTO_71" = "yes" ]) +# Checks for pkg-config packages +PKG_CHECK_MODULES(XORG, [xorg-server >= 1.2 xproto fontsproto $REQUIRED_MODULES]) +sdkdir=$(pkg-config --variable=sdkdir xorg-server) # Checks for libraries. +# Checks for header files. +AC_HEADER_STDC if test "$DRI" != no; then - PKG_CHECK_MODULES(DRI, [libdrm >= 2.2 xf86driproto]) - save_CPPFLAGS="$CPPFLAGS" - CPPFLAGS="$XORG_CFLAGS $DRI_CFLAGS" - AC_CHECK_HEADER([dri.h], - [have_dri_h="yes"], [have_dri_h="no"],[-]) - AC_CHECK_HEADER([sarea.h], - [have_sarea_h="yes"], [have_sarea_h="no"],[-]) - AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[ -#include -#include - ]])], - [have_dristruct_h="yes"], [have_dristruct_h="no"],[-]) - AC_CHECK_HEADER([damage.h], - [have_damage_h="yes"], [have_damage_h="no"],[-]) - CPPFLAGS="$save_CPPFLAGS" + 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"]) + AC_CHECK_FILE([${sdkdir}/damage.h], + [have_damage_h="yes"], [have_damage_h="no"]) fi AC_MSG_CHECKING([whether to include DRI support]) @@ -129,39 +108,18 @@ AC_MSG_RESULT([$DRI]) AM_CONDITIONAL(DRI, test x$DRI = xyes) if test "$DRI" = yes; then + PKG_CHECK_MODULES(DRI, [libdrm >= 2.2 xf86driproto]) AC_DEFINE(XF86DRI,1,[Enable DRI driver support]) AC_DEFINE(XF86DRI_DEVEL,1,[Enable developmental DRI driver support]) if test "$have_damage_h" = yes; then AC_DEFINE(DAMAGE,1,[Use Damage extension]) fi - - save_CFLAGS="$CFLAGS" - CFLAGS="$XORG_CFLAGS $DRI_CFLAGS $CFLAGS" - if test "$DRM_MODE" = yes; then - AC_CHECK_HEADER(xf86drmMode.h,[DRM_MODE=yes],[DRM_MODE=no],[#include -#include ]) - if test "x$DRM_MODE" = xyes; then - PKG_CHECK_MODULES(LIBDRM_RADEON, [xorg-server >= 1.6.2 libdrm_radeon], - [LIBDRM_RADEON=yes], [LIBDRM_RADEON=no]) - - if test "x$LIBDRM_RADEON" = xyes; then - AC_DEFINE(XF86DRM_MODE,1,[DRM kernel modesetting]) - AC_DEFINE(RADEON_DRI2, 1,[Enable DRI2 code]) - else - DRM_MODE=no - fi - PKG_CHECK_MODULES(LIBUDEV, [libudev], [LIBUDEV=yes], [LIBUDEV=no]) - if test "x$LIBUDEV" = xyes; then - AC_DEFINE(HAVE_LIBUDEV, 1,[libudev support]) - fi - fi - fi - CFLAGS="$save_CFLAGS" -else - DRM_MODE=no fi -AM_CONDITIONAL(DRM_MODE, test x$DRM_MODE = xyes) -AM_CONDITIONAL(LIBUDEV, test x$LIBUDEV = xyes) + +save_CFLAGS="$CFLAGS" +CFLAGS="$XORG_CFLAGS" +AC_CHECK_HEADER(xf86Modes.h,[XMODES=yes],[XMODES=no],[#include "xorg-server.h"]) +CFLAGS="$save_CFLAGS" AC_DEFINE(USE_XAA, 1, [Build support for XAA]) @@ -233,17 +191,52 @@ AC_CHECK_DECL(XSERVER_LIBPCIACCESS, [XSERVER_LIBPCIACCESS=yes],[XSERVER_LIBPCIACCESS=no], [#include "xorg-server.h"]) -AC_CHECK_HEADERS([list.h], - [], [], - [#include - #include "xorg-server.h"]) +AM_CONDITIONAL(XMODES, test "x$XMODES" = xno) + +if test "x$XSERVER_SOURCE" = x; then + if test -d ../../xserver; then + XSERVER_SOURCE="`cd ../../xserver && pwd`" + fi +fi + +if test -d "$XSERVER_SOURCE"; then + case "$XSERVER_SOURCE" in + /*) + ;; + *) + XSERVER_SOURCE="`cd $XSERVER_SOURCE && pwd`" + esac + if test -f src/modes/xf86Modes.h; then + : + else + ln -sf $XSERVER_SOURCE/hw/xfree86/modes src/modes + fi + + if test -f src/parser/xf86Parser.h; then + : + else + ln -sf $XSERVER_SOURCE/hw/xfree86/parser src/parser + fi +fi +if test "x$XMODES" = xyes; then + AC_MSG_NOTICE([X server has new mode code]) + AC_DEFINE(XMODES, 1,[X server has built-in mode code]) + XMODES_CFLAGS= +else + if test -f src/modes/xf86Modes.h -a -f src/parser/xf86Parser.h; then + AC_MSG_NOTICE([X server is missing new mode code, using local copy]) + else + AC_MSG_ERROR([Must have X server >= 1.3 source tree for mode setting code. Please specify --with-xserver-source]) + fi + XMODES_CFLAGS='-DXF86_MODES_RENAME -I$(top_srcdir)/src -I$(top_srcdir)/src/modes -I$(top_srcdir)/src/parser' +fi + +AC_SUBST([XMODES_CFLAGS]) CPPFLAGS="$SAVE_CPPFLAGS" AM_CONDITIONAL(USE_EXA, test "x$USE_EXA" = xyes) -AM_CONDITIONAL(XF86DRM_MODE, test "x$LIBDRM_RADEON" = xyes) - if test "x$XSERVER_LIBPCIACCESS" = xyes; then PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0]) XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS" @@ -315,11 +308,17 @@ case $host_os in AC_DEFINE(FGL_LINUX, 1, [Use linux pragma pack]) ;; esac +AC_SUBST([XORG_CFLAGS]) +AC_SUBST([DRI_CFLAGS]) AC_SUBST([moduledir]) DRIVER_NAME=ati AC_SUBST([DRIVER_NAME]) +XORG_MANPAGE_SECTIONS +XORG_RELEASE_VERSION +XORG_CHECK_LINUXDOC + AC_MSG_NOTICE( [The atimisc sub-driver has been split out to xf86-video-mach64:] [ git://anongit.freedesktop.org/git/xorg/driver/xf86-video-mach64] @@ -332,31 +331,8 @@ AC_MSG_NOTICE( [Please install that driver as well for rage128-based cards.] ) -AC_CONFIG_FILES([ - Makefile - src/Makefile - man/Makefile +AC_OUTPUT([ + Makefile + src/Makefile + man/Makefile ]) -AC_OUTPUT - -dnl -dnl Output some configuration info for the user -dnl -echo "" -echo " prefix: $prefix" -echo " exec_prefix: $exec_prefix" -echo " libdir: $libdir" -echo " includedir: $includedir" - - -echo "" -echo " Kernel modesetting: $DRM_MODE" - -echo "" -echo " CFLAGS: $CFLAGS" -echo " CXXFLAGS: $CXXFLAGS" -echo " Macros: $DEFINES" - -echo "" -echo " Run '${MAKE-make}' to build xf86-video-ati" -echo "" diff --git a/driver/xf86-video-ati/ltmain.sh b/driver/xf86-video-ati/ltmain.sh index 23cd75709..fccf69e28 100644 --- a/driver/xf86-video-ati/ltmain.sh +++ b/driver/xf86-video-ati/ltmain.sh @@ -1,90 +1,52 @@ - -# libtool (GNU libtool) 2.4.2 -# Written by Gordon Matzigkeit , 1996 - +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, -# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. -# This is free software; see the source for copying conditions. There is NO -# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - -# GNU Libtool is free software; you can redistribute it and/or modify +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# 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. # -# As a special exception to the GNU General Public License, -# if you distribute this file as part of a program or library that -# is built using GNU Libtool, you may include this file under the -# same distribution terms that you use for the rest of that program. -# -# GNU Libtool is distributed in the hope that it will be useful, but +# 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 GNU Libtool; see the file COPYING. If not, a copy -# can be downloaded from http://www.gnu.org/licenses/gpl.html, -# or obtained by writing to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. -# Usage: $progname [OPTION]... [MODE-ARG]... -# -# Provide generalized library-building support services. -# -# --config show all configuration variables -# --debug enable verbose shell tracing -# -n, --dry-run display commands without modifying any files -# --features display basic configuration information and exit -# --mode=MODE use operation mode MODE -# --preserve-dup-deps don't remove duplicate dependency libraries -# --quiet, --silent don't print informational messages -# --no-quiet, --no-silent -# print informational messages (default) -# --no-warn don't display warning messages -# --tag=TAG use configuration variables from tag TAG -# -v, --verbose print more informational messages than default -# --no-verbose don't print the extra informational messages -# --version print version information -# -h, --help, --help-all print short, long, or detailed help message -# -# MODE must be one of the following: -# -# clean remove files from the build directory -# compile compile a source file into a libtool object -# execute automatically set library path, then run a program -# finish complete the installation of libtool libraries -# install install libraries or executables -# link create a library or an executable -# uninstall remove libraries from an installed directory -# -# MODE-ARGS vary depending on the MODE. When passed as first option, -# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that. -# Try `$progname --help --mode=MODE' for a more detailed description of MODE. -# -# When reporting a bug, please describe a test case to reproduce it and -# include the following information: -# -# host-triplet: $host -# shell: $SHELL -# compiler: $LTCC -# compiler flags: $LTCFLAGS -# linker: $LD (gnu? $with_gnu_ld) -# $progname: (GNU libtool) 2.4.2 -# automake: $automake_version -# autoconf: $autoconf_version -# -# Report bugs to . -# GNU libtool home page: . -# General help using GNU software: . +basename="s,^.*/,,g" -PROGRAM=libtool +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath="$0" + +# The name of this program: +progname=`echo "$progpath" | $SED $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh PACKAGE=libtool -VERSION=2.4.2 -TIMESTAMP="" -package_revision=1.3337 +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" -# Be Bourne compatible +# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: @@ -98,457 +60,104 @@ fi BIN_SH=xpg4; export BIN_SH # for Tru64 DUALCASE=1; export DUALCASE # for MKS sh -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi -# NLS nuisances: We save the old values to restore during execute mode. -lt_user_locale= -lt_safe_locale= +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi -# func_dirname file append nondir_replacement -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -func_dirname () -{ - func_dirname_result=`$ECHO "${1}" | $SED "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi -} # func_dirname may be replaced by extended shell implementation - - -# func_basename file -func_basename () -{ - func_basename_result=`$ECHO "${1}" | $SED "$basename"` -} # func_basename may be replaced by extended shell implementation - - -# func_dirname_and_basename file append nondir_replacement -# perform func_basename and func_dirname in a single function -# call: -# dirname: Compute the dirname of FILE. If nonempty, -# add APPEND to the result, otherwise set result -# to NONDIR_REPLACEMENT. -# value returned in "$func_dirname_result" -# basename: Compute filename of FILE. -# value retuned in "$func_basename_result" -# Implementation must be kept synchronized with func_dirname -# and func_basename. For efficiency, we do not delegate to -# those functions but instead duplicate the functionality here. -func_dirname_and_basename () -{ - # Extract subdirectory from the argument. - func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"` - if test "X$func_dirname_result" = "X${1}"; then - func_dirname_result="${3}" - else - func_dirname_result="$func_dirname_result${2}" - fi - func_basename_result=`$ECHO "${1}" | $SED -e "$basename"` -} # func_dirname_and_basename may be replaced by extended shell implementation - - -# func_stripname prefix suffix name -# strip PREFIX and SUFFIX off of NAME. -# PREFIX and SUFFIX must not contain globbing or regex special -# characters, hashes, percent signs, but SUFFIX may contain a leading -# dot (in which case that matches only a dot). -# func_strip_suffix prefix name -func_stripname () -{ - case ${2} in - .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;; - *) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;; - esac -} # func_stripname may be replaced by extended shell implementation - - -# These SED scripts presuppose an absolute path with a trailing slash. -pathcar='s,^/\([^/]*\).*$,\1,' -pathcdr='s,^/[^/]*,,' -removedotparts=':dotsl - s@/\./@/@g - t dotsl - s,/\.$,/,' -collapseslashes='s@/\{1,\}@/@g' -finalslash='s,/*$,/,' - -# func_normal_abspath PATH -# Remove doubled-up and trailing slashes, "." path components, -# and cancel out any ".." path components in PATH after making -# it an absolute path. -# value returned in "$func_normal_abspath_result" -func_normal_abspath () -{ - # Start from root dir and reassemble the path. - func_normal_abspath_result= - func_normal_abspath_tpath=$1 - func_normal_abspath_altnamespace= - case $func_normal_abspath_tpath in - "") - # Empty path, that just means $cwd. - func_stripname '' '/' "`pwd`" - func_normal_abspath_result=$func_stripname_result - return - ;; - # The next three entries are used to spot a run of precisely - # two leading slashes without using negated character classes; - # we take advantage of case's first-match behaviour. - ///*) - # Unusual form of absolute path, do nothing. - ;; - //*) - # Not necessarily an ordinary path; POSIX reserves leading '//' - # and for example Cygwin uses it to access remote file shares - # over CIFS/SMB, so we conserve a leading double slash if found. - func_normal_abspath_altnamespace=/ - ;; - /*) - # Absolute path, do nothing. - ;; - *) - # Relative path, prepend $cwd. - func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath - ;; - esac - # Cancel out all the simple stuff to save iterations. We also want - # the path to end with a slash for ease of parsing, so make sure - # there is one (and only one) here. - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"` - while :; do - # Processed it all yet? - if test "$func_normal_abspath_tpath" = / ; then - # If we ascended to the root using ".." the result may be empty now. - if test -z "$func_normal_abspath_result" ; then - func_normal_abspath_result=/ - fi - break - fi - func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$pathcdr"` - # Figure out what to do with it - case $func_normal_abspath_tcomponent in - "") - # Trailing empty path component, ignore it. - ;; - ..) - # Parent dir; strip last assembled component from result. - func_dirname "$func_normal_abspath_result" - func_normal_abspath_result=$func_dirname_result - ;; - *) - # Actual path component, append it. - func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent - ;; - esac - done - # Restore leading double-slash if one was found on entry. - func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result -} - -# func_relative_path SRCDIR DSTDIR -# generates a relative path from SRCDIR to DSTDIR, with a trailing -# slash if non-empty, suitable for immediately appending a filename -# without needing to append a separator. -# value returned in "$func_relative_path_result" -func_relative_path () -{ - func_relative_path_result= - func_normal_abspath "$1" - func_relative_path_tlibdir=$func_normal_abspath_result - func_normal_abspath "$2" - func_relative_path_tbindir=$func_normal_abspath_result - - # Ascend the tree starting from libdir - while :; do - # check if we have found a prefix of bindir - case $func_relative_path_tbindir in - $func_relative_path_tlibdir) - # found an exact match - func_relative_path_tcancelled= - break - ;; - $func_relative_path_tlibdir*) - # found a matching prefix - func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" - func_relative_path_tcancelled=$func_stripname_result - if test -z "$func_relative_path_result"; then - func_relative_path_result=. - fi - break - ;; - *) - func_dirname $func_relative_path_tlibdir - func_relative_path_tlibdir=${func_dirname_result} - if test "x$func_relative_path_tlibdir" = x ; then - # Have to descend all the way to the root! - func_relative_path_result=../$func_relative_path_result - func_relative_path_tcancelled=$func_relative_path_tbindir - break - fi - func_relative_path_result=../$func_relative_path_result - ;; - esac - done - - # Now calculate path; take care to avoid doubling-up slashes. - func_stripname '' '/' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - func_stripname '/' '/' "$func_relative_path_tcancelled" - if test "x$func_stripname_result" != x ; then - func_relative_path_result=${func_relative_path_result}/${func_stripname_result} - fi - - # Normalisation. If bindir is libdir, return empty string, - # else relative path ending with a slash; either way, target - # file name can be directly appended. - if test ! -z "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result/" - func_relative_path_result=$func_stripname_result - fi -} - -# The name of this program: -func_dirname_and_basename "$progpath" -progname=$func_basename_result - -# Make sure we have an absolute path for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=$func_dirname_result - progdir=`cd "$progdir" && pwd` - progpath="$progdir/$progname" - ;; - *) - save_IFS="$IFS" - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS="$save_IFS" - test -x "$progdir/$progname" && break - done - IFS="$save_IFS" - test -n "$progdir" || progdir=`pwd` - progpath="$progdir/$progname" - ;; -esac - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -Xsed="${SED}"' -e 1s/^X//' -sed_quote_subst='s/\([`"$\\]\)/\\\1/g' - -# Same as above, but do not quote variable references. -double_quote_subst='s/\(["`\\]\)/\\\1/g' - -# Sed substitution that turns a string into a regex matching for the -# string literally. -sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' - -# Sed substitution that converts a w32 file name or path -# which contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-`\' parameter expansions in output of double_quote_subst that were -# `\'-ed in input to the same. If an odd number of `\' preceded a '$' -# in input to double_quote_subst, that '$' was protected from expansion. -# Since each input `\' is now two `\'s, look for any number of runs of -# four `\'s followed by two `\'s and then a '$'. `\' that '$'. -bs='\\' -bs2='\\\\' -bs4='\\\\\\\\' -dollar='\$' -sed_double_backslash="\ - s/$bs4/&\\ -/g - s/^$bs2$dollar/$bs&/ - s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g - s/\n//g" - -# Standard options: -opt_dry_run=false -opt_help=false -opt_quiet=false -opt_verbose=false -opt_warning=: - -# func_echo arg... -# Echo program name prefixed message, along with the current mode -# name if it has been set yet. -func_echo () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }$*" -} - -# func_verbose arg... -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $opt_verbose && func_echo ${1+"$@"} - - # A bug in bash halts the script if the last line of a function - # fails when set -e is in force, so we need another command to - # work around that: - : -} - -# func_echo_all arg... -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - -# func_error arg... -# Echo program name prefixed message to standard error. -func_error () -{ - $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2 -} - -# func_warning arg... -# Echo program name prefixed warning message to standard error. -func_warning () -{ - $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2 - - # bash bug again: - : -} - -# func_fatal_error arg... -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - -# func_fatal_help arg... -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - func_error ${1+"$@"} - func_fatal_error "$help" -} -help="Try \`$progname --help' for more information." ## default - - -# func_grep expression filename -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_mkdir_p directory-path -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - my_directory_path="$1" - my_dir_list= - - if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then - - # Protect directory names starting with `-' - case $my_directory_path in - -*) my_directory_path="./$my_directory_path" ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$my_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - my_dir_list="$my_directory_path:$my_dir_list" - - # If the last portion added has no slash in it, the list is done - case $my_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"` - done - my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'` - - save_mkdir_p_IFS="$IFS"; IFS=':' - for my_dir in $my_dir_list; do - IFS="$save_mkdir_p_IFS" - # mkdir can fail with a `File exist' error if two processes - # try to create one of the directories concurrently. Don't - # stop in that case! - $MKDIR "$my_dir" 2>/dev/null || : - done - IFS="$save_mkdir_p_IFS" - - # Bail out if we (or some other process) failed to create a directory. - test -d "$my_directory_path" || \ - func_fatal_error "Failed to create \`$1'" - fi -} +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 +##################################### +# Shell function definitions: +# This seems to be the best place for them # func_mktempdir [string] # Make a temporary directory that won't clash with other running @@ -558,7 +167,7 @@ func_mktempdir () { my_template="${TMPDIR-/tmp}/${1-$progname}" - if test "$opt_dry_run" = ":"; then + if test "$run" = ":"; then # Return a directory name, but don't create it in dry-run mode my_tmpdir="${my_template}-$$" else @@ -567,804 +176,71 @@ func_mktempdir () my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` if test ! -d "$my_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - my_tmpdir="${my_template}-${RANDOM-0}$$" + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" - save_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$my_tmpdir" - umask $save_mktempdir_umask + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask fi # If we're not in dry-run mode, bomb out on failure - test -d "$my_tmpdir" || \ - func_fatal_error "cannot create temporary directory \`$my_tmpdir'" + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } fi - $ECHO "$my_tmpdir" + $echo "X$my_tmpdir" | $Xsed } -# func_quote_for_eval arg -# Aesthetically quote ARG to be evaled later. -# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT -# is double-quoted, suitable for a subsequent eval, whereas -# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters -# which are still active within double quotes backslashified. -func_quote_for_eval () +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +func_win32_libid () { - case $1 in - *[\\\`\"\$]*) - func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;; - *) - func_quote_for_eval_unquoted_result="$1" ;; - esac - - case $func_quote_for_eval_unquoted_result in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and and variable - # expansion for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\"" - ;; - *) - func_quote_for_eval_result="$func_quote_for_eval_unquoted_result" - esac -} - - -# func_quote_for_expand arg -# Aesthetically quote ARG to be evaled later; same as above, -# but do not quote variable references. -func_quote_for_expand () -{ - case $1 in - *[\\\`\"]*) - my_arg=`$ECHO "$1" | $SED \ - -e "$double_quote_subst" -e "$sed_double_backslash"` ;; - *) - my_arg="$1" ;; - esac - - case $my_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting and command substitution for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - my_arg="\"$my_arg\"" - ;; - esac - - func_quote_for_expand_result="$my_arg" -} - - -# func_show_eval cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. -func_show_eval () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$my_cmd" - my_status=$? - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - - -# func_show_eval_locale cmd [fail_exp] -# Unless opt_silent is true, then output CMD. Then, if opt_dryrun is -# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP -# is given, then evaluate it. Use the saved locale for evaluation. -func_show_eval_locale () -{ - my_cmd="$1" - my_fail_exp="${2-:}" - - ${opt_silent-false} || { - func_quote_for_expand "$my_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - if ${opt_dry_run-false}; then :; else - eval "$lt_user_locale - $my_cmd" - my_status=$? - eval "$lt_safe_locale" - if test "$my_status" -eq 0; then :; else - eval "(exit $my_status); $my_fail_exp" - fi - fi -} - -# func_tr_sh -# Turn $1 into a string suitable for a shell variable name. -# Result is stored in $func_tr_sh_result. All characters -# not in the set a-zA-Z0-9_ are replaced with '_'. Further, -# if $1 begins with a digit, a '_' is prepended as well. -func_tr_sh () -{ - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'` + win32_libid_type="unknown" + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" ;; - * ) - func_tr_sh_result=$1 + *ar\ archive*) # could be an import, or static + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi ;; - esac -} - - -# func_version -# Echo version message to standard output and exit. -func_version () -{ - $opt_debug - - $SED -n '/(C)/!b go - :more - /\./!{ - N - s/\n# / / - b more - } - :go - /^# '$PROGRAM' (GNU /,/# warranty; / { - s/^# // - s/^# *$// - s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/ - p - }' < "$progpath" - exit $? -} - -# func_usage -# Echo short help message to standard output and exit. -func_usage () -{ - $opt_debug - - $SED -n '/^# Usage:/,/^# *.*--help/ { - s/^# // - s/^# *$// - s/\$progname/'$progname'/ - p - }' < "$progpath" - echo - $ECHO "run \`$progname --help | more' for full usage" - exit $? -} - -# func_help [NOEXIT] -# Echo long help message to standard output and exit, -# unless 'noexit' is passed as argument. -func_help () -{ - $opt_debug - - $SED -n '/^# Usage:/,/# Report bugs to/ { - :print - s/^# // - s/^# *$// - s*\$progname*'$progname'* - s*\$host*'"$host"'* - s*\$SHELL*'"$SHELL"'* - s*\$LTCC*'"$LTCC"'* - s*\$LTCFLAGS*'"$LTCFLAGS"'* - s*\$LD*'"$LD"'* - s/\$with_gnu_ld/'"$with_gnu_ld"'/ - s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/ - s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/ - p - d - } - /^# .* home page:/b print - /^# General help using/b print - ' < "$progpath" - ret=$? - if test -z "$1"; then - exit $ret - fi -} - -# func_missing_arg argname -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $opt_debug - - func_error "missing argument for $1." - exit_cmd=exit -} - - -# func_split_short_opt shortopt -# Set func_split_short_opt_name and func_split_short_opt_arg shell -# variables after splitting SHORTOPT after the 2nd character. -func_split_short_opt () -{ - my_sed_short_opt='1s/^\(..\).*$/\1/;q' - my_sed_short_rest='1s/^..\(.*\)$/\1/;q' - - func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"` - func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"` -} # func_split_short_opt may be replaced by extended shell implementation - - -# func_split_long_opt longopt -# Set func_split_long_opt_name and func_split_long_opt_arg shell -# variables after splitting LONGOPT at the `=' sign. -func_split_long_opt () -{ - my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q' - my_sed_long_arg='1s/^--[^=]*=//' - - func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"` - func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"` -} # func_split_long_opt may be replaced by extended shell implementation - -exit_cmd=: - - - - - -magic="%%%MAGIC variable%%%" -magic_exe="%%%MAGIC EXE variable%%%" - -# Global variables. -nonopt= -preserve_args= -lo2o="s/\\.lo\$/.${objext}/" -o2lo="s/\\.${objext}\$/.lo/" -extracted_archives= -extracted_serial=0 - -# If this variable is set in any of the actions, the command in it -# will be execed at the end. This prevents here-documents from being -# left over by shells. -exec_cmd= - -# func_append var value -# Append VALUE to the end of shell variable VAR. -func_append () -{ - eval "${1}=\$${1}\${2}" -} # func_append may be replaced by extended shell implementation - -# func_append_quoted var value -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -func_append_quoted () -{ - func_quote_for_eval "${2}" - eval "${1}=\$${1}\\ \$func_quote_for_eval_result" -} # func_append_quoted may be replaced by extended shell implementation - - -# func_arith arithmetic-term... -func_arith () -{ - func_arith_result=`expr "${@}"` -} # func_arith may be replaced by extended shell implementation - - -# func_len string -# STRING may not start with a hyphen. -func_len () -{ - func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len` -} # func_len may be replaced by extended shell implementation - - -# func_lo2o object -func_lo2o () -{ - func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"` -} # func_lo2o may be replaced by extended shell implementation - - -# func_xform libobj-or-source -func_xform () -{ - func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'` -} # func_xform may be replaced by extended shell implementation - - -# func_fatal_configuration arg... -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func_error ${1+"$@"} - func_error "See the $PACKAGE documentation for more information." - func_fatal_error "Fatal configuration error." -} - - -# func_config -# Display the configuration for all the tags in this script. -func_config () -{ - re_begincf='^# ### BEGIN LIBTOOL' - re_endcf='^# ### END LIBTOOL' - - # Default configuration. - $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" - - # Now print the configurations for the tags. - for tagname in $taglist; do - $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" - done - - exit $? -} - -# func_features -# Display the features supported by this script. -func_features () -{ - echo "host: $host" - if test "$build_libtool_libs" = yes; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test "$build_old_libs" = yes; then - echo "enable static libraries" - else - echo "disable static libraries" - fi - - exit $? -} - -# func_enable_tag tagname -# Verify that TAGNAME is valid, and either flag an error and exit, or -# enable the TAGNAME tag. We also add TAGNAME to the global $taglist -# variable here. -func_enable_tag () -{ - # Global variable: - tagname="$1" - - re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" - re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" - sed_extractcf="/$re_begincf/,/$re_endcf/p" - - # Validate tagname. - case $tagname in - *[!-_A-Za-z0-9,/]*) - func_fatal_error "invalid tag name: $tagname" + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" ;; - esac - - # Don't test for the "default" C tag, as we know it's - # there but not specially marked. - case $tagname in - CC) ;; - *) - if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then - taglist="$taglist $tagname" - - # Evaluate the configuration. Be careful to quote the path - # and the sed script, to avoid splitting on whitespace, but - # also don't use non-portable quotes within backquotes within - # quotes we have to do it in 2 steps: - extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` - eval "$extractedcf" - else - func_error "ignoring unknown tag $tagname" - fi - ;; - esac -} - -# func_check_version_match -# Ensure that we are using m4 macros, and libtool script from the same -# release of libtool. -func_check_version_match () -{ - if test "$package_revision" != "$macro_revision"; then - if test "$VERSION" != "$macro_version"; then - if test -z "$macro_version"; then - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from an older release. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, but the -$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. -$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION -$progname: and run autoconf again. -_LT_EOF - fi - else - cat >&2 <<_LT_EOF -$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, -$progname: but the definition of this LT_INIT comes from revision $macro_revision. -$progname: You should recreate aclocal.m4 with macros from revision $package_revision -$progname: of $PACKAGE $VERSION and run autoconf again. -_LT_EOF - fi - - exit $EXIT_MISMATCH - fi -} - - -# Shorthand for --mode=foo, only valid as the first argument -case $1 in -clean|clea|cle|cl) - shift; set dummy --mode clean ${1+"$@"}; shift - ;; -compile|compil|compi|comp|com|co|c) - shift; set dummy --mode compile ${1+"$@"}; shift - ;; -execute|execut|execu|exec|exe|ex|e) - shift; set dummy --mode execute ${1+"$@"}; shift - ;; -finish|finis|fini|fin|fi|f) - shift; set dummy --mode finish ${1+"$@"}; shift - ;; -install|instal|insta|inst|ins|in|i) - shift; set dummy --mode install ${1+"$@"}; shift - ;; -link|lin|li|l) - shift; set dummy --mode link ${1+"$@"}; shift - ;; -uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) - shift; set dummy --mode uninstall ${1+"$@"}; shift - ;; -esac - - - -# Option defaults: -opt_debug=: -opt_dry_run=false -opt_config=false -opt_preserve_dup_deps=false -opt_features=false -opt_finish=false -opt_help=false -opt_help_all=false -opt_silent=: -opt_warning=: -opt_verbose=: -opt_silent=false -opt_verbose=false - - -# Parse options once, thoroughly. This comes as soon as possible in the -# script to make things like `--version' happen as quickly as we can. -{ - # this just eases exit handling - while test $# -gt 0; do - opt="$1" - shift - case $opt in - --debug|-x) opt_debug='set -x' - func_echo "enabling shell trace mode" - $opt_debug - ;; - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - --config) - opt_config=: -func_config - ;; - --dlopen|-dlopen) - optarg="$1" - opt_dlopen="${opt_dlopen+$opt_dlopen -}$optarg" - shift - ;; - --preserve-dup-deps) - opt_preserve_dup_deps=: - ;; - --features) - opt_features=: -func_features - ;; - --finish) - opt_finish=: -set dummy --mode finish ${1+"$@"}; shift - ;; - --help) - opt_help=: - ;; - --help-all) - opt_help_all=: -opt_help=': help-all' - ;; - --mode) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_mode="$optarg" -case $optarg in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $opt" - exit_cmd=exit - break - ;; -esac - shift - ;; - --no-silent|--no-quiet) - opt_silent=false -func_append preserve_args " $opt" - ;; - --no-warning|--no-warn) - opt_warning=false -func_append preserve_args " $opt" - ;; - --no-verbose) - opt_verbose=false -func_append preserve_args " $opt" - ;; - --silent|--quiet) - opt_silent=: -func_append preserve_args " $opt" - opt_verbose=false - ;; - --verbose|-v) - opt_verbose=: -func_append preserve_args " $opt" -opt_silent=false - ;; - --tag) - test $# = 0 && func_missing_arg $opt && break - optarg="$1" - opt_tag="$optarg" -func_append preserve_args " $opt $optarg" -func_enable_tag "$optarg" - shift - ;; - - -\?|-h) func_usage ;; - --help) func_help ;; - --version) func_version ;; - - # Separate optargs to long options: - --*=*) - func_split_long_opt "$opt" - set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-n*|-v*) - func_split_short_opt "$opt" - set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognized option \`$opt'" ;; - *) set dummy "$opt" ${1+"$@"}; shift; break ;; esac - done - - # Validate options: - - # save first non-option argument - if test "$#" -gt 0; then - nonopt="$opt" - shift - fi - - # preserve --debug - test "$opt_debug" = : || func_append preserve_args " --debug" - - case $host in - *cygwin* | *mingw* | *pw32* | *cegcc*) - # don't eliminate duplications in $postdeps and $predeps - opt_duplicate_compiler_generated_deps=: - ;; - *) - opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps - ;; - esac - - $opt_help || { - # Sanity checks first: - func_check_version_match - - if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then - func_fatal_configuration "not configured to build any kind of library" - fi - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test "$opt_mode" != execute; then - func_error "unrecognized option \`-dlopen'" - $ECHO "$help" 1>&2 - exit $EXIT_FAILURE - fi - - # Change the help message to a mode-specific one. - generic_help="$help" - help="Try \`$progname --help --mode=$opt_mode' for more information." - } - - - # Bail if the options were screwed - $exit_cmd $EXIT_FAILURE -} - - - - -## ----------- ## -## Main. ## -## ----------- ## - -# func_lalib_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_lalib_p () -{ - test -f "$1" && - $SED -e 4q "$1" 2>/dev/null \ - | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# func_lalib_unsafe_p file -# True iff FILE is a libtool `.la' library or `.lo' object file. -# This function implements the same check as func_lalib_p without -# resorting to external programs. To this end, it redirects stdin and -# closes it afterwards, without saving the original file descriptor. -# As a safety measure, use it only where a negative result would be -# fatal anyway. Works if `file' does not exist. -func_lalib_unsafe_p () -{ - lalib_p=no - if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then - for lalib_p_l in 1 2 3 4 - do - read lalib_p_line - case "$lalib_p_line" in - \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; - esac - done - exec 0<&5 5<&- - fi - test "$lalib_p" = yes -} - -# func_ltwrapper_script_p file -# True iff FILE is a libtool wrapper script -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_script_p () -{ - func_lalib_p "$1" -} - -# func_ltwrapper_executable_p file -# True iff FILE is a libtool wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_executable_p () -{ - func_ltwrapper_exec_suffix= - case $1 in - *.exe) ;; - *) func_ltwrapper_exec_suffix=.exe ;; - esac - $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 -} - -# func_ltwrapper_scriptname file -# Assumes file is an ltwrapper_executable -# uses $file to determine the appropriate filename for a -# temporary ltwrapper_script. -func_ltwrapper_scriptname () -{ - func_dirname_and_basename "$1" "" "." - func_stripname '' '.exe' "$func_basename_result" - func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper" -} - -# func_ltwrapper_p file -# True iff FILE is a libtool wrapper script or wrapper executable -# This function is only a basic sanity check; it will hardly flush out -# determined imposters. -func_ltwrapper_p () -{ - func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" -} - - -# func_execute_cmds commands fail_cmd -# Execute tilde-delimited COMMANDS. -# If FAIL_CMD is given, eval that upon failure. -# FAIL_CMD may read-access the current command in variable CMD! -func_execute_cmds () -{ - $opt_debug - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$save_ifs - eval cmd=\"$cmd\" - func_show_eval "$cmd" "${2-:}" - done - IFS=$save_ifs -} - - -# func_source file -# Source FILE, adding directory component if necessary. -# Note that it is not necessary on cygwin/mingw to append a dot to -# FILE even if both FILE and FILE.exe exist: automatic-append-.exe -# behavior happens only for exec(3), not for open(2)! Also, sourcing -# `FILE.' does not work on cygwin managed mounts. -func_source () -{ - $opt_debug - case $1 in - */* | *\\*) . "$1" ;; - *) . "./$1" ;; - esac -} - - -# func_resolve_sysroot PATH -# Replace a leading = in PATH with a sysroot. Store the result into -# func_resolve_sysroot_result -func_resolve_sysroot () -{ - func_resolve_sysroot_result=$1 - case $func_resolve_sysroot_result in - =*) - func_stripname '=' '' "$func_resolve_sysroot_result" - func_resolve_sysroot_result=$lt_sysroot$func_stripname_result ;; esac + $echo $win32_libid_type } -# func_replace_sysroot PATH -# If PATH begins with the sysroot, replace it with = and -# store the result into func_replace_sysroot_result. -func_replace_sysroot () -{ - case "$lt_sysroot:$1" in - ?*:"$lt_sysroot"*) - func_stripname "$lt_sysroot" '' "$1" - func_replace_sysroot_result="=$func_stripname_result" - ;; - *) - # Including no sysroot. - func_replace_sysroot_result=$1 - ;; - esac -} # func_infer_tag arg # Infer tagged configuration to use if any are available and @@ -1374,36 +250,39 @@ func_replace_sysroot () # arg is usually of the form 'gcc ...' func_infer_tag () { - $opt_debug if test -n "$available_tags" && test -z "$tagname"; then CC_quoted= for arg in $CC; do - func_append_quoted CC_quoted "$arg" + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` case $@ in # Blanks in the command may have been stripped by the calling shell, # but not from the CC environment variable when configure was run. - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; # Blanks at the start of $base_compile will cause this to fail # if we don't check for them as well. *) for z in $available_tags; do - if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then # Evaluate the configuration. eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" CC_quoted= for arg in $CC; do - # Double-quote args containing other shell metacharacters. - func_append_quoted CC_quoted "$arg" - done - CC_expanded=`func_echo_all $CC` - CC_quoted_expanded=`func_echo_all $CC_quoted` + # Double-quote args containing other shell metacharacters. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done case "$@ " in - " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ - " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) # The compiler in the base compile command matches # the one in the tagged configuration. # Assume this is the tagged configuration we want. @@ -1417,10 +296,11 @@ func_infer_tag () # was found and let the user know that the "--tag" command # line option must be used. if test -z "$tagname"; then - func_echo "unable to infer tagged configuration" - func_fatal_error "specify a tag with \`--tag'" -# else -# func_verbose "using $tagname tagged configuration" + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" fi ;; esac @@ -1428,528 +308,354 @@ func_infer_tag () } - -# func_write_libtool_object output_name pic_name nonpic_name -# Create a libtool object file (analogous to a ".la" file), -# but don't create it if we're doing a dry run. -func_write_libtool_object () +# func_extract_an_archive dir oldlib +func_extract_an_archive () { - write_libobj=${1} - if test "$build_libtool_libs" = yes; then - write_lobj=\'${2}\' + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : else - write_lobj=none + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE fi - - if test "$build_old_libs" = yes; then - write_oldobj=\'${3}\' - else - write_oldobj=none - fi - - $opt_dry_run || { - cat >${write_libobj}T </dev/null` - if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then - func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | - $SED -e "$lt_sed_naive_backslashify"` - else - func_convert_core_file_wine_to_w32_result= + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status fi - fi -} -# end: func_convert_core_file_wine_to_w32 + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir="$my_gentop/$my_xlib_u" -# func_convert_core_path_wine_to_w32 ARG -# Helper function used by path conversion functions when $build is *nix, and -# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly -# configured wine environment available, with the winepath program in $build's -# $PATH. Assumes ARG has no leading or trailing path separator characters. -# -# ARG is path to be converted from $build format to win32. -# Result is available in $func_convert_core_path_wine_to_w32_result. -# Unconvertible file (directory) names in ARG are skipped; if no directory names -# are convertible, then the result may be empty. -func_convert_core_path_wine_to_w32 () -{ - $opt_debug - # unfortunately, winepath doesn't convert paths, only file names - func_convert_core_path_wine_to_w32_result="" - if test -n "$1"; then - oldIFS=$IFS - IFS=: - for func_convert_core_path_wine_to_w32_f in $1; do - IFS=$oldIFS - func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" - if test -n "$func_convert_core_file_wine_to_w32_result" ; then - if test -z "$func_convert_core_path_wine_to_w32_result"; then - func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result" - else - func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" - fi + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + mkdir -p "unfat-$$/${darwin_base_archive}-${darwin_arch}" + lipo -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" + cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" + func_extract_an_archive "`pwd`" "${darwin_base_archive}" + cd "$darwin_curdir" + $rm "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" + done # $darwin_arches + ## Okay now we have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` done - IFS=$oldIFS - fi + func_extract_archives_result="$my_oldobjs" } -# end: func_convert_core_path_wine_to_w32 +# End of Shell function definitions +##################################### +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" -# func_cygpath ARGS... -# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when -# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) -# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or -# (2), returns the Cygwin file name or path in func_cygpath_result (input -# file name or path is assumed to be in w32 format, as previously converted -# from $build's *nix or MSYS format). In case (3), returns the w32 file name -# or path in func_cygpath_result (input file name or path is assumed to be in -# Cygwin format). Returns an empty string on error. -# -# ARGS are passed to cygpath, with the last one being the file name or path to -# be converted. -# -# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH -# environment variable; do not put it in $PATH. -func_cygpath () -{ - $opt_debug - if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then - func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` - if test "$?" -ne 0; then - # on failure, ensure result is empty - func_cygpath_result= - fi - else - func_cygpath_result= - func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'" - fi -} -#end: func_cygpath +disable_libs=no +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift -# func_convert_core_msys_to_w32 ARG -# Convert file name or path ARG from MSYS format to w32 format. Return -# result in func_convert_core_msys_to_w32_result. -func_convert_core_msys_to_w32 () -{ - $opt_debug - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"` -} -#end: func_convert_core_msys_to_w32 - - -# func_convert_file_check ARG1 ARG2 -# Verify that ARG1 (a file name in $build format) was converted to $host -# format in ARG2. Otherwise, emit an error message, but continue (resetting -# func_to_host_file_result to ARG1). -func_convert_file_check () -{ - $opt_debug - if test -z "$2" && test -n "$1" ; then - func_error "Could not determine host file name corresponding to" - func_error " \`$1'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback: - func_to_host_file_result="$1" - fi -} -# end func_convert_file_check - - -# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH -# Verify that FROM_PATH (a path in $build format) was converted to $host -# format in TO_PATH. Otherwise, emit an error message, but continue, resetting -# func_to_host_file_result to a simplistic fallback value (see below). -func_convert_path_check () -{ - $opt_debug - if test -z "$4" && test -n "$3"; then - func_error "Could not determine the host path corresponding to" - func_error " \`$3'" - func_error "Continuing, but uninstalled executables may not work." - # Fallback. This is a deliberately simplistic "conversion" and - # should not be "improved". See libtool.info. - if test "x$1" != "x$2"; then - lt_replace_pathsep_chars="s|$1|$2|g" - func_to_host_path_result=`echo "$3" | - $SED -e "$lt_replace_pathsep_chars"` - else - func_to_host_path_result="$3" - fi - fi -} -# end func_convert_path_check - - -# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG -# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT -# and appending REPL if ORIG matches BACKPAT. -func_convert_path_front_back_pathsep () -{ - $opt_debug - case $4 in - $1 ) func_to_host_path_result="$3$func_to_host_path_result" - ;; + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; esac - case $4 in - $2 ) func_append func_to_host_path_result "$3" - ;; - esac -} -# end func_convert_path_front_back_pathsep + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" -################################################## -# $build to $host FILE NAME CONVERSION FUNCTIONS # -################################################## -# invoked via `$to_host_file_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# Result will be available in $func_to_host_file_result. + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac - -# func_to_host_file ARG -# Converts the file name ARG from $build format to $host format. Return result -# in func_to_host_file_result. -func_to_host_file () -{ - $opt_debug - $to_host_file_cmd "$1" -} -# end func_to_host_file - - -# func_to_tool_file ARG LAZY -# converts the file name ARG from $build format to toolchain format. Return -# result in func_to_tool_file_result. If the conversion in use is listed -# in (the comma separated) LAZY, no conversion takes place. -func_to_tool_file () -{ - $opt_debug - case ,$2, in - *,"$to_tool_file_cmd",*) - func_to_tool_file_result=$1 + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac ;; *) - $to_tool_file_cmd "$1" - func_to_tool_file_result=$func_to_host_file_result + eval "$prev=\$arg" ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 Free Software Foundation, Inc. +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; esac -} -# end func_to_tool_file +done +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi -# func_convert_file_noop ARG -# Copy ARG to func_to_host_file_result. -func_convert_file_noop () -{ - func_to_host_file_result="$1" -} -# end func_convert_file_noop +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= -# func_convert_file_msys_to_w32 ARG -# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_file_result. -func_convert_file_msys_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_to_host_file_result="$func_convert_core_msys_to_w32_result" +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_w32 - -# func_convert_file_cygwin_to_w32 ARG -# Convert file name ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_file_cygwin_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # because $build is cygwin, we call "the" cygpath in $PATH; no need to use - # LT_CYGPATH in this case. - func_to_host_file_result=`cygpath -m "$1"` + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_cygwin_to_w32 + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." -# func_convert_file_nix_to_w32 ARG -# Convert file name ARG from *nix to w32 format. Requires a wine environment -# and a working winepath. Returns result in func_to_host_file_result. -func_convert_file_nix_to_w32 () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_file_wine_to_w32 "$1" - func_to_host_file_result="$func_convert_core_file_wine_to_w32_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_w32 - - -# func_convert_file_msys_to_cygwin ARG -# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_file_msys_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - func_convert_core_msys_to_w32 "$1" - func_cygpath -u "$func_convert_core_msys_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_msys_to_cygwin - - -# func_convert_file_nix_to_cygwin ARG -# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed -# in a wine environment, working winepath, and LT_CYGPATH set. Returns result -# in func_to_host_file_result. -func_convert_file_nix_to_cygwin () -{ - $opt_debug - func_to_host_file_result="$1" - if test -n "$1"; then - # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. - func_convert_core_file_wine_to_w32 "$1" - func_cygpath -u "$func_convert_core_file_wine_to_w32_result" - func_to_host_file_result="$func_cygpath_result" - fi - func_convert_file_check "$1" "$func_to_host_file_result" -} -# end func_convert_file_nix_to_cygwin - - -############################################# -# $build to $host PATH CONVERSION FUNCTIONS # -############################################# -# invoked via `$to_host_path_cmd ARG' -# -# In each case, ARG is the path to be converted from $build to $host format. -# The result will be available in $func_to_host_path_result. -# -# Path separators are also converted from $build format to $host format. If -# ARG begins or ends with a path separator character, it is preserved (but -# converted to $host format) on output. -# -# All path conversion functions are named using the following convention: -# file name conversion function : func_convert_file_X_to_Y () -# path conversion function : func_convert_path_X_to_Y () -# where, for any given $build/$host combination the 'X_to_Y' value is the -# same. If conversion functions are added for new $build/$host combinations, -# the two new functions must follow this pattern, or func_init_to_host_path_cmd -# will break. - - -# func_init_to_host_path_cmd -# Ensures that function "pointer" variable $to_host_path_cmd is set to the -# appropriate value, based on the value of $to_host_file_cmd. -to_host_path_cmd= -func_init_to_host_path_cmd () -{ - $opt_debug - if test -z "$to_host_path_cmd"; then - func_stripname 'func_convert_file_' '' "$to_host_file_cmd" - to_host_path_cmd="func_convert_path_${func_stripname_result}" - fi -} - - -# func_to_host_path ARG -# Converts the path ARG from $build format to $host format. Return result -# in func_to_host_path_result. -func_to_host_path () -{ - $opt_debug - func_init_to_host_path_cmd - $to_host_path_cmd "$1" -} -# end func_to_host_path - - -# func_convert_path_noop ARG -# Copy ARG to func_to_host_path_result. -func_convert_path_noop () -{ - func_to_host_path_result="$1" -} -# end func_convert_path_noop - - -# func_convert_path_msys_to_w32 ARG -# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic -# conversion to w32 is not available inside the cwrapper. Returns result in -# func_to_host_path_result. -func_convert_path_msys_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from ARG. MSYS - # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; - # and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_msys_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_msys_to_w32 - - -# func_convert_path_cygwin_to_w32 ARG -# Convert path ARG from Cygwin to w32 format. Returns result in -# func_to_host_file_result. -func_convert_path_cygwin_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_cygwin_to_w32 - - -# func_convert_path_nix_to_w32 ARG -# Convert path ARG from *nix to w32 format. Requires a wine environment and -# a working winepath. Returns result in func_to_host_file_result. -func_convert_path_nix_to_w32 () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_to_host_path_result="$func_convert_core_path_wine_to_w32_result" - func_convert_path_check : ";" \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" - fi -} -# end func_convert_path_nix_to_w32 - - -# func_convert_path_msys_to_cygwin ARG -# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. -# Returns result in func_to_host_file_result. -func_convert_path_msys_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # See func_convert_path_msys_to_w32: - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_msys_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_msys_to_cygwin - - -# func_convert_path_nix_to_cygwin ARG -# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a -# a wine environment, working winepath, and LT_CYGPATH set. Returns result in -# func_to_host_file_result. -func_convert_path_nix_to_cygwin () -{ - $opt_debug - func_to_host_path_result="$1" - if test -n "$1"; then - # Remove leading and trailing path separator characters from - # ARG. msys behavior is inconsistent here, cygpath turns them - # into '.;' and ';.', and winepath ignores them completely. - func_stripname : : "$1" - func_to_host_path_tmp1=$func_stripname_result - func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" - func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" - func_to_host_path_result="$func_cygpath_result" - func_convert_path_check : : \ - "$func_to_host_path_tmp1" "$func_to_host_path_result" - func_convert_path_front_back_pathsep ":*" "*:" : "$1" - fi -} -# end func_convert_path_nix_to_cygwin - - -# func_mode_compile arg... -func_mode_compile () -{ - $opt_debug + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" # Get the compilation command and the source file. base_compile= srcfile="$nonopt" # always keep a non-empty value in "srcfile" @@ -1958,7 +664,6 @@ func_mode_compile () arg_mode=normal libobj= later= - pie_flag= for arg do @@ -1979,19 +684,16 @@ func_mode_compile () # Accept any command-line options. case $arg in -o) - test -n "$libobj" && \ - func_fatal_error "you cannot specify \`-o' more than once" + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi arg_mode=target continue ;; - -pie | -fpie | -fPIE) - func_append pie_flag " $arg" - continue - ;; - - -shared | -static | -prefer-pic | -prefer-non-pic) - func_append later " $arg" + -static | -prefer-pic | -prefer-non-pic) + later="$later $arg" continue ;; @@ -2006,24 +708,31 @@ func_mode_compile () ;; # replaced later. I would guess that would be a bug. -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` lastarg= save_ifs="$IFS"; IFS=',' - for arg in $args; do + for arg in $args; do IFS="$save_ifs" - func_append_quoted lastarg "$arg" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" done IFS="$save_ifs" - func_stripname ' ' '' "$lastarg" - lastarg=$func_stripname_result + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` # Add the arguments to base_compile. - func_append base_compile " $lastarg" + base_compile="$base_compile $lastarg" continue ;; - *) + * ) # Accept the current argument as the source file. # The previous "srcfile" becomes the current argument. # @@ -2035,41 +744,66 @@ func_mode_compile () esac # case $arg_mode # Aesthetically quote the previous argument. - func_append_quoted base_compile "$lastarg" + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" done # for arg case $arg_mode in arg) - func_fatal_error "you must specify an argument for -Xcompile" + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE ;; target) - func_fatal_error "you must specify a target with \`-o'" + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE ;; *) # Get the name of the library object. - test -z "$libobj" && { - func_basename "$srcfile" - libobj="$func_basename_result" - } + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` ;; esac # Recognize several different file suffixes. # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' case $libobj in - *.[cCFSifmso] | \ - *.ada | *.adb | *.ads | *.asm | \ - *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ - *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) - func_xform "$libobj" - libobj=$func_xform_result - ;; + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; esac + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + case $libobj in - *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; *) - func_fatal_error "cannot determine name of library object from \`$libobj'" + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE ;; esac @@ -2077,15 +811,7 @@ func_mode_compile () for arg in $later; do case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - continue - ;; - -static) - build_libtool_libs=no build_old_libs=yes continue ;; @@ -2102,17 +828,28 @@ func_mode_compile () esac done - func_quote_for_eval "$libobj" - test "X$libobj" != "X$func_quote_for_eval_result" \ - && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ - && func_warning "libobj name \`$libobj' may not contain shell special characters." - func_dirname_and_basename "$obj" "/" "" - objname="$func_basename_result" - xdir="$func_dirname_result" + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi lobj=${xdir}$objdir/$objname - test -z "$base_compile" && \ - func_fatal_help "you must specify a compilation command" + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi # Delete any leftover library objects. if test "$build_old_libs" = yes; then @@ -2121,9 +858,12 @@ func_mode_compile () removelist="$lobj $libobj ${libobj}T" fi + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + # On Cygwin there's no "real" PIC flag so we must build both object types case $host_os in - cygwin* | mingw* | pw32* | os2* | cegcc*) + cygwin* | mingw* | pw32* | os2*) pic_mode=default ;; esac @@ -2135,8 +875,10 @@ func_mode_compile () # Calculate the filename of the output object if compiler does # not support -o with -c if test "$compiler_c_o" = no; then - output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext} + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 else output_obj= need_locks=no @@ -2146,13 +888,13 @@ func_mode_compile () # Lock this critical section if it is needed # We use this script file to make the link, it avoids creating a new file if test "$need_locks" = yes; then - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" sleep 2 done elif test "$need_locks" = warn; then if test -f "$lockfile"; then - $ECHO "\ + $echo "\ *** ERROR, $lockfile exists and contains: `cat $lockfile 2>/dev/null` @@ -2163,21 +905,34 @@ repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." - $opt_dry_run || $RM $removelist + $run $rm $removelist exit $EXIT_FAILURE fi - func_append removelist " $output_obj" - $ECHO "$srcfile" > "$lockfile" + $echo "$srcfile" > "$lockfile" fi - $opt_dry_run || $RM $removelist - func_append removelist " $lockfile" - trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac - func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 - srcfile=$func_to_tool_file_result - func_quote_for_eval "$srcfile" - qsrcfile=$func_quote_for_eval_result + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then - $ECHO "\ + $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -2217,42 +985,65 @@ repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." - $opt_dry_run || $RM $removelist + $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed, then go on to compile the next one if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then - func_show_eval '$MV "$output_obj" "$lobj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi fi + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then - $ECHO "\ + $echo "\ *** ERROR, $lockfile contains: `cat $lockfile 2>/dev/null` @@ -2266,2794 +1057,53 @@ repeat this compilation, it may succeed, by chance, but you had better avoid parallel builds (make -j) in this platform, or get a better compiler." - $opt_dry_run || $RM $removelist + $run $rm $removelist exit $EXIT_FAILURE fi # Just move the object if needed if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then - func_show_eval '$MV "$output_obj" "$obj"' \ - 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T < $tmpdir/tmp-la - mv -f $tmpdir/tmp-la $lib - done - ${RM}r "$tmpdir" - fi - fi - - if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then - for libdir in $libdirs; do - if test -n "$finish_cmds"; then - # Do each command in the finish commands. - func_execute_cmds "$finish_cmds" 'admincmds="$admincmds -'"$cmd"'"' - fi - if test -n "$finish_eval"; then - # Do the single finish_eval. - eval cmds=\"$finish_eval\" - $opt_dry_run || eval "$cmds" || func_append admincmds " - $cmds" - fi - done - fi - - # Exit here if they wanted silent mode. - $opt_silent && exit $EXIT_SUCCESS - - exit $EXIT_SUCCESS -} - -test "$opt_mode" = finish && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $opt_debug - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || - # Allow the use of GNU shtool's install command. - case $nonopt in *shtool*) :;; *) false;; esac; then - # Aesthetically quote it. - func_quote_for_eval "$nonopt" - install_prog="$func_quote_for_eval_result " - arg=$1 - shift - else - install_prog= - arg=$nonopt - fi - - # The real first argument should be the name of the installation program. - # Aesthetically quote it. - func_quote_for_eval "$arg" - func_append install_prog "$func_quote_for_eval_result" - install_shared_prog=$install_prog - case " $install_prog " in - *[\\\ /]cp\ *) install_cp=: ;; - *) install_cp=false ;; - esac - - # We need to accept at least all the BSD install flags. - dest= - files= - opts= - prev= - install_type= - isdir=no - stripme= - no_mode=: - for arg - do - arg2= - if test -n "$dest"; then - func_append files " $dest" - dest=$arg - continue - fi - - case $arg in - -d) isdir=yes ;; - -f) - if $install_cp; then :; else - prev=$arg - fi - ;; - -g | -m | -o) - prev=$arg - ;; - -s) - stripme=" -s" - continue - ;; - -*) - ;; - *) - # If the previous option needed an argument, then skip it. - if test -n "$prev"; then - if test "x$prev" = x-m && test -n "$install_override_mode"; then - arg2=$install_override_mode - no_mode=false - fi - prev= - else - dest=$arg - continue - fi - ;; - esac - - # Aesthetically quote the argument. - func_quote_for_eval "$arg" - func_append install_prog " $func_quote_for_eval_result" - if test -n "$arg2"; then - func_quote_for_eval "$arg2" - fi - func_append install_shared_prog " $func_quote_for_eval_result" - done - case " $install_prog " in - *[\\\ /]cp\ *) extra_mode=;; - *) extra_mode='-m 644';; - esac - - test -z "$install_prog" && \ - func_fatal_help "you must specify an install program" - - test -n "$prev" && \ - func_fatal_help "the \`$prev' option requires an argument" - - if test -n "$install_override_mode" && $no_mode; then - if $install_cp; then :; else - func_quote_for_eval "$install_override_mode" - func_append install_shared_prog " -m $func_quote_for_eval_result" - fi - fi - - if test -z "$files"; then - if test -z "$dest"; then - func_fatal_help "no file or destination specified" - else - func_fatal_help "you must specify a destination" - fi - fi - - # Strip any trailing slash from the destination. - func_stripname '' '/' "$dest" - dest=$func_stripname_result - - # Check to see that the destination is a directory. - test -d "$dest" && isdir=yes - if test "$isdir" = yes; then - destdir="$dest" - destname= - else - func_dirname_and_basename "$dest" "" "." - destdir="$func_dirname_result" - destname="$func_basename_result" - - # Not a directory, so check to see that there is only one file specified. - set dummy $files; shift - test "$#" -gt 1 && \ - func_fatal_help "\`$dest' is not a directory" - fi - case $destdir in - [\\/]* | [A-Za-z]:[\\/]*) ;; - *) - for file in $files; do - case $file in - *.lo) ;; - *) - func_fatal_help "\`$destdir' must be an absolute directory name" - ;; - esac - done - ;; - esac - - # This variable tells wrapper scripts just to set variables rather - # than running their programs. - libtool_install_magic="$magic" - - staticlibs= - future_libdirs= - current_libdirs= - for file in $files; do - - # Do each installation. - case $file in - *.$libext) - # Do the static libraries later. - func_append staticlibs " $file" - ;; - - *.la) - func_resolve_sysroot "$file" - file=$func_resolve_sysroot_result - - # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$file" \ - || func_fatal_help "\`$file' is not a valid libtool archive" - - library_names= - old_library= - relink_command= - func_source "$file" - - # Add the libdir to current_libdirs if it is the destination. - if test "X$destdir" = "X$libdir"; then - case "$current_libdirs " in - *" $libdir "*) ;; - *) func_append current_libdirs " $libdir" ;; - esac - else - # Note the libdir as a future libdir. - case "$future_libdirs " in - *" $libdir "*) ;; - *) func_append future_libdirs " $libdir" ;; - esac - fi - - func_dirname "$file" "/" "" - dir="$func_dirname_result" - func_append dir "$objdir" - - if test -n "$relink_command"; then - # Determine the prefix the user has applied to our future dir. - inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` - - # Don't allow the user to place us outside of our expected - # location b/c this prevents finding dependent libraries that - # are installed to the same prefix. - # At present, this check doesn't affect windows .dll's that - # are installed into $libdir/../bin (currently, that works fine) - # but it's something to keep an eye on. - test "$inst_prefix_dir" = "$destdir" && \ - func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir" - - if test -n "$inst_prefix_dir"; then - # Stick the inst_prefix_dir data into the link command. - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` - else - relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` - fi - - func_warning "relinking \`$file'" - func_show_eval "$relink_command" \ - 'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"' - fi - - # See the names of the shared library. - set dummy $library_names; shift - if test -n "$1"; then - realname="$1" - shift - - srcname="$realname" - test -n "$relink_command" && srcname="$realname"T - - # Install the shared library and build the symlinks. - func_show_eval "$install_shared_prog $extra_mode $dir/$srcname $destdir/$realname" \ - 'exit $?' - tstripme="$stripme" - case $host_os in - cygwin* | mingw* | pw32* | cegcc*) - case $realname in - *.dll.a) - tstripme="" - ;; - esac - ;; - esac - if test -n "$tstripme" && test -n "$striplib"; then - func_show_eval "$striplib $destdir/$realname" 'exit $?' - fi - - if test "$#" -gt 0; then - # Delete the old symlinks, and create new ones. - # Try `ln -sf' first, because the `ln' binary might depend on - # the symlink we replace! Solaris /bin/ln does not understand -f, - # so we also need to try rm && ln -s. - for linkname - do - test "$linkname" != "$realname" \ - && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" - done - fi - - # Do each command in the postinstall commands. - lib="$destdir/$realname" - func_execute_cmds "$postinstall_cmds" 'exit $?' - fi - - # Install the pseudo-library for information purposes. - func_basename "$file" - name="$func_basename_result" - instname="$dir/$name"i - func_show_eval "$install_prog $extra_mode $instname $destdir/$name" 'exit $?' - - # Maybe install the static library, too. - test -n "$old_library" && func_append staticlibs " $dir/$old_library" - ;; - - *.lo) - # Install (i.e. copy) a libtool object. - - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # Deduce the name of the destination old-style object file. - case $destfile in - *.lo) - func_lo2o "$destfile" - staticdest=$func_lo2o_result - ;; - *.$objext) - staticdest="$destfile" - destfile= - ;; - *) - func_fatal_help "cannot copy a libtool object to \`$destfile'" - ;; - esac - - # Install the libtool object if requested. - test -n "$destfile" && \ - func_show_eval "$install_prog $extra_mode $file $destfile" 'exit $?' - - # Install the old object if enabled. - if test "$build_old_libs" = yes; then - # Deduce the name of the old-style object file. - func_lo2o "$file" - staticobj=$func_lo2o_result - func_show_eval "$install_prog $extra_mode \$staticobj \$staticdest" 'exit $?' - fi - exit $EXIT_SUCCESS - ;; - - *) - # Figure out destination file name, if it wasn't already specified. - if test -n "$destname"; then - destfile="$destdir/$destname" - else - func_basename "$file" - destfile="$func_basename_result" - destfile="$destdir/$destfile" - fi - - # If the file is missing, and there is a .exe on the end, strip it - # because it is most likely a libtool script we actually want to - # install - stripped_ext="" - case $file in - *.exe) - if test ! -f "$file"; then - func_stripname '' '.exe' "$file" - file=$func_stripname_result - stripped_ext=".exe" - fi - ;; - esac - - # Do a test to see if this is really a libtool program. - case $host in - *cygwin* | *mingw*) - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - wrapper=$func_ltwrapper_scriptname_result - else - func_stripname '' '.exe' "$file" - wrapper=$func_stripname_result - fi - ;; - *) - wrapper=$file - ;; - esac - if func_ltwrapper_script_p "$wrapper"; then - notinst_deplibs= - relink_command= - - func_source "$wrapper" - - # Check the variables that should have been set. - test -z "$generated_by_libtool_version" && \ - func_fatal_error "invalid libtool wrapper script \`$wrapper'" - - finalize=yes - for lib in $notinst_deplibs; do - # Check to see that each library is installed. - libdir= - if test -f "$lib"; then - func_source "$lib" - fi - libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "\`$lib' has not been installed in \`$libdir'" - finalize=no - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test "$fast_install" = no && test -n "$relink_command"; then - $opt_dry_run || { - if test "$finalize" = yes; then - tmpdir=`func_mktempdir` - func_basename "$file$stripped_ext" - file="$func_basename_result" - outputname="$tmpdir/$file" - # Replace the output file specification. - relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` - - $opt_silent || { - func_quote_for_expand "$relink_command" - eval "func_echo $func_quote_for_expand_result" - } - if eval "$relink_command"; then : - else - func_error "error: relink \`$file' with the above command before installing it" - $opt_dry_run || ${RM}r "$tmpdir" - continue - fi - file="$outputname" - else - func_warning "cannot relink \`$file'" - fi - } - else - # Install the binary that we compiled earlier. - file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` - fi - fi - - # remove .exe since cygwin /usr/bin/install will append another - # one anyway - case $install_prog,$host in - */usr/bin/install*,*cygwin*) - case $file:$destfile in - *.exe:*.exe) - # this is ok - ;; - *.exe:*) - destfile=$destfile.exe - ;; - *:*.exe) - func_stripname '' '.exe' "$destfile" - destfile=$func_stripname_result - ;; - esac - ;; - esac - func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' - $opt_dry_run || if test -n "$outputname"; then - ${RM}r "$tmpdir" - fi - ;; - esac - done - - for file in $staticlibs; do - func_basename "$file" - name="$func_basename_result" - - # Set up the ranlib parameters. - oldlib="$destdir/$name" - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_oldlib" 'exit $?' - fi - - # Do each command in the postinstall commands. - func_execute_cmds "$old_postinstall_cmds" 'exit $?' - done - - test -n "$future_libdirs" && \ - func_warning "remember to run \`$progname --finish$future_libdirs'" - - if test -n "$current_libdirs"; then - # Maybe just do a dry run. - $opt_dry_run && current_libdirs=" -n$current_libdirs" - exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' - else - exit $EXIT_SUCCESS - fi -} - -test "$opt_mode" = install && func_mode_install ${1+"$@"} - - -# func_generate_dlsyms outputname originator pic_p -# Extract symbols from dlprefiles and create ${outputname}S.o with -# a dlpreopen symbol table. -func_generate_dlsyms () -{ - $opt_debug - my_outputname="$1" - my_originator="$2" - my_pic_p="${3-no}" - my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - if test -n "$NM" && test -n "$global_symbol_pipe"; then - my_dlsyms="${my_outputname}S.c" - else - func_error "not configured to extract global symbols from dlpreopened files" - fi - fi - - if test -n "$my_dlsyms"; then - case $my_dlsyms in - "") ;; - *.c) - # Discover the nlist of each of the dlfiles. - nlist="$output_objdir/${my_outputname}.nm" - - func_show_eval "$RM $nlist ${nlist}S ${nlist}T" - - # Parse the name list into a source file. - func_verbose "creating $output_objdir/$my_dlsyms" - - $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ -/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */ -/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */ - -#ifdef __cplusplus -extern \"C\" { -#endif - -#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) -#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" -#endif - -/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ -#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE) -/* DATA imports from DLLs on WIN32 con't be const, because runtime - relocations are performed -- see ld's documentation on pseudo-relocs. */ -# define LT_DLSYM_CONST -#elif defined(__osf__) -/* This system does not cope well with relocations in const data. */ -# define LT_DLSYM_CONST -#else -# define LT_DLSYM_CONST const -#endif - -/* External symbol declarations for the compiler. */\ -" - - if test "$dlself" = yes; then - func_verbose "generating symbol list for \`$output'" - - $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" - - # Add our own program objects to the symbol list. - progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` - for progfile in $progfiles; do - func_to_tool_file "$progfile" func_convert_file_msys_to_w32 - func_verbose "extracting global C symbols from \`$func_to_tool_file_result'" - $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" - done - - if test -n "$exclude_expsyms"; then - $opt_dry_run || { - eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - if test -n "$export_symbols_regex"; then - $opt_dry_run || { - eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - } - fi - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - export_symbols="$output_objdir/$outputname.exp" - $opt_dry_run || { - $RM $export_symbols - eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' - ;; - esac - } - else - $opt_dry_run || { - eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' - eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' - eval '$MV "$nlist"T "$nlist"' - case $host in - *cygwin* | *mingw* | *cegcc* ) - eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' - eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' - ;; - esac - } - fi - fi - - for dlprefile in $dlprefiles; do - func_verbose "extracting global C symbols from \`$dlprefile'" - func_basename "$dlprefile" - name="$func_basename_result" - case $host in - *cygwin* | *mingw* | *cegcc* ) - # if an import library, we need to obtain dlname - if func_win32_import_lib_p "$dlprefile"; then - func_tr_sh "$dlprefile" - eval "curr_lafile=\$libfile_$func_tr_sh_result" - dlprefile_dlbasename="" - if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then - # Use subshell, to avoid clobbering current variable values - dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` - if test -n "$dlprefile_dlname" ; then - func_basename "$dlprefile_dlname" - dlprefile_dlbasename="$func_basename_result" - else - # no lafile. user explicitly requested -dlpreopen . - $sharedlib_from_linklib_cmd "$dlprefile" - dlprefile_dlbasename=$sharedlib_from_linklib_result - fi - fi - $opt_dry_run || { - if test -n "$dlprefile_dlbasename" ; then - eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' - else - func_warning "Could not compute DLL name from $name" - eval '$ECHO ": $name " >> "$nlist"' - fi - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | - $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" - } - else # not an import lib - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - fi - ;; - *) - $opt_dry_run || { - eval '$ECHO ": $name " >> "$nlist"' - func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 - eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" - } - ;; - esac - done - - $opt_dry_run || { - # Make sure we have at least an empty file. - test -f "$nlist" || : > "$nlist" - - if test -n "$exclude_expsyms"; then - $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T - $MV "$nlist"T "$nlist" - fi - - # Try sorting and uniquifying the output. - if $GREP -v "^: " < "$nlist" | - if sort -k 3 /dev/null 2>&1; then - sort -k 3 - else - sort +2 - fi | - uniq > "$nlist"S; then - : - else - $GREP -v "^: " < "$nlist" > "$nlist"S - fi - - if test -f "$nlist"S; then - eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' - else - echo '/* NONE */' >> "$output_objdir/$my_dlsyms" - fi - - echo >> "$output_objdir/$my_dlsyms" "\ - -/* The mapping between symbol names and symbols. */ -typedef struct { - const char *name; - void *address; -} lt_dlsymlist; -extern LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[]; -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{\ - { \"$my_originator\", (void *) 0 }," - - case $need_lib_prefix in - no) - eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - *) - eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" - ;; - esac - echo >> "$output_objdir/$my_dlsyms" "\ - {0, (void *) 0} -}; - -/* This works around a problem in FreeBSD linker */ -#ifdef FREEBSD_WORKAROUND -static const void *lt_preloaded_setup() { - return lt_${my_prefix}_LTX_preloaded_symbols; -} -#endif - -#ifdef __cplusplus -} -#endif\ -" - } # !$opt_dry_run - - pic_flag_for_symtable= - case "$compile_command " in - *" -static "*) ;; - *) - case $host in - # compiling the symbol table file with pic_flag works around - # a FreeBSD bug that causes programs to crash when -lm is - # linked before any other PIC object. But we must not use - # pic_flag when linking with -static. The problem exists in - # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. - *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) - pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; - *-*-hpux*) - pic_flag_for_symtable=" $pic_flag" ;; - *) - if test "X$my_pic_p" != Xno; then - pic_flag_for_symtable=" $pic_flag" - fi - ;; - esac - ;; - esac - symtab_cflags= - for arg in $LTCFLAGS; do - case $arg in - -pie | -fpie | -fPIE) ;; - *) func_append symtab_cflags " $arg" ;; - esac - done - - # Now compile the dynamic symbol file. - func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' - - # Clean up the generated files. - func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"' - - # Transform the symbol file into the correct name. - symfileobj="$output_objdir/${my_outputname}S.$objext" - case $host in - *cygwin* | *mingw* | *cegcc* ) - if test -f "$output_objdir/$my_outputname.def"; then - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` - else - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - fi - ;; - *) - compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` - ;; - esac - ;; - *) - func_fatal_error "unknown suffix for \`$my_dlsyms'" - ;; - esac - else - # We keep going just in case the user didn't refer to - # lt_preloaded_symbols. The linker will fail if global_symbol_pipe - # really was required. - - # Nullify the symbol file. - compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` - finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` - fi -} - -# func_win32_libid arg -# return the library type of file 'arg' -# -# Need a lot of goo to handle *both* DLLs and import libs -# Has to be a shell function in order to 'eat' the argument -# that is supplied when $file_magic_command is called. -# Despite the name, also deal with 64 bit binaries. -func_win32_libid () -{ - $opt_debug - win32_libid_type="unknown" - win32_fileres=`file -L $1 2>/dev/null` - case $win32_fileres in - *ar\ archive\ import\ library*) # definitely import - win32_libid_type="x86 archive import" - ;; - *ar\ archive*) # could be an import, or static - # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. - if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | - $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then - func_to_tool_file "$1" func_convert_file_msys_to_w32 - win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | - $SED -n -e ' - 1,100{ - / I /{ - s,.*,import, - p - q - } - }'` - case $win32_nmres in - import*) win32_libid_type="x86 archive import";; - *) win32_libid_type="x86 archive static";; - esac - fi - ;; - *DLL*) - win32_libid_type="x86 DLL" - ;; - *executable*) # but shell scripts are "executable" too... - case $win32_fileres in - *MS\ Windows\ PE\ Intel*) - win32_libid_type="x86 DLL" - ;; - esac - ;; - esac - $ECHO "$win32_libid_type" -} - -# func_cygming_dll_for_implib ARG -# -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib () -{ - $opt_debug - sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` -} - -# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs -# -# The is the core of a fallback implementation of a -# platform-specific function to extract the name of the -# DLL associated with the specified import library LIBNAME. -# -# SECTION_NAME is either .idata$6 or .idata$7, depending -# on the platform and compiler that created the implib. -# -# Echos the name of the DLL associated with the -# specified import library. -func_cygming_dll_for_implib_fallback_core () -{ - $opt_debug - match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` - $OBJDUMP -s --section "$1" "$2" 2>/dev/null | - $SED '/^Contents of section '"$match_literal"':/{ - # Place marker at beginning of archive member dllname section - s/.*/====MARK====/ - p - d - } - # These lines can sometimes be longer than 43 characters, but - # are always uninteresting - /:[ ]*file format pe[i]\{,1\}-/d - /^In archive [^:]*:/d - # Ensure marker is printed - /^====MARK====/p - # Remove all lines with less than 43 characters - /^.\{43\}/!d - # From remaining lines, remove first 43 characters - s/^.\{43\}//' | - $SED -n ' - # Join marker and all lines until next marker into a single line - /^====MARK====/ b para - H - $ b para - b - :para - x - s/\n//g - # Remove the marker - s/^====MARK====// - # Remove trailing dots and whitespace - s/[\. \t]*$// - # Print - /./p' | - # we now have a list, one entry per line, of the stringified - # contents of the appropriate section of all members of the - # archive which possess that section. Heuristic: eliminate - # all those which have a first or second character that is - # a '.' (that is, objdump's representation of an unprintable - # character.) This should work for all archives with less than - # 0x302f exports -- but will fail for DLLs whose name actually - # begins with a literal '.' or a single character followed by - # a '.'. - # - # Of those that remain, print the first one. - $SED -e '/^\./d;/^.\./d;q' -} - -# func_cygming_gnu_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is a GNU/binutils-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_gnu_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` - test -n "$func_cygming_gnu_implib_tmp" -} - -# func_cygming_ms_implib_p ARG -# This predicate returns with zero status (TRUE) if -# ARG is an MS-style import library. Returns -# with nonzero status (FALSE) otherwise. -func_cygming_ms_implib_p () -{ - $opt_debug - func_to_tool_file "$1" func_convert_file_msys_to_w32 - func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` - test -n "$func_cygming_ms_implib_tmp" -} - -# func_cygming_dll_for_implib_fallback ARG -# Platform-specific function to extract the -# name of the DLL associated with the specified -# import library ARG. -# -# This fallback implementation is for use when $DLLTOOL -# does not support the --identify-strict option. -# Invoked by eval'ing the libtool variable -# $sharedlib_from_linklib_cmd -# Result is available in the variable -# $sharedlib_from_linklib_result -func_cygming_dll_for_implib_fallback () -{ - $opt_debug - if func_cygming_gnu_implib_p "$1" ; then - # binutils import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` - elif func_cygming_ms_implib_p "$1" ; then - # ms-generated import library - sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` - else - # unknown - sharedlib_from_linklib_result="" - fi -} - - -# func_extract_an_archive dir oldlib -func_extract_an_archive () -{ - $opt_debug - f_ex_an_ar_dir="$1"; shift - f_ex_an_ar_oldlib="$1" - if test "$lock_old_archive_extraction" = yes; then - lockfile=$f_ex_an_ar_oldlib.lock - until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do - func_echo "Waiting for $lockfile to be removed" - sleep 2 - done - fi - func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ - 'stat=$?; rm -f "$lockfile"; exit $stat' - if test "$lock_old_archive_extraction" = yes; then - $opt_dry_run || rm -f "$lockfile" - fi - if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then - : - else - func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" - fi -} - - -# func_extract_archives gentop oldlib ... -func_extract_archives () -{ - $opt_debug - my_gentop="$1"; shift - my_oldlibs=${1+"$@"} - my_oldobjs="" - my_xlib="" - my_xabs="" - my_xdir="" - - for my_xlib in $my_oldlibs; do - # Extract the objects. - case $my_xlib in - [\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;; - *) my_xabs=`pwd`"/$my_xlib" ;; - esac - func_basename "$my_xlib" - my_xlib="$func_basename_result" - my_xlib_u=$my_xlib - while :; do - case " $extracted_archives " in - *" $my_xlib_u "*) - func_arith $extracted_serial + 1 - extracted_serial=$func_arith_result - my_xlib_u=lt$extracted_serial-$my_xlib ;; - *) break ;; - esac - done - extracted_archives="$extracted_archives $my_xlib_u" - my_xdir="$my_gentop/$my_xlib_u" - - func_mkdir_p "$my_xdir" - - case $host in - *-darwin*) - func_verbose "Extracting $my_xabs" - # Do not bother doing anything if just a dry run - $opt_dry_run || { - darwin_orig_dir=`pwd` - cd $my_xdir || exit $? - darwin_archive=$my_xabs - darwin_curdir=`pwd` - darwin_base_archive=`basename "$darwin_archive"` - darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` - if test -n "$darwin_arches"; then - darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` - darwin_arch= - func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" - for darwin_arch in $darwin_arches ; do - func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}" - $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}" - cd "unfat-$$/${darwin_base_archive}-${darwin_arch}" - func_extract_an_archive "`pwd`" "${darwin_base_archive}" - cd "$darwin_curdir" - $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" - done # $darwin_arches - ## Okay now we've a bunch of thin objects, gotta fatten them up :) - darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u` - darwin_file= - darwin_files= - for darwin_file in $darwin_filelist; do - darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` - $LIPO -create -output "$darwin_file" $darwin_files - done # $darwin_filelist - $RM -rf unfat-$$ - cd "$darwin_orig_dir" - else - cd $darwin_orig_dir - func_extract_an_archive "$my_xdir" "$my_xabs" - fi # $darwin_arches - } # !$opt_dry_run - ;; - *) - func_extract_an_archive "$my_xdir" "$my_xabs" - ;; - esac - my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` - done - - func_extract_archives_result="$my_oldobjs" -} - - -# func_emit_wrapper [arg=no] -# -# Emit a libtool wrapper script on stdout. -# Don't directly open a file because we may want to -# incorporate the script contents within a cygwin/mingw -# wrapper executable. Must ONLY be called from within -# func_mode_link because it depends on a number of variables -# set therein. -# -# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR -# variable will take. If 'yes', then the emitted script -# will assume that the directory in which it is stored is -# the $objdir directory. This is a cygwin/mingw-specific -# behavior. -func_emit_wrapper () -{ - func_emit_wrapper_arg1=${1-no} - - $ECHO "\ -#! $SHELL - -# $output - temporary wrapper script for $objdir/$outputname -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION -# -# The $output program cannot be directly executed until all the libtool -# libraries that it depends on are installed. -# -# This wrapper script should never be moved out of the build directory. -# If it is, it will not operate correctly. - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='$sed_quote_subst' - -# Be Bourne compatible -if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac -fi -BIN_SH=xpg4; export BIN_SH # for Tru64 -DUALCASE=1; export DUALCASE # for MKS sh - -# The HP-UX ksh and POSIX shell print the target directory to stdout -# if CDPATH is set. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -relink_command=\"$relink_command\" - -# This environment variable determines our operation mode. -if test \"\$libtool_install_magic\" = \"$magic\"; then - # install mode needs the following variables: - generated_by_libtool_version='$macro_version' - notinst_deplibs='$notinst_deplibs' -else - # When we are sourced in execute mode, \$file and \$ECHO are already set. - if test \"\$libtool_execute_magic\" != \"$magic\"; then - file=\"\$0\"" - - qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` - $ECHO "\ - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -\$1 -_LTECHO_EOF' -} - ECHO=\"$qECHO\" - fi - -# Very basic option parsing. These options are (a) specific to -# the libtool wrapper, (b) are identical between the wrapper -# /script/ and the wrapper /executable/ which is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options which match -# this pattern). -# -# There are only two supported options: --lt-debug and -# --lt-dump-script. There is, deliberately, no --lt-help. -# -# The first argument to this parsing function should be the -# script's $0 value, followed by "$@". -lt_option_debug= -func_parse_lt_options () -{ - lt_script_arg0=\$0 - shift - for lt_opt - do - case \"\$lt_opt\" in - --lt-debug) lt_option_debug=1 ;; - --lt-dump-script) - lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` - test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. - lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` - cat \"\$lt_dump_D/\$lt_dump_F\" - exit 0 - ;; - --lt-*) - \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 - exit 1 - ;; - esac - done - - # Print the debug banner immediately: - if test -n \"\$lt_option_debug\"; then - echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2 - fi -} - -# Used when --lt-debug. Prints its arguments to stdout -# (redirection is the responsibility of the caller) -func_lt_dump_args () -{ - lt_dump_args_N=1; - for lt_arg - do - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\" - lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` - done -} - -# Core function for launching the target application -func_exec_program_core () -{ -" - case $host in - # Backslashes separate directories on plain windows - *-*-mingw | *-*-os2* | *-cegcc*) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} -" ;; - *) - $ECHO "\ - if test -n \"\$lt_option_debug\"; then - \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2 - func_lt_dump_args \${1+\"\$@\"} 1>&2 - fi - exec \"\$progdir/\$program\" \${1+\"\$@\"} -" - ;; - esac - $ECHO "\ - \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 - exit 1 -} - -# A function to encapsulate launching the target application -# Strips options in the --lt-* namespace from \$@ and -# launches target application with the remaining arguments. -func_exec_program () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - func_exec_program_core \${1+\"\$@\"} -} - - # Parse options - func_parse_lt_options \"\$0\" \${1+\"\$@\"} - - # Find the directory that this script lives in. - thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` - test \"x\$thisdir\" = \"x\$file\" && thisdir=. - - # Follow symbolic links until we get to the real thisdir. - file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` - while test -n \"\$file\"; do - destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` - - # If there was a directory component, then change thisdir. - if test \"x\$destdir\" != \"x\$file\"; then - case \"\$destdir\" in - [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; - *) thisdir=\"\$thisdir/\$destdir\" ;; - esac - fi - - file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` - file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` - done - - # Usually 'no', except on cygwin/mingw when embedded into - # the cwrapper. - WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 - if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then - # special case for '.' - if test \"\$thisdir\" = \".\"; then - thisdir=\`pwd\` - fi - # remove .libs from thisdir - case \"\$thisdir\" in - *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; - $objdir ) thisdir=. ;; - esac - fi - - # Try to get the absolute directory name. - absdir=\`cd \"\$thisdir\" && pwd\` - test -n \"\$absdir\" && thisdir=\"\$absdir\" -" - - if test "$fast_install" = yes; then - $ECHO "\ - program=lt-'$outputname'$exeext - progdir=\"\$thisdir/$objdir\" - - if test ! -f \"\$progdir/\$program\" || - { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ - test \"X\$file\" != \"X\$progdir/\$program\"; }; then - - file=\"\$\$-\$program\" - - if test ! -d \"\$progdir\"; then - $MKDIR \"\$progdir\" - else - $RM \"\$progdir/\$file\" - fi" - - $ECHO "\ - - # relink executable if necessary - if test -n \"\$relink_command\"; then - if relink_command_output=\`eval \$relink_command 2>&1\`; then : - else - $ECHO \"\$relink_command_output\" >&2 - $RM \"\$progdir/\$file\" - exit 1 - fi - fi - - $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || - { $RM \"\$progdir/\$program\"; - $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } - $RM \"\$progdir/\$file\" - fi" - else - $ECHO "\ - program='$outputname' - progdir=\"\$thisdir/$objdir\" -" - fi - - $ECHO "\ - - if test -f \"\$progdir/\$program\"; then" - - # fixup the dll searchpath if we need to. - # - # Fix the DLL searchpath if we need to. Do this before prepending - # to shlibpath, because on Windows, both are PATH and uninstalled - # libraries must come first. - if test -n "$dllsearchpath"; then - $ECHO "\ - # Add the dll search path components to the executable PATH - PATH=$dllsearchpath:\$PATH -" - fi - - # Export our shlibpath_var if we have one. - if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then - $ECHO "\ - # Add our own library path to $shlibpath_var - $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" - - # Some systems cannot cope with colon-terminated $shlibpath_var - # The second colon is a workaround for a bug in BeOS R4 sed - $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` - - export $shlibpath_var -" - fi - - $ECHO "\ - if test \"\$libtool_execute_magic\" != \"$magic\"; then - # Run the actual program with our arguments. - func_exec_program \${1+\"\$@\"} - fi - else - # The program doesn't exist. - \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 - \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 - \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 - exit 1 - fi -fi\ -" -} - - -# func_emit_cwrapperexe_src -# emit the source code for a wrapper executable on stdout -# Must ONLY be called from within func_mode_link because -# it depends on a number of variable set therein. -func_emit_cwrapperexe_src () -{ - cat < -#include -#ifdef _MSC_VER -# include -# include -# include -#else -# include -# include -# ifdef __CYGWIN__ -# include -# endif -#endif -#include -#include -#include -#include -#include -#include -#include -#include - -/* declarations of non-ANSI functions */ -#if defined(__MINGW32__) -# ifdef __STRICT_ANSI__ -int _putenv (const char *); -# endif -#elif defined(__CYGWIN__) -# ifdef __STRICT_ANSI__ -char *realpath (const char *, char *); -int putenv (char *); -int setenv (const char *, const char *, int); -# endif -/* #elif defined (other platforms) ... */ -#endif - -/* portability defines, excluding path handling macros */ -#if defined(_MSC_VER) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -# define S_IXUSR _S_IEXEC -# ifndef _INTPTR_T_DEFINED -# define _INTPTR_T_DEFINED -# define intptr_t int -# endif -#elif defined(__MINGW32__) -# define setmode _setmode -# define stat _stat -# define chmod _chmod -# define getcwd _getcwd -# define putenv _putenv -#elif defined(__CYGWIN__) -# define HAVE_SETENV -# define FOPEN_WB "wb" -/* #elif defined (other platforms) ... */ -#endif - -#if defined(PATH_MAX) -# define LT_PATHMAX PATH_MAX -#elif defined(MAXPATHLEN) -# define LT_PATHMAX MAXPATHLEN -#else -# define LT_PATHMAX 1024 -#endif - -#ifndef S_IXOTH -# define S_IXOTH 0 -#endif -#ifndef S_IXGRP -# define S_IXGRP 0 -#endif - -/* path handling portability macros */ -#ifndef DIR_SEPARATOR -# define DIR_SEPARATOR '/' -# define PATH_SEPARATOR ':' -#endif - -#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ - defined (__OS2__) -# define HAVE_DOS_BASED_FILE_SYSTEM -# define FOPEN_WB "wb" -# ifndef DIR_SEPARATOR_2 -# define DIR_SEPARATOR_2 '\\' -# endif -# ifndef PATH_SEPARATOR_2 -# define PATH_SEPARATOR_2 ';' -# endif -#endif - -#ifndef DIR_SEPARATOR_2 -# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) -#else /* DIR_SEPARATOR_2 */ -# define IS_DIR_SEPARATOR(ch) \ - (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) -#endif /* DIR_SEPARATOR_2 */ - -#ifndef PATH_SEPARATOR_2 -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) -#else /* PATH_SEPARATOR_2 */ -# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) -#endif /* PATH_SEPARATOR_2 */ - -#ifndef FOPEN_WB -# define FOPEN_WB "w" -#endif -#ifndef _O_BINARY -# define _O_BINARY 0 -#endif - -#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) -#define XFREE(stale) do { \ - if (stale) { free ((void *) stale); stale = 0; } \ -} while (0) - -#if defined(LT_DEBUGWRAPPER) -static int lt_debug = 1; -#else -static int lt_debug = 0; -#endif - -const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ - -void *xmalloc (size_t num); -char *xstrdup (const char *string); -const char *base_name (const char *name); -char *find_executable (const char *wrapper); -char *chase_symlinks (const char *pathspec); -int make_executable (const char *path); -int check_executable (const char *path); -char *strendzap (char *str, const char *pat); -void lt_debugprintf (const char *file, int line, const char *fmt, ...); -void lt_fatal (const char *file, int line, const char *message, ...); -static const char *nonnull (const char *s); -static const char *nonempty (const char *s); -void lt_setenv (const char *name, const char *value); -char *lt_extend_str (const char *orig_value, const char *add, int to_end); -void lt_update_exe_path (const char *name, const char *value); -void lt_update_lib_path (const char *name, const char *value); -char **prepare_spawn (char **argv); -void lt_dump_script (FILE *f); -EOF - - cat <= 0) - && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) - return 1; - else - return 0; -} - -int -make_executable (const char *path) -{ - int rval = 0; - struct stat st; - - lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", - nonempty (path)); - if ((!path) || (!*path)) - return 0; - - if (stat (path, &st) >= 0) - { - rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); - } - return rval; -} - -/* Searches for the full path of the wrapper. Returns - newly allocated full path name if found, NULL otherwise - Does not chase symlinks, even on platforms that support them. -*/ -char * -find_executable (const char *wrapper) -{ - int has_slash = 0; - const char *p; - const char *p_next; - /* static buffer for getcwd */ - char tmp[LT_PATHMAX + 1]; - int tmp_len; - char *concat_name; - - lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", - nonempty (wrapper)); - - if ((wrapper == NULL) || (*wrapper == '\0')) - return NULL; - - /* Absolute path? */ -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - else - { -#endif - if (IS_DIR_SEPARATOR (wrapper[0])) - { - concat_name = xstrdup (wrapper); - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } -#if defined (HAVE_DOS_BASED_FILE_SYSTEM) - } -#endif - - for (p = wrapper; *p; p++) - if (*p == '/') - { - has_slash = 1; - break; - } - if (!has_slash) - { - /* no slashes; search PATH */ - const char *path = getenv ("PATH"); - if (path != NULL) - { - for (p = path; *p; p = p_next) - { - const char *q; - size_t p_len; - for (q = p; *q; q++) - if (IS_PATH_SEPARATOR (*q)) - break; - p_len = q - p; - p_next = (*q == '\0' ? q : q + 1); - if (p_len == 0) - { - /* empty path: current directory */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = - XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - } - else - { - concat_name = - XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, p, p_len); - concat_name[p_len] = '/'; - strcpy (concat_name + p_len + 1, wrapper); - } - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - } - } - /* not found in PATH; assume curdir */ - } - /* Relative path | not found in path: prepend cwd */ - if (getcwd (tmp, LT_PATHMAX) == NULL) - lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", - nonnull (strerror (errno))); - tmp_len = strlen (tmp); - concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); - memcpy (concat_name, tmp, tmp_len); - concat_name[tmp_len] = '/'; - strcpy (concat_name + tmp_len + 1, wrapper); - - if (check_executable (concat_name)) - return concat_name; - XFREE (concat_name); - return NULL; -} - -char * -chase_symlinks (const char *pathspec) -{ -#ifndef S_ISLNK - return xstrdup (pathspec); -#else - char buf[LT_PATHMAX]; - struct stat s; - char *tmp_pathspec = xstrdup (pathspec); - char *p; - int has_symlinks = 0; - while (strlen (tmp_pathspec) && !has_symlinks) - { - lt_debugprintf (__FILE__, __LINE__, - "checking path component for symlinks: %s\n", - tmp_pathspec); - if (lstat (tmp_pathspec, &s) == 0) - { - if (S_ISLNK (s.st_mode) != 0) - { - has_symlinks = 1; - break; - } - - /* search backwards for last DIR_SEPARATOR */ - p = tmp_pathspec + strlen (tmp_pathspec) - 1; - while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - p--; - if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) - { - /* no more DIR_SEPARATORS left */ - break; - } - *p = '\0'; - } - else - { - lt_fatal (__FILE__, __LINE__, - "error accessing file \"%s\": %s", - tmp_pathspec, nonnull (strerror (errno))); - } - } - XFREE (tmp_pathspec); - - if (!has_symlinks) - { - return xstrdup (pathspec); - } - - tmp_pathspec = realpath (pathspec, buf); - if (tmp_pathspec == 0) - { - lt_fatal (__FILE__, __LINE__, - "could not follow symlinks for %s", pathspec); - } - return xstrdup (tmp_pathspec); -#endif -} - -char * -strendzap (char *str, const char *pat) -{ - size_t len, patlen; - - assert (str != NULL); - assert (pat != NULL); - - len = strlen (str); - patlen = strlen (pat); - - if (patlen <= len) - { - str += len - patlen; - if (strcmp (str, pat) == 0) - *str = '\0'; - } - return str; -} - -void -lt_debugprintf (const char *file, int line, const char *fmt, ...) -{ - va_list args; - if (lt_debug) - { - (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); - va_start (args, fmt); - (void) vfprintf (stderr, fmt, args); - va_end (args); - } -} - -static void -lt_error_core (int exit_status, const char *file, - int line, const char *mode, - const char *message, va_list ap) -{ - fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); - vfprintf (stderr, message, ap); - fprintf (stderr, ".\n"); - - if (exit_status >= 0) - exit (exit_status); -} - -void -lt_fatal (const char *file, int line, const char *message, ...) -{ - va_list ap; - va_start (ap, message); - lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); - va_end (ap); -} - -static const char * -nonnull (const char *s) -{ - return s ? s : "(null)"; -} - -static const char * -nonempty (const char *s) -{ - return (s && !*s) ? "(empty)" : nonnull (s); -} - -void -lt_setenv (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_setenv) setting '%s' to '%s'\n", - nonnull (name), nonnull (value)); - { -#ifdef HAVE_SETENV - /* always make a copy, for consistency with !HAVE_SETENV */ - char *str = xstrdup (value); - setenv (name, str, 1); -#else - int len = strlen (name) + 1 + strlen (value) + 1; - char *str = XMALLOC (char, len); - sprintf (str, "%s=%s", name, value); - if (putenv (str) != EXIT_SUCCESS) - { - XFREE (str); - } -#endif - } -} - -char * -lt_extend_str (const char *orig_value, const char *add, int to_end) -{ - char *new_value; - if (orig_value && *orig_value) - { - int orig_value_len = strlen (orig_value); - int add_len = strlen (add); - new_value = XMALLOC (char, add_len + orig_value_len + 1); - if (to_end) - { - strcpy (new_value, orig_value); - strcpy (new_value + orig_value_len, add); - } - else - { - strcpy (new_value, add); - strcpy (new_value + add_len, orig_value); - } - } - else - { - new_value = xstrdup (add); - } - return new_value; -} - -void -lt_update_exe_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - /* some systems can't cope with a ':'-terminated path #' */ - int len = strlen (new_value); - while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[len-1] = '\0'; - } - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -void -lt_update_lib_path (const char *name, const char *value) -{ - lt_debugprintf (__FILE__, __LINE__, - "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", - nonnull (name), nonnull (value)); - - if (name && *name && value && *value) - { - char *new_value = lt_extend_str (getenv (name), value, 0); - lt_setenv (name, new_value); - XFREE (new_value); - } -} - -EOF - case $host_os in - mingw*) - cat <<"EOF" - -/* Prepares an argument vector before calling spawn(). - Note that spawn() does not by itself call the command interpreter - (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : - ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - GetVersionEx(&v); - v.dwPlatformId == VER_PLATFORM_WIN32_NT; - }) ? "cmd.exe" : "command.com"). - Instead it simply concatenates the arguments, separated by ' ', and calls - CreateProcess(). We must quote the arguments since Win32 CreateProcess() - interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a - special way: - - Space and tab are interpreted as delimiters. They are not treated as - delimiters if they are surrounded by double quotes: "...". - - Unescaped double quotes are removed from the input. Their only effect is - that within double quotes, space and tab are treated like normal - characters. - - Backslashes not followed by double quotes are not special. - - But 2*n+1 backslashes followed by a double quote become - n backslashes followed by a double quote (n >= 0): - \" -> " - \\\" -> \" - \\\\\" -> \\" - */ -#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" -char ** -prepare_spawn (char **argv) -{ - size_t argc; - char **new_argv; - size_t i; - - /* Count number of arguments. */ - for (argc = 0; argv[argc] != NULL; argc++) - ; - - /* Allocate new argument vector. */ - new_argv = XMALLOC (char *, argc + 1); - - /* Put quoted arguments into the new argument vector. */ - for (i = 0; i < argc; i++) - { - const char *string = argv[i]; - - if (string[0] == '\0') - new_argv[i] = xstrdup ("\"\""); - else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) - { - int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); - size_t length; - unsigned int backslashes; - const char *s; - char *quoted_string; - char *p; - - length = 0; - backslashes = 0; - if (quote_around) - length++; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - length += backslashes + 1; - length++; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - length += backslashes + 1; - - quoted_string = XMALLOC (char, length + 1); - - p = quoted_string; - backslashes = 0; - if (quote_around) - *p++ = '"'; - for (s = string; *s != '\0'; s++) - { - char c = *s; - if (c == '"') - { - unsigned int j; - for (j = backslashes + 1; j > 0; j--) - *p++ = '\\'; - } - *p++ = c; - if (c == '\\') - backslashes++; - else - backslashes = 0; - } - if (quote_around) - { - unsigned int j; - for (j = backslashes; j > 0; j--) - *p++ = '\\'; - *p++ = '"'; - } - *p = '\0'; - - new_argv[i] = quoted_string; - } - else - new_argv[i] = (char *) string; - } - new_argv[argc] = NULL; - - return new_argv; -} -EOF - ;; - esac - - cat <<"EOF" -void lt_dump_script (FILE* f) -{ -EOF - func_emit_wrapper yes | - $SED -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - cat <<"EOF" -} -EOF -} -# end: func_emit_cwrapperexe_src - -# func_win32_import_lib_p ARG -# True if ARG is an import lib, as indicated by $file_magic_cmd -func_win32_import_lib_p () -{ - $opt_debug - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $opt_debug + # libtool link mode + link | relink) + modename="$modename: link" case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) # It is impossible to link a dll without this setting, and # we shouldn't force the makefile maintainer to figure out # which system we are compiling for in order to pass an extra @@ -5071,10 +1121,10 @@ func_mode_link () allow_undefined=yes ;; esac - libtool_args=$nonopt + libtool_args="$nonopt" base_compile="$nonopt $@" - compile_command=$nonopt - finalize_command=$nonopt + compile_command="$nonopt" + finalize_command="$nonopt" compile_rpath= finalize_rpath= @@ -5089,10 +1139,8 @@ func_mode_link () dllsearchpath= lib_search_path=`pwd` inst_prefix_dir= - new_inherited_linker_flags= avoid_version=no - bindir= dlfiles= dlprefiles= dlself=no @@ -5106,6 +1154,7 @@ func_mode_link () no_install=no objs= non_pic_objects= + notinst_path= # paths that contain not-installed libtool libraries precious_files_regex= prefer_static_libs=no preload=no @@ -5119,25 +1168,19 @@ func_mode_link () thread_safe=no vinfo= vinfo_number=no - weak_libs= single_module="${wl}-single_module" + func_infer_tag $base_compile # We need to know -static, to get the right output filenames. for arg do case $arg in - -shared) - test "$build_libtool_libs" != yes && \ - func_fatal_configuration "can not build a shared library" - build_old_libs=no - break - ;; -all-static | -static | -static-libtool-libs) case $arg in -all-static) if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then - func_warning "complete static linking is impossible in this configuration" + $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 fi if test -n "$link_static_flag"; then dlopen_self=$dlopen_self_static @@ -5171,30 +1214,29 @@ func_mode_link () while test "$#" -gt 0; do arg="$1" shift - func_quote_for_eval "$arg" - qarg=$func_quote_for_eval_unquoted_result - func_append libtool_args " $func_quote_for_eval_result" + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" # If the previous option needs an argument, assign it. if test -n "$prev"; then case $prev in output) - func_append compile_command " @OUTPUT@" - func_append finalize_command " @OUTPUT@" + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" ;; esac case $prev in - bindir) - bindir="$arg" - prev= - continue - ;; dlfiles|dlprefiles) if test "$preload" = no; then # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" preload=yes fi case $arg in @@ -5221,9 +1263,9 @@ func_mode_link () ;; *) if test "$prev" = dlfiles; then - func_append dlfiles " $arg" + dlfiles="$dlfiles $arg" else - func_append dlprefiles " $arg" + dlprefiles="$dlprefiles $arg" fi prev= continue @@ -5232,8 +1274,10 @@ func_mode_link () ;; expsyms) export_symbols="$arg" - test -f "$arg" \ - || func_fatal_error "symbol file \`$arg' does not exist" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi prev= continue ;; @@ -5242,120 +1286,11 @@ func_mode_link () prev= continue ;; - framework) - case $host in - *-*-darwin*) - case "$deplibs " in - *" $qarg.ltframework "*) ;; - *) func_append deplibs " $qarg.ltframework" # this is fixed later - ;; - esac - ;; - esac - prev= - continue - ;; inst_prefix) inst_prefix_dir="$arg" prev= continue ;; - objectlist) - if test -f "$arg"; then - save_arg=$arg - moreargs= - for fil in `cat "$save_arg"` - do -# func_append moreargs " $fil" - arg=$fil - # A libtool-controlled object. - - # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then - pic_object= - non_pic_object= - - # Read the .lo file - func_source "$arg" - - if test -z "$pic_object" || - test -z "$non_pic_object" || - test "$pic_object" = none && - test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - if test "$pic_object" != none; then - # Prepend the subdirectory the object is found in. - pic_object="$xdir$pic_object" - - if test "$prev" = dlfiles; then - if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" - prev= - continue - else - # If libtool objects are unsupported, then we need to preload. - prev=dlprefiles - fi - fi - - # CHECK ME: I think I busted this. -Ossama - if test "$prev" = dlprefiles; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg="$pic_object" - fi - - # Non-PIC object. - if test "$non_pic_object" != none; then - # Prepend the subdirectory the object is found in. - non_pic_object="$xdir$non_pic_object" - - # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" - if test -z "$pic_object" || test "$pic_object" = none ; then - arg="$non_pic_object" - fi - else - # If the PIC object exists, use it instead. - # $xdir was prepended to $pic_object above. - non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" - fi - else - # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" - else - func_fatal_error "\`$arg' is not a valid libtool object" - fi - fi - done - else - func_fatal_error "link input file \`$arg' does not exist" - fi - arg=$save_arg - prev= - continue - ;; precious_regex) precious_files_regex="$arg" prev= @@ -5366,59 +1301,174 @@ func_mode_link () prev= continue ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; then + arg="$non_pic_object" + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object="$pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; rpath | xrpath) # We need an absolute path. case $arg in [\\/]* | [A-Za-z]:[\\/]*) ;; *) - func_fatal_error "only absolute run-paths are allowed" + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE ;; esac if test "$prev" = rpath; then case "$rpath " in *" $arg "*) ;; - *) func_append rpath " $arg" ;; + *) rpath="$rpath $arg" ;; esac else case "$xrpath " in *" $arg "*) ;; - *) func_append xrpath " $arg" ;; + *) xrpath="$xrpath $arg" ;; esac fi prev= continue ;; - shrext) - shrext_cmds="$arg" - prev= - continue - ;; - weak) - func_append weak_libs " $arg" - prev= - continue - ;; - xcclinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $qarg" - prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" - continue - ;; xcompiler) - func_append compiler_flags " $qarg" + compiler_flags="$compiler_flags $qarg" prev= - func_append compile_command " $qarg" - func_append finalize_command " $qarg" + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" continue ;; xlinker) - func_append linker_flags " $qarg" - func_append compiler_flags " $wl$qarg" + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" prev= - func_append compile_command " $wl$qarg" - func_append finalize_command " $wl$qarg" continue ;; *) @@ -5434,16 +1484,16 @@ func_mode_link () case $arg in -all-static) if test -n "$link_static_flag"; then - # See comment for -static flag below, for more details. - func_append compile_command " $link_static_flag" - func_append finalize_command " $link_static_flag" + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" fi continue ;; -allow-undefined) # FIXME: remove this flag sometime in the future. - func_fatal_error "\`-allow-undefined' must not be used because it is the default" + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue ;; -avoid-version) @@ -5451,11 +1501,6 @@ func_mode_link () continue ;; - -bindir) - prev=bindir - continue - ;; - -dlopen) prev=dlfiles continue @@ -5473,7 +1518,8 @@ func_mode_link () -export-symbols | -export-symbols-regex) if test -n "$export_symbols" || test -n "$export_symbols_regex"; then - func_fatal_error "more than one -exported-symbols argument is not allowed" + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE fi if test "X$arg" = "X-export-symbols"; then prev=expsyms @@ -5483,8 +1529,15 @@ func_mode_link () continue ;; - -framework) - prev=framework + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" continue ;; @@ -5498,59 +1551,45 @@ func_mode_link () -L[A-Z][A-Z]*:*) case $with_gcc/$host in no/*-*-irix* | /*-*-irix*) - func_append compile_command " $arg" - func_append finalize_command " $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" ;; esac continue ;; -L*) - func_stripname "-L" '' "$arg" - if test -z "$func_stripname_result"; then - if test "$#" -gt 0; then - func_fatal_error "require no space between \`-L' and \`$1'" - else - func_fatal_error "need path for \`-L' option" - fi - fi - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; *) absdir=`cd "$dir" && pwd` - test -z "$absdir" && \ - func_fatal_error "cannot determine absolute directory name of \`$dir'" + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi dir="$absdir" ;; esac case "$deplibs " in - *" -L$dir "* | *" $arg "*) - # Will only happen for absolute or sysroot arguments - ;; + *" -L$dir "*) ;; *) - # Preserve sysroot, but never include relative directories - case $dir in - [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; - *) func_append deplibs " -L$dir" ;; - esac - func_append lib_search_path " $dir" + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" ;; esac case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$dir:"*) ;; - ::) dllsearchpath=$dir;; - *) func_append dllsearchpath ":$dir";; + *) dllsearchpath="$dllsearchpath:$dir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; + *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac @@ -5560,7 +1599,7 @@ func_mode_link () -l*) if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) # These systems don't actually have a C or math library (as such) continue ;; @@ -5574,7 +1613,7 @@ func_mode_link () ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C and math libraries are in the System framework - func_append deplibs " System.ltframework" + deplibs="$deplibs -framework System" continue ;; *-*-sco3.2v5* | *-*-sco5v6*) @@ -5594,7 +1633,30 @@ func_mode_link () ;; esac fi - func_append deplibs " $arg" + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + deplibs="$deplibs $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" continue ;; @@ -5603,32 +1665,36 @@ func_mode_link () continue ;; - # Tru64 UNIX uses -model [arg] to determine the layout of C++ - # classes, name mangling, and exception handling. - # Darwin uses the -arch flag to determine output architecture. - -model|-arch|-isysroot|--sysroot) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - prev=xcompiler - continue - ;; + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - func_append compiler_flags " $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append deplibs " $arg" - case "$new_inherited_linker_flags " in - *" $arg "*) ;; - * ) func_append new_inherited_linker_flags " $arg" ;; + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; esac - continue - ;; + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; - -multi_module) - single_module="${wl}-multi_module" + -shrext) + prev=shrext continue ;; @@ -5639,11 +1705,11 @@ func_mode_link () -no-install) case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) # The PATH hackery in wrapper scripts is required on Windows # and Darwin in order for the loader to find any dlls it needs. - func_warning "\`-no-install' is ignored for $host" - func_warning "assuming \`-no-fast-install' instead" + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 fast_install=no ;; *) no_install=yes ;; @@ -5684,36 +1750,22 @@ func_mode_link () ;; -R*) - func_stripname '-R' '' "$arg" - dir=$func_stripname_result + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) ;; - =*) - func_stripname '=' '' "$dir" - dir=$lt_sysroot$func_stripname_result - ;; *) - func_fatal_error "only absolute run-paths are allowed" + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE ;; esac case "$xrpath " in *" $dir "*) ;; - *) func_append xrpath " $dir" ;; + *) xrpath="$xrpath $dir" ;; esac continue ;; - -shared) - # The effects of -shared are defined in a previous loop. - continue - ;; - - -shrext) - prev=shrext - continue - ;; - -static | -static-libtool-libs) # The effects of -static are defined in a previous loop. # We used to do the same as -all-static on platforms that @@ -5732,49 +1784,47 @@ func_mode_link () prev=vinfo continue ;; - -version-number) prev=vinfo vinfo_number=yes continue ;; - -weak) - prev=weak - continue - ;; - -Wc,*) - func_stripname '-Wc,' '' "$arg" - args=$func_stripname_result + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $func_quote_for_eval_result" - func_append compiler_flags " $func_quote_for_eval_result" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" done IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Wl,*) - func_stripname '-Wl,' '' "$arg" - args=$func_stripname_result + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` arg= save_ifs="$IFS"; IFS=',' for flag in $args; do IFS="$save_ifs" - func_quote_for_eval "$flag" - func_append arg " $wl$func_quote_for_eval_result" - func_append compiler_flags " $wl$func_quote_for_eval_result" - func_append linker_flags " $func_quote_for_eval_result" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" done IFS="$save_ifs" - func_stripname ' ' '' "$arg" - arg=$func_stripname_result + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` ;; -Xcompiler) @@ -5792,68 +1842,53 @@ func_mode_link () continue ;; - # -msg_* for osf cc - -msg_*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - ;; - - # Flags to be passed through unchanged, with rationale: - # -64, -mips[0-9] enable 64-bit mode for the SGI compiler - # -r[0-9][0-9]* specify processor for the SGI compiler - # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler - # +DA*, +DD* enable 64-bit mode for the HP compiler - # -q* compiler args for the IBM compiler - # -m*, -t[45]*, -txscale* architecture-specific flags for GCC - # -F/path path to uninstalled frameworks, gcc on darwin - # -p, -pg, --coverage, -fprofile-* profiling flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ - -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ - -O*|-flto*|-fwhopr*|-fuse-linker-plugin) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" - func_append compile_command " $arg" - func_append finalize_command " $arg" - func_append compiler_flags " $arg" - continue - ;; - # Some other compiler flag. -* | +*) - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac ;; *.$objext) # A standard object. - func_append objs " $arg" + objs="$objs $arg" ;; *.lo) # A libtool-controlled object. # Check to see that this really is a libtool object. - if func_lalib_unsafe_p "$arg"; then + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then pic_object= non_pic_object= # Read the .lo file - func_source "$arg" + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac - if test -z "$pic_object" || + if test -z "$pic_object" || \ test -z "$non_pic_object" || - test "$pic_object" = none && + test "$pic_object" = none && \ test "$non_pic_object" = none; then - func_fatal_error "cannot find name of object for \`$arg'" + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE fi # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi if test "$pic_object" != none; then # Prepend the subdirectory the object is found in. @@ -5861,7 +1896,7 @@ func_mode_link () if test "$prev" = dlfiles; then if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then - func_append dlfiles " $pic_object" + dlfiles="$dlfiles $pic_object" prev= continue else @@ -5873,12 +1908,12 @@ func_mode_link () # CHECK ME: I think I busted this. -Ossama if test "$prev" = dlprefiles; then # Preload the old-style object. - func_append dlprefiles " $pic_object" + dlprefiles="$dlprefiles $pic_object" prev= fi # A PIC object. - func_append libobjs " $pic_object" + libobjs="$libobjs $pic_object" arg="$pic_object" fi @@ -5888,7 +1923,7 @@ func_mode_link () non_pic_object="$xdir$non_pic_object" # A standard non-PIC object - func_append non_pic_objects " $non_pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" if test -z "$pic_object" || test "$pic_object" = none ; then arg="$non_pic_object" fi @@ -5896,47 +1931,52 @@ func_mode_link () # If the PIC object exists, use it instead. # $xdir was prepended to $pic_object above. non_pic_object="$pic_object" - func_append non_pic_objects " $non_pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" fi else # Only an error if not doing a dry-run. - if $opt_dry_run; then - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir="$func_dirname_result" - - func_lo2o "$arg" - pic_object=$xdir$objdir/$func_lo2o_result - non_pic_object=$xdir$func_lo2o_result - func_append libobjs " $pic_object" - func_append non_pic_objects " $non_pic_object" + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE else - func_fatal_error "\`$arg' is not a valid libtool object" + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" fi fi ;; *.$libext) # An archive. - func_append deplibs " $arg" - func_append old_deplibs " $arg" + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" continue ;; *.la) # A libtool-controlled library. - func_resolve_sysroot "$arg" if test "$prev" = dlfiles; then # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" + dlfiles="$dlfiles $arg" prev= elif test "$prev" = dlprefiles; then # The library was specified with -dlpreopen. - func_append dlprefiles " $func_resolve_sysroot_result" + dlprefiles="$dlprefiles $arg" prev= else - func_append deplibs " $func_resolve_sysroot_result" + deplibs="$deplibs $arg" fi continue ;; @@ -5945,53 +1985,70 @@ func_mode_link () *) # Unknown arguments in both finalize_command and compile_command need # to be aesthetically quoted because they are evaled later. - func_quote_for_eval "$arg" - arg="$func_quote_for_eval_result" + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac ;; esac # arg # Now actually substitute the argument into the commands. if test -n "$arg"; then - func_append compile_command " $arg" - func_append finalize_command " $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" fi done # argument parsing loop - test -n "$prev" && \ - func_fatal_help "the \`$prevarg' option requires an argument" + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then eval arg=\"$export_dynamic_flag_spec\" - func_append compile_command " $arg" - func_append finalize_command " $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" fi oldlibs= # calculate the name of the file, without its directory - func_basename "$output" - outputname="$func_basename_result" + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` libobjs_save="$libobjs" if test -n "$shlibpath_var"; then # get the directories listed in $shlibpath_var - eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\` + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'s/:/ /g\'\` else shlib_search_path= fi eval sys_lib_search_path=\"$sys_lib_search_path_spec\" eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" - func_dirname "$output" "/" "" - output_objdir="$func_dirname_result$objdir" - func_to_tool_file "$output_objdir/" - tool_output_objdir=$func_to_tool_file_result + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi # Create the object directory. - func_mkdir_p "$output_objdir" + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi # Determine the type of output case $output in "") - func_fatal_help "you must specify an output file" + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE ;; *.$libext) linkmode=oldlib ;; *.lo | *.$objext) linkmode=obj ;; @@ -5999,18 +2056,27 @@ func_mode_link () *) linkmode=prog ;; # Anything else should be a program. esac + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + esac specialdeplibs= libs= # Find all interdependent deplibs by searching for libraries # that are linked more than once (e.g. -la -lb -la) for deplib in $deplibs; do - if $opt_preserve_dup_deps ; then + if test "X$duplicate_deps" = "Xyes" ; then case "$libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi - func_append libs " $deplib" + libs="$libs $deplib" done if test "$linkmode" = lib; then @@ -6020,12 +2086,12 @@ func_mode_link () # $postdeps and mark them as special (i.e., whose duplicates are # not to be eliminated). pre_post_deps= - if $opt_duplicate_compiler_generated_deps; then + if test "X$duplicate_compiler_generated_deps" = "Xyes" ; then for pre_post_dep in $predeps $postdeps; do case "$pre_post_deps " in - *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; esac - func_append pre_post_deps " $pre_post_dep" + pre_post_deps="$pre_post_deps $pre_post_dep" done fi pre_post_deps= @@ -6036,16 +2102,15 @@ func_mode_link () newlib_search_path= need_relink=no # whether we're linking any uninstalled libtool libraries notinst_deplibs= # not-installed libtool libraries - notinst_path= # paths that contain not-installed libtool libraries - case $linkmode in lib) - passes="conv dlpreopen link" + passes="conv link" for file in $dlfiles $dlprefiles; do case $file in *.la) ;; *) - func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file" + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE ;; esac done @@ -6061,20 +2126,7 @@ func_mode_link () *) passes="conv" ;; esac - for pass in $passes; do - # The preopen pass in lib mode reverses $deplibs; put it back here - # so that -L comes before libs that need it for instance... - if test "$linkmode,$pass" = "lib,link"; then - ## FIXME: Find the place where the list is rebuilt in the wrong - ## order, and fix it there properly - tmp_deplibs= - for deplib in $deplibs; do - tmp_deplibs="$deplib $tmp_deplibs" - done - deplibs="$tmp_deplibs" - fi - if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan"; then libs="$deplibs" @@ -6087,63 +2139,31 @@ func_mode_link () link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; esac fi - if test "$linkmode,$pass" = "lib,dlpreopen"; then - # Collect and forward deplibs of preopened libtool libs - for lib in $dlprefiles; do - # Ignore non-libtool-libs - dependency_libs= - func_resolve_sysroot "$lib" - case $lib in - *.la) func_source "$func_resolve_sysroot_result" ;; - esac - - # Collect preopened libtool deplibs, except any this library - # has declared as weak libs - for deplib in $dependency_libs; do - func_basename "$deplib" - deplib_base=$func_basename_result - case " $weak_libs " in - *" $deplib_base "*) ;; - *) func_append deplibs " $deplib" ;; - esac - done - done - libs="$dlprefiles" - fi if test "$pass" = dlopen; then # Collect dlpreopened libraries save_deplibs="$deplibs" deplibs= fi - for deplib in $libs; do lib= found=no case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else - func_append compiler_flags " $deplib" + compiler_flags="$compiler_flags $deplib" test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi fi continue ;; -l*) if test "$linkmode" != lib && test "$linkmode" != prog; then - func_warning "\`-l' is ignored for archives/objects" + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 continue fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` if test "$linkmode" = lib; then searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" else @@ -6179,17 +2199,21 @@ func_mode_link () if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $deplib "*) - if func_lalib_p "$lib"; then + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then library_names= old_library= - func_source "$lib" + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac for l in $old_library $library_names; do ll="$l" done if test "X$ll" = "X$old_library" ; then # only static version available found=no - func_dirname "$lib" "" "." - ladir="$func_dirname_result" + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." lib=$ladir/$old_library if test "$linkmode,$pass" = "prog,link"; then compile_deplibs="$deplib $compile_deplibs" @@ -6201,36 +2225,19 @@ func_mode_link () continue fi fi - ;; + ;; *) ;; esac fi fi ;; # -l - *.ltframework) - if test "$linkmode,$pass" = "prog,link"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test "$linkmode" = lib ; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; -L*) case $linkmode in lib) deplibs="$deplib $deplibs" test "$pass" = conv && continue newdependency_libs="$deplib $newdependency_libs" - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; prog) if test "$pass" = conv; then @@ -6243,34 +2250,27 @@ func_mode_link () compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" fi - func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` ;; *) - func_warning "\`-L' is ignored for archives/objects" + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 ;; esac # linkmode continue ;; # -L -R*) if test "$pass" = link; then - func_stripname '-R' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - dir=$func_resolve_sysroot_result + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` # Make sure the xrpath contains only unique directories. case "$xrpath " in *" $dir "*) ;; - *) func_append xrpath " $dir" ;; + *) xrpath="$xrpath $dir" ;; esac fi deplibs="$deplib $deplibs" continue ;; - *.la) - func_resolve_sysroot "$deplib" - lib=$func_resolve_sysroot_result - ;; + *.la) lib="$deplib" ;; *.$libext) if test "$pass" = conv; then deplibs="$deplib $deplibs" @@ -6278,41 +2278,35 @@ func_mode_link () fi case $linkmode in lib) - # Linking convenience modules into shared libraries is allowed, - # but linking other static libraries is non-portable. - case " $dlpreconveniencelibs " in - *" $deplib "*) ;; - *) - valid_a_lib=no - case $deplibs_check_method in - match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` - if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ | $EGREP "$match_pattern_regex" > /dev/null; then - valid_a_lib=yes - fi - ;; - pass_all) valid_a_lib=yes + fi ;; - esac - if test "$valid_a_lib" != yes; then - echo - $ECHO "*** Warning: Trying to link with static lib archive $deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because the file extensions .$libext of this argument makes me believe" - echo "*** that it is just a static archive that I should not use here." - else - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - fi - ;; - esac + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi continue ;; prog) @@ -6333,11 +2327,11 @@ func_mode_link () if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then # If there is no dlopen support or we're linking statically, # we need to preload. - func_append newdlprefiles " $deplib" + newdlprefiles="$newdlprefiles $deplib" compile_deplibs="$deplib $compile_deplibs" finalize_deplibs="$deplib $finalize_deplibs" else - func_append newdlfiles " $deplib" + newdlfiles="$newdlfiles $deplib" fi fi continue @@ -6347,18 +2341,21 @@ func_mode_link () continue ;; esac # case $deplib - if test "$found" = yes || test -f "$lib"; then : else - func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'" + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE fi # Check to see that this really is a libtool archive. - func_lalib_unsafe_p "$lib" \ - || func_fatal_error "\`$lib' is not a valid libtool archive" + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi - func_dirname "$lib" "" "." - ladir="$func_dirname_result" + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." dlname= dlopen= @@ -6366,7 +2363,6 @@ func_mode_link () libdir= library_names= old_library= - inherited_linker_flags= # If the library was installed with an old release of libtool, # it will not redefine variables installed, or shouldnotlink installed=yes @@ -6375,24 +2371,16 @@ func_mode_link () # Read the .la file - func_source "$lib" + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac - # Convert "-framework foo" to "foo.ltframework" - if test -n "$inherited_linker_flags"; then - tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` - for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do - case " $new_inherited_linker_flags " in - *" $tmp_inherited_linker_flag "*) ;; - *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; - esac - done - fi - dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` if test "$linkmode,$pass" = "lib,link" || test "$linkmode,$pass" = "prog,scan" || { test "$linkmode" != prog && test "$linkmode" != lib; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" fi if test "$pass" = conv; then @@ -6400,23 +2388,25 @@ func_mode_link () deplibs="$lib $deplibs" if test -z "$libdir"; then if test -z "$old_library"; then - func_fatal_error "cannot find name of link library for \`$lib'" + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE fi # It is a libtool convenience library, so add in its objects. - func_append convenience " $ladir/$objdir/$old_library" - func_append old_convenience " $ladir/$objdir/$old_library" + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" elif test "$linkmode" != prog && test "$linkmode" != lib; then - func_fatal_error "\`$lib' is not a convenience library" + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE fi tmp_libs= for deplib in $dependency_libs; do deplibs="$deplib $deplibs" - if $opt_preserve_dup_deps ; then + if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi - func_append tmp_libs " $deplib" + tmp_libs="$tmp_libs $deplib" done continue fi # $pass = conv @@ -6424,23 +2414,19 @@ func_mode_link () # Get the name of the library we link against. linklib= - if test -n "$old_library" && - { test "$prefer_static_libs" = yes || - test "$prefer_static_libs,$installed" = "built,no"; }; then - linklib=$old_library - else - for l in $old_library $library_names; do - linklib="$l" - done - fi + for l in $old_library $library_names; do + linklib="$l" + done if test -z "$linklib"; then - func_fatal_error "cannot find name of link library for \`$lib'" + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE fi # This library was specified with -dlopen. if test "$pass" = dlopen; then if test -z "$libdir"; then - func_fatal_error "cannot -dlopen a convenience library: \`$lib'" + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE fi if test -z "$dlname" || test "$dlopen_support" != yes || @@ -6449,9 +2435,9 @@ func_mode_link () # statically, we need to preload. We also need to preload any # dependent libraries so libltdl's deplib preloader doesn't # bomb out in the load deplibs phase. - func_append dlprefiles " $lib $dependency_libs" + dlprefiles="$dlprefiles $lib $dependency_libs" else - func_append newdlfiles " $lib" + newdlfiles="$newdlfiles $lib" fi continue fi # $pass = dlopen @@ -6462,25 +2448,24 @@ func_mode_link () *) abs_ladir=`cd "$ladir" && pwd` if test -z "$abs_ladir"; then - func_warning "cannot determine absolute directory name of \`$ladir'" - func_warning "passing it literally to the linker, although it might fail" + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 abs_ladir="$ladir" fi ;; esac - func_basename "$lib" - laname="$func_basename_result" + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` # Find the relevant object directory and library name. if test "X$installed" = Xyes; then - if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then - func_warning "library \`$lib' was moved." + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 dir="$ladir" absdir="$abs_ladir" libdir="$abs_ladir" else - dir="$lt_sysroot$libdir" - absdir="$lt_sysroot$libdir" + dir="$libdir" + absdir="$libdir" fi test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes else @@ -6488,62 +2473,32 @@ func_mode_link () dir="$ladir" absdir="$abs_ladir" # Remove this search path later - func_append notinst_path " $abs_ladir" + notinst_path="$notinst_path $abs_ladir" else dir="$ladir/$objdir" absdir="$abs_ladir/$objdir" # Remove this search path later - func_append notinst_path " $abs_ladir" + notinst_path="$notinst_path $abs_ladir" fi fi # $installed = yes - func_stripname 'lib' '.la' "$laname" - name=$func_stripname_result + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` # This library was specified with -dlpreopen. if test "$pass" = dlpreopen; then - if test -z "$libdir" && test "$linkmode" = prog; then - func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'" + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" fi - case "$host" in - # special handling for platforms with PE-DLLs. - *cygwin* | *mingw* | *cegcc* ) - # Linker will automatically link against shared library if both - # static and shared are present. Therefore, ensure we extract - # symbols from the import library if a shared library is present - # (otherwise, the dlopen module name will be incorrect). We do - # this by putting the import library name into $newdlprefiles. - # We recover the dlopen module name by 'saving' the la file - # name in a special purpose variable, and (later) extracting the - # dlname from the la file. - if test -n "$dlname"; then - func_tr_sh "$dir/$linklib" - eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" - func_append newdlprefiles " $dir/$linklib" - else - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - fi - ;; - * ) - # Prefer using a static library (so that no silly _DYNAMIC symbols - # are required to link). - if test -n "$old_library"; then - func_append newdlprefiles " $dir/$old_library" - # Keep a list of preopened convenience libraries to check - # that they are being used correctly in the link pass. - test -z "$libdir" && \ - func_append dlpreconveniencelibs " $dir/$old_library" - # Otherwise, use the dlname, so that lt_dlopen finds it. - elif test -n "$dlname"; then - func_append newdlprefiles " $dir/$dlname" - else - func_append newdlprefiles " $dir/$linklib" - fi - ;; - esac fi # $pass = dlpreopen if test -z "$libdir"; then @@ -6561,7 +2516,7 @@ func_mode_link () if test "$linkmode" = prog && test "$pass" != link; then - func_append newlib_search_path " $ladir" + newlib_search_path="$newlib_search_path $ladir" deplibs="$lib $deplibs" linkalldeplibs=no @@ -6573,10 +2528,7 @@ func_mode_link () tmp_libs= for deplib in $dependency_libs; do case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result" - func_append newlib_search_path " $func_resolve_sysroot_result" - ;; + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test esac # Need to link against all dependency_libs? if test "$linkalldeplibs" = yes; then @@ -6586,12 +2538,12 @@ func_mode_link () # or/and link against static libraries newdependency_libs="$deplib $newdependency_libs" fi - if $opt_preserve_dup_deps ; then + if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in - *" $deplib "*) func_append specialdeplibs " $deplib" ;; + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi - func_append tmp_libs " $deplib" + tmp_libs="$tmp_libs $deplib" done # for deplib continue fi # $linkmode = prog... @@ -6599,14 +2551,15 @@ func_mode_link () if test "$linkmode,$pass" = "prog,link"; then if test -n "$library_names" && { { test "$prefer_static_libs" = no || - test "$prefer_static_libs,$installed" = "built,yes"; } || + test "$prefer_static_libs,$installed" = "built,yes"; } || test -z "$old_library"; }; then # We need to hardcode the library path if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then # Make sure the rpath contains only unique directories. - case "$temp_rpath:" in - *"$absdir:"*) ;; - *) func_append temp_rpath "$absdir:" ;; + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; esac fi @@ -6618,7 +2571,7 @@ func_mode_link () *) case "$compile_rpath " in *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; + *) compile_rpath="$compile_rpath $absdir" esac ;; esac @@ -6627,7 +2580,7 @@ func_mode_link () *) case "$finalize_rpath " in *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; + *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac @@ -6644,43 +2597,27 @@ func_mode_link () link_static=no # Whether the deplib will be linked statically use_static_libs=$prefer_static_libs - if test "$use_static_libs" = built && test "$installed" = yes; then + if test "$use_static_libs" = built && test "$installed" = yes ; then use_static_libs=no fi if test -n "$library_names" && { test "$use_static_libs" = no || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test "$installed" = no; then - func_append notinst_deplibs " $lib" - test -z "$DESTDIR" && need_relink=yes - fi - ;; - esac + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + test -z "$DESTDIR" && need_relink=yes + fi # This is a shared library - # Warn about portability, can't link against -module's on some - # systems (darwin). Don't bleat about dlopened modules though! - dlopenmodule="" - for dlpremoduletest in $dlprefiles; do - if test "X$dlpremoduletest" = "X$lib"; then - dlopenmodule="$dlpremoduletest" - break - fi - done - if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then - echo + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo if test "$linkmode" = prog; then - $ECHO "*** Warning: Linking the executable $output against the loadable module" + $echo "*** Warning: Linking the executable $output against the loadable module" else - $ECHO "*** Warning: Linking the shared library $output against the loadable module" + $echo "*** Warning: Linking the shared library $output against the loadable module" fi - $ECHO "*** $linklib is not portable!" + $echo "*** $linklib is not portable!" fi if test "$linkmode" = lib && test "$hardcode_into_libs" = yes; then @@ -6692,7 +2629,7 @@ func_mode_link () *) case "$compile_rpath " in *" $absdir "*) ;; - *) func_append compile_rpath " $absdir" ;; + *) compile_rpath="$compile_rpath $absdir" esac ;; esac @@ -6701,7 +2638,7 @@ func_mode_link () *) case "$finalize_rpath " in *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; + *) finalize_rpath="$finalize_rpath $libdir" esac ;; esac @@ -6710,19 +2647,17 @@ func_mode_link () if test -n "$old_archive_from_expsyms_cmds"; then # figure out the soname set dummy $library_names - shift - realname="$1" - shift - libname=`eval "\\$ECHO \"$libname_spec\""` + realname="$2" + shift; shift + libname=`eval \\$echo \"$libname_spec\"` # use dlname if we got it. it's perfectly good, no? if test -n "$dlname"; then soname="$dlname" elif test -n "$soname_spec"; then # bleh windows case $host in - *cygwin* | mingw* | *cegcc*) - func_arith $current - $age - major=$func_arith_result + *cygwin* | mingw*) + major=`expr $current - $age` versuffix="-$major" ;; esac @@ -6733,29 +2668,43 @@ func_mode_link () # Make a new name for the extract_expsyms_cmds to use soroot="$soname" - func_basename "$soroot" - soname="$func_basename_result" - func_stripname 'lib' '.dll' "$soname" - newlib=libimp-$func_stripname_result.a + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" # If the library has no export list, then create one now if test -f "$output_objdir/$soname-def"; then : else - func_verbose "extracting exported symbol list from \`$soname'" - func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" fi # Create $newlib if test -f "$output_objdir/$newlib"; then :; else - func_verbose "generating import library for \`$soname'" - func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" fi # make sure the library variables are pointing to the new library dir=$output_objdir linklib=$newlib fi # test -n "$old_archive_from_expsyms_cmds" - if test "$linkmode" = prog || test "$opt_mode" != relink; then + if test "$linkmode" = prog || test "$mode" != relink; then add_shlibpath= add_dir= add= @@ -6770,21 +2719,17 @@ func_mode_link () *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ *-*-unixware7*) add_dir="-L$dir" ;; *-*-darwin* ) - # if the lib is a (non-dlopened) module then we can not - # link against it, someone is ignoring the earlier warnings + # if the lib is a module then we can not link against + # it, someone is ignoring the new warnings I added if /usr/bin/file -L $add 2> /dev/null | - $GREP ": [^:]* bundle" >/dev/null ; then - if test "X$dlopenmodule" != "X$lib"; then - $ECHO "*** Warning: lib $linklib is a module, not a shared library" - if test -z "$old_library" ; then - echo - echo "*** And there doesn't seem to be a static archive available" - echo "*** The link will probably fail, sorry" - else - add="$dir/$old_library" - fi - elif test -n "$old_library"; then - add="$dir/$old_library" + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" fi fi esac @@ -6802,16 +2747,15 @@ func_mode_link () fi ;; relink) - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then + if test "$hardcode_direct" = yes; then add="$dir/$linklib" elif test "$hardcode_minus_L" = yes; then - add_dir="-L$absdir" + add_dir="-L$dir" # Try looking first in the location we're being installed to. if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" + add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi @@ -6827,13 +2771,14 @@ func_mode_link () esac if test "$lib_linked" != yes; then - func_fatal_configuration "unsupported hardcode properties" + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE fi if test -n "$add_shlibpath"; then case :$compile_shlibpath: in *":$add_shlibpath:"*) ;; - *) func_append compile_shlibpath "$add_shlibpath:" ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; esac fi if test "$linkmode" = prog; then @@ -6842,24 +2787,23 @@ func_mode_link () else test -n "$add_dir" && deplibs="$add_dir $deplibs" test -n "$add" && deplibs="$add $deplibs" - if test "$hardcode_direct" != yes && - test "$hardcode_minus_L" != yes && + if test "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac fi fi fi - if test "$linkmode" = prog || test "$opt_mode" = relink; then + if test "$linkmode" = prog || test "$mode" = relink; then add_shlibpath= add_dir= add= # Finalize command for both is simple: just hardcode it. - if test "$hardcode_direct" = yes && - test "$hardcode_direct_absolute" = no; then + if test "$hardcode_direct" = yes && test -f $libdir/$linklib; then add="$libdir/$linklib" elif test "$hardcode_minus_L" = yes; then add_dir="-L$libdir" @@ -6867,15 +2811,15 @@ func_mode_link () elif test "$hardcode_shlibpath_var" = yes; then case :$finalize_shlibpath: in *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; esac add="-l$name" elif test "$hardcode_automatic" = yes; then if test -n "$inst_prefix_dir" && test -f "$inst_prefix_dir$libdir/$linklib" ; then - add="$inst_prefix_dir$libdir/$linklib" + add="$inst_prefix_dir$libdir/$linklib" else - add="$libdir/$linklib" + add="$libdir/$linklib" fi else # We cannot seem to hardcode it, guess we'll fake it. @@ -6884,7 +2828,7 @@ func_mode_link () if test -n "$inst_prefix_dir"; then case $libdir in [\\/]*) - func_append add_dir " -L$inst_prefix_dir$libdir" + add_dir="$add_dir -L$inst_prefix_dir$libdir" ;; esac fi @@ -6919,21 +2863,21 @@ func_mode_link () # Just print a warning and add the library to dependency_libs so # that the program can be linked against the static library. - echo - $ECHO "*** Warning: This system can not link to static lib archive $lib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have." + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." if test "$module" = yes; then - echo "*** But as you try to build a module library, libtool will still create " - echo "*** a static module, that should work as long as the dlopening application" - echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then build_libtool_libs=module @@ -6957,113 +2901,126 @@ func_mode_link () temp_deplibs= for libdir in $dependency_libs; do case $libdir in - -R*) func_stripname '-R' '' "$libdir" - temp_xrpath=$func_stripname_result + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` case " $xrpath " in *" $temp_xrpath "*) ;; - *) func_append xrpath " $temp_xrpath";; + *) xrpath="$xrpath $temp_xrpath";; esac;; - *) func_append temp_deplibs " $libdir";; + *) temp_deplibs="$temp_deplibs $libdir";; esac done dependency_libs="$temp_deplibs" fi - func_append newlib_search_path " $absdir" + newlib_search_path="$newlib_search_path $absdir" # Link against this library test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" # ... and its dependency_libs tmp_libs= for deplib in $dependency_libs; do newdependency_libs="$deplib $newdependency_libs" - case $deplib in - -L*) func_stripname '-L' '' "$deplib" - func_resolve_sysroot "$func_stripname_result";; - *) func_resolve_sysroot "$deplib" ;; - esac - if $opt_preserve_dup_deps ; then + if test "X$duplicate_deps" = "Xyes" ; then case "$tmp_libs " in - *" $func_resolve_sysroot_result "*) - func_append specialdeplibs " $func_resolve_sysroot_result" ;; + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; esac fi - func_append tmp_libs " $func_resolve_sysroot_result" + tmp_libs="$tmp_libs $deplib" done if test "$link_all_deplibs" != no; then # Add the search paths of all dependency libraries for deplib in $dependency_libs; do - path= case $deplib in -L*) path="$deplib" ;; *.la) - func_resolve_sysroot "$deplib" - deplib=$func_resolve_sysroot_result - func_dirname "$deplib" "" "." - dir=$func_dirname_result + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." # We need an absolute path. case $dir in [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; *) absdir=`cd "$dir" && pwd` if test -z "$absdir"; then - func_warning "cannot determine absolute directory name of \`$dir'" + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 absdir="$dir" fi ;; esac - if $GREP "^installed=no" $deplib > /dev/null; then + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= case $host in *-*-darwin*) - depdepl= + # we do not want to link against static libs, + # but need to link against shared eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` if test -n "$deplibrary_names" ; then for tmp in $deplibrary_names ; do depdepl=$tmp done - if test -f "$absdir/$objdir/$depdepl" ; then - depdepl="$absdir/$objdir/$depdepl" - darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - if test -z "$darwin_install_name"; then - darwin_install_name=`${OTOOL64} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` - fi - func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}" - func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}" - path= + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac fi + path="" ;; *) - path="-L$absdir/$objdir" + path="-L$path" ;; esac - else - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - test "$absdir" != "$libdir" && \ - func_warning "\`$deplib' seems to be moved" - - path="-L$absdir" - fi ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; esac case " $deplibs " in *" $path "*) ;; *) deplibs="$path $deplibs" ;; esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac done fi # link_all_deplibs != no fi # linkmode = lib done # for deplib in $libs - if test "$pass" = link; then - if test "$linkmode" = "prog"; then - compile_deplibs="$new_inherited_linker_flags $compile_deplibs" - finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" - else - compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - fi - fi dependency_libs="$newdependency_libs" if test "$pass" = dlpreopen; then # Link the dlpreopened libraries before other libraries @@ -7078,7 +3035,7 @@ func_mode_link () for dir in $newlib_search_path; do case "$lib_search_path " in *" $dir "*) ;; - *) func_append lib_search_path " $dir" ;; + *) lib_search_path="$lib_search_path $dir" ;; esac done newlib_search_path= @@ -7136,10 +3093,10 @@ func_mode_link () -L*) case " $tmp_libs " in *" $deplib "*) ;; - *) func_append tmp_libs " $deplib" ;; + *) tmp_libs="$tmp_libs $deplib" ;; esac ;; - *) func_append tmp_libs " $deplib" ;; + *) tmp_libs="$tmp_libs $deplib" ;; esac done eval $var=\"$tmp_libs\" @@ -7155,96 +3112,99 @@ func_mode_link () ;; esac if test -n "$i" ; then - func_append tmp_libs " $i" + tmp_libs="$tmp_libs $i" fi done dependency_libs=$tmp_libs done # for pass if test "$linkmode" = prog; then dlfiles="$newdlfiles" - fi - if test "$linkmode" = prog || test "$linkmode" = lib; then dlprefiles="$newdlprefiles" fi case $linkmode in oldlib) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for archives" - fi - case " $deplibs" in *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for archives" ;; + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; esac - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for archives" + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for archives" + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for archives" + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi - test -n "$release" && \ - func_warning "\`-release' is ignored for archives" + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi - test -n "$export_symbols$export_symbols_regex" && \ - func_warning "\`-export-symbols' is ignored for archives" + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi # Now set the variables for building old libraries. build_libtool_libs=no oldlibs="$output" - func_append objs "$old_deplibs" + objs="$objs$old_deplibs" ;; lib) # Make sure we only generate libraries of the form `libNAME.la'. case $outputname in lib*) - func_stripname 'lib' '.la' "$outputname" - name=$func_stripname_result + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" ;; *) - test "$module" = no && \ - func_fatal_help "libtool library \`$output' must begin with \`lib'" - + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi if test "$need_lib_prefix" != no; then # Add the "lib" prefix for modules if required - func_stripname '' '.la' "$outputname" - name=$func_stripname_result + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` eval shared_ext=\"$shrext_cmds\" eval libname=\"$libname_spec\" else - func_stripname '' '.la' "$outputname" - libname=$func_stripname_result + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` fi ;; esac if test -n "$objs"; then if test "$deplibs_check_method" != pass_all; then - func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs" + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE else - echo - $ECHO "*** Warning: Linking the shared library $output against the non-libtool" - $ECHO "*** objects $objs is not portable!" - func_append libobjs " $objs" + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" fi fi - test "$dlself" != no && \ - func_warning "\`-dlopen self' is ignored for libtool libraries" + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi set dummy $rpath - shift - test "$#" -gt 1 && \ - func_warning "ignoring multiple \`-rpath's for a libtool library" - - install_libdir="$1" + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" oldlibs= if test -z "$rpath"; then @@ -7258,21 +3218,25 @@ func_mode_link () build_old_libs=yes fi - test -n "$vinfo" && \ - func_warning "\`-version-info/-version-number' is ignored for convenience libraries" + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi - test -n "$release" && \ - func_warning "\`-release' is ignored for convenience libraries" + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi else # Parse the version information argument. save_ifs="$IFS"; IFS=':' set dummy $vinfo 0 0 0 - shift IFS="$save_ifs" - test -n "$7" && \ - func_fatal_help "too many parameters to \`-version-info'" + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi # convert absolute version numbers to libtool ages # this retains compatibility with .la files and attempts @@ -7280,9 +3244,9 @@ func_mode_link () case $vinfo_number in yes) - number_major="$1" - number_minor="$2" - number_revision="$3" + number_major="$2" + number_minor="$3" + number_revision="$4" # # There are really only two kinds -- those that # use the current revision as the major version @@ -7291,21 +3255,18 @@ func_mode_link () # which has an extra 1 added just for fun # case $version_type in - # correct linux to gnu/linux during the next big refactor darwin|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result + current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_revision" ;; - freebsd-aout|freebsd-elf|qnx|sunos) + freebsd-aout|freebsd-elf|sunos) current="$number_major" revision="$number_minor" age="0" ;; irix|nonstopux) - func_arith $number_major + $number_minor - current=$func_arith_result + current=`expr $number_major + $number_minor` age="$number_minor" revision="$number_minor" lt_irix_increment=no @@ -7313,9 +3274,9 @@ func_mode_link () esac ;; no) - current="$1" - revision="$2" - age="$3" + current="$2" + revision="$3" + age="$4" ;; esac @@ -7323,30 +3284,34 @@ func_mode_link () case $current in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) - func_error "CURRENT \`$current' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE ;; esac case $revision in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) - func_error "REVISION \`$revision' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE ;; esac case $age in 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; *) - func_error "AGE \`$age' must be a nonnegative integer" - func_fatal_error "\`$vinfo' is not valid version information" + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE ;; esac if test "$age" -gt "$current"; then - func_error "AGE \`$age' is greater than the current interface number \`$current'" - func_fatal_error "\`$vinfo' is not valid version information" + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE fi # Calculate the version variables. @@ -7359,12 +3324,10 @@ func_mode_link () darwin) # Like Linux, but with the current version available in # verstring for coding it into the library header - func_arith $current - $age - major=.$func_arith_result + major=.`expr $current - $age` versuffix="$major.$age.$revision" # Darwin ld doesn't like 0 for these options... - func_arith $current + 1 - minor_current=$func_arith_result + minor_current=`expr $current + 1` xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" ;; @@ -7376,17 +3339,15 @@ func_mode_link () freebsd-elf) major=".$current" - versuffix=".$current" + versuffix=".$current"; ;; irix | nonstopux) if test "X$lt_irix_increment" = "Xno"; then - func_arith $current - $age + major=`expr $current - $age` else - func_arith $current - $age + 1 + major=`expr $current - $age + 1` fi - major=$func_arith_result - case $version_type in nonstopux) verstring_prefix=nonstopux ;; *) verstring_prefix=sgi ;; @@ -7396,10 +3357,8 @@ func_mode_link () # Add in all the interfaces that we are compatible with. loop=$revision while test "$loop" -ne 0; do - func_arith $revision - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result + iface=`expr $revision - $loop` + loop=`expr $loop - 1` verstring="$verstring_prefix$major.$iface:$verstring" done @@ -7408,35 +3367,26 @@ func_mode_link () versuffix="$major.$revision" ;; - linux) # correct to gnu/linux during the next big refactor - func_arith $current - $age - major=.$func_arith_result + linux) + major=.`expr $current - $age` versuffix="$major.$age.$revision" ;; osf) - func_arith $current - $age - major=.$func_arith_result + major=.`expr $current - $age` versuffix=".$current.$age.$revision" verstring="$current.$age.$revision" # Add in all the interfaces that we are compatible with. loop=$age while test "$loop" -ne 0; do - func_arith $current - $loop - iface=$func_arith_result - func_arith $loop - 1 - loop=$func_arith_result + iface=`expr $current - $loop` + loop=`expr $loop - 1` verstring="$verstring:${iface}.0" done # Make executables depend on our current version. - func_append verstring ":${current}.0" - ;; - - qnx) - major=".$current" - versuffix=".$current" + verstring="$verstring:${current}.0" ;; sunos) @@ -7447,13 +3397,14 @@ func_mode_link () windows) # Use '-' rather than '.', since we only want one # extension on DOS 8.3 filesystems. - func_arith $current - $age - major=$func_arith_result + major=`expr $current - $age` versuffix="-$major" ;; *) - func_fatal_configuration "unknown library version type \`$version_type'" + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE ;; esac @@ -7501,7 +3452,7 @@ func_mode_link () # Check to see if the archive will have undefined symbols. if test "$allow_undefined" = yes; then if test "$allow_undefined_flag" = unsupported; then - func_warning "undefined symbols not allowed in $host shared libraries" + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 build_libtool_libs=no build_old_libs=yes fi @@ -7509,62 +3460,58 @@ func_mode_link () # Don't allow undefined symbols. allow_undefined_flag="$no_undefined_flag" fi - fi - func_generate_dlsyms "$libname" "$libname" "yes" - func_append libobjs " $symfileobj" - test "X$libobjs" = "X " && libobjs= - - if test "$opt_mode" != relink; then + if test "$mode" != relink; then # Remove our outputs, but don't remove object files since they # may have been created when compiling PIC objects. removelist= - tempremovelist=`$ECHO "$output_objdir/*"` + tempremovelist=`$echo "$output_objdir/*"` for p in $tempremovelist; do case $p in - *.$objext | *.gcno) + *.$objext) ;; $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) if test "X$precious_files_regex" != "X"; then - if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 - then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then continue fi fi - func_append removelist " $p" + removelist="$removelist $p" ;; *) ;; esac done - test -n "$removelist" && \ - func_show_eval "${RM}r \$removelist" + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi fi # Now set the variables for building old libraries. if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then - func_append oldlibs " $output_objdir/$libname.$libext" + oldlibs="$oldlibs $output_objdir/$libname.$libext" # Transform .lo files to .o files. - oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP` + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` fi # Eliminate all temporary directories. #for path in $notinst_path; do - # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` - # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` - # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "s% -L$path % %g"` #done if test -n "$xrpath"; then # If the user specified any rpath flags, then add them. temp_xrpath= for libdir in $xrpath; do - func_replace_sysroot "$libdir" - func_append temp_xrpath " -R$func_replace_sysroot_result" + temp_xrpath="$temp_xrpath -R$libdir" case "$finalize_rpath " in *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; esac done if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then @@ -7578,7 +3525,7 @@ func_mode_link () for lib in $old_dlfiles; do case " $dlprefiles $dlfiles " in *" $lib "*) ;; - *) func_append dlfiles " $lib" ;; + *) dlfiles="$dlfiles $lib" ;; esac done @@ -7588,19 +3535,19 @@ func_mode_link () for lib in $old_dlprefiles; do case "$dlprefiles " in *" $lib "*) ;; - *) func_append dlprefiles " $lib" ;; + *) dlprefiles="$dlprefiles $lib" ;; esac done if test "$build_libtool_libs" = yes; then if test -n "$rpath"; then case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) # these systems don't actually have a c library (as such)! ;; *-*-rhapsody* | *-*-darwin1.[012]) # Rhapsody C library is in the System framework - func_append deplibs " System.ltframework" + deplibs="$deplibs -framework System" ;; *-*-netbsd*) # Don't link with libc until the a.out ld.so is fixed. @@ -7614,10 +3561,10 @@ func_mode_link () *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) # Compiler inserts libc in the correct place for threads to work ;; - *) + *) # Add libc to deplibs on all other systems if necessary. if test "$build_libtool_need_lc" = "yes"; then - func_append deplibs " -lc" + deplibs="$deplibs -lc" fi ;; esac @@ -7651,139 +3598,120 @@ func_mode_link () # limits. Maybe even breaks it. We compile a program, linking it # against the deplibs as a proxy for the library. Then we can check # whether they linked in statically or dynamically with ldd. - $opt_dry_run || $RM conftest.c + $rm conftest.c cat > conftest.c </dev/null` - $nocaseglob - else - potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` - fi + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do # Follow soft links. - if ls -lLd "$potent_lib" 2>/dev/null | - $GREP " -> " >/dev/null; then + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then continue fi # The statement above tries to avoid entering an @@ -7796,13 +3724,13 @@ EOF potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` case $potliblink in [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; - *) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; esac done - if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | - $SED -e 10q | - $EGREP "$file_magic_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi @@ -7811,52 +3739,50 @@ EOF fi if test -n "$a_deplib" ; then droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + $echo "*** with $libname but no candidates were found. (...for file magic test)" else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a file magic. Last file checked: $potlib" + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" fi fi - ;; - *) + else # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac + newdeplibs="$newdeplibs $a_deplib" + fi done # Gone through all deplibs. ;; match_pattern*) - set dummy $deplibs_check_method; shift - match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` for a_deplib in $deplibs; do - case $a_deplib in - -l*) - func_stripname -l '' "$a_deplib" - name=$func_stripname_result + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then case " $predeps $postdeps " in *" $a_deplib "*) - func_append newdeplibs " $a_deplib" + newdeplibs="$newdeplibs $a_deplib" a_deplib="" ;; esac fi if test -n "$a_deplib" ; then - libname=`eval "\\$ECHO \"$libname_spec\""` + libname=`eval \\$echo \"$libname_spec\"` for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do potential_libs=`ls $i/$libname[.-]* 2>/dev/null` for potent_lib in $potential_libs; do potlib="$potent_lib" # see symlink-check above in file_magic test - if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ - $EGREP "$match_pattern_regex" > /dev/null; then - func_append newdeplibs " $a_deplib" + if eval $echo \"$potent_lib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" a_deplib="" break 2 fi @@ -7865,48 +3791,46 @@ EOF fi if test -n "$a_deplib" ; then droppeddeps=yes - echo - $ECHO "*** Warning: linker path does not have real file for library $a_deplib." - echo "*** I have the capability to make that library automatically link in when" - echo "*** you link to this library. But I can only do this if you have a" - echo "*** shared version of the library, which you do not appear to have" - echo "*** because I did check the linker path looking for a file starting" + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" if test -z "$potlib" ; then - $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" else - $ECHO "*** with $libname and none of the candidates passed a file format test" - $ECHO "*** using a regex pattern. Last file checked: $potlib" + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" fi fi - ;; - *) + else # Add a -L argument. - func_append newdeplibs " $a_deplib" - ;; - esac + newdeplibs="$newdeplibs $a_deplib" + fi done # Gone through all deplibs. ;; none | unknown | *) newdeplibs="" - tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then for i in $predeps $postdeps ; do # can't use Xsed below, because $i might contain '/' - tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"` + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` done fi - case $tmp_deplibs in - *[!\ \ ]*) - echo + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo if test "X$deplibs_check_method" = "Xnone"; then - echo "*** Warning: inter-library dependencies are not supported in this platform." + $echo "*** Warning: inter-library dependencies are not supported in this platform." else - echo "*** Warning: inter-library dependencies are not known to be supported." + $echo "*** Warning: inter-library dependencies are not known to be supported." fi - echo "*** All declared inter-library dependencies are being dropped." + $echo "*** All declared inter-library dependencies are being dropped." droppeddeps=yes - ;; - esac + fi ;; esac versuffix=$versuffix_save @@ -7917,24 +3841,24 @@ EOF case $host in *-*-rhapsody* | *-*-darwin1.[012]) - # On Rhapsody replace the C library with the System framework - newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac if test "$droppeddeps" = yes; then if test "$module" = yes; then - echo - echo "*** Warning: libtool could not satisfy all declared inter-library" - $ECHO "*** dependencies of module $libname. Therefore, libtool will create" - echo "*** a static module, that should work as long as the dlopening" - echo "*** application is linked with the -dlopen flag." + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." if test -z "$global_symbol_pipe"; then - echo - echo "*** However, this would only work if libtool was able to extract symbol" - echo "*** lists from a program, using \`nm' or equivalent, but libtool could" - echo "*** not find such a program. So, this module is probably useless." - echo "*** \`nm' from GNU binutils and a full rebuild may help." + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." fi if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" @@ -7944,16 +3868,16 @@ EOF build_libtool_libs=no fi else - echo "*** The inter-library dependencies that have been dropped here will be" - echo "*** automatically added whenever a program is linked with this library" - echo "*** or is declared to -dlopen it." + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." if test "$allow_undefined" = no; then - echo - echo "*** Since this library must not contain undefined symbols," - echo "*** because either the platform does not support them or" - echo "*** it was explicitly requested with -no-undefined," - echo "*** libtool will only create a static version of it." + $echo + $echo "*** Since this library must not contain undefined symbols," + $echo "*** because either the platform does not support them or" + $echo "*** it was explicitly requested with -no-undefined," + $echo "*** libtool will only create a static version of it." if test "$build_old_libs" = no; then oldlibs="$output_objdir/$libname.$libext" build_libtool_libs=module @@ -7967,14 +3891,7 @@ EOF # Done checking deplibs! deplibs=$newdeplibs fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - case $host in - *-*-darwin*) - newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; - esac + # move library search paths that coincide with paths to not yet # installed libraries to the beginning of the library search list @@ -7985,7 +3902,7 @@ EOF *) case " $deplibs " in *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; + new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac @@ -7995,14 +3912,15 @@ EOF -L*) case " $new_libs " in *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac done deplibs="$new_libs" + # All the library-specific variables (install_libdir is set above). library_names= old_library= @@ -8010,22 +3928,15 @@ EOF # Test again, we may have decided not to build it any more if test "$build_libtool_libs" = yes; then - # Remove ${wl} instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac if test "$hardcode_into_libs" = yes; then # Hardcode the library paths hardcode_libdirs= dep_rpath= rpath="$finalize_rpath" - test "$opt_mode" != relink && rpath="$compile_rpath$rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" for libdir in $rpath; do if test -n "$hardcode_libdir_flag_spec"; then if test -n "$hardcode_libdir_separator"; then - func_replace_sysroot "$libdir" - libdir=$func_replace_sysroot_result if test -z "$hardcode_libdirs"; then hardcode_libdirs="$libdir" else @@ -8034,18 +3945,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - func_append dep_rpath " $flag" + dep_rpath="$dep_rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; + *) perm_rpath="$perm_rpath $libdir" ;; esac fi done @@ -8053,13 +3964,20 @@ EOF if test -n "$hardcode_libdir_separator" && test -n "$hardcode_libdirs"; then libdir="$hardcode_libdirs" - eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi fi if test -n "$runpath_var" && test -n "$perm_rpath"; then # We should set the runpath_var. rpath= for dir in $perm_rpath; do - func_append rpath "$dir:" + rpath="$rpath$dir:" done eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" fi @@ -8067,7 +3985,7 @@ EOF fi shlibpath="$finalize_shlibpath" - test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath" + test "$mode" != relink && shlibpath="$compile_shlibpath$shlibpath" if test -n "$shlibpath"; then eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" fi @@ -8076,9 +3994,8 @@ EOF eval shared_ext=\"$shrext_cmds\" eval library_names=\"$library_names_spec\" set dummy $library_names - shift - realname="$1" - shift + realname="$2" + shift; shift if test -n "$soname_spec"; then eval soname=\"$soname_spec\" @@ -8093,166 +4010,83 @@ EOF linknames= for link do - func_append linknames " $link" + linknames="$linknames $link" done # Use standard objects if they are pic - test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` - test "X$libobjs" = "X " && libobjs= - - delfiles= - if test -n "$export_symbols" && test -n "$include_expsyms"; then - $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" - export_symbols="$output_objdir/$libname.uexp" - func_append delfiles " $export_symbols" - fi - - orig_export_symbols= - case $host_os in - cygwin* | mingw* | cegcc*) - if test -n "$export_symbols" && test -z "$export_symbols_regex"; then - # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then - # and it's NOT already a .def file. Must figure out - # which of the given symbols are data symbols and tag - # them as such. So, trigger use of export_symbols_cmds. - # export_symbols gets reassigned inside the "prepare - # the list of exported symbols" if statement, so the - # include_expsyms logic still works. - orig_export_symbols="$export_symbols" - export_symbols= - always_export_symbols=yes - fi - fi - ;; - esac + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` # Prepare the list of exported symbols if test -z "$export_symbols"; then if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then - func_verbose "generating symbol list for \`$libname.la'" + $show "generating symbol list for \`$libname.la'" export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols + $run $rm $export_symbols cmds=$export_symbols_cmds save_ifs="$IFS"; IFS='~' - for cmd1 in $cmds; do + for cmd in $cmds; do IFS="$save_ifs" - # Take the normal branch if the nm_file_list_spec branch - # doesn't work or if tool conversion is not needed. - case $nm_file_list_spec~$to_tool_file_cmd in - *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) - try_normal_branch=yes - eval cmd=\"$cmd1\" - func_len " $cmd" - len=$func_len_result - ;; - *) - try_normal_branch=no - ;; - esac - if test "$try_normal_branch" = yes \ - && { test "$len" -lt "$max_cmd_len" \ - || test "$max_cmd_len" -le -1; } - then - func_show_eval "$cmd" 'exit $?' - skipped_export=false - elif test -n "$nm_file_list_spec"; then - func_basename "$output" - output_la=$func_basename_result - save_libobjs=$libobjs - save_output=$output - output=${output_objdir}/${output_la}.nm - func_to_tool_file "$output" - libobjs=$nm_file_list_spec$func_to_tool_file_result - func_append delfiles " $output" - func_verbose "creating $NM input file list: $output" - for obj in $save_libobjs; do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > "$output" - eval cmd=\"$cmd1\" - func_show_eval "$cmd" 'exit $?' - output=$save_output - libobjs=$save_libobjs - skipped_export=false + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false else - # The command line is too long to execute in one step. - func_verbose "using reloadable object file for export list..." - skipped_export=: + # The command line is too long to execute in one step. + $show "using reloadable object file for export list..." + skipped_export=: # Break out early, otherwise skipped_export may be # set to false by a later but shorter cmd. break fi done IFS="$save_ifs" - if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + if test -n "$export_symbols_regex"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' fi fi fi if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' fi tmp_deplibs= for test_deplib in $deplibs; do - case " $convenience " in - *" $test_deplib "*) ;; - *) - func_append tmp_deplibs " $test_deplib" - ;; - esac + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac done deplibs="$tmp_deplibs" if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec" && - test "$compiler_needs_object" = yes && - test -z "$libobjs"; then - # extract the archives, so we have objects to list. - # TODO: could optimize this to just extract one archive. - whole_archive_flag_spec= - fi if test -n "$whole_archive_flag_spec"; then save_libobjs=$libobjs eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= else gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $convenience - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= + libobjs="$libobjs $func_extract_archives_result" fi fi - + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then eval flag=\"$thread_safe_flag_spec\" - func_append linker_flags " $flag" + linker_flags="$linker_flags $flag" fi # Make a backup of the uninstalled library when relinking - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? fi # Do each of the archive commands. @@ -8265,24 +4099,22 @@ EOF cmds=$module_cmds fi else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - eval test_cmds=\"$archive_expsym_cmds\" - cmds=$archive_expsym_cmds - else - eval test_cmds=\"$archive_cmds\" - cmds=$archive_cmds + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds fi fi if test "X$skipped_export" != "X:" && - func_len " $test_cmds" && - len=$func_len_result && - test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then : else - # The command line is too long to link in one step, link piecewise - # or, if using GNU ld and skipped_export is not :, use a linker - # script. + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." # Save the value of $output and $libobjs because we want to # use them later. If we have whole_archive_flag_spec, we @@ -8296,171 +4128,77 @@ EOF save_libobjs=$libobjs fi save_output=$output - func_basename "$output" - output_la=$func_basename_result + output_la=`$echo "X$output" | $Xsed -e "$basename"` # Clear the reloadable object creation command queue and # initialize k to one. test_cmds= concat_cmds= objlist= + delfiles= last_robj= k=1 - - if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then - output=${output_objdir}/${output_la}.lnkscript - func_verbose "creating GNU ld script: $output" - echo 'INPUT (' > $output - for obj in $save_libobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - echo ')' >> $output - func_append delfiles " $output" - func_to_tool_file "$output" - output=$func_to_tool_file_result - elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then - output=${output_objdir}/${output_la}.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test "$compiler_needs_object" = yes; then - firstobj="$1 " - shift - fi - for obj - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" >> $output - done - func_append delfiles " $output" - func_to_tool_file "$output" - output=$firstobj\"$file_list_spec$func_to_tool_file_result\" - else - if test -n "$save_libobjs"; then - func_verbose "creating reloadable object files..." - output=$output_objdir/$output_la-${k}.$objext - eval test_cmds=\"$reload_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 - - # Loop over the list of objects to be linked. - for obj in $save_libobjs - do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - if test "X$objlist" = X || - test "$len" -lt "$max_cmd_len"; then - func_append objlist " $obj" - else - # The command $test_cmds is almost too long, add a - # command to the queue. - if test "$k" -eq 1 ; then - # The first file doesn't have a previous command to add. - reload_objs=$objlist - eval concat_cmds=\"$reload_cmds\" - else - # All subsequent reloadable object files will link in - # the last one created. - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" - fi - last_robj=$output_objdir/$output_la-${k}.$objext - func_arith $k + 1 - k=$func_arith_result - output=$output_objdir/$output_la-${k}.$objext - objlist=" $obj" - func_len " $last_robj" - func_arith $len0 + $func_len_result - len=$func_arith_result - fi - done - # Handle the remaining objects by creating one last - # reloadable object file. All subsequent reloadable object - # files will link in the last one created. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - reload_objs="$objlist $last_robj" - eval concat_cmds=\"\${concat_cmds}$reload_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\" - fi - func_append delfiles " $output" - + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" else - output= - fi - - if ${skipped_export-false}; then - func_verbose "generating symbol list for \`$libname.la'" - export_symbols="$output_objdir/$libname.exp" - $opt_dry_run || $RM $export_symbols - libobjs=$output - # Append the command to create the export file. - test -z "$concat_cmds" || concat_cmds=$concat_cmds~ - eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" - if test -n "$last_robj"; then - eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" - test -n "$save_libobjs" && - func_verbose "creating a temporary reloadable object file: $output" + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi - # Loop through the commands generated above and execute them. - save_ifs="$IFS"; IFS='~' - for cmd in $concat_cmds; do - IFS="$save_ifs" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { - lt_exit=$? + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done - # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) - fi + $echo "creating a temporary reloadable object file: $output" - exit $lt_exit - } - done + # Loop through the commands generated above and execute them. + save_ifs="$IFS"; IFS='~' + for cmd in $concat_cmds; do IFS="$save_ifs" - - if test -n "$export_symbols_regex" && ${skipped_export-false}; then - func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' - func_show_eval '$MV "${export_symbols}T" "$export_symbols"' - fi - fi - - if ${skipped_export-false}; then - if test -n "$export_symbols" && test -n "$include_expsyms"; then - tmp_export_symbols="$export_symbols" - test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols" - $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' - fi - - if test -n "$orig_export_symbols"; then - # The given exports_symbols file has to be filtered, so filter it. - func_verbose "filter symbol list for \`$libname.la' to tag DATA exports" - # FIXME: $output_objdir/$libname.filter potentially contains lots of - # 's' commands which not all seds can handle. GNU sed should be fine - # though. Also, the filter scales superlinearly with the number of - # global variables. join(1) would be nice here, but unfortunately - # isn't a blessed tool. - $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter - func_append delfiles " $export_symbols $output_objdir/$libname.filter" - export_symbols=$output_objdir/$libname.def - $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols - fi - fi + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" libobjs=$output # Restore the value of output. @@ -8468,7 +4206,6 @@ EOF if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then eval libobjs=\"\$libobjs $whole_archive_flag_spec\" - test "X$libobjs" = "X " && libobjs= fi # Expand the library linking commands again to reset the # value of $libobjs for piecewise linking. @@ -8481,45 +4218,28 @@ EOF cmds=$module_cmds fi else - if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then - cmds=$archive_expsym_cmds - else - cmds=$archive_cmds + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds fi fi + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" fi - - if test -n "$delfiles"; then - # Append the command to remove temporary files to $cmds. - eval cmds=\"\$cmds~\$RM $delfiles\" - fi - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append libobjs " $func_extract_archives_result" - test "X$libobjs" = "X " && libobjs= - fi - save_ifs="$IFS"; IFS='~' for cmd in $cmds; do IFS="$save_ifs" eval cmd=\"$cmd\" - $opt_silent || { - func_quote_for_expand "$cmd" - eval "func_echo $func_quote_for_expand_result" - } - $opt_dry_run || eval "$cmd" || { + $show "$cmd" + $run eval "$cmd" || { lt_exit=$? # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - ( cd "$output_objdir" && \ - $RM "${realname}T" && \ - $MV "${realname}U" "$realname" ) + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' fi exit $lt_exit @@ -8528,12 +4248,13 @@ EOF IFS="$save_ifs" # Restore the uninstalled library and exit - if test "$opt_mode" = relink; then - $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? if test -n "$convenience"; then if test -z "$whole_archive_flag_spec"; then - func_show_eval '${RM}r "$gentop"' + $show "${rm}r $gentop" + $run ${rm}r "$gentop" fi fi @@ -8543,7 +4264,8 @@ EOF # Create links to the real library. for linkname in $linknames; do if test "$realname" != "$linkname"; then - func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? fi done @@ -8556,35 +4278,39 @@ EOF ;; obj) - if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then - func_warning "\`-dlopen' is ignored for objects" - fi - case " $deplibs" in *\ -l* | *\ -L*) - func_warning "\`-l' and \`-L' are ignored for objects" ;; + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; esac - test -n "$rpath" && \ - func_warning "\`-rpath' is ignored for objects" + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi - test -n "$xrpath" && \ - func_warning "\`-R' is ignored for objects" + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for objects" + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi - test -n "$release" && \ - func_warning "\`-release' is ignored for objects" + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi case $output in *.lo) - test -n "$objs$old_deplibs" && \ - func_fatal_error "cannot build library object \`$output' from non-libtool objects" - - libobj=$output - func_lo2o "$libobj" - obj=$func_lo2o_result + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` ;; *) libobj= @@ -8593,7 +4319,7 @@ EOF esac # Delete the old objects. - $opt_dry_run || $RM $obj $libobj + $run $rm $obj $libobj # Objects from convenience libraries. This assumes # single-version convenience libraries. Whenever we create @@ -8609,29 +4335,35 @@ EOF if test -n "$convenience"; then if test -n "$whole_archive_flag_spec"; then eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` else gentop="$output_objdir/${obj}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $convenience reload_conv_objs="$reload_objs $func_extract_archives_result" fi fi - # If we're not building shared, we need to use non_pic_objs - test "$build_libtool_libs" != yes && libobjs="$non_pic_objects" - # Create the old-style object. - reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test output="$obj" - func_execute_cmds "$reload_cmds" 'exit $?' + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" # Exit if we aren't doing a library object file. if test -z "$libobj"; then if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' + $show "${rm}r $gentop" + $run ${rm}r $gentop fi exit $EXIT_SUCCESS @@ -8639,13 +4371,14 @@ EOF if test "$build_libtool_libs" != yes; then if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' + $show "${rm}r $gentop" + $run ${rm}r $gentop fi # Create an invalid libtool object if no PIC, so that we don't # accidentally link it into a program. # $show "echo timestamp > $libobj" - # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + # $run eval "echo timestamp > $libobj" || exit $? exit $EXIT_SUCCESS fi @@ -8653,11 +4386,20 @@ EOF # Only do commands if we really have different PIC objects. reload_objs="$libobjs $reload_conv_objs" output="$libobj" - func_execute_cmds "$reload_cmds" 'exit $?' + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" fi if test -n "$gentop"; then - func_show_eval '${RM}r "$gentop"' + $show "${rm}r $gentop" + $run ${rm}r $gentop fi exit $EXIT_SUCCESS @@ -8665,45 +4407,39 @@ EOF prog) case $host in - *cygwin*) func_stripname '' '.exe' "$output" - output=$func_stripname_result.exe;; + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; esac - test -n "$vinfo" && \ - func_warning "\`-version-info' is ignored for programs" + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi - test -n "$release" && \ - func_warning "\`-release' is ignored for programs" + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi - test "$preload" = yes \ - && test "$dlopen_support" = unknown \ - && test "$dlopen_self" = unknown \ - && test "$dlopen_self_static" = unknown && \ - func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support." + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi case $host in *-*-rhapsody* | *-*-darwin1.[012]) # On Rhapsody replace the C library is the System framework - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` ;; esac case $host in - *-*-darwin*) - # Don't allow lazy linking, it breaks C++ global constructors - # But is supposedly fixed on 10.4 or later (yay!). - if test "$tagname" = CXX ; then - case ${MACOSX_DEPLOYMENT_TARGET-10.0} in - 10.[0123]) - func_append compile_command " ${wl}-bind_at_load" - func_append finalize_command " ${wl}-bind_at_load" - ;; - esac - fi - # Time to change all our "foo.ltframework" stuff back to "-framework foo" - compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` - ;; + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; esac @@ -8716,7 +4452,7 @@ EOF *) case " $compile_deplibs " in *" -L$path/$objdir "*) - func_append new_libs " -L$path/$objdir" ;; + new_libs="$new_libs -L$path/$objdir" ;; esac ;; esac @@ -8726,17 +4462,17 @@ EOF -L*) case " $new_libs " in *" $deplib "*) ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac ;; - *) func_append new_libs " $deplib" ;; + *) new_libs="$new_libs $deplib" ;; esac done compile_deplibs="$new_libs" - func_append compile_command " $compile_deplibs" - func_append finalize_command " $finalize_deplibs" + compile_command="$compile_command $compile_deplibs" + finalize_command="$finalize_command $finalize_deplibs" if test -n "$rpath$xrpath"; then # If the user specified any rpath flags, then add them. @@ -8744,7 +4480,7 @@ EOF # This is the magic to use -rpath. case "$finalize_rpath " in *" $libdir "*) ;; - *) func_append finalize_rpath " $libdir" ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; esac done fi @@ -8763,32 +4499,30 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" + rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$perm_rpath " in *" $libdir "*) ;; - *) func_append perm_rpath " $libdir" ;; + *) perm_rpath="$perm_rpath $libdir" ;; esac fi case $host in - *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) - testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'` + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` case :$dllsearchpath: in *":$libdir:"*) ;; - ::) dllsearchpath=$libdir;; - *) func_append dllsearchpath ":$libdir";; + *) dllsearchpath="$dllsearchpath:$libdir";; esac case :$dllsearchpath: in *":$testbindir:"*) ;; - ::) dllsearchpath=$testbindir;; - *) func_append dllsearchpath ":$testbindir";; + *) dllsearchpath="$dllsearchpath:$testbindir";; esac ;; esac @@ -8814,18 +4548,18 @@ EOF *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) ;; *) - func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" ;; esac fi else eval flag=\"$hardcode_libdir_flag_spec\" - func_append rpath " $flag" + rpath="$rpath $flag" fi elif test -n "$runpath_var"; then case "$finalize_perm_rpath " in *" $libdir "*) ;; - *) func_append finalize_perm_rpath " $libdir" ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; esac fi done @@ -8839,57 +4573,281 @@ EOF if test -n "$libobjs" && test "$build_old_libs" = yes; then # Transform all the library objects into standard objects. - compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` - finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` fi - func_generate_dlsyms "$outputname" "@PROGRAM@" "no" - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi fi - wrappers_required=yes - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=no - ;; - *cygwin* | *mingw* ) - if test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - *) - if test "$need_relink" = no || test "$build_libtool_libs" != yes; then - wrappers_required=no - fi - ;; - esac - if test "$wrappers_required" = no; then + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then # Replace the output file specification. - compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` link_command="$compile_command$compile_rpath" # We have no uninstalled library dependencies, so finalize right now. - exit_status=0 - func_show_eval "$link_command" 'exit_status=$?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi + $show "$link_command" + $run eval "$link_command" + exit_status=$? # Delete the generated files. - if test -f "$output_objdir/${outputname}S.${objext}"; then - func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"' + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" fi exit $exit_status fi + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + if test -n "$compile_shlibpath$finalize_shlibpath"; then compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" fi @@ -8904,7 +4862,7 @@ EOF # We should set the runpath_var. rpath= for dir in $perm_rpath; do - func_append rpath "$dir:" + rpath="$rpath$dir:" done compile_var="$runpath_var=\"$rpath\$$runpath_var\" " fi @@ -8912,7 +4870,7 @@ EOF # We should set the runpath_var. rpath= for dir in $finalize_perm_rpath; do - func_append rpath "$dir:" + rpath="$rpath$dir:" done finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " fi @@ -8922,18 +4880,12 @@ EOF # We don't need to create a wrapper script. link_command="$compile_var$compile_command$compile_rpath" # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` # Delete the old output file. - $opt_dry_run || $RM $output + $run $rm $output # Link the executable and exit - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi - + $show "$link_command" + $run eval "$link_command" || exit $? exit $EXIT_SUCCESS fi @@ -8942,13 +4894,13 @@ EOF link_command="$compile_var$compile_command$compile_rpath" relink_command="$finalize_var$finalize_command$finalize_rpath" - func_warning "this platform does not like uninstalled shared libraries" - func_warning "\`$output' will be relinked during installation" + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 else if test "$fast_install" != no; then link_command="$finalize_var$compile_command$finalize_rpath" if test "$fast_install" = yes; then - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` else # fast_install is set to needless relink_command= @@ -8960,98 +4912,608 @@ EOF fi # Replace the output file specification. - link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` # Delete the old output files. - $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname - func_show_eval "$link_command" 'exit $?' - - if test -n "$postlink_cmds"; then - func_to_tool_file "$output_objdir/$outputname" - postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` - func_execute_cmds "$postlink_cmds" 'exit $?' - fi + $show "$link_command" + $run eval "$link_command" || exit $? # Now create the wrapper script. - func_verbose "creating $output" + $show "creating $output" # Quote the relink command for shipping. if test -n "$relink_command"; then # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done relink_command="(cd `pwd`; $relink_command)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` fi - # Only actually do things if not in dry run mode. - $opt_dry_run || { + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then # win32 will think the script is a binary if it has # a .exe suffix, so we strip it off here. case $output in - *.exe) func_stripname '' '.exe' "$output" - output=$func_stripname_result ;; + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; esac # test for cygwin because mv fails w/o .exe extensions case $host in *cygwin*) exeext=.exe - func_stripname '' '.exe' "$outputname" - outputname=$func_stripname_result ;; + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; *) exeext= ;; esac case $host in *cygwin* | *mingw* ) - func_dirname_and_basename "$output" "" "." - output_name=$func_basename_result - output_path=$func_dirname_result - cwrappersource="$output_path/$objdir/lt-$output_name.c" - cwrapper="$output_path/$output_name.exe" - $RM $cwrappersource $cwrapper - trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + output_name=`basename $output` + output_path=`dirname $output` + cwrappersource="$output_path/$objdir/lt-$output_name.c" + cwrapper="$output_path/$output_name.exe" + $rm $cwrappersource $cwrapper + trap "$rm $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 - func_emit_cwrapperexe_src > $cwrappersource + cat > $cwrappersource < $func_ltwrapper_scriptname_result - else - func_emit_wrapper no > $func_ltwrapper_scriptname_result - fi - } + The $output program cannot be directly executed until all the libtool + libraries that it depends on are installed. + + This wrapper executable should never be moved out of the build directory. + If it is, it will not operate correctly. + + Currently, it simply execs the wrapper *script* "/bin/sh $output", + but could eventually absorb all of the scripts functionality and + exec $objdir/$outputname directly. +*/ +EOF + cat >> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \ + defined (__OS2__) +# define HAVE_DOS_BASED_FILE_SYSTEM +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +char * +find_executable (const char* wrapper) +{ + int has_slash = 0; + const char* p; + const char* p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + if (isalpha ((unsigned char)wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char* path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char* q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR(*q)) + break; + p_len = q - p; + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = XMALLOC(char, p_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal ("getcwd failed"); + tmp_len = strlen(tmp); + concat_name = XMALLOC(char, tmp_len + 1 + strlen(wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable(concat_name)) + return concat_name; + XFREE(concat_name); + return NULL; +} + +char * +strendzap(char *str, const char *pat) +{ + size_t len, patlen; + + assert(str != NULL); + assert(pat != NULL); + + len = strlen(str); + patlen = strlen(pat); + + if (patlen <= len) + { + str += len - patlen; + if (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_BOURNE_COMPATIBLE). +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$echo are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || \\ + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $mkdir \"\$progdir\" + else + $rm \"\$progdir/\$file\" + fi" + + $echo >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + $echo \"\$relink_command_output\" >&2 + $rm \"\$progdir/\$file\" + exit $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" ;; - * ) - $RM $output - trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 - func_emit_wrapper no > $output - chmod +x $output + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" ;; esac - } + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + $echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi exit $EXIT_SUCCESS ;; esac @@ -9060,7 +5522,7 @@ EOF for oldlib in $oldlibs; do if test "$build_libtool_libs" = convenience; then - oldobjs="$libobjs_save $symfileobj" + oldobjs="$libobjs_save" addlibs="$convenience" build_libtool_libs=no else @@ -9069,35 +5531,22 @@ EOF build_libtool_libs=no else oldobjs="$old_deplibs $non_pic_objects" - if test "$preload" = yes && test -f "$symfileobj"; then - func_append oldobjs " $symfileobj" - fi fi addlibs="$old_convenience" fi if test -n "$addlibs"; then gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" + generated="$generated $gentop" func_extract_archives $gentop $addlibs - func_append oldobjs " $func_extract_archives_result" + oldobjs="$oldobjs $func_extract_archives_result" fi # Do each command in the archive commands. if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then - cmds=$old_archive_from_new_cmds + cmds=$old_archive_from_new_cmds else - - # Add any objects from preloaded convenience libraries - if test -n "$dlprefiles"; then - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - - func_extract_archives $gentop $dlprefiles - func_append oldobjs " $func_extract_archives_result" - fi - # POSIX demands no paths to be encoded in archives. We have # to avoid creating archives with duplicate basenames if we # might have to extract them afterwards, e.g., when creating a @@ -9106,22 +5555,32 @@ EOF # not supported by libtool). if (for obj in $oldobjs do - func_basename "$obj" - $ECHO "$func_basename_result" + $echo "X$obj" | $Xsed -e 's%^.*/%%' done | sort | sort -uc >/dev/null 2>&1); then : else - echo "copying selected object files to avoid basename conflicts..." - gentop="$output_objdir/${outputname}x" - func_append generated " $gentop" - func_mkdir_p "$gentop" + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + save_oldobjs=$oldobjs oldobjs= counter=1 for obj in $save_oldobjs do - func_basename "$obj" - objbase="$func_basename_result" + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` case " $oldobjs " in " ") oldobjs=$obj ;; *[\ /]"$objbase "*) @@ -9129,74 +5588,58 @@ EOF # Make sure we don't pick an alternate name that also # overlaps. newobj=lt$counter-$objbase - func_arith $counter + 1 - counter=$func_arith_result + counter=`expr $counter + 1` case " $oldobjs " in *[\ /]"$newobj "*) ;; *) if test ! -f "$gentop/$newobj"; then break; fi ;; esac done - func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" - func_append oldobjs " $gentop/$newobj" + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" ;; - *) func_append oldobjs " $obj" ;; + *) oldobjs="$oldobjs $obj" ;; esac done fi - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" - func_len " $cmds" - len=$func_len_result - if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then - cmds=$old_archive_cmds - elif test -n "$archiver_list_spec"; then - func_verbose "using command file archive linking..." - for obj in $oldobjs - do - func_to_tool_file "$obj" - $ECHO "$func_to_tool_file_result" - done > $output_objdir/$libname.libcmd - func_to_tool_file "$output_objdir/$libname.libcmd" - oldobjs=" $archiver_list_spec$func_to_tool_file_result" + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then cmds=$old_archive_cmds else # the command line is too long to link in one step, link in parts - func_verbose "using piecewise archive linking..." + $echo "using piecewise archive linking..." save_RANLIB=$RANLIB RANLIB=: objlist= concat_cmds= save_oldobjs=$oldobjs - oldobjs= + # Is there a better way of finding the last object in the list? for obj in $save_oldobjs do last_oldobj=$obj done - eval test_cmds=\"$old_archive_cmds\" - func_len " $test_cmds" - len0=$func_len_result - len=$len0 for obj in $save_oldobjs do - func_len " $obj" - func_arith $len + $func_len_result - len=$func_arith_result - func_append objlist " $obj" - if test "$len" -lt "$max_cmd_len"; then + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; then : else # the above command should be used before it gets too long oldobjs=$objlist if test "$obj" = "$last_oldobj" ; then - RANLIB=$save_RANLIB + RANLIB=$save_RANLIB fi test -z "$concat_cmds" || concat_cmds=$concat_cmds~ eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\" objlist= - len=$len0 fi done RANLIB=$save_RANLIB @@ -9208,39 +5651,49 @@ EOF fi fi fi - func_execute_cmds "$cmds" 'exit $?' + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" done - test -n "$generated" && \ - func_show_eval "${RM}r$generated" + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi # Now create the libtool archive. case $output in *.la) old_library= test "$build_old_libs" = yes && old_library="$libname.$libext" - func_verbose "creating $output" + $show "creating $output" # Preserve any variables that may affect compiler behavior for var in $variables_saved_for_relink; do if eval test -z \"\${$var+set}\"; then - relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + relink_command="{ test -z \"\${$var+set}\" || unset $var || { $var=; export $var; }; }; $relink_command" elif eval var_value=\$$var; test -z "$var_value"; then relink_command="$var=; export $var; $relink_command" else - func_quote_for_eval "$var_value" - relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" fi done # Quote the link command for shipping. relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" - relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` if test "$hardcode_automatic" = yes ; then relink_command= fi + # Only create the output if not a dry run. - $opt_dry_run || { + if test -z "$run"; then for installed in no yes; do if test "$installed" = yes; then if test -z "$install_libdir"; then @@ -9252,60 +5705,38 @@ EOF for deplib in $dependency_libs; do case $deplib in *.la) - func_basename "$deplib" - name="$func_basename_result" - func_resolve_sysroot "$deplib" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - test -z "$libdir" && \ - func_fatal_error "\`$deplib' is not a valid libtool archive" - func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" ;; - -L*) - func_stripname -L '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -L$func_replace_sysroot_result" - ;; - -R*) - func_stripname -R '' "$deplib" - func_replace_sysroot "$func_stripname_result" - func_append newdependency_libs " -R$func_replace_sysroot_result" - ;; - *) func_append newdependency_libs " $deplib" ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; esac done dependency_libs="$newdependency_libs" newdlfiles= - for lib in $dlfiles; do - case $lib in - *.la) - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" - ;; - *) func_append newdlfiles " $lib" ;; - esac + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" done dlfiles="$newdlfiles" newdlprefiles= for lib in $dlprefiles; do - case $lib in - *.la) - # Only pass preopened files to the pseudo-archive (for - # eventual linking with the app. that links it) if we - # didn't already link the preopened objects directly into - # the library: - func_basename "$lib" - name="$func_basename_result" - eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` - test -z "$libdir" && \ - func_fatal_error "\`$lib' is not a valid libtool archive" - func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" - ;; - esac + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" done dlprefiles="$newdlprefiles" else @@ -9315,7 +5746,7 @@ EOF [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac - func_append newdlfiles " $abs" + newdlfiles="$newdlfiles $abs" done dlfiles="$newdlfiles" newdlprefiles= @@ -9324,37 +5755,19 @@ EOF [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; *) abs=`pwd`"/$lib" ;; esac - func_append newdlprefiles " $abs" + newdlprefiles="$newdlprefiles $abs" done dlprefiles="$newdlprefiles" fi - $RM $output + $rm $output # place dlname in correct position for cygwin - # In fact, it would be nice if we could use this code for all target - # systems that can't hard-code library paths into their executables - # and that have no shared library path variable independent of PATH, - # but it turns out we can't easily determine that from inspecting - # libtool variables, so we have to hard-code the OSs to which it - # applies here; at the moment, that means platforms that use the PE - # object format with DLL files. See the long comment at the top of - # tests/bindir.at for full details. tdlname=$dlname case $host,$output,$installed,$module,$dlname in - *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) - # If a -bindir argument was supplied, place the dll there. - if test "x$bindir" != x ; - then - func_relative_path "$install_libdir" "$bindir" - tdlname=$func_relative_path_result$dlname - else - # Otherwise fall back on heuristic. - tdlname=../bin/$dlname - fi - ;; + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; esac - $ECHO > $output "\ + $echo > $output "\ # $outputname - a libtool library file -# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP # # Please DO NOT delete this file! # It is necessary for linking the library. @@ -9368,15 +5781,9 @@ library_names='$library_names' # The name of the static archive. old_library='$old_library' -# Linker flags that can not go in dependency_libs. -inherited_linker_flags='$new_inherited_linker_flags' - # Libraries that this one depends upon. dependency_libs='$dependency_libs' -# Names of additional weak libraries provided by this library -weak_library_names='$weak_libs' - # Version information for $libname. current=$current age=$age @@ -9395,29 +5802,718 @@ dlpreopen='$dlprefiles' # Directory that this library needs to be installed in: libdir='$install_libdir'" if test "$installed" = no && test "$need_relink" = yes; then - $ECHO >> $output "\ + $echo >> $output "\ relink_command=\"$relink_command\"" fi done - } + fi # Do a symbolic link so that the libtool archive can be found in # LD_LIBRARY_PATH before the program is installed. - func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? ;; esac exit $EXIT_SUCCESS -} + ;; -{ test "$opt_mode" = link || test "$opt_mode" = relink; } && - func_mode_link ${1+"$@"} + # libtool install mode + install) + modename="$modename: install" + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $opt_debug - RM="$nonopt" + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + case " $install_prog " in + *[\\\ /]cp\ *) extra_mode=;; + *) extra_mode='-m 644';; + esac + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $extra_mode $dir/$srcname $destdir/$realname" + $run eval "$install_prog $extra_mode $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try `ln -sf' first, because the `ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $extra_mode $instname $destdir/$name" + $run eval "$install_prog $extra_mode $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $extra_mode $file $destfile" + $run eval "$install_prog $extra_mode $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $extra_mode $staticobj $staticdest" + $run eval "$install_prog $extra_mode \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext="" + case $file in + *.exe) + if test ! -f "$file"; then + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo and FILE.exe exist: automatic-append-.exe + # behavior happens only for exec(3), not for open(2)! Also, sourcing + # `FILE.' does not work on cygwin managed mounts. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" files= rmforce= exit_status=0 @@ -9429,41 +6525,44 @@ func_mode_uninstall () for arg do case $arg in - -f) func_append RM " $arg"; rmforce=yes ;; - -*) func_append RM " $arg" ;; - *) func_append files " $arg" ;; + -f) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; esac done - test -z "$RM" && \ - func_fatal_help "you must specify an RM program" + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi rmdirs= + origobjdir="$objdir" for file in $files; do - func_dirname "$file" "" "." - dir="$func_dirname_result" - if test "X$dir" = X.; then - odir="$objdir" + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" else - odir="$dir/$objdir" + objdir="$dir/$origobjdir" fi - func_basename "$file" - name="$func_basename_result" - test "$opt_mode" = uninstall && odir="$dir" + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" - # Remember odir for removal later, being careful to avoid duplicates - if test "$opt_mode" = clean; then + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then case " $rmdirs " in - *" $odir "*) ;; - *) func_append rmdirs " $odir" ;; + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; esac fi # Don't error if the file doesn't exist and rm -f was used. - if { test -L "$file"; } >/dev/null 2>&1 || - { test -h "$file"; } >/dev/null 2>&1 || - test -f "$file"; then + if (test -L "$file") >/dev/null 2>&1 \ + || (test -h "$file") >/dev/null 2>&1 \ + || test -f "$file"; then : elif test -d "$file"; then exit_status=1 @@ -9477,32 +6576,55 @@ func_mode_uninstall () case $name in *.la) # Possibly a libtool archive, so verify it. - if func_lalib_p "$file"; then - func_source $dir/$name + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name # Delete the libtool libraries and symlinks. for n in $library_names; do - func_append rmfiles " $odir/$n" + rmfiles="$rmfiles $objdir/$n" done - test -n "$old_library" && func_append rmfiles " $odir/$old_library" + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" - case "$opt_mode" in + case "$mode" in clean) - case " $library_names " in + case " $library_names " in + # " " in the beginning catches empty $dlname *" $dlname "*) ;; - *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; esac - test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" ;; uninstall) if test -n "$library_names"; then # Do each command in the postuninstall commands. - func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" fi if test -n "$old_library"; then # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1' + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" fi # FIXME: should reinstall the best remaining shared library. ;; @@ -9512,95 +6634,288 @@ func_mode_uninstall () *.lo) # Possibly a libtool object, so verify it. - if func_lalib_p "$file"; then + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then # Read the .lo file - func_source $dir/$name + . $dir/$name # Add PIC object to the list of files to remove. - if test -n "$pic_object" && - test "$pic_object" != none; then - func_append rmfiles " $dir/$pic_object" + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" fi # Add non-PIC object to the list of files to remove. - if test -n "$non_pic_object" && - test "$non_pic_object" != none; then - func_append rmfiles " $dir/$non_pic_object" + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" fi fi ;; *) - if test "$opt_mode" = clean ; then + if test "$mode" = clean ; then noexename=$name case $file in *.exe) - func_stripname '' '.exe' "$file" - file=$func_stripname_result - func_stripname '' '.exe' "$name" - noexename=$func_stripname_result + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` # $file with .exe has already been added to rmfiles, # add $file without .exe - func_append rmfiles " $file" + rmfiles="$rmfiles $file" ;; esac # Do a test to see if this is a libtool program. - if func_ltwrapper_p "$file"; then - if func_ltwrapper_executable_p "$file"; then - func_ltwrapper_scriptname "$file" - relink_command= - func_source $func_ltwrapper_scriptname_result - func_append rmfiles " $func_ltwrapper_scriptname_result" - else - relink_command= - func_source $dir/$noexename - fi + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename # note $name still contains .exe if it was in $file originally # as does the version of $file that was added into $rmfiles - func_append rmfiles " $odir/$name $odir/${name}S.${objext}" + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" if test "$fast_install" = yes && test -n "$relink_command"; then - func_append rmfiles " $odir/lt-$name" + rmfiles="$rmfiles $objdir/lt-$name" fi if test "X$noexename" != "X$name" ; then - func_append rmfiles " $odir/lt-${noexename}.c" + rmfiles="$rmfiles $objdir/lt-${noexename}.c" fi fi fi ;; esac - func_show_eval "$RM $rmfiles" 'exit_status=1' + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 done + objdir="$origobjdir" # Try to remove the ${objdir}s in the directories where we deleted files for dir in $rmdirs; do if test -d "$dir"; then - func_show_eval "rmdir $dir >/dev/null 2>&1" + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 fi done exit $exit_status -} + ;; -{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } && - func_mode_uninstall ${1+"$@"} + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac -test -z "$opt_mode" && { - help="$generic_help" - func_fatal_help "you must specify a MODE" -} - -test -z "$exec_cmd" && \ - func_fatal_help "invalid operation mode \`$opt_mode'" + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" if test -n "$exec_cmd"; then - eval exec "$exec_cmd" + eval exec $exec_cmd exit $EXIT_FAILURE fi -exit $exit_status +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + +compile) + $echo \ +"Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE Use a list of object files found in FILE to specify objects + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? # The TAGs below are defined such that we never get into a situation # in which we disable both kinds of libraries. Given conflicting @@ -9614,17 +6929,14 @@ exit $exit_status # configuration. But we'll never go from static-only to shared-only. # ### BEGIN LIBTOOL TAG CONFIG: disable-shared -build_libtool_libs=no -build_old_libs=yes +disable_libs=shared # ### END LIBTOOL TAG CONFIG: disable-shared # ### BEGIN LIBTOOL TAG CONFIG: disable-static -build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +disable_libs=static # ### END LIBTOOL TAG CONFIG: disable-static # Local Variables: # mode:shell-script # sh-indentation:2 # End: -# vi:sw=2 - diff --git a/driver/xf86-video-ati/man/Makefile.am b/driver/xf86-video-ati/man/Makefile.am index 85337650a..93ff52c76 100644 --- a/driver/xf86-video-ati/man/Makefile.am +++ b/driver/xf86-video-ati/man/Makefile.am @@ -1,24 +1,27 @@ # # Copyright 2005 Sun Microsystems, Inc. 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 -# 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 (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 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. +# +# 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) @@ -31,11 +34,25 @@ EXTRA_DIST = @DRIVER_NAME@.man radeon.man CLEANFILES = $(driverman_DATA) +SED = sed -# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure +# Strings to replace in man pages +XORGRELSTRING = @PACKAGE_STRING@ + XORGMANNAME = X Version 11 +MAN_SUBSTS = \ + -e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ + -e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ + -e 's|__xservername__|Xorg|g' \ + -e 's|__xconfigfile__|xorg.conf|g' \ + -e 's|__projectroot__|$(prefix)|g' \ + -e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \ + -e 's|__drivermansuffix__|$(DRIVER_MAN_SUFFIX)|g' \ + -e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \ + -e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \ + -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g' SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man .man.$(DRIVER_MAN_SUFFIX): - $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ + sed $(MAN_SUBSTS) < $< > $@ diff --git a/driver/xf86-video-ati/man/Makefile.in b/driver/xf86-video-ati/man/Makefile.in index 71d2175c9..83cd85bd0 100644 --- a/driver/xf86-video-ati/man/Makefile.in +++ b/driver/xf86-video-ati/man/Makefile.in @@ -16,25 +16,28 @@ # # Copyright 2005 Sun Microsystems, Inc. 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 -# 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 (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 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. +# +# 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. # srcdir = @srcdir@ @@ -46,9 +49,9 @@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -install_sh_DATA = ${SHELL} $(install_sh) -c -m 644 -install_sh_PROGRAM = ${SHELL} $(install_sh) -c -install_sh_SCRIPT = ${SHELL} $(install_sh) -c +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : @@ -86,7 +89,6 @@ ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_MAN_DIR = @APP_MAN_DIR@ APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ AR = @AR@ @@ -94,18 +96,22 @@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ -BASE_CFLAGS = @BASE_CFLAGS@ +BUILD_LINUXDOC_FALSE = @BUILD_LINUXDOC_FALSE@ +BUILD_LINUXDOC_TRUE = @BUILD_LINUXDOC_TRUE@ +BUILD_PDFDOC_FALSE = @BUILD_PDFDOC_FALSE@ +BUILD_PDFDOC_TRUE = @BUILD_PDFDOC_TRUE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CHANGELOG_CMD = @CHANGELOG_CMD@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CWARNFLAGS = @CWARNFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ DRIVER_NAME = @DRIVER_NAME@ @@ -113,56 +119,43 @@ DRI_CFLAGS = @DRI_CFLAGS@ DRI_FALSE = @DRI_FALSE@ DRI_LIBS = @DRI_LIBS@ DRI_TRUE = @DRI_TRUE@ -DRM_MODE_FALSE = @DRM_MODE_FALSE@ -DRM_MODE_TRUE = @DRM_MODE_TRUE@ DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -FGREP = @FGREP@ +F77 = @F77@ +FFLAGS = @FFLAGS@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ GREP = @GREP@ -HAVE_XEXTPROTO_71_FALSE = @HAVE_XEXTPROTO_71_FALSE@ -HAVE_XEXTPROTO_71_TRUE = @HAVE_XEXTPROTO_71_TRUE@ -INSTALL_CMD = @INSTALL_CMD@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ LDFLAGS = @LDFLAGS@ -LIBDRM_RADEON_CFLAGS = @LIBDRM_RADEON_CFLAGS@ -LIBDRM_RADEON_LIBS = @LIBDRM_RADEON_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ -LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@ -LIBUDEV_FALSE = @LIBUDEV_FALSE@ -LIBUDEV_LIBS = @LIBUDEV_LIBS@ -LIBUDEV_TRUE = @LIBUDEV_TRUE@ LIB_MAN_DIR = @LIB_MAN_DIR@ LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ -LIPO = @LIPO@ +LINUXDOC = @LINUXDOC@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MAN_SUBSTS = @MAN_SUBSTS@ +MAKE_HTML = @MAKE_HTML@ +MAKE_PDF = @MAKE_PDF@ +MAKE_PS = @MAKE_PS@ +MAKE_TEXT = @MAKE_TEXT@ MISC_MAN_DIR = @MISC_MAN_DIR@ MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ -NM = @NM@ NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -173,29 +166,29 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@ PCIACCESS_LIBS = @PCIACCESS_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PS2PDF = @PS2PDF@ RANLIB = @RANLIB@ -SED = @SED@ +SED = sed SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ -STRICT_CFLAGS = @STRICT_CFLAGS@ STRIP = @STRIP@ USE_EXA_FALSE = @USE_EXA_FALSE@ USE_EXA_TRUE = @USE_EXA_TRUE@ VERSION = @VERSION@ -XEXT_CFLAGS = @XEXT_CFLAGS@ -XEXT_LIBS = @XEXT_LIBS@ -XF86DRM_MODE_FALSE = @XF86DRM_MODE_FALSE@ -XF86DRM_MODE_TRUE = @XF86DRM_MODE_TRUE@ +XMODES_CFLAGS = @XMODES_CFLAGS@ +XMODES_FALSE = @XMODES_FALSE@ +XMODES_TRUE = @XMODES_TRUE@ XORG_CFLAGS = @XORG_CFLAGS@ XORG_LIBS = @XORG_LIBS@ -XORG_MAN_PAGE = @XORG_MAN_PAGE@ XSERVER_LIBPCIACCESS_FALSE = @XSERVER_LIBPCIACCESS_FALSE@ XSERVER_LIBPCIACCESS_TRUE = @XSERVER_LIBPCIACCESS_TRUE@ -ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -243,7 +236,21 @@ driverman_DATA = $(driverman_PRE:man=@DRIVER_MAN_SUFFIX@) EXTRA_DIST = @DRIVER_NAME@.man radeon.man CLEANFILES = $(driverman_DATA) -# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure +# Strings to replace in man pages +XORGRELSTRING = @PACKAGE_STRING@ +XORGMANNAME = X Version 11 +MAN_SUBSTS = \ + -e 's|__vendorversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ + -e 's|__xorgversion__|"$(XORGRELSTRING)" "$(XORGMANNAME)"|' \ + -e 's|__xservername__|Xorg|g' \ + -e 's|__xconfigfile__|xorg.conf|g' \ + -e 's|__projectroot__|$(prefix)|g' \ + -e 's|__appmansuffix__|$(APP_MAN_SUFFIX)|g' \ + -e 's|__drivermansuffix__|$(DRIVER_MAN_SUFFIX)|g' \ + -e 's|__adminmansuffix__|$(ADMIN_MAN_SUFFIX)|g' \ + -e 's|__miscmansuffix__|$(MISC_MAN_SUFFIX)|g' \ + -e 's|__filemansuffix__|$(FILE_MAN_SUFFIX)|g' + SUFFIXES = .$(DRIVER_MAN_SUFFIX) .man all: all-am @@ -258,9 +265,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign man/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign man/Makefile + $(AUTOMAKE) --gnu man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -430,7 +437,7 @@ uninstall-am: uninstall-drivermanDATA uninstall-info-am .man.$(DRIVER_MAN_SUFFIX): - $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ + sed $(MAN_SUBSTS) < $< > $@ # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/driver/xf86-video-ati/man/ati.man b/driver/xf86-video-ati/man/ati.man index deb775994..614cca258 100644 --- a/driver/xf86-video-ati/man/ati.man +++ b/driver/xf86-video-ati/man/ati.man @@ -1,3 +1,4 @@ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/ati.man,v 1.2 2001/01/27 18:20:46 dawes Exp $ .\" shorthand for double quote that works everywhere. .ds q \N'34' .TH ATI __drivermansuffix__ __vendorversion__ @@ -26,6 +27,7 @@ those drivers. See those manpages for specific cards supported. .SH CONFIGURATION DETAILS Please refer to __xconfigfile__(__filemansuffix__) for general configuration details, and the specific card driver for driver configuration details. +driver. .SH "SEE ALSO" __xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__), r128(__drivermansuffix__), radeon(__drivermansuffix__) .SH AUTHORS diff --git a/driver/xf86-video-ati/man/radeon.man b/driver/xf86-video-ati/man/radeon.man index 55c5d0238..09239cf46 100644 --- a/driver/xf86-video-ati/man/radeon.man +++ b/driver/xf86-video-ati/man/radeon.man @@ -1,3 +1,4 @@ +.\" $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/radeon.man,v 1.0 2003/01/31 23:04:50 $ .ds q \N'34' .TH RADEON __drivermansuffix__ __vendorversion__ .SH NAME @@ -12,23 +13,22 @@ radeon \- ATI RADEON video driver .fi .SH DESCRIPTION .B radeon -is an __xservername__ driver for ATI RADEON-based video cards with the +is an __xservername__ driver for ATI RADEON based video cards with the following features: .PP .PD 0 .TP 2 \(bu -Full support for 8-, 15-, 16- and 24-bit pixel depths; +Full support for 8, 15, 16 and 24 bit pixel depths; .TP \(bu RandR 1.2 and RandR 1.3 support; .TP \(bu -TV-out support (only on RV/RS1xx, RV/RS2xx, R/RV/RS3xx. Experimental +TV-out support (only on R/RV/RS1xx, R/RV/RS2xx, R/RV/RS3xx. Experimental support on R/RV5xx, R/RV6xx, and R/RV7xx through the .B ATOMTvOut -option); TV-out is not supported on cards that use the Rage Theatre -chip for TV-out (R100, R200). +option); .TP \(bu Full EXA 2D acceleration; @@ -40,20 +40,19 @@ R/RV/RS2xx and RS3xx); .TP \(bu Textured XVideo acceleration including anti-tearing support (Bicubic filtering -only available on R/RV3xx, R/RV/RS4xx, R/RV5xx, and RS6xx/RS740); +only available on R/RV3xx, R/RV/RS4xx, R/RV5xx, and RS6xx); .TP \(bu Overlay XVideo acceleration (only on R/RV/RS1xx, R/RV/RS2xx, R/RV/RS3xx, R/RV/RS4xx); .TP \(bu -3D acceleration; +3D acceleration (not supported on R/RV6xx and R/RV/RS7xx); .PD .SH SUPPORTED HARDWARE The .B radeon -driver supports PCI, AGP, and PCIE video cards based on the following ATI chips -(note: list is non-exhaustive): +driver supports PCI, AGP, and PCIE video cards based on the following ATI chips: .PP .PD 0 .TP 12 @@ -127,7 +126,7 @@ Radeon X800, M28 PCIE Radeon X850 PCIE/AGP .TP 12 .B RV505/RV515/RV516/RV550 -Radeon X1300/X1400/X1500/X1550/X2300 +Radeon X1300/X1400/X1500/X2300 .TP 12 .B R520 Radeon X1800 @@ -145,55 +144,25 @@ Radeon X1200/X1250/X2100 Radeon HD 2900 .TP 12 .B RV610/RV630 -Radeon HD 2400/2600/2700/4200/4225/4250 +Radeon HD 2400/2600 .TP 12 .B RV620/RV635 -Radeon HD 3410/3430/3450/3470/3650/3670 +Radeon HD 3450/3470 .TP 12 .B RV670 -Radeon HD 3690/3850/3870 +Radeon HD 3850/3870 .TP 12 -.B RS780/RS880 -Radeon HD 3100/3200/3300/4100/4200/4250/4290 +.B RS780 +Radeon HD 3100/3200/3300 .TP 12 -.B RV710/RV730 -Radeon HD 4330/4350/4550/4650/4670/5145/5165/530v/545v/560v/565v +.B RV710 +Radeon HD 4350/4550 .TP 12 -.B RV740/RV770/RV790 -Radeon HD 4770/4730/4830/4850/4860/4870/4890 +.B RV730 +Radeon HD 4650/4670 .TP 12 -.B CEDAR -Radeon HD 5430/5450/6330/6350/6370 -.TP 12 -.B REDWOOD -Radeon HD 5550/5570/5650/5670/5730/5750/5770/6530/6550/6570 -.TP 12 -.B JUNIPER -Radeon HD 5750/5770/5830/5850/5870/6750/6770/6830/6850/6870 -.TP 12 -.B CYPRESS -Radeon HD 5830/5850/5870 -.TP 12 -.B HEMLOCK -Radeon HD 5970 -.TP 12 -.B PALM -Radeon HD 6310/6250 -.TP 12 -.B SUMO/SUMO2 -Radeon HD 6370/6380/6410/6480/6520/6530/6550/6620 -.TP 12 -.B BARTS -Radeon HD 6790/6850/6870/6950/6970/6990 -.TP 12 -.B TURKS -Radeon HD 6570/6630/6650/6670/6730/6750/6770 -.TP 12 -.B CAICOS -Radeon HD 6430/6450/6470/6490 -.TP 12 -.B CAYMAN -Radeon HD 6950/6970/6990 +.B RV770 +Radeon HD 4850/4870 .PD .SH CONFIGURATION DETAILS Please refer to __xconfigfile__(__filemansuffix__) for general configuration @@ -202,7 +171,7 @@ driver. .PP The driver auto\-detects all device information necessary to initialize the card. However, if you have problems with auto\-detection, you can -specify for UMS (Userspace Modesetting): +specify: .PP .RS 4 VideoRam \- in kilobytes @@ -216,11 +185,7 @@ ChipID \- PCI DEVICE ID .PP In addition, the following driver .B Options -are supported for both -.B UMS -(Userspace Modesetting) and -.B KMS -(Kernel Modesetting): +are supported: .TP .BI "Option \*qSWcursor\*q \*q" boolean \*q Selects software cursor. The default is @@ -233,71 +198,6 @@ The default is to .B enable hardware acceleration. .TP -.BI "Option \*qZaphodHeads\*q \*q" string \*q -Specify the RandR output(s) to use with zaphod mode for a particular driver -instance. If you use this option you must use this option for all instances -of the driver. -.br -For example: -.B -Option \*qZaphodHeads\*q \*qLVDS,VGA-0\*q -will assign xrandr outputs LVDS and VGA-0 to this instance of the driver. -.TP -.BI "Option \*qEXAVSync\*q \*q" boolean \*q -This option attempts to avoid tearing by stalling the engine until the display -controller has passed the destination region. It reduces tearing at the cost -of performance and has been known to cause instability on some chips. -The default is -.B off. - -.PP -The following driver -.B Options -are supported for -.B KMS -(Kernel Modesetting): -.TP -.BI "Option \*qColorTiling\*q \*q" "boolean" \*q -The framebuffer can be addressed either in linear or tiled mode. Tiled mode can provide -significant performance benefits with 3D applications. Tiling will be disabled if the drm -module is too old or if the current display configuration does not support it. KMS -ColorTiling is not currently supported on R/RV/RS1XX, R/RV/RS2XX, and RS3XX. -.br -The default value is -.B on -for R/RV3XX, R/RV4XX, R/RV5XX, RS6XX, RS740, R/RV6XX, R/RV7XX, RS780, RS880, -EVERGREEN, and CAYMAN. -.TP -.BI "Option \*qEXAPixmaps\*q \*q" boolean \*q -Under KMS, to avoid thrashing pixmaps in/out of VRAM on low memory cards, -we use a heuristic based on VRAM amount to determine whether to allow EXA -to use VRAM for non-essential pixmaps. This option allows us to override the -heuristic. The default is -.B on -with > 32MB VRAM, off with < 32MB. -.TP -.BI "Option \*qSwapbuffersWait\*q \*q" boolean \*q -This option controls the behavior of glXSwapBuffers and glXCopySubBufferMESA -calls by GL applications. If enabled, the calls will avoid tearing by making -sure the display scanline is outside of the area to be copied before the copy -occurs. If disabled, no scanline synchronization is performed, meaning tearing -will likely occur. Note that when enabled, this option can adversely affect -the framerate of applications that render frames at less than refresh rate. -.IP -The default value is -.B on. -.TP -.BI "Option \*qEnablePageFlip\*q \*q" boolean \*q -Enable DRI2 page flipping. The default is -.B on. -Pageflipping is supported on all radeon hardware. -.PP -The following driver -.B Options -are supported for -.B UMS -(Userspace Modesetting): -.TP .BI "Option \*qDac6Bit\*q \*q" boolean \*q Enables or disables the use of 6 bits per color component when in 8 bpp mode (emulates VGA mode). By default, all 8 bits per color component @@ -313,14 +213,13 @@ The default value is .B 0x1E. .TP .BI "Option \*qScalerWidth\*q \*q" integer \*q -This sets the overlay scaler buffer width. Accepted values range from -1024 to 2048, divisible by 64. Values other than 1536 and 1920 may -not make sense. This should be set automatically, but no one knows -what the limit is for which chip. If you think quality is not optimal -when playing back HD video (with horizontal resolution larger than -this setting), increase this value. If you get an empty area at the -right (usually pink), decrease it. Note that this only affects the "true" -overlay via Xv, and won't affect things like textured video. +This sets the overlay scaler buffer width. Accepted values range from 1024 to +2048, divisible by 64, values other than 1536 and 1920 may not make sense +though. Should be set automatically, but noone has a clue what the limit is +for which chip. If you think quality is not optimal when playing back HD video +(with horizontal resolution larger than this setting), increase this value, if +you get an empty area at the right (usually pink), decrease it. Note this only +affects the "true" overlay via xv, it won't affect things like textured video. .br The default value is either 1536 (for most chips) or 1920. .TP @@ -352,7 +251,7 @@ The default is .BI "Option \*qBusType\*q \*q" string \*q Used to replace previous ForcePCIMode option. Should only be used when driver's bus detection is incorrect -or you want to force an AGP card to PCI mode. You should NEVER force +or you want to force a AGP card to PCI mode. Should NEVER force a PCI card to AGP bus. .br PCI \-\- PCI bus @@ -384,12 +283,12 @@ The default value is .B AUTO. .TP .BI "Option \*qColorTiling\*q \*q" "boolean" \*q -The framebuffer can be addressed either in linear or tiled mode. Tiled mode can provide -significant performance benefits with 3D applications. For 2D it shouldn't matter +Frame buffer can be addressed either in linear or tiled mode. Tiled mode can provide +significant performance benefits with 3D applications, for 2D it shouldn't matter much. Tiling will be disabled if the virtual x resolution exceeds 2048 (3968 for R300 -and above), or if DRI is enabled and the drm module is too old. +and above), or if DRI is enabled the drm module is too old. .br -If this option is enabled, a new DRI driver is required for direct rendering. +If this option is enabled, a new dri driver is required for direct rendering too. .br Color tiling will be automatically disabled in interlaced or doublescan screen modes. .br @@ -397,43 +296,12 @@ The default value is .B on. .TP .BI "Option \*qIgnoreEDID\*q \*q" boolean \*q -Do not use EDID data for mode validation. DDC is still used +Do not use EDID data for mode validation, but DDC is still used for monitor detection. This is different from NoDDC option. .br The default value is .B off. .TP -.BI "Option \*qCustomEDID\*q \*q" string \*q -Forces the X driver to use the EDID data specified in a file rather -than the display's EDID. Also overrides DDC monitor detection. -.br -You may specify a semicolon-separated list of output name and filename pairs -with an optional flag, "digital" or "analog", to override the digital bit in -the EDID which is used by the driver to determine whether to use the -analog or digital encoder associated with a DVI-I port. -The output name is the RandR output name, e.g., "VGA-0" or "DVI-0"; -consult the Xorg log for the supported output names of any given system. -.br -The file must contain a raw 128-byte EDID block, as captured by -.B -get-edid. -.br -For example: -.B -Option \*qCustomEDID\*q \*qVGA-0:/tmp/edid1.bin; DVI-0:/tmp/edid2.bin:digital\*q -will assign the EDID from the file /tmp/edid1.bin to the output device -VGA-0, and the EDID from the file /tmp/edid2.bin to the output device -DVI-0 and force the DVI port to use the digital encoder. -.br -Note that an output name must always be specified, -even if only one EDID is specified. -.br -.B -Caution: -Specifying an EDID that doesn't exactly match your display may -damage your hardware, as it allows the driver to specify timings beyond -the capabilities of your display. Use with care. -.TP .BI "Option \*qPanelSize\*q \*q" "string" \*q Should only be used when driver cannot detect the correct panel size. Apply to both desktop (TMDS) and laptop (LVDS) digital panels. @@ -467,7 +335,7 @@ parameter may be specified as a float value with standard suffixes like .BI "Option \*qRenderAccel\*q \*q" boolean \*q Enables or disables hardware Render acceleration. It is supported on all Radeon cards when using EXA acceleration and on Radeon R/RV/RS1xx, -R/RV/RS2xx and RS3xx when using XAA. The default is to +R/RV/RS2xx and RS3xx when usig XAA. The default is to .B enable Render acceleration. .TP @@ -478,8 +346,9 @@ and .B EXA. XAA is the traditional acceleration architecture and support for it is very stable. EXA is a newer acceleration architecture with better performance for -the Render and Composite extensions. The default is -.B EXA. +the Render and Composite extensions, but the rendering code for it is newer and +possibly unstable. The default is +.B XAA. .TP .BI "Option \*qAccelDFS\*q \*q" boolean \*q Use or don't use accelerated EXA DownloadFromScreen hook when possible (only @@ -544,22 +413,13 @@ for CRT, .B RGB for digital panels .TP -.BI "Option \*qClockGating\*q \*q" boolean \*q -Enable dynamic clock gating. This can help reduce heat and increase battery +.BI "Option \*qDynamicClocks\*q \*q" boolean \*q +Enable dynamic clock scaling. The on-chip clocks will scale dynamically +based on usage. This can help reduce heat and increase battery life by reducing power usage. Some users report reduced 3D performance with this enabled. The default is .B off. .TP -.BI "Option \*qForceLowPowerMode\*q \*q" boolean \*q -Enable a static low power mode. This can help reduce heat and increase battery -life by reducing power usage at the expense of performance. The default is -.B off. -.TP -.BI "Option \*qDynamicPM\*q \*q" boolean \*q -Enable dynamic power mode switching. This can help reduce heat and increase battery -life by reducing power usage when the system is idle (DPMS active). The default is -.B off. -.TP .BI "Option \*qVGAAccess\*q \*q" boolean \*q Tell the driver if it can do legacy VGA IOs to the card. This is necessary for properly resuming consoles when in VGA text mode, but @@ -572,16 +432,16 @@ on PowerPC and SPARC and on other architectures. .TP .BI "Option \*qReverseDDC\*q \*q" boolean \*q -When BIOS connector information isn't available, use this option to -reverse the mapping of the two main DDC ports. Use this if the X server +When BIOS connector informations aren't available, use this option to +reverse the mapping of the 2 main DDC ports. Use this if the X server obviously detects the wrong display for each connector. This is typically needed on the Radeon 9600 cards bundled with Apple G5s. The default is .B off. .TP .BI "Option \*qLVDSProbePLL\*q \*q" boolean \*q -When BIOS panel information isn't available (like on PowerBooks), it -may still be necessary to use the firmware-provided PLL values for the +When BIOS panel informations aren't available (like on PowerBooks), it +may still be necessary to use the firmware provided PLL values for the panel or flickering will happen. This option will force probing of the current value programmed in the chip when X is launched in that case. This is only useful for LVDS panels (laptop internal panels). @@ -597,7 +457,7 @@ The default is .TP .BI "Option \*qDefaultTMDSPLL\*q \*q" boolean \*q Use the default driver provided TMDS PLL values rather than the ones -provided by the BIOS. This option has no effect on Mac cards. Enable +provided by the bios. This option has no effect on Mac cards. Enable this option if you are having problems with a DVI monitor using the internal TMDS controller. The default is @@ -605,7 +465,7 @@ The default is .TP .BI "Option \*qDefaultTVDACAdj\*q \*q" boolean \*q Use the default driver provided TVDAC Adj values rather than the ones -provided by the BIOS. This option has no effect on Mac cards. Enable +provided by the bios. This option has no effect on Mac cards. Enable this option if you are having problems with a washed out display on the secondary DAC. The default is @@ -628,7 +488,7 @@ The default is .BI "Option \*qMacModel\*q \*q" string \*q .br Used to specify Mac models for connector tables and quirks. If you have -a PowerBook or Mini with DVI that does not work properly, try the alternate +a powerbook or mini with DVI that does not work properly, try the alternate options as Apple does not seem to provide a good way of knowing whether they use internal or external TMDS for DVI. Only valid on PowerPC. On Linux, the driver will attempt to detect the MacModel automatically. @@ -655,7 +515,7 @@ The default value is .BI "Option \*qTVStandard\*q \*q" string \*q .br Used to specify the default TV standard if you want to use something other than -the BIOS default. Valid options are: +the bios default. Valid options are: .br ntsc .br @@ -684,20 +544,27 @@ The default is .B on. .TP .BI "Option \*qInt10\*q \*q" boolean \*q -This option allows you to disable INT10 initialization. Set this to +This option allows you to disable int10 initialization. Set this to False if you are experiencing a hang when initializing a secondary card. The default is .B on. .TP +.BI "Option \*qEXAVSync\*q \*q" boolean \*q +This option attempts to avoid tearing by stalling the engine until the display +controller has passed the destination region. It reduces tearing at the cost +of performance and has been know to cause instability on some chips. +The default is +.B off. +.TP .BI "Option \*qATOMTvOut\*q \*q" boolean \*q This option enables experimental TV-out support for R/RV5xx, R/RV6xx, and R/RV7xx -AtomBIOS chips. TV-out is experimental and may not function on these chips as +atombios chips. TV-out is experimental and may not function on these chips as well as hoped for. The default is .B off. .TP .BI "Option \*qR4xxATOM\*q \*q" boolean \*q -This option enables modesetting on R/RV4xx chips using AtomBIOS. +This option enables modesetting on R/RV4xx chips using atombios. The default is .B off. @@ -712,29 +579,15 @@ the screen update to the monitor vertical refresh to eliminate tearing. It has two values: 'off'(0) and 'on'(1). The default is .B 'on'(1). -.TP -.BI "XV_CRTC" -XV_CRTC is used to control which display controller (crtc) the textured -adapter synchronizes the screen update with when XV_VSYNC is enabled. -The default, 'auto'(-1), will sync to the display controller that more -of the video is on; when this is ambiguous, the display controller associated -with the RandR primary output is preferred. This attribute is useful for -things like clone mode where the user can best decide which display should be -synced. -The default is -.B 'auto'(-1). - .TP .BI "XV_BICUBIC" XV_BICUBIC is used to control whether textured adapter should apply a bicubic filter to smooth the output. It has three values: 'off'(0), 'on'(1) and 'auto'(2). 'off' means never apply the filter, 'on' means always apply the filter and 'auto' means apply the filter only if the X and Y -sizes are scaled to more than double to avoid blurred output. Bicubic -filtering is not currently compatible with other Xv attributes like hue, -contrast, and brightness, and must be disabled to use those attributes. +sizes are scaled to more than double, this to avoid blurred output. The default is -.B 'off'(0). +.B 'auto'(2). .SH SEE ALSO __xservername__(__appmansuffix__), __xconfigfile__(__filemansuffix__), Xserver(__appmansuffix__), X(__miscmansuffix__) @@ -777,7 +630,7 @@ Kevin E. Martin \fIkem@freedesktop.org\fP Alan Hourihane \fIalanh@fairlite.demon.co.uk\fP Marc Aurele La France \fItsi@xfree86.org\fP Benjamin Herrenschmidt \fIbenh@kernel.crashing.org\fP -Michel D\(:anzer \fImichel@daenzer.net\fP +Michel D\(:anzer \fImichel@tungstengraphics.com\fP Alex Deucher \fIalexdeucher@gmail.com\fP Bogdan D. \fIbogdand@users.sourceforge.net\fP Eric Anholt \fIeric@anholt.net\fP diff --git a/driver/xf86-video-ati/src/AtomBios/CD_Operations.c b/driver/xf86-video-ati/src/AtomBios/CD_Operations.c index f8b47e3e3..6b2856040 100644 --- a/driver/xf86-video-ati/src/AtomBios/CD_Operations.c +++ b/driver/xf86-video-ati/src/AtomBios/CD_Operations.c @@ -42,7 +42,6 @@ Revision History: #include #include "xorg-server.h" -#include "compiler.h" #include "Decoder.h" @@ -231,7 +230,7 @@ UINT32 IndirectInputOutput(PARSER_TEMP_DATA STACK_BASED * pParserTempData) IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].func(pParserTempData); pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; } - pParserTempData->IndirectIOTablePointer-=UINT16LE_TO_CPU(ldw_u((uint16_t *)(pParserTempData->IndirectIOTablePointer+1))); + pParserTempData->IndirectIOTablePointer-=UINT16LE_TO_CPU(*(UINT16*)(pParserTempData->IndirectIOTablePointer+1)); pParserTempData->IndirectIOTablePointer++; return pParserTempData->IndirectData; } else pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; @@ -268,8 +267,8 @@ VOID PutDataRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData) VOID PutDataPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { - stl_u(CPU_TO_UINT32LE(pParserTempData->DestData32), - pParserTempData->pDeviceData->pParameterSpace+pParserTempData->pCmd->Parameters.ByteXX.PA_Destination); + *(pParserTempData->pDeviceData->pParameterSpace+pParserTempData->pCmd->Parameters.ByteXX.PA_Destination)= + CPU_TO_UINT32LE(pParserTempData->DestData32); } VOID PutDataWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) @@ -301,9 +300,6 @@ VOID PutDataWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) case WS_ATTRIBUTES_C: pParserTempData->AttributesData=(UINT16)pParserTempData->DestData32; break; - case WS_REGPTR_C: - pParserTempData->CurrentRegBlock=(UINT16)pParserTempData->DestData32; - break; } } @@ -342,7 +338,7 @@ VOID SkipParameters16(PARSER_TEMP_DATA STACK_BASED * pParserTempData) UINT32 GetParametersRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { - pParserTempData->Index=UINT16LE_TO_CPU(ldw_u((uint16_t *)pParserTempData->pWorkingTableData->IP)); + pParserTempData->Index=UINT16LE_TO_CPU(*(UINT16*)pParserTempData->pWorkingTableData->IP); pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); pParserTempData->Index+=pParserTempData->CurrentRegBlock; switch(pParserTempData->Multipurpose.CurrentPort) @@ -367,7 +363,7 @@ UINT32 GetParametersPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) UINT32 data; pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); - data = UINT32LE_TO_CPU(ldl_u(pParserTempData->pDeviceData->pParameterSpace+pParserTempData->Index)); + data = UINT32LE_TO_CPU(*(pParserTempData->pDeviceData->pParameterSpace+pParserTempData->Index)); return data; } @@ -394,8 +390,6 @@ UINT32 GetParametersWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) return pParserTempData->CurrentFB_Window; case WS_ATTRIBUTES_C: return pParserTempData->AttributesData; - case WS_REGPTR_C: - return (UINT32)pParserTempData->CurrentRegBlock; } return 0; @@ -426,11 +420,11 @@ UINT32 GetParametersMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData) UINT32 GetParametersIndirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { - UINT32 ret; + UINT32 ret; - pParserTempData->Index=UINT16LE_TO_CPU(ldw_u((uint16_t *)pParserTempData->pWorkingTableData->IP)); + pParserTempData->Index=UINT16LE_TO_CPU(*(UINT16*)pParserTempData->pWorkingTableData->IP); pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); - ret = UINT32LE_TO_CPU(ldl_u((UINT32*)(RELATIVE_TO_BIOS_IMAGE(pParserTempData->Index)+pParserTempData->CurrentDataBlock))); + ret = UINT32LE_TO_CPU(*(UINT32*)(RELATIVE_TO_BIOS_IMAGE(pParserTempData->Index)+pParserTempData->CurrentDataBlock)); return ret; } @@ -445,7 +439,7 @@ UINT32 GetParametersDirect8(PARSER_TEMP_DATA STACK_BASED * pParserTempData) UINT32 GetParametersDirect16(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->CD_Mask.SrcAlignment=alignmentLowerWord; - pParserTempData->Index=UINT16LE_TO_CPU(ldw_u((uint16_t *)pParserTempData->pWorkingTableData->IP)); + pParserTempData->Index=UINT16LE_TO_CPU(*(UINT16*)pParserTempData->pWorkingTableData->IP); pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); return pParserTempData->Index; } @@ -453,7 +447,7 @@ UINT32 GetParametersDirect16(PARSER_TEMP_DATA STACK_BASED * pParserTempData) UINT32 GetParametersDirect32(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { pParserTempData->CD_Mask.SrcAlignment=alignmentDword; - pParserTempData->Index=UINT32LE_TO_CPU(ldl_u((UINT32*)pParserTempData->pWorkingTableData->IP)); + pParserTempData->Index=UINT32LE_TO_CPU(*(UINT32*)pParserTempData->pWorkingTableData->IP); pParserTempData->pWorkingTableData->IP+=sizeof(UINT32); return pParserTempData->Index; } @@ -505,16 +499,13 @@ VOID ProcessMove(PARSER_TEMP_DATA STACK_BASED * pParserTempData) VOID ProcessMask(PARSER_TEMP_DATA STACK_BASED * pParserTempData) { - UINT8 src; pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); - src = pParserTempData->CD_Mask.SrcAlignment; pParserTempData->SourceData32=GetParametersDirect(pParserTempData); - pParserTempData->Index=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + pParserTempData->Index=GetParametersDirect(pParserTempData); pParserTempData->SourceData32 <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; pParserTempData->SourceData32 |= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]); pParserTempData->DestData32 &= pParserTempData->SourceData32; - pParserTempData->Index >>= SourceAlignmentShift[src]; pParserTempData->Index &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->Index <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; pParserTempData->DestData32 |= pParserTempData->Index; @@ -684,7 +675,7 @@ VOID ProcessSwitch(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; - while ( UINT16LE_TO_CPU(ldw_u((uint16_t *)pParserTempData->pWorkingTableData->IP)) != (((UINT16)NOP_OPCODE << 8)+NOP_OPCODE)) + while ( UINT16LE_TO_CPU(*(UINT16*)pParserTempData->pWorkingTableData->IP) != (((UINT16)NOP_OPCODE << 8)+NOP_OPCODE)) { if (*pParserTempData->pWorkingTableData->IP == 'c') { diff --git a/driver/xf86-video-ati/src/AtomBios/includes/Decoder.h b/driver/xf86-video-ati/src/AtomBios/includes/Decoder.h index cc533efb0..1e143f021 100644 --- a/driver/xf86-video-ati/src/AtomBios/includes/Decoder.h +++ b/driver/xf86-video-ati/src/AtomBios/includes/Decoder.h @@ -44,7 +44,6 @@ NEG:27.08.2002 Initiated. #define WS_AND_MASK_C (WS_OR_MASK_C+1) #define WS_FB_WINDOW_C (WS_AND_MASK_C+1) #define WS_ATTRIBUTES_C (WS_FB_WINDOW_C+1) -#define WS_REGPTR_C (WS_ATTRIBUTES_C+1) #define PARSER_VERSION_MAJOR 0x00000000 #define PARSER_VERSION_MINOR 0x0000000E #define PARSER_VERSION (PARSER_VERSION_MAJOR | PARSER_VERSION_MINOR) diff --git a/driver/xf86-video-ati/src/AtomBios/includes/ObjectID.h b/driver/xf86-video-ati/src/AtomBios/includes/ObjectID.h index c714179d1..f1f18a48c 100644 --- a/driver/xf86-video-ati/src/AtomBios/includes/ObjectID.h +++ b/driver/xf86-video-ati/src/AtomBios/includes/ObjectID.h @@ -106,8 +106,6 @@ #define CONNECTOR_OBJECT_ID_CROSSFIRE 0x11 #define CONNECTOR_OBJECT_ID_HARDCODE_DVI 0x12 #define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13 -#define CONNECTOR_OBJECT_ID_eDP 0x14 -#define CONNECTOR_OBJECT_ID_MXM 0x15 /* deleted */ @@ -118,15 +116,7 @@ #define ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL 0x01 /****************************************************/ -/* Generic Object ID Definition */ -/****************************************************/ -#define GENERIC_OBJECT_ID_NONE 0x00 -#define GENERIC_OBJECT_ID_GLSYNC 0x01 -#define GENERIC_OBJECT_ID_PX2_NON_DRIVABLE 0x02 -#define GENERIC_OBJECT_ID_MXM_OPM 0x03 - -/****************************************************/ -/* Graphics Object ENUM ID Definition */ +// Graphics Object ENUM ID Definition */ /****************************************************/ #define GRAPH_OBJECT_ENUM_ID1 0x01 #define GRAPH_OBJECT_ENUM_ID2 0x02 @@ -134,7 +124,6 @@ #define GRAPH_OBJECT_ENUM_ID4 0x04 #define GRAPH_OBJECT_ENUM_ID5 0x05 #define GRAPH_OBJECT_ENUM_ID6 0x06 -#define GRAPH_OBJECT_ENUM_ID7 0x07 /****************************************************/ /* Graphics Object ID Bit definition */ @@ -385,18 +374,6 @@ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) -#define CONNECTOR_LVDS_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) - -#define CONNECTOR_eDP_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_eDP << OBJECT_ID_SHIFT) - -#define CONNECTOR_eDP_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_eDP << OBJECT_ID_SHIFT) - #define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) @@ -425,14 +402,6 @@ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) -#define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) - -#define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) - #define CONNECTOR_VGA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) @@ -445,76 +414,37 @@ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) -#define CONNECTOR_COMPOSITE_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) - #define CONNECTOR_SVIDEO_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) -#define CONNECTOR_SVIDEO_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) - #define CONNECTOR_YPbPr_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) -#define CONNECTOR_YPbPr_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) - #define CONNECTOR_D_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) -#define CONNECTOR_D_CONNECTOR_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) - #define CONNECTOR_9PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) -#define CONNECTOR_9PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) - #define CONNECTOR_SCART_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) -#define CONNECTOR_SCART_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) - #define CONNECTOR_HDMI_TYPE_A_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) -#define CONNECTOR_HDMI_TYPE_A_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) - -#define CONNECTOR_HDMI_TYPE_A_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) - #define CONNECTOR_HDMI_TYPE_B_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) -#define CONNECTOR_HDMI_TYPE_B_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) - #define CONNECTOR_7PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) -#define CONNECTOR_7PIN_DIN_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) #define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ @@ -557,42 +487,6 @@ GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) -#define CONNECTOR_DISPLAYPORT_ENUM_ID5 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) - -#define CONNECTOR_DISPLAYPORT_ENUM_ID6 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) - -#define CONNECTOR_MXM_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_A - -#define CONNECTOR_MXM_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_B - -#define CONNECTOR_MXM_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_C - -#define CONNECTOR_MXM_ENUM_ID4 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DP_D - -#define CONNECTOR_MXM_ENUM_ID5 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID5 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_LVDS_TXxx - -#define CONNECTOR_MXM_ENUM_ID6 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID6 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_LVDS_UXxx - -#define CONNECTOR_MXM_ENUM_ID7 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID7 << ENUM_ID_SHIFT |\ - CONNECTOR_OBJECT_ID_MXM << OBJECT_ID_SHIFT) //Mapping to MXM_DAC - /****************************************************/ /* Router Object ID definition - Shared with BIOS */ /****************************************************/ @@ -602,25 +496,6 @@ /* deleted */ -/****************************************************/ -/* Generic Object ID definition - Shared with BIOS */ -/****************************************************/ -#define GENERICOBJECT_GLSYNC_ENUM_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ - GENERIC_OBJECT_ID_GLSYNC << OBJECT_ID_SHIFT) - -#define GENERICOBJECT_PX2_NON_DRIVABLE_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ - GENERIC_OBJECT_ID_PX2_NON_DRIVABLE<< OBJECT_ID_SHIFT) - -#define GENERICOBJECT_PX2_NON_DRIVABLE_ID2 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ - GENERIC_OBJECT_ID_PX2_NON_DRIVABLE<< OBJECT_ID_SHIFT) - -#define GENERICOBJECT_MXM_OPM_ENUM_ID1 (GRAPH_OBJECT_TYPE_GENERIC << OBJECT_TYPE_SHIFT |\ - GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ - GENERIC_OBJECT_ID_MXM_OPM << OBJECT_ID_SHIFT) - /****************************************************/ /* Object Cap definition - Shared with BIOS */ /****************************************************/ diff --git a/driver/xf86-video-ati/src/AtomBios/includes/atombios.h b/driver/xf86-video-ati/src/AtomBios/includes/atombios.h index 1bc72c319..7a3afa8d3 100644 --- a/driver/xf86-video-ati/src/AtomBios/includes/atombios.h +++ b/driver/xf86-video-ati/src/AtomBios/includes/atombios.h @@ -61,19 +61,12 @@ #define ATOM_CRTC1 0 #define ATOM_CRTC2 1 -#define ATOM_CRTC3 2 -#define ATOM_CRTC4 3 -#define ATOM_CRTC5 4 -#define ATOM_CRTC6 5 -#define ATOM_CRTC_INVALID 0xFF #define ATOM_DIGA 0 #define ATOM_DIGB 1 #define ATOM_PPLL1 0 #define ATOM_PPLL2 1 -#define ATOM_DCPLL 2 -#define ATOM_PPLL_INVALID 0xFF #define ATOM_SCALER1 0 #define ATOM_SCALER2 1 @@ -91,7 +84,6 @@ #define ATOM_LCD_SELFTEST_START (ATOM_DISABLE+5) #define ATOM_LCD_SELFTEST_STOP (ATOM_ENABLE+5) #define ATOM_ENCODER_INIT (ATOM_DISABLE+7) -#define ATOM_GET_STATUS (ATOM_DISABLE+8) #define ATOM_BLANKING 1 #define ATOM_BLANKING_OFF 0 @@ -249,18 +241,18 @@ typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{ USHORT DAC1EncoderControl; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT DAC2EncoderControl; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT DVOOutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 - USHORT CV1OutputControl; //Atomic Table, Atomic Table, Obsolete from Ry6xx, use DAC2 Output instead + USHORT CV1OutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT GetConditionalGoldenSetting; //only used by Bios USHORT TVEncoderControl; //Function Table,directly used by various SW components,latest version 1.1 USHORT TMDSAEncoderControl; //Atomic Table, directly used by various SW components,latest version 1.3 USHORT LVDSEncoderControl; //Atomic Table, directly used by various SW components,latest version 1.3 - USHORT TV1OutputControl; //Atomic Table, Obsolete from Ry6xx, use DAC2 Output instead + USHORT TV1OutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT EnableScaler; //Atomic Table, used only by Bios USHORT BlankCRTC; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT EnableCRTC; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT GetPixelClock; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT EnableVGA_Render; //Function Table,directly used by various SW components,latest version 1.1 - USHORT GetSCLKOverMCLKRatio; //Atomic Table, only used by Bios + USHORT EnableVGA_Access; //Obsolete , only used by Bios USHORT SetCRTC_Timing; //Atomic Table, directly used by various SW components,latest version 1.1 USHORT SetCRTC_OverScan; //Atomic Table, used by various SW components,latest version 1.1 USHORT SetCRTC_Replication; //Atomic Table, used only by Bios @@ -310,8 +302,6 @@ typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{ #define LVTMATransmitterControl DIG2TransmitterControl #define SetCRTC_DPM_State GetConditionalGoldenSetting #define SetUniphyInstance ASIC_StaticPwrMgtStatusChange -#define HPDInterruptService ReadHWAssistedI2CStatus -#define EnableVGA_Access GetSCLKOverMCLKRatio typedef struct _ATOM_MASTER_COMMAND_TABLE { @@ -425,20 +415,6 @@ typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V3 #define ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN 1 #define ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE 2 #define ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE 4 -#define ATOM_PLL_CNTL_FLAG_SPLL_ISPARE_9 8 - - -// V4 are only used for APU which PLL outside GPU -typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4 -{ -#if ATOM_BIG_ENDIAN - ULONG ucPostDiv; //return parameter: post divider which is used to program to register directly - ULONG ulClock:24; //Input= target clock, output = actual clock -#else - ULONG ulClock:24; //Input= target clock, output = actual clock - ULONG ucPostDiv; //return parameter: post divider which is used to program to register directly -#endif -}COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V4; typedef struct _DYNAMICE_MEMORY_SETTINGS_PARAMETER { @@ -604,7 +580,6 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS #define ATOM_ENCODER_MODE_DVI 2 #define ATOM_ENCODER_MODE_HDMI 3 #define ATOM_ENCODER_MODE_SDVO 4 -#define ATOM_ENCODER_MODE_DP_AUDIO 5 #define ATOM_ENCODER_MODE_TV 13 #define ATOM_ENCODER_MODE_CV 14 #define ATOM_ENCODER_MODE_CRT 15 @@ -639,8 +614,7 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V2 // =3: HDMI encoder // =4: SDVO encoder UCHAR ucLaneNum; // how many lanes to enable - UCHAR ucStatus; // = DP_LINK_TRAINING_COMPLETE or DP_LINK_TRAINING_INCOMPLETE, only used by VBIOS with command ATOM_ENCODER_CMD_QUERY_DP_LINK_TRAINING_STATUS - UCHAR ucReserved; + UCHAR ucReserved[2]; }DIG_ENCODER_CONTROL_PARAMETERS_V2; //ucConfig @@ -655,67 +629,6 @@ typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V2 #define ATOM_ENCODER_CONFIG_V2_TRANSMITTER2 0x08 #define ATOM_ENCODER_CONFIG_V2_TRANSMITTER3 0x10 -// ucAction: -// ATOM_DISABLE -// ATOM_ENABLE -#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_START 0x08 -#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1 0x09 -#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2 0x0a -#define ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE 0x0b -#define ATOM_ENCODER_CMD_DP_VIDEO_OFF 0x0c -#define ATOM_ENCODER_CMD_DP_VIDEO_ON 0x0d -#define ATOM_ENCODER_CMD_QUERY_DP_LINK_TRAINING_STATUS 0x0e -#define ATOM_ENCODER_CMD_SETUP 0x0f - -// ucStatus -#define ATOM_ENCODER_STATUS_LINK_TRAINING_COMPLETE 0x10 -#define ATOM_ENCODER_STATUS_LINK_TRAINING_INCOMPLETE 0x00 - -// Following function ENABLE sub-function will be used by driver when TMDS/HDMI/LVDS is used, disable function will be used by driver -typedef struct _ATOM_DIG_ENCODER_CONFIG_V3 -{ -#if ATOM_BIG_ENDIAN - UCHAR ucReserved1:1; - UCHAR ucDigSel:3; // =0: DIGA/B/C/D/E/F - UCHAR ucReserved:3; - UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz -#else - UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz - UCHAR ucReserved:3; - UCHAR ucDigSel:3; // =0: DIGA/B/C/D/E/F - UCHAR ucReserved1:1; -#endif -}ATOM_DIG_ENCODER_CONFIG_V3; - -#define ATOM_ENCODER_CONFIG_V3_ENCODER_SEL 0x70 - - -typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V3 -{ - USHORT usPixelClock; // in 10KHz; for bios convenient - ATOM_DIG_ENCODER_CONFIG_V3 acConfig; - UCHAR ucAction; - UCHAR ucEncoderMode; - // =0: DP encoder - // =1: LVDS encoder - // =2: DVI encoder - // =3: HDMI encoder - // =4: SDVO encoder - // =5: DP audio - UCHAR ucLaneNum; // how many lanes to enable - UCHAR ucBitPerColor; // only valid for DP mode when ucAction = ATOM_ENCODER_CMD_SETUP - UCHAR ucReserved; -}DIG_ENCODER_CONTROL_PARAMETERS_V3; - - -// define ucBitPerColor: -#define PANEL_BPC_UNDEFINE 0x00 -#define PANEL_6BIT_PER_COLOR 0x01 -#define PANEL_8BIT_PER_COLOR 0x02 -#define PANEL_10BIT_PER_COLOR 0x03 -#define PANEL_12BIT_PER_COLOR 0x04 -#define PANEL_16BIT_PER_COLOR 0x05 - /****************************************************************************/ // Structures used by UNIPHYTransmitterControlTable // LVTMATransmitterControlTable @@ -797,8 +710,7 @@ typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS #define ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT 9 #define ATOM_TRANSMITTER_ACTION_SETUP 10 #define ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH 11 -#define ATOM_TRANSMITTER_ACTION_POWER_ON 12 -#define ATOM_TRANSMITTER_ACTION_POWER_OFF 13 + // Following are used for DigTransmitterControlTable ver1.2 typedef struct _ATOM_DIG_TRANSMITTER_CONFIG_V2 @@ -838,7 +750,7 @@ typedef struct _ATOM_DIG_TRANSMITTER_CONFIG_V2 //Bit2 #define ATOM_TRANSMITTER_CONFIG_V2_LINK_SEL_MASK 0x04 -#define ATOM_TRANSMITTER_CONFIG_V2_LINKA 0x00 +#define ATOM_TRANSMITTER_CONFIG_V2_LINKA 0x00 #define ATOM_TRANSMITTER_CONFIG_V2_LINKB 0x04 // Bit3 @@ -864,77 +776,10 @@ typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 ATOM_DP_VS_MODE asMode; // DP Voltage swing mode }; ATOM_DIG_TRANSMITTER_CONFIG_V2 acConfig; - UCHAR ucAction; // define as ATOM_TRANSMITER_ACTION_XXX + UCHAR ucAction; // define as ATOM_TRANSMITER_ACTION_XXX UCHAR ucReserved[4]; }DIG_TRANSMITTER_CONTROL_PARAMETERS_V2; -typedef struct _ATOM_DIG_TRANSMITTER_CONFIG_V3 -{ -#if ATOM_BIG_ENDIAN - UCHAR ucTransmitterSel:2; //bit7:6: =0 Dig Transmitter 1 ( Uniphy AB ) - // =1 Dig Transmitter 2 ( Uniphy CD ) - // =2 Dig Transmitter 3 ( Uniphy EF ) - UCHAR ucRefClkSource:2; //bit5:4: PPLL1 =0, PPLL2=1, EXT_CLK=2 - UCHAR ucEncoderSel:1; //bit3=0: Data/Clk path source from DIGA/C/E. =1: Data/clk path source from DIGB/D/F - UCHAR ucLinkSel:1; //bit2=0: Uniphy LINKA or C or E when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is A or C or E - // =1: Uniphy LINKB or D or F when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is B or D or F - UCHAR fCoherentMode:1; //bit1=1: Coherent Mode ( for DVI/HDMI mode ) - UCHAR fDualLinkConnector:1; //bit0=1: Dual Link DVI connector -#else - UCHAR fDualLinkConnector:1; //bit0=1: Dual Link DVI connector - UCHAR fCoherentMode:1; //bit1=1: Coherent Mode ( for DVI/HDMI mode ) - UCHAR ucLinkSel:1; //bit2=0: Uniphy LINKA or C or E when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is A or C or E - // =1: Uniphy LINKB or D or F when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is B or D or F - UCHAR ucEncoderSel:1; //bit3=0: Data/Clk path source from DIGA/C/E. =1: Data/clk path source from DIGB/D/F - UCHAR ucRefClkSource:2; //bit5:4: PPLL1 =0, PPLL2=1, EXT_CLK=2 - UCHAR ucTransmitterSel:2; //bit7:6: =0 Dig Transmitter 1 ( Uniphy AB ) - // =1 Dig Transmitter 2 ( Uniphy CD ) - // =2 Dig Transmitter 3 ( Uniphy EF ) -#endif -}ATOM_DIG_TRANSMITTER_CONFIG_V3; - -typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 -{ - union - { - USHORT usPixelClock; // in 10KHz; for bios convenient - USHORT usInitInfo; // when init uniphy,lower 8bit is used for connector type defined in objectid.h - ATOM_DP_VS_MODE asMode; // DP Voltage swing mode - }; - ATOM_DIG_TRANSMITTER_CONFIG_V3 acConfig; - UCHAR ucAction; // define as ATOM_TRANSMITER_ACTION_XXX - UCHAR ucLaneNum; - UCHAR ucReserved[3]; -}DIG_TRANSMITTER_CONTROL_PARAMETERS_V3; - -//ucConfig -//Bit0 -#define ATOM_TRANSMITTER_CONFIG_V3_DUAL_LINK_CONNECTOR 0x01 - -//Bit1 -#define ATOM_TRANSMITTER_CONFIG_V3_COHERENT 0x02 - -//Bit2 -#define ATOM_TRANSMITTER_CONFIG_V3_LINK_SEL_MASK 0x04 -#define ATOM_TRANSMITTER_CONFIG_V3_LINKA 0x00 -#define ATOM_TRANSMITTER_CONFIG_V3_LINKB 0x04 - -// Bit3 -#define ATOM_TRANSMITTER_CONFIG_V3_ENCODER_SEL_MASK 0x08 -#define ATOM_TRANSMITTER_CONFIG_V3_DIG1_ENCODER 0x00 -#define ATOM_TRANSMITTER_CONFIG_V3_DIG2_ENCODER 0x08 - -// Bit5:4 -#define ATOM_TRASMITTER_CONFIG_V3_REFCLK_SEL_MASK 0x30 -#define ATOM_TRASMITTER_CONFIG_V3_P1PLL 0x00 -#define ATOM_TRASMITTER_CONFIG_V3_P2PLL 0x10 -#define ATOM_TRASMITTER_CONFIG_V3_REFCLK_SRC_EXT 0x20 - -// Bit7:6 -#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER_SEL_MASK 0xC0 -#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER1 0x00 //AB -#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER2 0x40 //CD -#define ATOM_TRANSMITTER_CONFIG_V3_TRANSMITTER3 0x80 //EF /****************************************************************************/ // Structures used by DAC1OuputControlTable @@ -1137,10 +982,6 @@ typedef struct _PIXEL_CLOCK_PARAMETERS_V2 #define PIXEL_CLOCK_MISC_CRTC_SEL_CRTC1 0x00 #define PIXEL_CLOCK_MISC_CRTC_SEL_CRTC2 0x04 #define PIXEL_CLOCK_MISC_USE_ENGINE_FOR_DISPCLK 0x08 -#define PIXEL_CLOCK_MISC_REF_DIV_SRC 0x10 -// V1.4 for RoadRunner -#define PIXEL_CLOCK_V4_MISC_SS_ENABLE 0x10 -#define PIXEL_CLOCK_V4_MISC_COHERENT_MODE 0x20 typedef struct _PIXEL_CLOCK_PARAMETERS_V3 { @@ -1159,66 +1000,11 @@ typedef struct _PIXEL_CLOCK_PARAMETERS_V3 }; UCHAR ucMiscInfo; // bit[0]=Force program, bit[1]= set pclk for VGA, b[2]= CRTC sel // bit[3]=0:use PPLL for dispclk source, =1: use engine clock for dispclock source - // bit[4]=0:use XTALIN as the source of reference divider,=1 use the pre-defined clock as the source of reference divider }PIXEL_CLOCK_PARAMETERS_V3; #define PIXEL_CLOCK_PARAMETERS_LAST PIXEL_CLOCK_PARAMETERS_V2 #define GET_PIXEL_CLOCK_PS_ALLOCATION PIXEL_CLOCK_PARAMETERS_LAST -typedef struct _PIXEL_CLOCK_PARAMETERS_V5 -{ - UCHAR ucCRTC; // ATOM_CRTC1~6, indicate the CRTC controller to - // drive the pixel clock. not used for DCPLL case. - union{ - UCHAR ucReserved; - UCHAR ucFracFbDiv; // [gphan] temporary to prevent build problem. remove it after driver code is changed. - }; - USHORT usPixelClock; // target the pixel clock to drive the CRTC timing - // 0 means disable PPLL/DCPLL. - USHORT usFbDiv; // feedback divider integer part. - UCHAR ucPostDiv; // post divider. - UCHAR ucRefDiv; // Reference divider - UCHAR ucPpll; // ATOM_PPLL1/ATOM_PPLL2/ATOM_DCPLL - UCHAR ucTransmitterID; // ASIC encoder id defined in objectId.h, - // indicate which graphic encoder will be used. - UCHAR ucEncoderMode; // Encoder mode: - UCHAR ucMiscInfo; // bit[0]= Force program PPLL - // bit[1]= when VGA timing is used. - // bit[3:2]= HDMI panel bit depth: =0: 24bpp =1:30bpp, =2:32bpp - // bit[4]= RefClock source for PPLL. - // =0: XTLAIN( default mode ) - // =1: other external clock source, which is pre-defined - // by VBIOS depend on the feature required. - // bit[7:5]: reserved. - ULONG ulFbDivDecFrac; // 20 bit feedback divider decimal fraction part, range from 1~999999 ( 0.000001 to 0.999999 ) - -}PIXEL_CLOCK_PARAMETERS_V5; - -#define PIXEL_CLOCK_V5_MISC_FORCE_PROG_PPLL 0x01 -#define PIXEL_CLOCK_V5_MISC_VGA_MODE 0x02 -#define PIXEL_CLOCK_V5_MISC_HDMI_BPP_MASK 0x0c -#define PIXEL_CLOCK_V5_MISC_HDMI_24BPP 0x00 -#define PIXEL_CLOCK_V5_MISC_HDMI_30BPP 0x04 -#define PIXEL_CLOCK_V5_MISC_HDMI_32BPP 0x08 -#define PIXEL_CLOCK_V5_MISC_REF_DIV_SRC 0x10 - -typedef struct _GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V2 -{ - PIXEL_CLOCK_PARAMETERS_V3 sDispClkInput; -}GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V2; - -typedef struct _GET_DISP_PLL_STATUS_OUTPUT_PARAMETERS_V2 -{ - UCHAR ucStatus; - UCHAR ucRefDivSrc; // =1: reference clock source from XTALIN, =0: source from PCIE ref clock - UCHAR ucReserved[2]; -}GET_DISP_PLL_STATUS_OUTPUT_PARAMETERS_V2; - -typedef struct _GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V3 -{ - PIXEL_CLOCK_PARAMETERS_V5 sDispClkInput; -}GET_DISP_PLL_STATUS_INPUT_PARAMETERS_V3; - /****************************************************************************/ // Structures used by AdjustDisplayPllTable /****************************************************************************/ @@ -1236,47 +1022,9 @@ typedef struct _ADJUST_DISPLAY_PLL_PARAMETERS }ADJUST_DISPLAY_PLL_PARAMETERS; #define ADJUST_DISPLAY_CONFIG_SS_ENABLE 0x10 + #define ADJUST_DISPLAY_PLL_PS_ALLOCATION ADJUST_DISPLAY_PLL_PARAMETERS -typedef struct _ADJUST_DISPLAY_PLL_INPUT_PARAMETERS_V3 -{ - USHORT usPixelClock; // target pixel clock - UCHAR ucTransmitterID; // transmitter id defined in objectid.h - UCHAR ucEncodeMode; // encoder mode: CRT, LVDS, DP, TMDS or HDMI - UCHAR ucDispPllConfig; // display pll configure parameter defined as following DISPPLL_CONFIG_XXXX - UCHAR ucReserved[3]; -}ADJUST_DISPLAY_PLL_INPUT_PARAMETERS_V3; - -// usDispPllConfig v1.2 for RoadRunner -#define DISPPLL_CONFIG_DVO_RATE_SEL 0x0001 // need only when ucTransmitterID = DVO -#define DISPPLL_CONFIG_DVO_DDR_SPEED 0x0000 // need only when ucTransmitterID = DVO -#define DISPPLL_CONFIG_DVO_SDR_SPEED 0x0001 // need only when ucTransmitterID = DVO -#define DISPPLL_CONFIG_DVO_OUTPUT_SEL 0x000c // need only when ucTransmitterID = DVO -#define DISPPLL_CONFIG_DVO_LOW12BIT 0x0000 // need only when ucTransmitterID = DVO -#define DISPPLL_CONFIG_DVO_UPPER12BIT 0x0004 // need only when ucTransmitterID = DVO -#define DISPPLL_CONFIG_DVO_24BIT 0x0008 // need only when ucTransmitterID = DVO -#define DISPPLL_CONFIG_SS_ENABLE 0x0010 // Only used when ucEncoderMode = DP or LVDS -#define DISPPLL_CONFIG_COHERENT_MODE 0x0020 // Only used when ucEncoderMode = TMDS or HDMI -#define DISPPLL_CONFIG_DUAL_LINK 0x0040 // Only used when ucEncoderMode = TMDS or LVDS - - -typedef struct _ADJUST_DISPLAY_PLL_OUTPUT_PARAMETERS_V3 -{ - ULONG ulDispPllFreq; // return display PPLL freq which is used to generate the pixclock, and related idclk, symclk etc - UCHAR ucRefDiv; // if it is none-zero, it is used to be calculated the other ppll parameter fb_divider and post_div ( if it is not given ) - UCHAR ucPostDiv; // if it is none-zero, it is used to be calculated the other ppll parameter fb_divider - UCHAR ucReserved[2]; -}ADJUST_DISPLAY_PLL_OUTPUT_PARAMETERS_V3; - -typedef struct _ADJUST_DISPLAY_PLL_PS_ALLOCATION_V3 -{ - union - { - ADJUST_DISPLAY_PLL_INPUT_PARAMETERS_V3 sInput; - ADJUST_DISPLAY_PLL_OUTPUT_PARAMETERS_V3 sOutput; - }; -} ADJUST_DISPLAY_PLL_PS_ALLOCATION_V3; - /****************************************************************************/ // Structures used by EnableYUVTable /****************************************************************************/ @@ -1414,30 +1162,6 @@ typedef struct _ENABLE_SPREAD_SPECTRUM_ON_PPLL UCHAR ucPpll; // ATOM_PPLL1/ATOM_PPLL2 }ENABLE_SPREAD_SPECTRUM_ON_PPLL; -typedef struct _ENABLE_SPREAD_SPECTRUM_ON_PPLL_V2 -{ - USHORT usSpreadSpectrumPercentage; - UCHAR ucSpreadSpectrumType; // Bit[0]: 0-Down Spread,1-Center Spread. - // Bit[1]: 1-Ext. 0-Int. - // Bit[3:2]: =0 P1PLL =1 P2PLL =2 DCPLL - // Bits[7:4] reserved - UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE - USHORT usSpreadSpectrumAmount; // Includes SS_AMOUNT_FBDIV[7:0] and SS_AMOUNT_NFRAC_SLIP[11:8] - USHORT usSpreadSpectrumStep; // SS_STEP_SIZE_DSFRAC -}ENABLE_SPREAD_SPECTRUM_ON_PPLL_V2; - -#define ATOM_PPLL_SS_TYPE_V2_DOWN_SPREAD 0x00 -#define ATOM_PPLL_SS_TYPE_V2_CENTRE_SPREAD 0x01 -#define ATOM_PPLL_SS_TYPE_V2_EXT_SPREAD 0x02 -#define ATOM_PPLL_SS_TYPE_V2_PPLL_SEL_MASK 0x0c -#define ATOM_PPLL_SS_TYPE_V2_P1PLL 0x00 -#define ATOM_PPLL_SS_TYPE_V2_P2PLL 0x04 -#define ATOM_PPLL_SS_TYPE_V2_DCPLL 0x08 -#define ATOM_PPLL_SS_AMOUNT_V2_FBDIV_MASK 0x00FF -#define ATOM_PPLL_SS_AMOUNT_V2_FBDIV_SHIFT 0 -#define ATOM_PPLL_SS_AMOUNT_V2_NFRAC_MASK 0x0F00 -#define ATOM_PPLL_SS_AMOUNT_V2_NFRAC_SHIFT 8 - #define ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION ENABLE_SPREAD_SPECTRUM_ON_PPLL /**************************************************************************/ @@ -1695,6 +1419,11 @@ typedef struct _TV_ENCODER_CONTROL_PS_ALLOCATION //==============================Data Table Portion==================================== +#ifdef UEFI_BUILD + #define UTEMP USHORT + #define USHORT void* +#endif + /****************************************************************************/ // Structure used in Data.mtb /****************************************************************************/ @@ -1736,6 +1465,10 @@ typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES USHORT PowerSourceInfo; // Shared by various SW components, latest versoin 1.1 }ATOM_MASTER_LIST_OF_DATA_TABLES; +#ifdef UEFI_BUILD + #define USHORT UTEMP +#endif + typedef struct _ATOM_MASTER_DATA_TABLE { ATOM_COMMON_TABLE_HEADER sHeader; @@ -1788,8 +1521,8 @@ typedef struct _ATOM_MULTIMEDIA_CONFIG_INFO #define ATOM_BIOS_INFO_ATOM_FIRMWARE_POSTED 0x0001 #define ATOM_BIOS_INFO_DUAL_CRTC_SUPPORT 0x0002 #define ATOM_BIOS_INFO_EXTENDED_DESKTOP_SUPPORT 0x0004 -#define ATOM_BIOS_INFO_MEMORY_CLOCK_SS_SUPPORT 0x0008 // (valid from v1.1 ~v1.4):=1: memclk SS enable, =0 memclk SS disable. -#define ATOM_BIOS_INFO_ENGINE_CLOCK_SS_SUPPORT 0x0010 // (valid from v1.1 ~v1.4):=1: engclk SS enable, =0 engclk SS disable. +#define ATOM_BIOS_INFO_MEMORY_CLOCK_SS_SUPPORT 0x0008 +#define ATOM_BIOS_INFO_ENGINE_CLOCK_SS_SUPPORT 0x0010 #define ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU 0x0020 #define ATOM_BIOS_INFO_WMI_SUPPORT 0x0040 #define ATOM_BIOS_INFO_PPMODE_ASSIGNGED_BY_SYSTEM 0x0080 @@ -1797,8 +1530,7 @@ typedef struct _ATOM_MULTIMEDIA_CONFIG_INFO #define ATOM_BIOS_INFO_HYPERMEMORY_SIZE_MASK 0x1E00 #define ATOM_BIOS_INFO_VPOST_WITHOUT_FIRST_MODE_SET 0x2000 #define ATOM_BIOS_INFO_BIOS_SCRATCH6_SCL2_REDEFINE 0x4000 -#define ATOM_BIOS_INFO_MEMORY_CLOCK_EXT_SS_SUPPORT 0x0008 // (valid from v2.1 ): =1: memclk ss enable with external ss chip -#define ATOM_BIOS_INFO_ENGINE_CLOCK_EXT_SS_SUPPORT 0x0010 // (valid from v2.1 ): =1: engclk ss enable with external ss chip + #ifndef _H2INC @@ -1992,47 +1724,7 @@ typedef struct _ATOM_FIRMWARE_INFO_V1_4 UCHAR ucMemoryModule_ID; //Indicate what is the board design }ATOM_FIRMWARE_INFO_V1_4; -//the structure below to be used from Cypress -typedef struct _ATOM_FIRMWARE_INFO_V2_1 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - ULONG ulFirmwareRevision; - ULONG ulDefaultEngineClock; //In 10Khz unit - ULONG ulDefaultMemoryClock; //In 10Khz unit - ULONG ulReserved1; - ULONG ulReserved2; - ULONG ulMaxEngineClockPLL_Output; //In 10Khz unit - ULONG ulMaxMemoryClockPLL_Output; //In 10Khz unit - ULONG ulMaxPixelClockPLL_Output; //In 10Khz unit - ULONG ulBinaryAlteredInfo; //Was ulASICMaxEngineClock - ULONG ulDefaultDispEngineClkFreq; //In 10Khz unit - UCHAR ucReserved1; //Was ucASICMaxTemperature; - UCHAR ucMinAllowedBL_Level; - USHORT usBootUpVDDCVoltage; //In MV unit - USHORT usLcdMinPixelClockPLL_Output; // In MHz unit - USHORT usLcdMaxPixelClockPLL_Output; // In MHz unit - ULONG ulReserved4; //Was ulAsicMaximumVoltage - ULONG ulMinPixelClockPLL_Output; //In 10Khz unit - USHORT usMinEngineClockPLL_Input; //In 10Khz unit - USHORT usMaxEngineClockPLL_Input; //In 10Khz unit - USHORT usMinEngineClockPLL_Output; //In 10Khz unit - USHORT usMinMemoryClockPLL_Input; //In 10Khz unit - USHORT usMaxMemoryClockPLL_Input; //In 10Khz unit - USHORT usMinMemoryClockPLL_Output; //In 10Khz unit - USHORT usMaxPixelClock; //In 10Khz unit, Max. Pclk - USHORT usMinPixelClockPLL_Input; //In 10Khz unit - USHORT usMaxPixelClockPLL_Input; //In 10Khz unit - USHORT usMinPixelClockPLL_Output; //In 10Khz unit - lower 16bit of ulMinPixelClockPLL_Output - ATOM_FIRMWARE_CAPABILITY_ACCESS usFirmwareCapability; - USHORT usCoreReferenceClock; //In 10Khz unit - USHORT usMemoryReferenceClock; //In 10Khz unit - USHORT usUniphyDPModeExtClkFreq; //In 10Khz unit, if it is 0, In DP Mode Uniphy Input clock from internal PPLL, otherwise Input clock from external Spread clock - UCHAR ucMemoryModule_ID; //Indicate what is the board design - UCHAR ucReserved4[3]; -}ATOM_FIRMWARE_INFO_V2_1; - - -#define ATOM_FIRMWARE_INFO_LAST ATOM_FIRMWARE_INFO_V2_1 +#define ATOM_FIRMWARE_INFO_LAST ATOM_FIRMWARE_INFO_V1_4 /****************************************************************************/ // Structures used in IntegratedSystemInfoTable @@ -2144,16 +1836,14 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 USHORT usUMASyncStartDelay; USHORT usUMADataReturnTime; USHORT usLinkStatusZeroTime; - USHORT usDACEfuse; //for storing badgap value (for RS880 only) + USHORT usReserved; ULONG ulHighVoltageHTLinkFreq; // in 10Khz ULONG ulLowVoltageHTLinkFreq; // in 10Khz USHORT usMaxUpStreamHTLinkWidth; USHORT usMaxDownStreamHTLinkWidth; USHORT usMinUpStreamHTLinkWidth; USHORT usMinDownStreamHTLinkWidth; - USHORT usFirmwareVersion; //0 means FW is not supported. Otherwise it's the FW version loaded by SBIOS and driver should enable FW. - USHORT usFullT0Time; // Input to calculate minimum HT link change time required by NB P-State. Unit is 0.01us. - ULONG ulReserved3[96]; //must be 0x0 + ULONG ulReserved3[97]; //must be 0x0 }ATOM_INTEGRATED_SYSTEM_INFO_V2; /* @@ -2176,30 +1866,21 @@ Bit[6]=1: High Voltage requested for all power states. In this case, voltage wil =0: Voltage settings is determined by powerplay table. Bit[7]=1: Enable CLMC as hybrid Mode. CDLD and CILR will be disabled in this case and we're using legacy C1E. This is workaround for CPU(Griffin) performance issue. =0: Enable CLMC as regular mode, CDLD and CILR will be enabled. -Bit[8]=1: CDLF is supported and enabled on current system. - =0: CDLF is not supported or enabled on current system. -Bit[9]=1: DLL Shut Down feature is enabled on current system. - =0: DLL Shut Down feature is not enabled or supported on current system. ulBootUpReqDisplayVector: This dword is a bit vector indicates what display devices are requested during boot-up. Refer to ATOM_DEVICE_xxx_SUPPORT for the bit vector definitions. ulOtherDisplayMisc: [15:8]- Bootup LCD Expansion selection; 0-center, 1-full panel size expansion; - [7:0] - BootupTV standard selection; This is a bit vector to indicate what TV standards are supported by the system. Refer to ucTVSupportedStd definition; + [7:0] - BootupTV standard selection; This is a bit vector to indicate what TV standards are supported by the system. Refer to ucTVSuppportedStd definition; ulDDISlot1Config: Describes the PCIE lane configuration on this DDI PCIE slot (ADD2 card) or connector (Mobile design). [3:0] - Bit vector to indicate PCIE lane config of the DDI slot/connector on chassis (bit 0=1 lane 3:0; bit 1=1 lane 7:4; bit 2=1 lane 11:8; bit 3=1 lane 15:12) - [7:4] - Bit vector to indicate PCIE lane config of the same DDI slot/connector on docking station (bit 4=1 lane 3:0; bit 5=1 lane 7:4; bit 6=1 lane 11:8; bit 7=1 lane 15:12) - When a DDI connector is not "paired" (meaming two connections mutualexclusive on chassis or docking, only one of them can be connected at one time. - in both chassis and docking, SBIOS has to duplicate the same PCIE lane info from chassis to docking or vice versa. For example: - one DDI connector is only populated in docking with PCIE lane 8-11, but there is no paired connection on chassis, SBIOS has to copy bit 6 to bit 2. - + [7:4] - Bit vector to indicate PCIE lane config of the same DDI slot/connector on docking station (bit 0=1 lane 3:0; bit 1=1 lane 7:4; bit 2=1 lane 11:8; bit 3=1 lane 15:12) [15:8] - Lane configuration attribute; [23:16]- Connector type, possible value: CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D CONNECTOR_OBJECT_ID_HDMI_TYPE_A CONNECTOR_OBJECT_ID_DISPLAYPORT - CONNECTOR_OBJECT_ID_eDP [31:24]- Reserved ulDDISlot2Config: Same as Slot1. @@ -2215,13 +1896,11 @@ ucDockingPinPolarity:Polarity of the pin when docked; ulCPUCapInfo: [7:0]=1:Griffin;[7:0]=2:Greyhound;[7:0]=3:K8, other bits reserved for now and must be 0x0 usNumberOfCyclesInPeriod:Indicate how many cycles when PWM duty is 100%. - usMaxNBVoltage:Max. voltage control value in either PWM or GPIO mode. usMinNBVoltage:Min. voltage control value in either PWM or GPIO mode. GPIO mode: both usMaxNBVoltage & usMinNBVoltage have a valid value ulSystemConfig.SYSTEM_CONFIG_USE_PWM_ON_VOLTAGE=0 PWM mode: both usMaxNBVoltage & usMinNBVoltage have a valid value ulSystemConfig.SYSTEM_CONFIG_USE_PWM_ON_VOLTAGE=1 GPU SW don't control mode: usMaxNBVoltage & usMinNBVoltage=0 and no care about ulSystemConfig.SYSTEM_CONFIG_USE_PWM_ON_VOLTAGE - usBootUpNBVoltage:Boot-up voltage regulator dependent PWM value. ulHTLinkFreq: Bootup HT link Frequency in 10Khz. @@ -2259,8 +1938,6 @@ usMinDownStreamHTLinkWidth: same as above. #define SYSTEM_CONFIG_CDLW_ENABLED 0x00000020 #define SYSTEM_CONFIG_HIGH_VOLTAGE_REQUESTED 0x00000040 #define SYSTEM_CONFIG_CLMC_HYBRID_MODE_ENABLED 0x00000080 -#define SYSTEM_CONFIG_CDLF_ENABLED 0x00000100 -#define SYSTEM_CONFIG_DLL_SHUTDOWN_ENABLED 0x00000200 #define IGP_DDI_SLOT_LANE_CONFIG_MASK 0x000000FF @@ -2277,41 +1954,6 @@ usMinDownStreamHTLinkWidth: same as above. #define IGP_DDI_SLOT_CONNECTOR_TYPE_MASK 0x00FF0000 -// IntegratedSystemInfoTable new Rev is V5 after V2, because of the real rev of V2 is v1.4. This rev is used for RR -typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - ULONG ulBootUpEngineClock; //in 10kHz unit - ULONG ulDentistVCOFreq; //Dentist VCO clock in 10kHz unit, the source of GPU SCLK, LCLK, UCLK and VCLK. - ULONG ulLClockFreq; //GPU Lclk freq in 10kHz unit, have relationship with NCLK in NorthBridge - ULONG ulBootUpUMAClock; //in 10kHz unit - ULONG ulReserved1[8]; //must be 0x0 for the reserved - ULONG ulBootUpReqDisplayVector; - ULONG ulOtherDisplayMisc; - ULONG ulReserved2[4]; //must be 0x0 for the reserved - ULONG ulSystemConfig; //TBD - ULONG ulCPUCapInfo; //TBD - USHORT usMaxNBVoltage; //high NB voltage, calculated using current VDDNB (D24F2xDC) and VDDNB offset fuse; - USHORT usMinNBVoltage; //low NB voltage, calculated using current VDDNB (D24F2xDC) and VDDNB offset fuse; - USHORT usBootUpNBVoltage; //boot up NB voltage - UCHAR ucHtcTmpLmt; //bit [22:16] of D24F3x64 Hardware Thermal Control (HTC) Register, may not be needed, TBD - UCHAR ucTjOffset; //bit [28:22] of D24F3xE4 Thermtrip Status Register,may not be needed, TBD - ULONG ulReserved3[4]; //must be 0x0 for the reserved - ULONG ulDDISlot1Config; //see above ulDDISlot1Config definition - ULONG ulDDISlot2Config; - ULONG ulDDISlot3Config; - ULONG ulDDISlot4Config; - ULONG ulReserved4[4]; //must be 0x0 for the reserved - UCHAR ucMemoryType; //[3:0]=1:DDR1;=2:DDR2;=3:DDR3.[7:4] is reserved - UCHAR ucUMAChannelNumber; - USHORT usReserved; - ULONG ulReserved5[4]; //must be 0x0 for the reserved - ULONG ulCSR_M3_ARB_CNTL_DEFAULT[10];//arrays with values for CSR M3 arbiter for default - ULONG ulCSR_M3_ARB_CNTL_UVD[10]; //arrays with values for CSR M3 arbiter for UVD playback - ULONG ulCSR_M3_ARB_CNTL_FS3D[10];//arrays with values for CSR M3 arbiter for Full Screen 3D applications - ULONG ulReserved6[61]; //must be 0x0 -}ATOM_INTEGRATED_SYSTEM_INFO_V5; - #define ATOM_CRT_INT_ENCODER1_INDEX 0x00000000 #define ATOM_LCD_INT_ENCODER1_INDEX 0x00000001 #define ATOM_TV_INT_ENCODER1_INDEX 0x00000002 @@ -2327,7 +1969,7 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 #define ATOM_DFP_INT_ENCODER3_INDEX 0x0000000C #define ATOM_DFP_INT_ENCODER4_INDEX 0x0000000D -// define ASIC internal encoder id ( bit vector ), used for CRTC_SourceSelTable +// define ASIC internal encoder id ( bit vector ) #define ASIC_INT_DAC1_ENCODER_ID 0x00 #define ASIC_INT_TV_ENCODER_ID 0x02 #define ASIC_INT_DIG1_ENCODER_ID 0x03 @@ -2336,24 +1978,10 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 #define ASIC_INT_DVO_ENCODER_ID 0x07 #define ASIC_INT_DIG2_ENCODER_ID 0x09 #define ASIC_EXT_DIG_ENCODER_ID 0x05 -#define ASIC_EXT_DIG2_ENCODER_ID 0x08 -#define ASIC_INT_DIG3_ENCODER_ID 0x0a -#define ASIC_INT_DIG4_ENCODER_ID 0x0b -#define ASIC_INT_DIG5_ENCODER_ID 0x0c -#define ASIC_INT_DIG6_ENCODER_ID 0x0d //define Encoder attribute #define ATOM_ANALOG_ENCODER 0 #define ATOM_DIGITAL_ENCODER 1 -#define ATOM_DP_ENCODER 2 - -#define ATOM_ENCODER_ENUM_MASK 0x70 -#define ATOM_ENCODER_ENUM_ID1 0x00 -#define ATOM_ENCODER_ENUM_ID2 0x10 -#define ATOM_ENCODER_ENUM_ID3 0x20 -#define ATOM_ENCODER_ENUM_ID4 0x30 -#define ATOM_ENCODER_ENUM_ID5 0x40 -#define ATOM_ENCODER_ENUM_ID6 0x50 #define ATOM_DEVICE_CRT1_INDEX 0x00000000 #define ATOM_DEVICE_LCD1_INDEX 0x00000001 @@ -2361,13 +1989,12 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 #define ATOM_DEVICE_DFP1_INDEX 0x00000003 #define ATOM_DEVICE_CRT2_INDEX 0x00000004 #define ATOM_DEVICE_LCD2_INDEX 0x00000005 -#define ATOM_DEVICE_DFP6_INDEX 0x00000006 +#define ATOM_DEVICE_TV2_INDEX 0x00000006 #define ATOM_DEVICE_DFP2_INDEX 0x00000007 #define ATOM_DEVICE_CV_INDEX 0x00000008 -#define ATOM_DEVICE_DFP3_INDEX 0x00000009 -#define ATOM_DEVICE_DFP4_INDEX 0x0000000A -#define ATOM_DEVICE_DFP5_INDEX 0x0000000B - +#define ATOM_DEVICE_DFP3_INDEX 0x00000009 +#define ATOM_DEVICE_DFP4_INDEX 0x0000000A +#define ATOM_DEVICE_DFP5_INDEX 0x0000000B #define ATOM_DEVICE_RESERVEDC_INDEX 0x0000000C #define ATOM_DEVICE_RESERVEDD_INDEX 0x0000000D #define ATOM_DEVICE_RESERVEDE_INDEX 0x0000000E @@ -2381,20 +2008,20 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 #define ATOM_DEVICE_CRT1_SUPPORT (0x1L << ATOM_DEVICE_CRT1_INDEX ) #define ATOM_DEVICE_LCD1_SUPPORT (0x1L << ATOM_DEVICE_LCD1_INDEX ) #define ATOM_DEVICE_TV1_SUPPORT (0x1L << ATOM_DEVICE_TV1_INDEX ) -#define ATOM_DEVICE_DFP1_SUPPORT (0x1L << ATOM_DEVICE_DFP1_INDEX ) +#define ATOM_DEVICE_DFP1_SUPPORT (0x1L << ATOM_DEVICE_DFP1_INDEX) #define ATOM_DEVICE_CRT2_SUPPORT (0x1L << ATOM_DEVICE_CRT2_INDEX ) #define ATOM_DEVICE_LCD2_SUPPORT (0x1L << ATOM_DEVICE_LCD2_INDEX ) -#define ATOM_DEVICE_DFP6_SUPPORT (0x1L << ATOM_DEVICE_DFP6_INDEX ) -#define ATOM_DEVICE_DFP2_SUPPORT (0x1L << ATOM_DEVICE_DFP2_INDEX ) +#define ATOM_DEVICE_TV2_SUPPORT (0x1L << ATOM_DEVICE_TV2_INDEX ) +#define ATOM_DEVICE_DFP2_SUPPORT (0x1L << ATOM_DEVICE_DFP2_INDEX) #define ATOM_DEVICE_CV_SUPPORT (0x1L << ATOM_DEVICE_CV_INDEX ) -#define ATOM_DEVICE_DFP3_SUPPORT (0x1L << ATOM_DEVICE_DFP3_INDEX ) -#define ATOM_DEVICE_DFP4_SUPPORT (0x1L << ATOM_DEVICE_DFP4_INDEX ) -#define ATOM_DEVICE_DFP5_SUPPORT (0x1L << ATOM_DEVICE_DFP5_INDEX ) +#define ATOM_DEVICE_DFP3_SUPPORT (0x1L << ATOM_DEVICE_DFP3_INDEX ) +#define ATOM_DEVICE_DFP4_SUPPORT (0x1L << ATOM_DEVICE_DFP4_INDEX ) +#define ATOM_DEVICE_DFP5_SUPPORT (0x1L << ATOM_DEVICE_DFP5_INDEX ) -#define ATOM_DEVICE_CRT_SUPPORT (ATOM_DEVICE_CRT1_SUPPORT | ATOM_DEVICE_CRT2_SUPPORT) -#define ATOM_DEVICE_DFP_SUPPORT (ATOM_DEVICE_DFP1_SUPPORT | ATOM_DEVICE_DFP2_SUPPORT | ATOM_DEVICE_DFP3_SUPPORT | ATOM_DEVICE_DFP4_SUPPORT | ATOM_DEVICE_DFP5_SUPPORT | ATOM_DEVICE_DFP6_SUPPORT) -#define ATOM_DEVICE_TV_SUPPORT (ATOM_DEVICE_TV1_SUPPORT) -#define ATOM_DEVICE_LCD_SUPPORT (ATOM_DEVICE_LCD1_SUPPORT | ATOM_DEVICE_LCD2_SUPPORT) +#define ATOM_DEVICE_CRT_SUPPORT ATOM_DEVICE_CRT1_SUPPORT | ATOM_DEVICE_CRT2_SUPPORT +#define ATOM_DEVICE_DFP_SUPPORT ATOM_DEVICE_DFP1_SUPPORT | ATOM_DEVICE_DFP2_SUPPORT | ATOM_DEVICE_DFP3_SUPPORT | ATOM_DEVICE_DFP4_SUPPORT | ATOM_DEVICE_DFP5_SUPPORT +#define ATOM_DEVICE_TV_SUPPORT ATOM_DEVICE_TV1_SUPPORT | ATOM_DEVICE_TV2_SUPPORT +#define ATOM_DEVICE_LCD_SUPPORT ATOM_DEVICE_LCD1_SUPPORT | ATOM_DEVICE_LCD2_SUPPORT #define ATOM_DEVICE_CONNECTOR_TYPE_MASK 0x000000F0 #define ATOM_DEVICE_CONNECTOR_TYPE_SHIFT 0x00000004 @@ -2444,18 +2071,15 @@ typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V5 // Bit 3 = 0 - no DFP1 support= 1- DFP1 is supported // Bit 4 = 0 - no CRT2 support= 1- CRT2 is supported // Bit 5 = 0 - no LCD2 support= 1- LCD2 is supported -// Bit 6 = 0 - no DFP6 support= 1- DFP6 is supported +// Bit 6 = 0 - no TV2 support= 1- TV2 is supported // Bit 7 = 0 - no DFP2 support= 1- DFP2 is supported // Bit 8 = 0 - no CV support= 1- CV is supported // Bit 9 = 0 - no DFP3 support= 1- DFP3 is supported -// Bit 10 = 0 - no DFP4 support= 1- DFP4 is supported -// Bit 11 = 0 - no DFP5 support= 1- DFP5 is supported +// Byte1 (Supported Device Info) +// Bit 0 = = 0 - no CV support= 1- CV is supported // // -/****************************************************************************/ -/* Structure used in MclkSS_InfoTable */ -/****************************************************************************/ // ucI2C_ConfigID // [7:0] - I2C LINE Associate ID // = 0 - no I2C @@ -2701,6 +2325,10 @@ typedef struct _ATOM_DTD_FORMAT #define SUPPORTED_LCD_REFRESHRATE_50Hz 0x0010 #define SUPPORTED_LCD_REFRESHRATE_60Hz 0x0020 +//Once DAL sees this CAP is set, it will read EDID from LCD on its own instead of using sLCDTiming in ATOM_LVDS_INFO_V12. +//Other entries in ATOM_LVDS_INFO_V12 are still valid/useful to DAL +#define LCDPANEL_CAP_READ_EDID 0x1 + //ucTableFormatRevision=1 //ucTableContentRevision=1 typedef struct _ATOM_LVDS_INFO @@ -2746,39 +2374,6 @@ typedef struct _ATOM_LVDS_INFO_V12 UCHAR ucReserved[2]; }ATOM_LVDS_INFO_V12; -//Definitions for ucLCDPanel_SpecialHandlingCap: - -//Once DAL sees this CAP is set, it will read EDID from LCD on its own instead of using sLCDTiming in ATOM_LVDS_INFO_V12. -//Other entries in ATOM_LVDS_INFO_V12 are still valid/useful to DAL -#define LCDPANEL_CAP_READ_EDID 0x1 - -//If a design supports DRR (dynamic refresh rate) on internal panels (LVDS or EDP), this cap is set in ucLCDPanel_SpecialHandlingCap together -//with multiple supported refresh rates@usSupportedRefreshRate. This cap should not be set when only slow refresh rate is supported (static -//refresh rate switch by SW. This is only valid from ATOM_LVDS_INFO_V12 -#define LCDPANEL_CAP_DRR_SUPPORTED 0x2 - -//Use this cap bit for a quick reference whether an embadded panel (LCD1 ) is LVDS or eDP. -#define LCDPANEL_CAP_eDP 0x4 - - -//Color Bit Depth definition in EDID V1.4 @BYTE 14h -//Bit 6 5 4 - // 0 0 0 - Color bit depth is undefined - // 0 0 1 - 6 Bits per Primary Color - // 0 1 0 - 8 Bits per Primary Color - // 0 1 1 - 10 Bits per Primary Color - // 1 0 0 - 12 Bits per Primary Color - // 1 0 1 - 14 Bits per Primary Color - // 1 1 0 - 16 Bits per Primary Color - // 1 1 1 - Reserved - -#define PANEL_COLOR_BIT_DEPTH_MASK 0x70 - -// Bit7:{=0:Random Dithering disabled;1 Random Dithering enabled} -#define PANEL_RANDOM_DITHER 0x80 -#define PANEL_RANDOM_DITHER_MASK 0x80 - - #define ATOM_LVDS_INFO_LAST ATOM_LVDS_INFO_V12 typedef struct _ATOM_PATCH_RECORD_MODE @@ -2795,7 +2390,6 @@ typedef struct _ATOM_LCD_RTS_RECORD }ATOM_LCD_RTS_RECORD; //!! If the record below exits, it shoud always be the first record for easy use in command table!!! -// The record below is only used when LVDS_Info is present. From ATOM_LVDS_INFO_V12, use ucLCDPanel_SpecialHandlingCap instead. typedef struct _ATOM_LCD_MODE_CONTROL_CAP { UCHAR ucRecordType; @@ -2834,19 +2428,17 @@ typedef struct _ATOM_PANEL_RESOLUTION_PATCH_RECORD typedef struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT { USHORT usSpreadSpectrumPercentage; - UCHAR ucSpreadSpectrumType; //Bit1=0 Down Spread,=1 Center Spread. Bit1=1 Ext. =0 Int. Bit2=1: PCIE REFCLK SS =0 iternal PPLL SS Others:TBD + UCHAR ucSpreadSpectrumType; //Bit1=0 Down Spread,=1 Center Spread. Bit1=1 Ext. =0 Int. Others:TBD UCHAR ucSS_Step; UCHAR ucSS_Delay; UCHAR ucSS_Id; - UCHAR ucRecommendedRef_Div; + UCHAR ucRecommandedRef_Div; UCHAR ucSS_Range; //it was reserved for V11 }ATOM_SPREAD_SPECTRUM_ASSIGNMENT; #define ATOM_MAX_SS_ENTRY 16 -#define ATOM_DP_SS_ID1 0x0f1 // SS ID for internal DP stream at 2.7Ghz. if ATOM_DP_SS_ID2 does not exist in SS_InfoTable, it is used for internal DP stream at 1.62Ghz as well. -#define ATOM_DP_SS_ID2 0x0f2 // SS ID for internal DP stream at 1.62Ghz, if it exists in SS_InfoTable. -#define ATOM_LVLINK_2700MHz_SS_ID 0x0f3 // SS ID for LV link translator chip at 2.7Ghz -#define ATOM_LVLINK_1620MHz_SS_ID 0x0f4 // SS ID for LV link translator chip at 1.62Ghz +#define ATOM_DP_SS_ID1 0x0f1 // SS modulation freq=30k +#define ATOM_DP_SS_ID2 0x0f2 // SS modulation freq=33k #define ATOM_SS_DOWN_SPREAD_MODE_MASK 0x00000000 @@ -2879,7 +2471,7 @@ typedef struct _ATOM_SPREAD_SPECTRUM_INFO //ATOM_TV_PAL60 7 //ATOM_TV_SECAM 8 -//ucTVSupportedStd definition: +//ucTVSuppportedStd definition: #define NTSC_SUPPORT 0x1 #define NTSCJ_SUPPORT 0x2 @@ -2912,19 +2504,9 @@ typedef struct _ATOM_ANALOG_TV_INFO_V1_2 UCHAR ucTV_BootUpDefaultStandard; UCHAR ucExt_TV_ASIC_ID; UCHAR ucExt_TV_ASIC_SlaveAddr; - ATOM_DTD_FORMAT aModeTimings[MAX_SUPPORTED_TV_TIMING_V1_2]; + ATOM_DTD_FORMAT aModeTimings[MAX_SUPPORTED_TV_TIMING]; }ATOM_ANALOG_TV_INFO_V1_2; -typedef struct _ATOM_DPCD_INFO -{ - UCHAR ucRevisionNumber; //10h : Revision 1.0; 11h : Revision 1.1 - UCHAR ucMaxLinkRate; //06h : 1.62Gbps per lane; 0Ah = 2.7Gbps per lane - UCHAR ucMaxLane; //Bits 4:0 = MAX_LANE_COUNT (1/2/4). Bit 7 = ENHANCED_FRAME_CAP - UCHAR ucMaxDownSpread; //Bit0 = 0: No Down spread; Bit0 = 1: 0.5% (Subject to change according to DP spec) -}ATOM_DPCD_INFO; - -#define ATOM_DPCD_MAX_LANE_MASK 0x1F - /**************************************************************************/ // VRAM usage and their defintions @@ -2973,11 +2555,11 @@ typedef struct _ATOM_DPCD_INFO #define ATOM_LCD2_DTD_MODE_TBL_ADDR (ATOM_LCD2_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) #define ATOM_LCD2_STD_MODE_TBL_ADDR (ATOM_LCD2_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) -#define ATOM_DFP6_EDID_ADDR (ATOM_LCD2_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) -#define ATOM_DFP6_DTD_MODE_TBL_ADDR (ATOM_DFP6_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) -#define ATOM_DFP6_STD_MODE_TBL_ADDR (ATOM_DFP6_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_TV2_EDID_ADDR (ATOM_LCD2_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_TV2_DTD_MODE_TBL_ADDR (ATOM_TV2_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_TV2_STD_MODE_TBL_ADDR (ATOM_TV2_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) -#define ATOM_DFP2_EDID_ADDR (ATOM_DFP6_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_DFP2_EDID_ADDR (ATOM_TV2_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) #define ATOM_DFP2_DTD_MODE_TBL_ADDR (ATOM_DFP2_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) #define ATOM_DFP2_STD_MODE_TBL_ADDR (ATOM_DFP2_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) @@ -3019,21 +2601,6 @@ typedef struct _ATOM_DPCD_INFO // exactly same as 1.1 and 1.2 (1.3 is never in use), but ulStartAddrUsedByFirmware // (in offset to start of memory address) is KB aligned instead of byte aligend. /***********************************************************************************/ -// Note3: -/* If we change usReserved to "usFBUsedbyDrvInKB", then to VBIOS this usFBUsedbyDrvInKB is a predefined, unchanged constant across VGA or non VGA adapter, -for CAIL, The size of FB access area is known, only thing missing is the Offset of FB Access area, so we can have: - -If (ulStartAddrUsedByFirmware!=0) -FBAccessAreaOffset= ulStartAddrUsedByFirmware - usFBUsedbyDrvInKB; -Reserved area has been claimed by VBIOS including this FB access area; CAIL doesn't need to reserve any extra area for this purpose -else //Non VGA case - if (FB_Size<=2Gb) - FBAccessAreaOffset= FB_Size - usFBUsedbyDrvInKB; - else - FBAccessAreaOffset= Aper_Size - usFBUsedbyDrvInKB - -CAIL needs to claim an reserved area defined by FBAccessAreaOffset and usFBUsedbyDrvInKB in non VGA case.*/ - #define ATOM_MAX_FIRMWARE_VRAM_USAGE_INFO 1 typedef struct _ATOM_FIRMWARE_VRAM_RESERVE_INFO @@ -3049,20 +2616,6 @@ typedef struct _ATOM_VRAM_USAGE_BY_FIRMWARE ATOM_FIRMWARE_VRAM_RESERVE_INFO asFirmwareVramReserveInfo[ATOM_MAX_FIRMWARE_VRAM_USAGE_INFO]; }ATOM_VRAM_USAGE_BY_FIRMWARE; -// change verion to 1.5, when allow driver to allocate the vram area for command table access. -typedef struct _ATOM_FIRMWARE_VRAM_RESERVE_INFO_V1_5 -{ - ULONG ulStartAddrUsedByFirmware; - USHORT usFirmwareUseInKb; - USHORT usFBUsedByDrvInKb; -}ATOM_FIRMWARE_VRAM_RESERVE_INFO_V1_5; - -typedef struct _ATOM_VRAM_USAGE_BY_FIRMWARE_V1_5 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - ATOM_FIRMWARE_VRAM_RESERVE_INFO_V1_5 asFirmwareVramReserveInfo[ATOM_MAX_FIRMWARE_VRAM_USAGE_INFO]; -}ATOM_VRAM_USAGE_BY_FIRMWARE_V1_5; - /****************************************************************************/ // Structure used in GPIO_Pin_LUTTable /****************************************************************************/ @@ -3185,17 +2738,6 @@ typedef struct _ATOM_OBJECT_HEADER USHORT usDisplayPathTableOffset; }ATOM_OBJECT_HEADER; -typedef struct _ATOM_OBJECT_HEADER_V3 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - USHORT usDeviceSupport; - USHORT usConnectorObjectTableOffset; - USHORT usRouterObjectTableOffset; - USHORT usEncoderObjectTableOffset; - USHORT usProtectionObjectTableOffset; //only available when Protection block is independent. - USHORT usDisplayPathTableOffset; - USHORT usMiscObjectTableOffset; -}ATOM_OBJECT_HEADER_V3; typedef struct _ATOM_DISPLAY_OBJECT_PATH { @@ -3239,51 +2781,6 @@ typedef struct _ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT //usSrcDstTableOffset }ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT; -//Two definitions below are for OPM on MXM module designs - -#define EXT_HPDPIN_LUTINDEX_0 0 -#define EXT_HPDPIN_LUTINDEX_1 1 -#define EXT_HPDPIN_LUTINDEX_2 2 -#define EXT_HPDPIN_LUTINDEX_3 3 -#define EXT_HPDPIN_LUTINDEX_4 4 -#define EXT_HPDPIN_LUTINDEX_5 5 -#define EXT_HPDPIN_LUTINDEX_6 6 -#define EXT_HPDPIN_LUTINDEX_7 7 -#define MAX_NUMBER_OF_EXT_HPDPIN_LUT_ENTRIES (EXT_HPDPIN_LUTINDEX_7+1) - -#define EXT_AUXDDC_LUTINDEX_0 0 -#define EXT_AUXDDC_LUTINDEX_1 1 -#define EXT_AUXDDC_LUTINDEX_2 2 -#define EXT_AUXDDC_LUTINDEX_3 3 -#define EXT_AUXDDC_LUTINDEX_4 4 -#define EXT_AUXDDC_LUTINDEX_5 5 -#define EXT_AUXDDC_LUTINDEX_6 6 -#define EXT_AUXDDC_LUTINDEX_7 7 -#define MAX_NUMBER_OF_EXT_AUXDDC_LUT_ENTRIES (EXT_AUXDDC_LUTINDEX_7+1) - -typedef struct _EXT_DISPLAY_PATH -{ - USHORT usDeviceTag; //A bit vector to show what devices are supported - USHORT usDeviceACPIEnum; //16bit device ACPI id. - USHORT usDeviceConnector; //A physical connector for displays to plug in, using object connector definitions - UCHAR ucExtAUXDDCLutIndex; //An index into external AUX/DDC channel LUT - UCHAR ucExtHPDPINLutIndex; //An index into external HPD pin LUT - USHORT usExtEncoderObjId; //external encoder object id - USHORT usReserved[3]; -}EXT_DISPLAY_PATH; - -#define NUMBER_OF_UCHAR_FOR_GUID 16 -#define MAX_NUMBER_OF_EXT_DISPLAY_PATH 7 - -typedef struct _ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO -{ - ATOM_COMMON_TABLE_HEADER sHeader; - UCHAR ucGuid [NUMBER_OF_UCHAR_FOR_GUID]; // a GUID is a 16 byte long string - EXT_DISPLAY_PATH sPath[MAX_NUMBER_OF_EXT_DISPLAY_PATH]; // total of fixed 7 entries. - UCHAR ucChecksum; // a simple Checksum of the sum of whole structure equal to 0x0. - UCHAR Reserved [7]; // for potential expansion -}ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO; - //Related definitions, all records are differnt but they have a commond header typedef struct _ATOM_COMMON_RECORD_HEADER { @@ -3305,16 +2802,11 @@ typedef struct _ATOM_COMMON_RECORD_HEADER #define ATOM_CONNECTOR_CF_RECORD_TYPE 11 #define ATOM_CONNECTOR_HARDCODE_DTD_RECORD_TYPE 12 #define ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE 13 -#define ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE 14 -#define ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE 15 -#define ATOM_CONNECTOR_HPDPIN_LUT_RECORD_TYPE 16 //This is for the case when connectors are not known to object table -#define ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE 17 //This is for the case when connectors are not known to object table -#define ATOM_OBJECT_LINK_RECORD_TYPE 18 //Once this record is present under one object, it indicats the oobject is linked to another obj described by the record -#define ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE 19 - +#define ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE 14 +#define ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE 15 //Must be updated when new record type is added,equal to that record definition! -#define ATOM_MAX_OBJECT_RECORD_NUMBER ATOM_CONNECTOR_REMOTE_CAP_RECORD_TYPE +#define ATOM_MAX_OBJECT_RECORD_NUMBER ATOM_CONNECTOR_CF_RECORD_TYPE typedef struct _ATOM_I2C_RECORD { @@ -3327,7 +2819,7 @@ typedef struct _ATOM_HPD_INT_RECORD { ATOM_COMMON_RECORD_HEADER sheader; UCHAR ucHPDIntGPIOID; //Corresponding block in GPIO_PIN_INFO table gives the pin info - UCHAR ucPlugged_PinState; + UCHAR ucPluggged_PinState; }ATOM_HPD_INT_RECORD; @@ -3424,16 +2916,6 @@ typedef struct _ATOM_OBJECT_GPIO_CNTL_RECORD #define GPIO_PIN_STATE_ACTIVE_LOW 0x0 #define GPIO_PIN_STATE_ACTIVE_HIGH 0x1 -// Indexes to GPIO array in GLSync record -#define ATOM_GPIO_INDEX_GLSYNC_REFCLK 0 -#define ATOM_GPIO_INDEX_GLSYNC_HSYNC 1 -#define ATOM_GPIO_INDEX_GLSYNC_VSYNC 2 -#define ATOM_GPIO_INDEX_GLSYNC_SWAP_REQ 3 -#define ATOM_GPIO_INDEX_GLSYNC_SWAP_GNT 4 -#define ATOM_GPIO_INDEX_GLSYNC_INTERRUPT 5 -#define ATOM_GPIO_INDEX_GLSYNC_V_RESET 6 -#define ATOM_GPIO_INDEX_GLSYNC_MAX 7 - typedef struct _ATOM_ENCODER_DVO_CF_RECORD { ATOM_COMMON_RECORD_HEADER sheader; @@ -3489,30 +2971,6 @@ typedef struct _ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD #define ATOM_ROUTER_MUX_PIN_STATE_MASK 0x0f #define ATOM_ROUTER_MUX_PIN_SINGLE_STATE_COMPLEMENT 0x01 -typedef struct _ATOM_CONNECTOR_HPDPIN_LUT_RECORD //record for ATOM_CONNECTOR_HPDPIN_LUT_RECORD_TYPE -{ - ATOM_COMMON_RECORD_HEADER sheader; - UCHAR ucHPDPINMap[MAX_NUMBER_OF_EXT_HPDPIN_LUT_ENTRIES]; //An fixed size array which maps external pins to internal GPIO_PIN_INFO table -}ATOM_CONNECTOR_HPDPIN_LUT_RECORD; - -typedef struct _ATOM_CONNECTOR_AUXDDC_LUT_RECORD //record for ATOM_CONNECTOR_AUXDDC_LUT_RECORD_TYPE -{ - ATOM_COMMON_RECORD_HEADER sheader; - ATOM_I2C_ID_CONFIG ucAUXDDCMap[MAX_NUMBER_OF_EXT_AUXDDC_LUT_ENTRIES]; //An fixed size array which maps external pins to internal DDC ID -}ATOM_CONNECTOR_AUXDDC_LUT_RECORD; - -typedef struct _ATOM_OBJECT_LINK_RECORD -{ - ATOM_COMMON_RECORD_HEADER sheader; - USHORT usObjectID; //could be connector, encorder or other object in object.h -}ATOM_OBJECT_LINK_RECORD; - -typedef struct _ATOM_CONNECTOR_REMOTE_CAP_RECORD -{ - ATOM_COMMON_RECORD_HEADER sheader; - USHORT usReserved; -}ATOM_CONNECTOR_REMOTE_CAP_RECORD; - /****************************************************************************/ // ASIC voltage data table /****************************************************************************/ @@ -3548,19 +3006,6 @@ typedef struct _ATOM_VOLTAGE_FORMULA UCHAR ucVIDAdjustEntries[32]; // 32 is for allocation, the actual number of entry is present at ucNumOfVoltageEntries }ATOM_VOLTAGE_FORMULA; -typedef struct _VOLTAGE_LUT_ENTRY -{ - USHORT usVoltageCode; // The Voltage ID, either GPIO or I2C code - USHORT usVoltageValue; // The corresponding Voltage Value, in mV -}VOLTAGE_LUT_ENTRY; - -typedef struct _ATOM_VOLTAGE_FORMULA_V2 -{ - UCHAR ucNumOfVoltageEntries; // Number of Voltage Entry, which indicate max Voltage - UCHAR ucReserved[3]; - VOLTAGE_LUT_ENTRY asVIDAdjustEntries[32];// 32 is for allocation, the actual number of entries is in ucNumOfVoltageEntries -}ATOM_VOLTAGE_FORMULA_V2; - typedef struct _ATOM_VOLTAGE_CONTROL { UCHAR ucVoltageControlId; //Indicate it is controlled by I2C or GPIO or HW state machine @@ -3589,26 +3034,12 @@ typedef struct _ATOM_VOLTAGE_OBJECT ATOM_VOLTAGE_FORMULA asFormula; //Indicate How to convert real Voltage to VID }ATOM_VOLTAGE_OBJECT; -typedef struct _ATOM_VOLTAGE_OBJECT_V2 -{ - UCHAR ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI - UCHAR ucSize; //Size of Object - ATOM_VOLTAGE_CONTROL asControl; //describ how to control - ATOM_VOLTAGE_FORMULA_V2 asFormula; //Indicate How to convert real Voltage to VID -}ATOM_VOLTAGE_OBJECT_V2; - typedef struct _ATOM_VOLTAGE_OBJECT_INFO { ATOM_COMMON_TABLE_HEADER sHeader; ATOM_VOLTAGE_OBJECT asVoltageObj[3]; //Info for Voltage control }ATOM_VOLTAGE_OBJECT_INFO; -typedef struct _ATOM_VOLTAGE_OBJECT_INFO_V2 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - ATOM_VOLTAGE_OBJECT_V2 asVoltageObj[3]; //Info for Voltage control -}ATOM_VOLTAGE_OBJECT_INFO_V2; - typedef struct _ATOM_LEAKID_VOLTAGE { UCHAR ucLeakageId; @@ -3670,68 +3101,6 @@ typedef struct _ATOM_POWER_SOURCE_INFO #define POWER_SENSOR_GPIO 0x01 #define POWER_SENSOR_I2C 0x02 -typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V6 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - ULONG ulBootUpEngineClock; - ULONG ulDentistVCOFreq; - ULONG ulBootUpUMAClock; - ULONG ulReserved1[8]; - ULONG ulBootUpReqDisplayVector; - ULONG ulOtherDisplayMisc; - ULONG ulGPUCapInfo; - ULONG ulReserved2[3]; - ULONG ulSystemConfig; - ULONG ulCPUCapInfo; - USHORT usMaxNBVoltage; - USHORT usMinNBVoltage; - USHORT usBootUpNBVoltage; - USHORT usExtDispConnInfoOffset; - UCHAR ucHtcTmpLmt; - UCHAR ucTjOffset; - UCHAR ucMemoryType; - UCHAR ucUMAChannelNumber; - ULONG ulCSR_M3_ARB_CNTL_DEFAULT[10]; - ULONG ulCSR_M3_ARB_CNTL_UVD[10]; - ULONG ulCSR_M3_ARB_CNTL_FS3D[10]; - ULONG ulReserved3[42]; - ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO sExtDispConnInfo; -}ATOM_INTEGRATED_SYSTEM_INFO_V6; - -/********************************************************************************************************************** -// ATOM_INTEGRATED_SYSTEM_INFO_V6 Description -//ulBootUpEngineClock: VBIOS bootup Engine clock frequency, in 10kHz unit. -//ulDentistVCOFreq: Dentist VCO clock in 10kHz unit. -//ulBootUpUMAClock: System memory boot up clock frequency in 10Khz unit. -//ulReserved1[8] Reserved by now, must be 0x0. -//ulBootUpReqDisplayVector VBIOS boot up display IDs -// ATOM_DEVICE_CRT1_SUPPORT 0x0001 -// ATOM_DEVICE_CRT2_SUPPORT 0x0010 -// ATOM_DEVICE_DFP1_SUPPORT 0x0008 -// ATOM_DEVICE_DFP6_SUPPORT 0x0040 -// ATOM_DEVICE_DFP2_SUPPORT 0x0080 -// ATOM_DEVICE_DFP3_SUPPORT 0x0200 -// ATOM_DEVICE_DFP4_SUPPORT 0x0400 -// ATOM_DEVICE_DFP5_SUPPORT 0x0800 -// ATOM_DEVICE_LCD1_SUPPORT 0x0002 -//ulOtherDisplayMisc Other display related flags, not defined yet. -//ulGPUCapInfo TBD -//ulReserved2[3] must be 0x0 for the reserved. -//ulSystemConfig TBD -//ulCPUCapInfo TBD -//usMaxNBVoltage High NB voltage in unit of mv, calculated using current VDDNB (D24F2xDC) and VDDNB offset fuse. -//usMinNBVoltage Low NB voltage in unit of mv, calculated using current VDDNB (D24F2xDC) and VDDNB offset fuse. -//usBootUpNBVoltage Boot up NB voltage in unit of mv. -//ucHtcTmpLmt Bit [22:16] of D24F3x64 Thermal Control (HTC) Register. -//ucTjOffset Bit [28:22] of D24F3xE4 Thermtrip Status Register,may not be needed. -//ucMemoryType [3:0]=1:DDR1;=2:DDR2;=3:DDR3.[7:4] is reserved. -//ucUMAChannelNumber System memory channel numbers. -//usExtDispConnectionInfoOffset ATOM_EXTERNAL_DISPLAY_CONNECTION_INFO offset relative to beginning of this table. -//ulCSR_M3_ARB_CNTL_DEFAULT[10] Arrays with values for CSR M3 arbiter for default -//ulCSR_M3_ARB_CNTL_UVD[10] Arrays with values for CSR M3 arbiter for UVD playback. -//ulCSR_M3_ARB_CNTL_FS3D[10] Arrays with values for CSR M3 arbiter for Full Screen 3D applications. -**********************************************************************************************************************/ - /**************************************************************************/ // This portion is only used when ext thermal chip or engine/memory clock SS chip is populated on a design //Memory SS Info Table @@ -3780,66 +3149,16 @@ typedef struct _ATOM_ASIC_SS_ASSIGNMENT UCHAR ucReserved[2]; }ATOM_ASIC_SS_ASSIGNMENT; -//Define ucClockIndication, SW uses the IDs below to search if the SS is required/enabled on a clock branch/signal type. -//SS is not required or enabled if a match is not found. +//Define ucSpreadSpectrumType #define ASIC_INTERNAL_MEMORY_SS 1 #define ASIC_INTERNAL_ENGINE_SS 2 -#define ASIC_INTERNAL_UVD_SS 3 -#define ASIC_INTERNAL_SS_ON_TMDS 4 -#define ASIC_INTERNAL_SS_ON_HDMI 5 -#define ASIC_INTERNAL_SS_ON_LVDS 6 -#define ASIC_INTERNAL_SS_ON_DP 7 -#define ASIC_INTERNAL_SS_ON_DCPLL 8 +#define ASIC_INTERNAL_UVD_SS 3 -typedef struct _ATOM_ASIC_SS_ASSIGNMENT_V2 -{ - ULONG ulTargetClockRange; //For mem/engine/uvd, Clock Out frequence (VCO ), in unit of 10Khz - //For TMDS/HDMI/LVDS, it is pixel clock , for DP, it is link clock ( 27000 or 16200 ) - USHORT usSpreadSpectrumPercentage; //in unit of 0.01% - USHORT usSpreadRateIn10Hz; //in unit of 10Hz, modulation freq - UCHAR ucClockIndication; //Indicate which clock source needs SS - UCHAR ucSpreadSpectrumMode; //Bit0=0 Down Spread,=1 Center Spread, bit1=0: internal SS bit1=1: external SS - UCHAR ucReserved[2]; -}ATOM_ASIC_SS_ASSIGNMENT_V2; - -//ucSpreadSpectrumMode -//#define ATOM_SS_DOWN_SPREAD_MODE_MASK 0x00000000 -//#define ATOM_SS_DOWN_SPREAD_MODE 0x00000000 -//#define ATOM_SS_CENTRE_SPREAD_MODE_MASK 0x00000001 -//#define ATOM_SS_CENTRE_SPREAD_MODE 0x00000001 -//#define ATOM_INTERNAL_SS_MASK 0x00000000 -//#define ATOM_EXTERNAL_SS_MASK 0x00000002 - -typedef struct _ATOM_ASIC_INTERNAL_SS_INFO -{ +typedef struct _ATOM_ASIC_INTERNAL_SS_INFO{ ATOM_COMMON_TABLE_HEADER sHeader; ATOM_ASIC_SS_ASSIGNMENT asSpreadSpectrum[4]; }ATOM_ASIC_INTERNAL_SS_INFO; -typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V2 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - ATOM_ASIC_SS_ASSIGNMENT_V2 asSpreadSpectrum[1]; //this is point only. -}ATOM_ASIC_INTERNAL_SS_INFO_V2; - -typedef struct _ATOM_ASIC_SS_ASSIGNMENT_V3 -{ - ULONG ulTargetClockRange; //For mem/engine/uvd, Clock Out frequence (VCO ), in unit of 10Khz - //For TMDS/HDMI/LVDS, it is pixel clock , for DP, it is link clock ( 27000 or 16200 ) - USHORT usSpreadSpectrumPercentage; //in unit of 0.01% - USHORT usSpreadRateIn10Hz; //in unit of 10Hz, modulation freq - UCHAR ucClockIndication; //Indicate which clock source needs SS - UCHAR ucSpreadSpectrumMode; //Bit0=0 Down Spread,=1 Center Spread, bit1=0: internal SS bit1=1: external SS - UCHAR ucReserved[2]; -}ATOM_ASIC_SS_ASSIGNMENT_V3; - -typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - ATOM_ASIC_SS_ASSIGNMENT_V3 asSpreadSpectrum[1]; //this is pointer only. -}ATOM_ASIC_INTERNAL_SS_INFO_V3; - - //==============================Scratch Pad Definition Portion=============================== #define ATOM_DEVICE_CONNECT_INFO_DEF 0 #define ATOM_ROM_LOCATION_DEF 1 @@ -3884,15 +3203,15 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S0_DFP2 0x00020000L #define ATOM_S0_LCD1 0x00040000L #define ATOM_S0_LCD2 0x00080000L -#define ATOM_S0_DFP6 0x00100000L -#define ATOM_S0_DFP3 0x00200000L -#define ATOM_S0_DFP4 0x00400000L -#define ATOM_S0_DFP5 0x00800000L +#define ATOM_S0_TV2 0x00100000L +#define ATOM_S0_DFP3 0x00200000L +#define ATOM_S0_DFP4 0x00400000L +#define ATOM_S0_DFP5 0x00800000L -#define ATOM_S0_DFP_MASK ATOM_S0_DFP1 | ATOM_S0_DFP2 | ATOM_S0_DFP3 | ATOM_S0_DFP4 | ATOM_S0_DFP5 | ATOM_S0_DFP6 +#define ATOM_S0_DFP_MASK ATOM_S0_DFP1 | ATOM_S0_DFP2 | ATOM_S0_DFP3 | ATOM_S0_DFP4 | ATOM_S0_DFP5 #define ATOM_S0_FAD_REGISTER_BUG 0x02000000L // If set, indicates we are running a PCIE asic with - // the FAD/HDP reg access bug. Bit is read by DAL, this is obsolete from RV5xx + // the FAD/HDP reg access bug. Bit is read by DAL #define ATOM_S0_THERMAL_STATE_MASK 0x1C000000L #define ATOM_S0_THERMAL_STATE_SHIFT 26 @@ -3934,11 +3253,8 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S0_DFP2b2 0x02 #define ATOM_S0_LCD1b2 0x04 #define ATOM_S0_LCD2b2 0x08 -#define ATOM_S0_DFP6b2 0x10 -#define ATOM_S0_DFP3b2 0x20 -#define ATOM_S0_DFP4b2 0x40 -#define ATOM_S0_DFP5b2 0x80 - +#define ATOM_S0_TV2b2 0x10 +#define ATOM_S0_DFP3b2 0x20 #define ATOM_S0_THERMAL_STATE_MASKb3 0x1C #define ATOM_S0_THERMAL_STATE_SHIFTb3 2 @@ -3955,11 +3271,29 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S2_CURRENT_BL_LEVEL_MASK 0x0000FF00L #define ATOM_S2_CURRENT_BL_LEVEL_SHIFT 8 +#define ATOM_S2_CRT1_DPMS_STATE 0x00010000L +#define ATOM_S2_LCD1_DPMS_STATE 0x00020000L +#define ATOM_S2_TV1_DPMS_STATE 0x00040000L +#define ATOM_S2_DFP1_DPMS_STATE 0x00080000L +#define ATOM_S2_CRT2_DPMS_STATE 0x00100000L +#define ATOM_S2_LCD2_DPMS_STATE 0x00200000L +#define ATOM_S2_TV2_DPMS_STATE 0x00400000L +#define ATOM_S2_DFP2_DPMS_STATE 0x00800000L +#define ATOM_S2_CV_DPMS_STATE 0x01000000L +#define ATOM_S2_DFP3_DPMS_STATE 0x02000000L +#define ATOM_S2_DFP4_DPMS_STATE 0x04000000L +#define ATOM_S2_DFP5_DPMS_STATE 0x08000000L + +#define ATOM_S2_DFP_DPM_STATE ATOM_S2_DFP1_DPMS_STATE | ATOM_S2_DFP2_DPMS_STATE | ATOM_S2_DFP3_DPMS_STATE | ATOM_S2_DFP4_DPMS_STATE | ATOM_S2_DFP5_DPMS_STATE + +#define ATOM_S2_DEVICE_DPMS_STATE (ATOM_S2_CRT1_DPMS_STATE+ATOM_S2_LCD1_DPMS_STATE+ATOM_S2_TV1_DPMS_STATE+\ + ATOM_S2_DFP_DPMS_STATE+ATOM_S2_CRT2_DPMS_STATE+ATOM_S2_LCD2_DPMS_STATE+\ + ATOM_S2_TV2_DPMS_STATE+ATOM_S2_CV_DPMS_STATE + #define ATOM_S2_FORCEDLOWPWRMODE_STATE_MASK 0x0C000000L #define ATOM_S2_FORCEDLOWPWRMODE_STATE_MASK_SHIFT 26 #define ATOM_S2_FORCEDLOWPWRMODE_STATE_CHANGE 0x10000000L -#define ATOM_S2_DEVICE_DPMS_STATE 0x00010000L #define ATOM_S2_VRI_BRIGHT_ENABLE 0x20000000L #define ATOM_S2_DISPLAY_ROTATION_0_DEGREE 0x0 @@ -3973,7 +3307,18 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 //Byte aligned defintion for BIOS usage #define ATOM_S2_TV1_STANDARD_MASKb0 0x0F #define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF -#define ATOM_S2_DEVICE_DPMS_STATEb2 0x01 +#define ATOM_S2_CRT1_DPMS_STATEb2 0x01 +#define ATOM_S2_LCD1_DPMS_STATEb2 0x02 +#define ATOM_S2_TV1_DPMS_STATEb2 0x04 +#define ATOM_S2_DFP1_DPMS_STATEb2 0x08 +#define ATOM_S2_CRT2_DPMS_STATEb2 0x10 +#define ATOM_S2_LCD2_DPMS_STATEb2 0x20 +#define ATOM_S2_TV2_DPMS_STATEb2 0x40 +#define ATOM_S2_DFP2_DPMS_STATEb2 0x80 +#define ATOM_S2_CV_DPMS_STATEb3 0x01 +#define ATOM_S2_DFP3_DPMS_STATEb3 0x02 +#define ATOM_S2_DFP4_DPMS_STATEb3 0x04 +#define ATOM_S2_DFP5_DPMS_STATEb3 0x08 #define ATOM_S2_DEVICE_DPMS_MASKw1 0x3FF #define ATOM_S2_FORCEDLOWPWRMODE_STATE_MASKb3 0x0C @@ -3989,14 +3334,14 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S3_DFP1_ACTIVE 0x00000008L #define ATOM_S3_CRT2_ACTIVE 0x00000010L #define ATOM_S3_LCD2_ACTIVE 0x00000020L -#define ATOM_S3_DFP6_ACTIVE 0x00000040L +#define ATOM_S3_TV2_ACTIVE 0x00000040L #define ATOM_S3_DFP2_ACTIVE 0x00000080L #define ATOM_S3_CV_ACTIVE 0x00000100L #define ATOM_S3_DFP3_ACTIVE 0x00000200L #define ATOM_S3_DFP4_ACTIVE 0x00000400L #define ATOM_S3_DFP5_ACTIVE 0x00000800L -#define ATOM_S3_DEVICE_ACTIVE_MASK 0x00000FFFL +#define ATOM_S3_DEVICE_ACTIVE_MASK 0x000003FFL #define ATOM_S3_LCD_FULLEXPANSION_ACTIVE 0x00001000L #define ATOM_S3_LCD_EXPANSION_ASPEC_RATIO_ACTIVE 0x00002000L @@ -4007,7 +3352,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S3_DFP1_CRTC_ACTIVE 0x00080000L #define ATOM_S3_CRT2_CRTC_ACTIVE 0x00100000L #define ATOM_S3_LCD2_CRTC_ACTIVE 0x00200000L -#define ATOM_S3_DFP6_CRTC_ACTIVE 0x00400000L +#define ATOM_S3_TV2_CRTC_ACTIVE 0x00400000L #define ATOM_S3_DFP2_CRTC_ACTIVE 0x00800000L #define ATOM_S3_CV_CRTC_ACTIVE 0x01000000L #define ATOM_S3_DFP3_CRTC_ACTIVE 0x02000000L @@ -4016,7 +3361,6 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S3_DEVICE_CRTC_ACTIVE_MASK 0x0FFF0000L #define ATOM_S3_ASIC_GUI_ENGINE_HUNG 0x20000000L -//Below two definitions are not supported in pplib, but in the old powerplay in DAL #define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L #define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L @@ -4027,7 +3371,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S3_DFP1_ACTIVEb0 0x08 #define ATOM_S3_CRT2_ACTIVEb0 0x10 #define ATOM_S3_LCD2_ACTIVEb0 0x20 -#define ATOM_S3_DFP6_ACTIVEb0 0x40 +#define ATOM_S3_TV2_ACTIVEb0 0x40 #define ATOM_S3_DFP2_ACTIVEb0 0x80 #define ATOM_S3_CV_ACTIVEb1 0x01 #define ATOM_S3_DFP3_ACTIVEb1 0x02 @@ -4042,7 +3386,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S3_DFP1_CRTC_ACTIVEb2 0x08 #define ATOM_S3_CRT2_CRTC_ACTIVEb2 0x10 #define ATOM_S3_LCD2_CRTC_ACTIVEb2 0x20 -#define ATOM_S3_DFP6_CRTC_ACTIVEb2 0x40 +#define ATOM_S3_TV2_CRTC_ACTIVEb2 0x40 #define ATOM_S3_DFP2_CRTC_ACTIVEb2 0x80 #define ATOM_S3_CV_CRTC_ACTIVEb3 0x01 #define ATOM_S3_DFP3_CRTC_ACTIVEb3 0x02 @@ -4051,6 +3395,10 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S3_ACTIVE_CRTC2w1 0xFFF +#define ATOM_S3_ASIC_GUI_ENGINE_HUNGb3 0x20 +#define ATOM_S3_ALLOW_FAST_PWR_SWITCHb3 0x40 +#define ATOM_S3_RQST_GPU_USE_MIN_PWRb3 0x80 + // BIOS_4_SCRATCH Definition #define ATOM_S4_LCD1_PANEL_ID_MASK 0x000000FFL #define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L @@ -4068,14 +3416,14 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S5_DOS_REQ_DFP1b0 0x08 #define ATOM_S5_DOS_REQ_CRT2b0 0x10 #define ATOM_S5_DOS_REQ_LCD2b0 0x20 -#define ATOM_S5_DOS_REQ_DFP6b0 0x40 +#define ATOM_S5_DOS_REQ_TV2b0 0x40 #define ATOM_S5_DOS_REQ_DFP2b0 0x80 #define ATOM_S5_DOS_REQ_CVb1 0x01 #define ATOM_S5_DOS_REQ_DFP3b1 0x02 #define ATOM_S5_DOS_REQ_DFP4b1 0x04 #define ATOM_S5_DOS_REQ_DFP5b1 0x08 -#define ATOM_S5_DOS_REQ_DEVICEw0 0x0FFF +#define ATOM_S5_DOS_REQ_DEVICEw0 0x03FF #define ATOM_S5_DOS_REQ_CRT1 0x0001 #define ATOM_S5_DOS_REQ_LCD1 0x0002 @@ -4083,12 +3431,12 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S5_DOS_REQ_DFP1 0x0008 #define ATOM_S5_DOS_REQ_CRT2 0x0010 #define ATOM_S5_DOS_REQ_LCD2 0x0020 -#define ATOM_S5_DOS_REQ_DFP6 0x0040 +#define ATOM_S5_DOS_REQ_TV2 0x0040 #define ATOM_S5_DOS_REQ_DFP2 0x0080 #define ATOM_S5_DOS_REQ_CV 0x0100 -#define ATOM_S5_DOS_REQ_DFP3 0x0200 -#define ATOM_S5_DOS_REQ_DFP4 0x0400 -#define ATOM_S5_DOS_REQ_DFP5 0x0800 +#define ATOM_S5_DOS_REQ_DFP3 0x0200 +#define ATOM_S5_DOS_REQ_DFP4 0x0400 +#define ATOM_S5_DOS_REQ_DFP5 0x0800 #define ATOM_S5_DOS_FORCE_CRT1b2 ATOM_S5_DOS_REQ_CRT1b0 #define ATOM_S5_DOS_FORCE_TV1b2 ATOM_S5_DOS_REQ_TV1b0 @@ -4122,7 +3470,7 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S6_ACC_REQ_DFP1 0x00080000L #define ATOM_S6_ACC_REQ_CRT2 0x00100000L #define ATOM_S6_ACC_REQ_LCD2 0x00200000L -#define ATOM_S6_ACC_REQ_DFP6 0x00400000L +#define ATOM_S6_ACC_REQ_TV2 0x00400000L #define ATOM_S6_ACC_REQ_DFP2 0x00800000L #define ATOM_S6_ACC_REQ_CV 0x01000000L #define ATOM_S6_ACC_REQ_DFP3 0x02000000L @@ -4157,12 +3505,12 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_S6_ACC_REQ_DFP1b2 0x08 #define ATOM_S6_ACC_REQ_CRT2b2 0x10 #define ATOM_S6_ACC_REQ_LCD2b2 0x20 -#define ATOM_S6_ACC_REQ_DFP6b2 0x40 +#define ATOM_S6_ACC_REQ_TV2b2 0x40 #define ATOM_S6_ACC_REQ_DFP2b2 0x80 #define ATOM_S6_ACC_REQ_CVb3 0x01 -#define ATOM_S6_ACC_REQ_DFP3b3 0x02 -#define ATOM_S6_ACC_REQ_DFP4b3 0x04 -#define ATOM_S6_ACC_REQ_DFP5b3 0x08 +#define ATOM_S6_ACC_REQ_DFP3b3 0x02 +#define ATOM_S6_ACC_REQ_DFP4b3 0x04 +#define ATOM_S6_ACC_REQ_DFP5b3 0x08 #define ATOM_S6_ACC_REQ_DEVICEw1 ATOM_S5_DOS_REQ_DEVICEw0 #define ATOM_S6_SYSTEM_POWER_MODE_CHANGEb3 0x10 @@ -4267,17 +3615,11 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 /****************************************************************************/ // Macros used by driver -#ifdef __cplusplus -#define GetIndexIntoMasterTable(MasterOrData, FieldName) ((reinterpret_cast(&(static_cast(0))->FieldName)-static_cast(0))/sizeof(USHORT)) -#define GET_COMMAND_TABLE_COMMANDSET_REVISION(TABLE_HEADER_OFFSET) (((static_cast(TABLE_HEADER_OFFSET))->ucTableFormatRevision )&0x3F) -#define GET_COMMAND_TABLE_PARAMETER_REVISION(TABLE_HEADER_OFFSET) (((static_cast(TABLE_HEADER_OFFSET))->ucTableContentRevision)&0x3F) -#else // not __cplusplus #define GetIndexIntoMasterTable(MasterOrData, FieldName) (((char*)(&((ATOM_MASTER_LIST_OF_##MasterOrData##_TABLES*)0)->FieldName)-(char*)0)/sizeof(USHORT)) #define GET_COMMAND_TABLE_COMMANDSET_REVISION(TABLE_HEADER_OFFSET) ((((ATOM_COMMON_TABLE_HEADER*)TABLE_HEADER_OFFSET)->ucTableFormatRevision)&0x3F) #define GET_COMMAND_TABLE_PARAMETER_REVISION(TABLE_HEADER_OFFSET) ((((ATOM_COMMON_TABLE_HEADER*)TABLE_HEADER_OFFSET)->ucTableContentRevision)&0x3F) -#endif // __cplusplus #define GET_DATA_TABLE_MAJOR_REVISION GET_COMMAND_TABLE_COMMANDSET_REVISION #define GET_DATA_TABLE_MINOR_REVISION GET_COMMAND_TABLE_PARAMETER_REVISION @@ -4289,6 +3631,11 @@ typedef struct _ATOM_ASIC_INTERNAL_SS_INFO_V3 #define ATOM_SRC_DAC1 0 #define ATOM_SRC_DAC2 0x80 + +#ifdef UEFI_BUILD + #define USHORT UTEMP +#endif + typedef struct _MEMORY_PLLINIT_PARAMETERS { ULONG ulTargetMemoryClock; //In 10Khz unit @@ -4359,15 +3706,6 @@ typedef struct _ENABLE_GRAPH_SURFACE_PARAMETERS_V1_2 UCHAR ucPadding[2]; }ENABLE_GRAPH_SURFACE_PARAMETERS_V1_2; -typedef struct _ENABLE_GRAPH_SURFACE_PARAMETERS_V1_3 -{ - USHORT usHight; // Image Hight - USHORT usWidth; // Image Width - UCHAR ucSurface; // Surface 1 or 2 - UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE - USHORT usDeviceId; // Active Device Id for this surface. If no device, set to 0. -}ENABLE_GRAPH_SURFACE_PARAMETERS_V1_3; - typedef struct _ENABLE_GRAPH_SURFACE_PS_ALLOCATION { ENABLE_GRAPH_SURFACE_PARAMETERS sSetSurface; @@ -4568,7 +3906,6 @@ typedef struct _ATOM_MC_INIT_PARAM_TABLE #define QIMONDA INFINEON #define PROMOS MOSEL -#define KRETON INFINEON /////////////Support for GDDR5 MC uCode to reside in upper 64K of ROM///////////// @@ -4709,46 +4046,11 @@ typedef struct _ATOM_MEMORY_TIMING_FORMAT_V1 UCHAR uctCKRSE; // UCHAR uctCKRSX; // UCHAR uctFAW32; // - UCHAR ucMR5lo; // - UCHAR ucMR5hi; // + UCHAR ucReserved1; // + UCHAR ucReserved2; // UCHAR ucTerminator; }ATOM_MEMORY_TIMING_FORMAT_V1; -typedef struct _ATOM_MEMORY_TIMING_FORMAT_V2 -{ - ULONG ulClkRange; // memory clock in 10kHz unit, when target memory clock is below this clock, use this memory timing - USHORT usMRS; // mode register - USHORT usEMRS; // extended mode register - UCHAR ucCL; // CAS latency - UCHAR ucWL; // WRITE Latency - UCHAR uctRAS; // tRAS - UCHAR uctRC; // tRC - UCHAR uctRFC; // tRFC - UCHAR uctRCDR; // tRCDR - UCHAR uctRCDW; // tRCDW - UCHAR uctRP; // tRP - UCHAR uctRRD; // tRRD - UCHAR uctWR; // tWR - UCHAR uctWTR; // tWTR - UCHAR uctPDIX; // tPDIX - UCHAR uctFAW; // tFAW - UCHAR uctAOND; // tAOND - UCHAR ucflag; // flag to control memory timing calculation. bit0= control EMRS2 Infineon -////////////////////////////////////GDDR parameters/////////////////////////////////// - UCHAR uctCCDL; // - UCHAR uctCRCRL; // - UCHAR uctCRCWL; // - UCHAR uctCKE; // - UCHAR uctCKRSE; // - UCHAR uctCKRSX; // - UCHAR uctFAW32; // - UCHAR ucMR4lo; // - UCHAR ucMR4hi; // - UCHAR ucMR5lo; // - UCHAR ucMR5hi; // - UCHAR ucTerminator; - UCHAR ucReserved; -}ATOM_MEMORY_TIMING_FORMAT_V2; typedef struct _ATOM_MEMORY_FORMAT { @@ -4872,39 +4174,6 @@ typedef struct _ATOM_VRAM_MODULE_V5 ATOM_MEMORY_TIMING_FORMAT_V1 asMemTiming[5];//Memory Timing block sort from lower clock to higher clock }ATOM_VRAM_MODULE_V5; -typedef struct _ATOM_VRAM_MODULE_V6 -{ - ULONG ulChannelMapCfg; // board dependent parameter: Channel combination - USHORT usModuleSize; // size of ATOM_VRAM_MODULE_V4, make it easy for VBIOS to look for next entry of VRAM_MODULE - USHORT usPrivateReserved; // BIOS internal reserved space to optimize code size, updated by the compiler, shouldn't be modified manually!! - // MC_ARB_RAMCFG (includes NOOFBANK,NOOFRANKS,NOOFROWS,NOOFCOLS) - USHORT usReserved; - UCHAR ucExtMemoryID; // An external indicator (by hardcode, callback or pin) to tell what is the current memory module - UCHAR ucMemoryType; // [7:4]=0x1:DDR1;=0x2:DDR2;=0x3:DDR3;=0x4:DDR4; 0x5:DDR5 [3:0] - Must be 0x0 for now; - UCHAR ucChannelNum; // Number of channels present in this module config - UCHAR ucChannelWidth; // 0 - 32 bits; 1 - 64 bits - UCHAR ucDensity; // _8Mx32, _16Mx32, _16Mx16, _32Mx16 - UCHAR ucFlag; // To enable/disable functionalities based on memory type - UCHAR ucMisc; // bit0: 0 - single rank; 1 - dual rank; bit2: 0 - burstlength 4, 1 - burstlength 8 - UCHAR ucVREFI; // board dependent parameter - UCHAR ucNPL_RT; // board dependent parameter:NPL round trip delay, used for calculate memory timing parameters - UCHAR ucPreamble; // [7:4] Write Preamble, [3:0] Read Preamble - UCHAR ucMemorySize; // BIOS internal reserved space to optimize code size, updated by the compiler, shouldn't be modified manually!! - // Total memory size in unit of 16MB for CONFIG_MEMSIZE - bit[23:0] zeros - UCHAR ucReserved[3]; - -//compare with V3, we flat the struct by merging ATOM_MEMORY_FORMAT (as is) into V4 as the same level - USHORT usEMRS2Value; // EMRS2 Value is used for GDDR2 and GDDR4 memory type - USHORT usEMRS3Value; // EMRS3 Value is used for GDDR2 and GDDR4 memory type - UCHAR ucMemoryVenderID; // Predefined, If not predefined, vendor detection table gets executed - UCHAR ucRefreshRateFactor; // [1:0]=RefreshFactor (00=8ms, 01=16ms, 10=32ms,11=64ms) - UCHAR ucFIFODepth; // FIFO depth supposes to be detected during vendor detection, but if we dont do vendor detection we have to hardcode FIFO Depth - UCHAR ucCDR_Bandwidth; // [0:3]=Read CDR bandwidth, [4:7] - Write CDR Bandwidth - ATOM_MEMORY_TIMING_FORMAT_V2 asMemTiming[5];//Memory Timing block sort from lower clock to higher clock -}ATOM_VRAM_MODULE_V6; - - - typedef struct _ATOM_VRAM_INFO_V2 { ATOM_COMMON_TABLE_HEADER sHeader; @@ -5198,16 +4467,6 @@ typedef struct _ATOM_DISP_OUT_INFO ASIC_ENCODER_INFO asEncoderInfo[1]; }ATOM_DISP_OUT_INFO; -typedef struct _ATOM_DISP_OUT_INFO_V2 -{ - ATOM_COMMON_TABLE_HEADER sHeader; - USHORT ptrTransmitterInfo; - USHORT ptrEncoderInfo; - USHORT ptrMainCallParserFar; // direct address of main parser call in VBIOS binary. - ASIC_TRANSMITTER_INFO asTransmitterInfo[1]; - ASIC_ENCODER_INFO asEncoderInfo[1]; -}ATOM_DISP_OUT_INFO_V2; - // DispDevicePriorityInfo typedef struct _ATOM_DISPLAY_DEVICE_PRIORITY_INFO { @@ -5230,21 +4489,6 @@ typedef struct _PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS UCHAR ucReserved; }PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS; -//ProcessAuxChannelTransactionTable -typedef struct _PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 -{ - USHORT lpAuxRequest; - USHORT lpDataOut; - UCHAR ucChannelID; - union - { - UCHAR ucReplyStatus; - UCHAR ucDelay; - }; - UCHAR ucDataOutLen; - UCHAR ucHPD_ID; //=0: HPD1, =1: HPD2, =2: HPD3, =3: HPD4, =4: HPD5, =5: HPD6 -}PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2; - #define PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS //GetSinkType @@ -5265,7 +4509,6 @@ typedef struct _DP_ENCODER_SERVICE_PARAMETERS // ucAction #define ATOM_DP_ACTION_GET_SINK_TYPE 0x01 -/* obselete */ #define ATOM_DP_ACTION_TRAINING_START 0x02 #define ATOM_DP_ACTION_TRAINING_COMPLETE 0x03 #define ATOM_DP_ACTION_TRAINING_PATTERN_SEL 0x04 @@ -5281,7 +4524,7 @@ typedef struct _DP_ENCODER_SERVICE_PARAMETERS #define ATOM_DP_CONFIG_LINK_SEL_MASK 0x04 #define ATOM_DP_CONFIG_LINK_A 0x00 #define ATOM_DP_CONFIG_LINK_B 0x04 -/* /obselete */ + #define DP_ENCODER_SERVICE_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS // DP_TRAINING_TABLE @@ -5296,8 +4539,8 @@ typedef struct _DP_ENCODER_SERVICE_PARAMETERS #define DP_I2C_AUX_DDC_WRITE_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 64) #define DP_I2C_AUX_DDC_READ_START_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 72) #define DP_I2C_AUX_DDC_READ_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 76) -#define DP_I2C_AUX_DDC_WRITE_END_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 80) -#define DP_I2C_AUX_DDC_READ_END_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 84) +#define DP_I2C_AUX_DDC_READ_END_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 80) + typedef struct _PROCESS_I2C_CHANNEL_TRANSACTION_PARAMETERS { @@ -5319,38 +4562,7 @@ typedef struct _PROCESS_I2C_CHANNEL_TRANSACTION_PARAMETERS //ucFlag #define HW_I2C_WRITE 1 #define HW_I2C_READ 0 -#define I2C_2BYTE_ADDR 0x02 -typedef struct _SET_HWBLOCK_INSTANCE_PARAMETER_V2 -{ - UCHAR ucHWBlkInst; // HW block instance, 0, 1, 2, ... - UCHAR ucReserved[3]; -}SET_HWBLOCK_INSTANCE_PARAMETER_V2; - -#define HWBLKINST_INSTANCE_MASK 0x07 -#define HWBLKINST_HWBLK_MASK 0xF0 -#define HWBLKINST_HWBLK_SHIFT 0x04 - -//ucHWBlock -#define SELECT_DISP_ENGINE 0 -#define SELECT_DISP_PLL 1 -#define SELECT_DCIO_UNIPHY_LINK0 2 -#define SELECT_DCIO_UNIPHY_LINK1 3 -#define SELECT_DCIO_IMPCAL 4 -#define SELECT_DCIO_DIG 6 -#define SELECT_CRTC_PIXEL_RATE 7 - -/****************************************************************************/ -//Portion VI: Definitinos for vbios MC scratch registers that driver used -/****************************************************************************/ - -#define MC_MISC0__MEMORY_TYPE_MASK 0xF0000000 -#define MC_MISC0__MEMORY_TYPE__GDDR1 0x10000000 -#define MC_MISC0__MEMORY_TYPE__DDR2 0x20000000 -#define MC_MISC0__MEMORY_TYPE__GDDR3 0x30000000 -#define MC_MISC0__MEMORY_TYPE__GDDR4 0x40000000 -#define MC_MISC0__MEMORY_TYPE__GDDR5 0x50000000 -#define MC_MISC0__MEMORY_TYPE__DDR3 0xB0000000 /****************************************************************************/ //Portion VI: Definitinos being oboselete @@ -5714,276 +4926,7 @@ typedef struct _ATOM_POWERPLAY_INFO_V3 ATOM_POWERMODE_INFO_V3 asPowerPlayInfo[ATOM_MAX_NUMBEROF_POWER_BLOCK]; }ATOM_POWERPLAY_INFO_V3; -/* New PPlib */ -/**************************************************************************/ -typedef struct _ATOM_PPLIB_THERMALCONTROLLER -{ - UCHAR ucType; // one of ATOM_PP_THERMALCONTROLLER_* - UCHAR ucI2cLine; // as interpreted by DAL I2C - UCHAR ucI2cAddress; - UCHAR ucFanParameters; // Fan Control Parameters. - UCHAR ucFanMinRPM; // Fan Minimum RPM (hundreds) -- for display purposes only. - UCHAR ucFanMaxRPM; // Fan Maximum RPM (hundreds) -- for display purposes only. - UCHAR ucReserved; // ---- - UCHAR ucFlags; // to be defined -} ATOM_PPLIB_THERMALCONTROLLER; - -#define ATOM_PP_FANPARAMETERS_TACHOMETER_PULSES_PER_REVOLUTION_MASK 0x0f -#define ATOM_PP_FANPARAMETERS_NOFAN 0x80 // No fan is connected to this controller. - -#define ATOM_PP_THERMALCONTROLLER_NONE 0 -#define ATOM_PP_THERMALCONTROLLER_LM63 1 // Not used by PPLib -#define ATOM_PP_THERMALCONTROLLER_ADM1032 2 // Not used by PPLib -#define ATOM_PP_THERMALCONTROLLER_ADM1030 3 // Not used by PPLib -#define ATOM_PP_THERMALCONTROLLER_MUA6649 4 // Not used by PPLib -#define ATOM_PP_THERMALCONTROLLER_LM64 5 -#define ATOM_PP_THERMALCONTROLLER_F75375 6 // Not used by PPLib -#define ATOM_PP_THERMALCONTROLLER_RV6xx 7 -#define ATOM_PP_THERMALCONTROLLER_RV770 8 -#define ATOM_PP_THERMALCONTROLLER_ADT7473 9 -#define ATOM_PP_THERMALCONTROLLER_EXTERNAL_GPIO 11 -#define ATOM_PP_THERMALCONTROLLER_EVERGREEN 12 -#define ATOM_PP_THERMALCONTROLLER_ADT7473_WITH_INTERNAL 0x89 // ADT7473 Fan Control + Internal Thermal Controller - -typedef struct _ATOM_PPLIB_STATE -{ - UCHAR ucNonClockStateIndex; - UCHAR ucClockStateIndices[1]; // variable-sized -} ATOM_PPLIB_STATE; - -typedef struct _ATOM_PPLIB_FANTABLE -{ - UCHAR ucFanTableFormat; // Change this if the table format changes or version changes so that the other fields are not the same. - UCHAR ucTHyst; // Temperature hysteresis. Integer. - USHORT usTMin; // The temperature, in 0.01 centigrades, below which we just run at a minimal PWM. - USHORT usTMed; // The middle temperature where we change slopes. - USHORT usTHigh; // The high point above TMed for adjusting the second slope. - USHORT usPWMMin; // The minimum PWM value in percent (0.01% increments). - USHORT usPWMMed; // The PWM value (in percent) at TMed. - USHORT usPWMHigh; // The PWM value at THigh. -} ATOM_PPLIB_FANTABLE; - -typedef struct _ATOM_PPLIB_EXTENDEDHEADER -{ - USHORT usSize; - ULONG ulMaxEngineClock; // For Overdrive. - ULONG ulMaxMemoryClock; // For Overdrive. - // Add extra system parameters here, always adjust size to include all fields. -} ATOM_PPLIB_EXTENDEDHEADER; - -//// ATOM_PPLIB_POWERPLAYTABLE::ulPlatformCaps -#define ATOM_PP_PLATFORM_CAP_BACKBIAS 1 -#define ATOM_PP_PLATFORM_CAP_POWERPLAY 2 -#define ATOM_PP_PLATFORM_CAP_SBIOSPOWERSOURCE 4 -#define ATOM_PP_PLATFORM_CAP_ASPM_L0s 8 -#define ATOM_PP_PLATFORM_CAP_ASPM_L1 16 -#define ATOM_PP_PLATFORM_CAP_HARDWAREDC 32 -#define ATOM_PP_PLATFORM_CAP_GEMINIPRIMARY 64 -#define ATOM_PP_PLATFORM_CAP_STEPVDDC 128 -#define ATOM_PP_PLATFORM_CAP_VOLTAGECONTROL 256 -#define ATOM_PP_PLATFORM_CAP_SIDEPORTCONTROL 512 -#define ATOM_PP_PLATFORM_CAP_TURNOFFPLL_ASPML1 1024 -#define ATOM_PP_PLATFORM_CAP_HTLINKCONTROL 2048 -#define ATOM_PP_PLATFORM_CAP_MVDDCONTROL 4096 -#define ATOM_PP_PLATFORM_CAP_GOTO_BOOT_ON_ALERT 0x2000 // Go to boot state on alerts, e.g. on an AC->DC transition. -#define ATOM_PP_PLATFORM_CAP_DONT_WAIT_FOR_VBLANK_ON_ALERT 0x4000 // Do NOT wait for VBLANK during an alert (e.g. AC->DC transition). -#define ATOM_PP_PLATFORM_CAP_VDDCI_CONTROL 0x8000 // Does the driver control VDDCI independently from VDDC. -#define ATOM_PP_PLATFORM_CAP_REGULATOR_HOT 0x00010000 // Enable the 'regulator hot' feature. -#define ATOM_PP_PLATFORM_CAP_BACO 0x00020000 // Does the driver supports BACO state. - -typedef struct _ATOM_PPLIB_POWERPLAYTABLE -{ - ATOM_COMMON_TABLE_HEADER sHeader; - - UCHAR ucDataRevision; - - UCHAR ucNumStates; - UCHAR ucStateEntrySize; - UCHAR ucClockInfoSize; - UCHAR ucNonClockSize; - - // offset from start of this table to array of ucNumStates ATOM_PPLIB_STATE structures - USHORT usStateArrayOffset; - - // offset from start of this table to array of ASIC-specific structures, - // currently ATOM_PPLIB_CLOCK_INFO. - USHORT usClockInfoArrayOffset; - - // offset from start of this table to array of ATOM_PPLIB_NONCLOCK_INFO - USHORT usNonClockInfoArrayOffset; - - USHORT usBackbiasTime; // in microseconds - USHORT usVoltageTime; // in microseconds - USHORT usTableSize; //the size of this structure, or the extended structure - - ULONG ulPlatformCaps; // See ATOM_PPLIB_CAPS_* - - ATOM_PPLIB_THERMALCONTROLLER sThermalController; - - USHORT usBootClockInfoOffset; - USHORT usBootNonClockInfoOffset; - -} ATOM_PPLIB_POWERPLAYTABLE; - -typedef struct _ATOM_PPLIB_POWERPLAYTABLE2 -{ - ATOM_PPLIB_POWERPLAYTABLE basicTable; - UCHAR ucNumCustomThermalPolicy; - USHORT usCustomThermalPolicyArrayOffset; -}ATOM_PPLIB_POWERPLAYTABLE2, *LPATOM_PPLIB_POWERPLAYTABLE2; - -typedef struct _ATOM_PPLIB_POWERPLAYTABLE3 -{ - ATOM_PPLIB_POWERPLAYTABLE2 basicTable2; - USHORT usFormatID; // To be used ONLY by PPGen. - USHORT usFanTableOffset; - USHORT usExtendendedHeaderOffset; -} ATOM_PPLIB_POWERPLAYTABLE3, *LPATOM_PPLIB_POWERPLAYTABLE3; - -//// ATOM_PPLIB_NONCLOCK_INFO::usClassification -#define ATOM_PPLIB_CLASSIFICATION_UI_MASK 0x0007 -#define ATOM_PPLIB_CLASSIFICATION_UI_SHIFT 0 -#define ATOM_PPLIB_CLASSIFICATION_UI_NONE 0 -#define ATOM_PPLIB_CLASSIFICATION_UI_BATTERY 1 -#define ATOM_PPLIB_CLASSIFICATION_UI_BALANCED 3 -#define ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE 5 -// 2, 4, 6, 7 are reserved - -#define ATOM_PPLIB_CLASSIFICATION_BOOT 0x0008 -#define ATOM_PPLIB_CLASSIFICATION_THERMAL 0x0010 -#define ATOM_PPLIB_CLASSIFICATION_LIMITEDPOWERSOURCE 0x0020 -#define ATOM_PPLIB_CLASSIFICATION_REST 0x0040 -#define ATOM_PPLIB_CLASSIFICATION_FORCED 0x0080 -#define ATOM_PPLIB_CLASSIFICATION_3DPERFORMANCE 0x0100 -#define ATOM_PPLIB_CLASSIFICATION_OVERDRIVETEMPLATE 0x0200 -#define ATOM_PPLIB_CLASSIFICATION_UVDSTATE 0x0400 -#define ATOM_PPLIB_CLASSIFICATION_3DLOW 0x0800 -#define ATOM_PPLIB_CLASSIFICATION_ACPI 0x1000 -#define ATOM_PPLIB_CLASSIFICATION_HD2STATE 0x2000 -#define ATOM_PPLIB_CLASSIFICATION_HDSTATE 0x4000 -#define ATOM_PPLIB_CLASSIFICATION_SDSTATE 0x8000 - -//// ATOM_PPLIB_NONCLOCK_INFO::ulCapsAndSettings -#define ATOM_PPLIB_SINGLE_DISPLAY_ONLY 0x00000001 -#define ATOM_PPLIB_SUPPORTS_VIDEO_PLAYBACK 0x00000002 - -// 0 is 2.5Gb/s, 1 is 5Gb/s -#define ATOM_PPLIB_PCIE_LINK_SPEED_MASK 0x00000004 -#define ATOM_PPLIB_PCIE_LINK_SPEED_SHIFT 2 - -// lanes - 1: 1, 2, 4, 8, 12, 16 permitted by PCIE spec -#define ATOM_PPLIB_PCIE_LINK_WIDTH_MASK 0x000000F8 -#define ATOM_PPLIB_PCIE_LINK_WIDTH_SHIFT 3 - -// lookup into reduced refresh-rate table -#define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_MASK 0x00000F00 -#define ATOM_PPLIB_LIMITED_REFRESHRATE_VALUE_SHIFT 8 - -#define ATOM_PPLIB_LIMITED_REFRESHRATE_UNLIMITED 0 -#define ATOM_PPLIB_LIMITED_REFRESHRATE_50HZ 1 -// 2-15 TBD as needed. - -#define ATOM_PPLIB_SOFTWARE_DISABLE_LOADBALANCING 0x00001000 -#define ATOM_PPLIB_SOFTWARE_ENABLE_SLEEP_FOR_TIMESTAMPS 0x00002000 -#define ATOM_PPLIB_DISALLOW_ON_DC 0x00004000 -#define ATOM_PPLIB_ENABLE_VARIBRIGHT 0x00008000 - -//memory related flags -#define ATOM_PPLIB_SWSTATE_MEMORY_DLL_OFF 0x000010000 - -//M3 Arb //2bits, current 3 sets of parameters in total -#define ATOM_PPLIB_M3ARB_MASK 0x00060000 -#define ATOM_PPLIB_M3ARB_SHIFT 17 - -// Contained in an array starting at the offset -// in ATOM_PPLIB_POWERPLAYTABLE::usNonClockInfoArrayOffset. -// referenced from ATOM_PPLIB_STATE_INFO::ucNonClockStateIndex -typedef struct _ATOM_PPLIB_NONCLOCK_INFO -{ - USHORT usClassification; - UCHAR ucMinTemperature; - UCHAR ucMaxTemperature; - ULONG ulCapsAndSettings; - UCHAR ucRequiredPower; - UCHAR ucUnused1[3]; -} ATOM_PPLIB_NONCLOCK_INFO; - -// Contained in an array starting at the offset -// in ATOM_PPLIB_POWERPLAYTABLE::usClockInfoArrayOffset. -// referenced from ATOM_PPLIB_STATE::ucClockStateIndices -#define ATOM_PPLIB_NONCLOCKINFO_VER1 12 -#define ATOM_PPLIB_NONCLOCKINFO_VER2 24 - -typedef struct _ATOM_PPLIB_R600_CLOCK_INFO -{ - USHORT usEngineClockLow; - UCHAR ucEngineClockHigh; - - USHORT usMemoryClockLow; - UCHAR ucMemoryClockHigh; - - USHORT usVDDC; - USHORT usUnused1; - USHORT usUnused2; - - ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_* - -} ATOM_PPLIB_R600_CLOCK_INFO; - -// ulFlags in ATOM_PPLIB_R600_CLOCK_INFO -#define ATOM_PPLIB_R600_FLAGS_PCIEGEN2 1 -#define ATOM_PPLIB_R600_FLAGS_UVDSAFE 2 -#define ATOM_PPLIB_R600_FLAGS_BACKBIASENABLE 4 -#define ATOM_PPLIB_R600_FLAGS_MEMORY_ODT_OFF 8 -#define ATOM_PPLIB_R600_FLAGS_MEMORY_DLL_OFF 16 -#define ATOM_PPLIB_R600_FLAGS_LOWPOWER 32 // On the RV770 use 'low power' setting (sequencer S0). - -typedef struct _ATOM_PPLIB_EVERGREEN_CLOCK_INFO -{ - USHORT usEngineClockLow; - UCHAR ucEngineClockHigh; - - USHORT usMemoryClockLow; - UCHAR ucMemoryClockHigh; - - USHORT usVDDC; - USHORT usVDDCI; - USHORT usUnused; - - ULONG ulFlags; // ATOM_PPLIB_R600_FLAGS_* - -} ATOM_PPLIB_EVERGREEN_CLOCK_INFO; - -typedef struct _ATOM_PPLIB_RS780_CLOCK_INFO - -{ - USHORT usLowEngineClockLow; // Low Engine clock in MHz (the same way as on the R600). - UCHAR ucLowEngineClockHigh; - USHORT usHighEngineClockLow; // High Engine clock in MHz. - UCHAR ucHighEngineClockHigh; - USHORT usMemoryClockLow; // For now one of the ATOM_PPLIB_RS780_SPMCLK_XXXX constants. - UCHAR ucMemoryClockHigh; // Currentyl unused. - UCHAR ucPadding; // For proper alignment and size. - USHORT usVDDC; // For the 780, use: None, Low, High, Variable - UCHAR ucMaxHTLinkWidth; // From SBIOS - {2, 4, 8, 16} - UCHAR ucMinHTLinkWidth; // From SBIOS - {2, 4, 8, 16}. Effective only if CDLW enabled. Minimum down stream width could be bigger as display BW requirement. - USHORT usHTLinkFreq; // See definition ATOM_PPLIB_RS780_HTLINKFREQ_xxx or in MHz(>=200). - ULONG ulFlags; -} ATOM_PPLIB_RS780_CLOCK_INFO; - -#define ATOM_PPLIB_RS780_VOLTAGE_NONE 0 -#define ATOM_PPLIB_RS780_VOLTAGE_LOW 1 -#define ATOM_PPLIB_RS780_VOLTAGE_HIGH 2 -#define ATOM_PPLIB_RS780_VOLTAGE_VARIABLE 3 - -#define ATOM_PPLIB_RS780_SPMCLK_NONE 0 // We cannot change the side port memory clock, leave it as it is. -#define ATOM_PPLIB_RS780_SPMCLK_LOW 1 -#define ATOM_PPLIB_RS780_SPMCLK_HIGH 2 - -#define ATOM_PPLIB_RS780_HTLINKFREQ_NONE 0 -#define ATOM_PPLIB_RS780_HTLINKFREQ_LOW 1 -#define ATOM_PPLIB_RS780_HTLINKFREQ_HIGH 2 /**************************************************************************/ @@ -6086,50 +5029,6 @@ typedef struct _ATOM_PPLIB_RS780_CLOCK_INFO #define EnableLVDS_SS EnableSpreadSpectrumOnPPLL #define ENABLE_LVDS_SS_PARAMETERS_V3 ENABLE_SPREAD_SPECTRUM_ON_PPLL -//#define ATOM_S2_CRT1_DPMS_STATE 0x00010000L -//#define ATOM_S2_LCD1_DPMS_STATE ATOM_S2_CRT1_DPMS_STATE -//#define ATOM_S2_TV1_DPMS_STATE ATOM_S2_CRT1_DPMS_STATE -//#define ATOM_S2_DFP1_DPMS_STATE ATOM_S2_CRT1_DPMS_STATE -//#define ATOM_S2_CRT2_DPMS_STATE ATOM_S2_CRT1_DPMS_STATE - -#define ATOM_S6_ACC_REQ_TV2 0x00400000L -#define ATOM_DEVICE_TV2_INDEX 0x00000006 -#define ATOM_DEVICE_TV2_SUPPORT (0x1L << ATOM_DEVICE_TV2_INDEX) -#define ATOM_S0_TV2 0x00100000L -#define ATOM_S3_TV2_ACTIVE ATOM_S3_DFP6_ACTIVE -#define ATOM_S3_TV2_CRTC_ACTIVE ATOM_S3_DFP6_CRTC_ACTIVE - -// -#define ATOM_S2_CRT1_DPMS_STATE 0x00010000L -#define ATOM_S2_LCD1_DPMS_STATE 0x00020000L -#define ATOM_S2_TV1_DPMS_STATE 0x00040000L -#define ATOM_S2_DFP1_DPMS_STATE 0x00080000L -#define ATOM_S2_CRT2_DPMS_STATE 0x00100000L -#define ATOM_S2_LCD2_DPMS_STATE 0x00200000L -#define ATOM_S2_TV2_DPMS_STATE 0x00400000L -#define ATOM_S2_DFP2_DPMS_STATE 0x00800000L -#define ATOM_S2_CV_DPMS_STATE 0x01000000L -#define ATOM_S2_DFP3_DPMS_STATE 0x02000000L -#define ATOM_S2_DFP4_DPMS_STATE 0x04000000L -#define ATOM_S2_DFP5_DPMS_STATE 0x08000000L - -#define ATOM_S2_CRT1_DPMS_STATEb2 0x01 -#define ATOM_S2_LCD1_DPMS_STATEb2 0x02 -#define ATOM_S2_TV1_DPMS_STATEb2 0x04 -#define ATOM_S2_DFP1_DPMS_STATEb2 0x08 -#define ATOM_S2_CRT2_DPMS_STATEb2 0x10 -#define ATOM_S2_LCD2_DPMS_STATEb2 0x20 -#define ATOM_S2_TV2_DPMS_STATEb2 0x40 -#define ATOM_S2_DFP2_DPMS_STATEb2 0x80 -#define ATOM_S2_CV_DPMS_STATEb3 0x01 -#define ATOM_S2_DFP3_DPMS_STATEb3 0x02 -#define ATOM_S2_DFP4_DPMS_STATEb3 0x04 -#define ATOM_S2_DFP5_DPMS_STATEb3 0x08 - -#define ATOM_S3_ASIC_GUI_ENGINE_HUNGb3 0x20 -#define ATOM_S3_ALLOW_FAST_PWR_SWITCHb3 0x40 -#define ATOM_S3_RQST_GPU_USE_MIN_PWRb3 0x80 - /*********************************************************************************/ #pragma pack() // BIOS data must use byte aligment diff --git a/driver/xf86-video-ati/src/Makefile.am b/driver/xf86-video-ati/src/Makefile.am index dc77c0248..7cc2a6fb0 100644 --- a/driver/xf86-video-ati/src/Makefile.am +++ b/driver/xf86-video-ati/src/Makefile.am @@ -26,7 +26,7 @@ # _ladir passes a dummy rpath to libtool so the thing will actually link # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. -radeon_drv_la_LIBADD = $(LIBDRM_RADEON_LIBS) +radeon_drv_la_LIBADD = if DRI RADEON_DRI_SRCS = radeon_dri.c @@ -48,25 +48,28 @@ RADEON_ATOMBIOS_SOURCES = \ AtomBios/includes/ObjectID.h \ AtomBios/includes/regsdef.h -if XF86DRM_MODE -RADEON_KMS_SRCS=radeon_dri2.c radeon_kms.c drmmode_display.c radeon_vbo.c -endif +XMODE_SRCS=\ + local_xf86Rename.h \ + parser/xf86Parser.h \ + parser/xf86Optrec.h \ + modes/xf86Modes.h \ + modes/xf86Modes.c \ + modes/xf86cvt.c \ + modes/xf86Crtc.h \ + modes/xf86Crtc.c \ + modes/xf86Cursors.c \ + modes/xf86EdidModes.c \ + modes/xf86RandR12.c \ + modes/xf86RandR12.h \ + modes/xf86Rename.h \ + modes/xf86Rotate.c \ + modes/xf86DiDGA.c if USE_EXA -RADEON_EXA_SOURCES = radeon_exa.c r600_exa.c r6xx_accel.c r600_textured_videofuncs.c r600_shader.c radeon_exa_shared.c \ - evergreen_exa.c evergreen_accel.c evergreen_shader.c evergreen_textured_videofuncs.c cayman_accel.c cayman_shader.c +RADEON_EXA_SOURCES = radeon_exa.c r600_exa.c r6xx_accel.c r600_textured_videofuncs.c r600_shader.c endif -AM_CFLAGS = \ - @LIBDRM_RADEON_CFLAGS@ \ - @XORG_CFLAGS@ \ - @DRI_CFLAGS@ \ - @LIBUDEV_CFLAGS@ \ - -DDISABLE_EASF \ - -DENABLE_ALL_SERVICE_FUNCTIONS \ - -DATOM_BIOS \ - -DATOM_BIOS_PARSER \ - -DDRIVER_PARSER +AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ @XMODES_CFLAGS@ -DDISABLE_EASF -DENABLE_ALL_SERVICE_FUNCTIONS -DATOM_BIOS -DATOM_BIOS_PARSER -DDRIVER_PARSER INCLUDES = -I$(srcdir)/AtomBios/includes @@ -75,10 +78,6 @@ ati_drv_la_LIBADD = $(PCIACCESS_LIBS) radeon_drv_la_LIBADD += $(PCIACCESS_LIBS) endif -if LIBUDEV -radeon_drv_la_LIBADD += $(LIBUDEV_LIBS) -endif - ati_drv_la_LTLIBRARIES = ati_drv.la ati_drv_la_LDFLAGS = -module -avoid-version ati_drv_ladir = @moduledir@/drivers @@ -89,15 +88,19 @@ radeon_drv_la_LTLIBRARIES = radeon_drv.la radeon_drv_la_LDFLAGS = -module -avoid-version radeon_drv_ladir = @moduledir@/drivers radeon_drv_la_SOURCES = \ - radeon_accel.c radeon_cursor.c radeon_legacy_memory.c \ + radeon_accel.c radeon_cursor.c radeon_dga.c radeon_legacy_memory.c \ radeon_driver.c radeon_video.c radeon_bios.c radeon_mm_i2c.c \ radeon_vip.c radeon_misc.c radeon_probe.c \ legacy_crtc.c legacy_output.c \ - radeon_textured_video.c radeon_xvmc.c radeon_pm.c \ + radeon_textured_video.c \ radeon_crtc.c radeon_output.c radeon_modes.c radeon_tv.c \ $(RADEON_ATOMBIOS_SOURCES) radeon_atombios.c radeon_atomwrapper.c \ - $(RADEON_DRI_SRCS) $(RADEON_EXA_SOURCES) atombios_output.c atombios_crtc.c \ - $(RADEON_KMS_SRCS) + $(RADEON_DRI_SRCS) $(RADEON_EXA_SOURCES) atombios_output.c atombios_crtc.c + +if XMODES +radeon_drv_la_SOURCES += \ + $(XMODE_SRCS) +endif theatre_detect_drv_la_LTLIBRARIES = theatre_detect_drv.la theatre_detect_drv_la_LDFLAGS = -module -avoid-version @@ -121,6 +124,7 @@ theatre200_drv_la_SOURCES = \ theatre200.c theatre200_module.c EXTRA_DIST = \ + $(XMODE_SRCS) \ radeon_render.c \ radeon_accelfuncs.c \ radeon_textured_videofuncs.c \ @@ -130,13 +134,6 @@ EXTRA_DIST = \ r600_reg_r7xx.h \ r600_shader.h \ r600_state.h \ - evergreen_reg.h \ - evergreen_reg_auto.h \ - evergreen_shader.h \ - evergreen_state.h \ - cayman_reg.h \ - cayman_reg_auto.h \ - cayman_shader.h \ ati.h \ ativersion.h \ bicubic_table.h \ @@ -144,20 +141,16 @@ EXTRA_DIST = \ radeon_commonfuncs.c \ radeon_dri.h \ radeon_drm.h \ - radeon_dummy_bufmgr.h \ radeon_exa_render.c \ radeon_exa_funcs.c \ - radeon_exa_shared.h \ radeon.h \ radeon_macros.h \ radeon_probe.h \ radeon_reg.h \ radeon_version.h \ - radeon_vbo.h \ radeon_video.h \ radeon_tv.h \ - radeon_atomwrapper.h \ - simple_list.h \ + radeon_atomwrapper.h \ theatre200.h \ theatre_detect.h \ theatre.h \ @@ -171,6 +164,4 @@ EXTRA_DIST = \ radeon_pci_device_match_gen.h \ pcidb/ati_pciids.csv \ pcidb/parse_pci_ids.pl \ - radeon_atombios.h \ - radeon_dri2.h \ - drmmode_display.h + radeon_atombios.h diff --git a/driver/xf86-video-ati/src/Makefile.in b/driver/xf86-video-ati/src/Makefile.in index c44422c7c..b079234f9 100644 --- a/driver/xf86-video-ati/src/Makefile.in +++ b/driver/xf86-video-ati/src/Makefile.in @@ -50,9 +50,9 @@ pkgincludedir = $(includedir)/@PACKAGE@ top_builddir = .. am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd INSTALL = @INSTALL@ -install_sh_DATA = ${SHELL} $(install_sh) -c -m 644 -install_sh_PROGRAM = ${SHELL} $(install_sh) -c -install_sh_SCRIPT = ${SHELL} $(install_sh) -c +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : @@ -65,7 +65,9 @@ build_triplet = @build@ host_triplet = @host@ @DRI_TRUE@am__append_1 = $(DRI_LIBS) @XSERVER_LIBPCIACCESS_TRUE@am__append_2 = $(PCIACCESS_LIBS) -@LIBUDEV_TRUE@am__append_3 = $(LIBUDEV_LIBS) +@XMODES_TRUE@am__append_3 = \ +@XMODES_TRUE@ $(XMODE_SRCS) + subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -102,19 +104,16 @@ am_ati_drv_la_OBJECTS = ati.lo atimodule.lo ati_drv_la_OBJECTS = $(am_ati_drv_la_OBJECTS) @DRI_TRUE@am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) @XSERVER_LIBPCIACCESS_TRUE@am__DEPENDENCIES_3 = $(am__DEPENDENCIES_1) -@LIBUDEV_TRUE@am__DEPENDENCIES_4 = $(am__DEPENDENCIES_1) -radeon_drv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ - $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_3) \ - $(am__DEPENDENCIES_4) +radeon_drv_la_DEPENDENCIES = $(am__DEPENDENCIES_2) \ + $(am__DEPENDENCIES_3) am__radeon_drv_la_SOURCES_DIST = radeon_accel.c radeon_cursor.c \ - radeon_legacy_memory.c radeon_driver.c radeon_video.c \ - radeon_bios.c radeon_mm_i2c.c radeon_vip.c radeon_misc.c \ - radeon_probe.c legacy_crtc.c legacy_output.c \ - radeon_textured_video.c radeon_xvmc.c radeon_pm.c \ - radeon_crtc.c radeon_output.c radeon_modes.c radeon_tv.c \ - AtomBios/CD_Operations.c AtomBios/Decoder.c \ - AtomBios/hwserv_drv.c AtomBios/includes/atombios.h \ - AtomBios/includes/CD_binding.h \ + radeon_dga.c radeon_legacy_memory.c radeon_driver.c \ + radeon_video.c radeon_bios.c radeon_mm_i2c.c radeon_vip.c \ + radeon_misc.c radeon_probe.c legacy_crtc.c legacy_output.c \ + radeon_textured_video.c radeon_crtc.c radeon_output.c \ + radeon_modes.c radeon_tv.c AtomBios/CD_Operations.c \ + AtomBios/Decoder.c AtomBios/hwserv_drv.c \ + AtomBios/includes/atombios.h AtomBios/includes/CD_binding.h \ AtomBios/includes/CD_Common_Types.h \ AtomBios/includes/CD_Definitions.h \ AtomBios/includes/CD_hw_services.h \ @@ -123,30 +122,28 @@ am__radeon_drv_la_SOURCES_DIST = radeon_accel.c radeon_cursor.c \ AtomBios/includes/regsdef.h radeon_atombios.c \ radeon_atomwrapper.c radeon_dri.c radeon_exa.c r600_exa.c \ r6xx_accel.c r600_textured_videofuncs.c r600_shader.c \ - radeon_exa_shared.c evergreen_exa.c evergreen_accel.c \ - evergreen_shader.c evergreen_textured_videofuncs.c \ - cayman_accel.c cayman_shader.c atombios_output.c \ - atombios_crtc.c radeon_dri2.c radeon_kms.c drmmode_display.c \ - radeon_vbo.c + atombios_output.c atombios_crtc.c local_xf86Rename.h \ + parser/xf86Parser.h parser/xf86Optrec.h modes/xf86Modes.h \ + modes/xf86Modes.c modes/xf86cvt.c modes/xf86Crtc.h \ + modes/xf86Crtc.c modes/xf86Cursors.c modes/xf86EdidModes.c \ + modes/xf86RandR12.c modes/xf86RandR12.h modes/xf86Rename.h \ + modes/xf86Rotate.c modes/xf86DiDGA.c am__objects_1 = CD_Operations.lo Decoder.lo hwserv_drv.lo @DRI_TRUE@am__objects_2 = radeon_dri.lo @USE_EXA_TRUE@am__objects_3 = radeon_exa.lo r600_exa.lo r6xx_accel.lo \ -@USE_EXA_TRUE@ r600_textured_videofuncs.lo r600_shader.lo \ -@USE_EXA_TRUE@ radeon_exa_shared.lo evergreen_exa.lo \ -@USE_EXA_TRUE@ evergreen_accel.lo evergreen_shader.lo \ -@USE_EXA_TRUE@ evergreen_textured_videofuncs.lo cayman_accel.lo \ -@USE_EXA_TRUE@ cayman_shader.lo -@XF86DRM_MODE_TRUE@am__objects_4 = radeon_dri2.lo radeon_kms.lo \ -@XF86DRM_MODE_TRUE@ drmmode_display.lo radeon_vbo.lo +@USE_EXA_TRUE@ r600_textured_videofuncs.lo r600_shader.lo +am__objects_4 = xf86Modes.lo xf86cvt.lo xf86Crtc.lo xf86Cursors.lo \ + xf86EdidModes.lo xf86RandR12.lo xf86Rotate.lo xf86DiDGA.lo +@XMODES_TRUE@am__objects_5 = $(am__objects_4) am_radeon_drv_la_OBJECTS = radeon_accel.lo radeon_cursor.lo \ - radeon_legacy_memory.lo radeon_driver.lo radeon_video.lo \ - radeon_bios.lo radeon_mm_i2c.lo radeon_vip.lo radeon_misc.lo \ - radeon_probe.lo legacy_crtc.lo legacy_output.lo \ - radeon_textured_video.lo radeon_xvmc.lo radeon_pm.lo \ - radeon_crtc.lo radeon_output.lo radeon_modes.lo radeon_tv.lo \ - $(am__objects_1) radeon_atombios.lo radeon_atomwrapper.lo \ - $(am__objects_2) $(am__objects_3) atombios_output.lo \ - atombios_crtc.lo $(am__objects_4) + radeon_dga.lo radeon_legacy_memory.lo radeon_driver.lo \ + radeon_video.lo radeon_bios.lo radeon_mm_i2c.lo radeon_vip.lo \ + radeon_misc.lo radeon_probe.lo legacy_crtc.lo legacy_output.lo \ + radeon_textured_video.lo radeon_crtc.lo radeon_output.lo \ + radeon_modes.lo radeon_tv.lo $(am__objects_1) \ + radeon_atombios.lo radeon_atomwrapper.lo $(am__objects_2) \ + $(am__objects_3) atombios_output.lo atombios_crtc.lo \ + $(am__objects_5) radeon_drv_la_OBJECTS = $(am_radeon_drv_la_OBJECTS) theatre200_drv_la_LIBADD = am_theatre200_drv_la_OBJECTS = theatre200_drv_la-theatre200.lo \ @@ -185,7 +182,6 @@ ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ AMDEP_FALSE = @AMDEP_FALSE@ AMDEP_TRUE = @AMDEP_TRUE@ AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ APP_MAN_DIR = @APP_MAN_DIR@ APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ AR = @AR@ @@ -193,18 +189,22 @@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ -BASE_CFLAGS = @BASE_CFLAGS@ +BUILD_LINUXDOC_FALSE = @BUILD_LINUXDOC_FALSE@ +BUILD_LINUXDOC_TRUE = @BUILD_LINUXDOC_TRUE@ +BUILD_PDFDOC_FALSE = @BUILD_PDFDOC_FALSE@ +BUILD_PDFDOC_TRUE = @BUILD_PDFDOC_TRUE@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ -CHANGELOG_CMD = @CHANGELOG_CMD@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ -CWARNFLAGS = @CWARNFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ -DLLTOOL = @DLLTOOL@ DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ DRIVER_NAME = @DRIVER_NAME@ @@ -212,56 +212,43 @@ DRI_CFLAGS = @DRI_CFLAGS@ DRI_FALSE = @DRI_FALSE@ DRI_LIBS = @DRI_LIBS@ DRI_TRUE = @DRI_TRUE@ -DRM_MODE_FALSE = @DRM_MODE_FALSE@ -DRM_MODE_TRUE = @DRM_MODE_TRUE@ DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ +ECHO = @ECHO@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ -FGREP = @FGREP@ +F77 = @F77@ +FFLAGS = @FFLAGS@ FILE_MAN_DIR = @FILE_MAN_DIR@ FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ GREP = @GREP@ -HAVE_XEXTPROTO_71_FALSE = @HAVE_XEXTPROTO_71_FALSE@ -HAVE_XEXTPROTO_71_TRUE = @HAVE_XEXTPROTO_71_TRUE@ -INSTALL_CMD = @INSTALL_CMD@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LD = @LD@ LDFLAGS = @LDFLAGS@ -LIBDRM_RADEON_CFLAGS = @LIBDRM_RADEON_CFLAGS@ -LIBDRM_RADEON_LIBS = @LIBDRM_RADEON_LIBS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ -LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@ -LIBUDEV_FALSE = @LIBUDEV_FALSE@ -LIBUDEV_LIBS = @LIBUDEV_LIBS@ -LIBUDEV_TRUE = @LIBUDEV_TRUE@ LIB_MAN_DIR = @LIB_MAN_DIR@ LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ -LIPO = @LIPO@ +LINUXDOC = @LINUXDOC@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MAN_SUBSTS = @MAN_SUBSTS@ +MAKE_HTML = @MAKE_HTML@ +MAKE_PDF = @MAKE_PDF@ +MAKE_PS = @MAKE_PS@ +MAKE_TEXT = @MAKE_TEXT@ MISC_MAN_DIR = @MISC_MAN_DIR@ MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ -NM = @NM@ NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ -OTOOL = @OTOOL@ -OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ @@ -272,29 +259,29 @@ PATH_SEPARATOR = @PATH_SEPARATOR@ PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@ PCIACCESS_LIBS = @PCIACCESS_LIBS@ PKG_CONFIG = @PKG_CONFIG@ +PS2PDF = @PS2PDF@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ -STRICT_CFLAGS = @STRICT_CFLAGS@ STRIP = @STRIP@ USE_EXA_FALSE = @USE_EXA_FALSE@ USE_EXA_TRUE = @USE_EXA_TRUE@ VERSION = @VERSION@ -XEXT_CFLAGS = @XEXT_CFLAGS@ -XEXT_LIBS = @XEXT_LIBS@ -XF86DRM_MODE_FALSE = @XF86DRM_MODE_FALSE@ -XF86DRM_MODE_TRUE = @XF86DRM_MODE_TRUE@ +XMODES_CFLAGS = @XMODES_CFLAGS@ +XMODES_FALSE = @XMODES_FALSE@ +XMODES_TRUE = @XMODES_TRUE@ XORG_CFLAGS = @XORG_CFLAGS@ XORG_LIBS = @XORG_LIBS@ -XORG_MAN_PAGE = @XORG_MAN_PAGE@ XSERVER_LIBPCIACCESS_FALSE = @XSERVER_LIBPCIACCESS_FALSE@ XSERVER_LIBPCIACCESS_TRUE = @XSERVER_LIBPCIACCESS_TRUE@ -ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ -ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ @@ -336,8 +323,7 @@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ -radeon_drv_la_LIBADD = $(LIBDRM_RADEON_LIBS) $(am__append_1) \ - $(am__append_2) $(am__append_3) +radeon_drv_la_LIBADD = $(am__append_1) $(am__append_2) @DRI_TRUE@RADEON_DRI_SRCS = radeon_dri.c RADEON_ATOMBIOS_SOURCES = \ AtomBios/CD_Operations.c \ @@ -354,21 +340,25 @@ RADEON_ATOMBIOS_SOURCES = \ AtomBios/includes/ObjectID.h \ AtomBios/includes/regsdef.h -@XF86DRM_MODE_TRUE@RADEON_KMS_SRCS = radeon_dri2.c radeon_kms.c drmmode_display.c radeon_vbo.c -@USE_EXA_TRUE@RADEON_EXA_SOURCES = radeon_exa.c r600_exa.c r6xx_accel.c r600_textured_videofuncs.c r600_shader.c radeon_exa_shared.c \ -@USE_EXA_TRUE@ evergreen_exa.c evergreen_accel.c evergreen_shader.c evergreen_textured_videofuncs.c cayman_accel.c cayman_shader.c - -AM_CFLAGS = \ - @LIBDRM_RADEON_CFLAGS@ \ - @XORG_CFLAGS@ \ - @DRI_CFLAGS@ \ - @LIBUDEV_CFLAGS@ \ - -DDISABLE_EASF \ - -DENABLE_ALL_SERVICE_FUNCTIONS \ - -DATOM_BIOS \ - -DATOM_BIOS_PARSER \ - -DDRIVER_PARSER +XMODE_SRCS = \ + local_xf86Rename.h \ + parser/xf86Parser.h \ + parser/xf86Optrec.h \ + modes/xf86Modes.h \ + modes/xf86Modes.c \ + modes/xf86cvt.c \ + modes/xf86Crtc.h \ + modes/xf86Crtc.c \ + modes/xf86Cursors.c \ + modes/xf86EdidModes.c \ + modes/xf86RandR12.c \ + modes/xf86RandR12.h \ + modes/xf86Rename.h \ + modes/xf86Rotate.c \ + modes/xf86DiDGA.c +@USE_EXA_TRUE@RADEON_EXA_SOURCES = radeon_exa.c r600_exa.c r6xx_accel.c r600_textured_videofuncs.c r600_shader.c +AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ @XMODES_CFLAGS@ -DDISABLE_EASF -DENABLE_ALL_SERVICE_FUNCTIONS -DATOM_BIOS -DATOM_BIOS_PARSER -DDRIVER_PARSER INCLUDES = -I$(srcdir)/AtomBios/includes @XSERVER_LIBPCIACCESS_TRUE@ati_drv_la_LIBADD = $(PCIACCESS_LIBS) ati_drv_la_LTLIBRARIES = ati_drv.la @@ -380,17 +370,15 @@ ati_drv_la_SOURCES = \ radeon_drv_la_LTLIBRARIES = radeon_drv.la radeon_drv_la_LDFLAGS = -module -avoid-version radeon_drv_ladir = @moduledir@/drivers -radeon_drv_la_SOURCES = \ - radeon_accel.c radeon_cursor.c radeon_legacy_memory.c \ - radeon_driver.c radeon_video.c radeon_bios.c radeon_mm_i2c.c \ - radeon_vip.c radeon_misc.c radeon_probe.c \ - legacy_crtc.c legacy_output.c \ - radeon_textured_video.c radeon_xvmc.c radeon_pm.c \ - radeon_crtc.c radeon_output.c radeon_modes.c radeon_tv.c \ - $(RADEON_ATOMBIOS_SOURCES) radeon_atombios.c radeon_atomwrapper.c \ - $(RADEON_DRI_SRCS) $(RADEON_EXA_SOURCES) atombios_output.c atombios_crtc.c \ - $(RADEON_KMS_SRCS) - +radeon_drv_la_SOURCES = radeon_accel.c radeon_cursor.c radeon_dga.c \ + radeon_legacy_memory.c radeon_driver.c radeon_video.c \ + radeon_bios.c radeon_mm_i2c.c radeon_vip.c radeon_misc.c \ + radeon_probe.c legacy_crtc.c legacy_output.c \ + radeon_textured_video.c radeon_crtc.c radeon_output.c \ + radeon_modes.c radeon_tv.c $(RADEON_ATOMBIOS_SOURCES) \ + radeon_atombios.c radeon_atomwrapper.c $(RADEON_DRI_SRCS) \ + $(RADEON_EXA_SOURCES) atombios_output.c atombios_crtc.c \ + $(am__append_3) theatre_detect_drv_la_LTLIBRARIES = theatre_detect_drv.la theatre_detect_drv_la_LDFLAGS = -module -avoid-version theatre_detect_drv_ladir = @moduledir@/multimedia @@ -413,6 +401,7 @@ theatre200_drv_la_SOURCES = \ theatre200.c theatre200_module.c EXTRA_DIST = \ + $(XMODE_SRCS) \ radeon_render.c \ radeon_accelfuncs.c \ radeon_textured_videofuncs.c \ @@ -422,13 +411,6 @@ EXTRA_DIST = \ r600_reg_r7xx.h \ r600_shader.h \ r600_state.h \ - evergreen_reg.h \ - evergreen_reg_auto.h \ - evergreen_shader.h \ - evergreen_state.h \ - cayman_reg.h \ - cayman_reg_auto.h \ - cayman_shader.h \ ati.h \ ativersion.h \ bicubic_table.h \ @@ -436,20 +418,16 @@ EXTRA_DIST = \ radeon_commonfuncs.c \ radeon_dri.h \ radeon_drm.h \ - radeon_dummy_bufmgr.h \ radeon_exa_render.c \ radeon_exa_funcs.c \ - radeon_exa_shared.h \ radeon.h \ radeon_macros.h \ radeon_probe.h \ radeon_reg.h \ radeon_version.h \ - radeon_vbo.h \ radeon_video.h \ radeon_tv.h \ - radeon_atomwrapper.h \ - simple_list.h \ + radeon_atomwrapper.h \ theatre200.h \ theatre_detect.h \ theatre.h \ @@ -463,9 +441,7 @@ EXTRA_DIST = \ radeon_pci_device_match_gen.h \ pcidb/ati_pciids.csv \ pcidb/parse_pci_ids.pl \ - radeon_atombios.h \ - radeon_dri2.h \ - drmmode_display.h + radeon_atombios.h all: all-am @@ -480,9 +456,9 @@ $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__confi exit 1;; \ esac; \ done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ - $(AUTOMAKE) --foreign src/Makefile + $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ @@ -658,13 +634,6 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atimodule.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atombios_crtc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/atombios_output.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cayman_accel.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cayman_shader.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/drmmode_display.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evergreen_accel.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evergreen_exa.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evergreen_shader.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/evergreen_textured_videofuncs.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hwserv_drv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legacy_crtc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/legacy_output.Plo@am__quote@ @@ -678,31 +647,34 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_bios.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_crtc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_cursor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_dga.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_dri.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_dri2.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_driver.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_exa.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_exa_shared.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_kms.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_legacy_memory.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_misc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_mm_i2c.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_modes.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_output.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_pm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_probe.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_textured_video.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_tv.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_vbo.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_video.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_vip.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_xvmc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre200_drv_la-theatre200.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre200_drv_la-theatre200_module.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre_detect.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre_detect_module.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre_module.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86Crtc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86Cursors.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86DiDGA.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86EdidModes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86Modes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86RandR12.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86Rotate.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xf86cvt.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ @@ -746,6 +718,62 @@ hwserv_drv.lo: AtomBios/hwserv_drv.c @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o hwserv_drv.lo `test -f 'AtomBios/hwserv_drv.c' || echo '$(srcdir)/'`AtomBios/hwserv_drv.c +xf86Modes.lo: modes/xf86Modes.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86Modes.lo -MD -MP -MF "$(DEPDIR)/xf86Modes.Tpo" -c -o xf86Modes.lo `test -f 'modes/xf86Modes.c' || echo '$(srcdir)/'`modes/xf86Modes.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86Modes.Tpo" "$(DEPDIR)/xf86Modes.Plo"; else rm -f "$(DEPDIR)/xf86Modes.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86Modes.c' object='xf86Modes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86Modes.lo `test -f 'modes/xf86Modes.c' || echo '$(srcdir)/'`modes/xf86Modes.c + +xf86cvt.lo: modes/xf86cvt.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86cvt.lo -MD -MP -MF "$(DEPDIR)/xf86cvt.Tpo" -c -o xf86cvt.lo `test -f 'modes/xf86cvt.c' || echo '$(srcdir)/'`modes/xf86cvt.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86cvt.Tpo" "$(DEPDIR)/xf86cvt.Plo"; else rm -f "$(DEPDIR)/xf86cvt.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86cvt.c' object='xf86cvt.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86cvt.lo `test -f 'modes/xf86cvt.c' || echo '$(srcdir)/'`modes/xf86cvt.c + +xf86Crtc.lo: modes/xf86Crtc.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86Crtc.lo -MD -MP -MF "$(DEPDIR)/xf86Crtc.Tpo" -c -o xf86Crtc.lo `test -f 'modes/xf86Crtc.c' || echo '$(srcdir)/'`modes/xf86Crtc.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86Crtc.Tpo" "$(DEPDIR)/xf86Crtc.Plo"; else rm -f "$(DEPDIR)/xf86Crtc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86Crtc.c' object='xf86Crtc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86Crtc.lo `test -f 'modes/xf86Crtc.c' || echo '$(srcdir)/'`modes/xf86Crtc.c + +xf86Cursors.lo: modes/xf86Cursors.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86Cursors.lo -MD -MP -MF "$(DEPDIR)/xf86Cursors.Tpo" -c -o xf86Cursors.lo `test -f 'modes/xf86Cursors.c' || echo '$(srcdir)/'`modes/xf86Cursors.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86Cursors.Tpo" "$(DEPDIR)/xf86Cursors.Plo"; else rm -f "$(DEPDIR)/xf86Cursors.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86Cursors.c' object='xf86Cursors.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86Cursors.lo `test -f 'modes/xf86Cursors.c' || echo '$(srcdir)/'`modes/xf86Cursors.c + +xf86EdidModes.lo: modes/xf86EdidModes.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86EdidModes.lo -MD -MP -MF "$(DEPDIR)/xf86EdidModes.Tpo" -c -o xf86EdidModes.lo `test -f 'modes/xf86EdidModes.c' || echo '$(srcdir)/'`modes/xf86EdidModes.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86EdidModes.Tpo" "$(DEPDIR)/xf86EdidModes.Plo"; else rm -f "$(DEPDIR)/xf86EdidModes.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86EdidModes.c' object='xf86EdidModes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86EdidModes.lo `test -f 'modes/xf86EdidModes.c' || echo '$(srcdir)/'`modes/xf86EdidModes.c + +xf86RandR12.lo: modes/xf86RandR12.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86RandR12.lo -MD -MP -MF "$(DEPDIR)/xf86RandR12.Tpo" -c -o xf86RandR12.lo `test -f 'modes/xf86RandR12.c' || echo '$(srcdir)/'`modes/xf86RandR12.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86RandR12.Tpo" "$(DEPDIR)/xf86RandR12.Plo"; else rm -f "$(DEPDIR)/xf86RandR12.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86RandR12.c' object='xf86RandR12.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86RandR12.lo `test -f 'modes/xf86RandR12.c' || echo '$(srcdir)/'`modes/xf86RandR12.c + +xf86Rotate.lo: modes/xf86Rotate.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86Rotate.lo -MD -MP -MF "$(DEPDIR)/xf86Rotate.Tpo" -c -o xf86Rotate.lo `test -f 'modes/xf86Rotate.c' || echo '$(srcdir)/'`modes/xf86Rotate.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86Rotate.Tpo" "$(DEPDIR)/xf86Rotate.Plo"; else rm -f "$(DEPDIR)/xf86Rotate.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86Rotate.c' object='xf86Rotate.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86Rotate.lo `test -f 'modes/xf86Rotate.c' || echo '$(srcdir)/'`modes/xf86Rotate.c + +xf86DiDGA.lo: modes/xf86DiDGA.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT xf86DiDGA.lo -MD -MP -MF "$(DEPDIR)/xf86DiDGA.Tpo" -c -o xf86DiDGA.lo `test -f 'modes/xf86DiDGA.c' || echo '$(srcdir)/'`modes/xf86DiDGA.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/xf86DiDGA.Tpo" "$(DEPDIR)/xf86DiDGA.Plo"; else rm -f "$(DEPDIR)/xf86DiDGA.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='modes/xf86DiDGA.c' object='xf86DiDGA.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o xf86DiDGA.lo `test -f 'modes/xf86DiDGA.c' || echo '$(srcdir)/'`modes/xf86DiDGA.c + theatre200_drv_la-theatre200.lo: theatre200.c @am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theatre200_drv_la_CFLAGS) $(CFLAGS) -MT theatre200_drv_la-theatre200.lo -MD -MP -MF "$(DEPDIR)/theatre200_drv_la-theatre200.Tpo" -c -o theatre200_drv_la-theatre200.lo `test -f 'theatre200.c' || echo '$(srcdir)/'`theatre200.c; \ @am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/theatre200_drv_la-theatre200.Tpo" "$(DEPDIR)/theatre200_drv_la-theatre200.Plo"; else rm -f "$(DEPDIR)/theatre200_drv_la-theatre200.Tpo"; exit 1; fi @@ -819,7 +847,7 @@ distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) - $(mkdir_p) $(distdir)/pcidb + $(mkdir_p) $(distdir)/modes $(distdir)/parser $(distdir)/pcidb @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ list='$(DISTFILES)'; for file in $$list; do \ diff --git a/driver/xf86-video-ati/src/ati.c b/driver/xf86-video-ati/src/ati.c index e1c136fc0..387aaca24 100644 --- a/driver/xf86-video-ati/src/ati.c +++ b/driver/xf86-video-ati/src/ati.c @@ -63,7 +63,6 @@ #include "atipcirename.h" #include "ati.h" -#include "atipciids.h" #include "ativersion.h" /* names duplicated from version headers */ @@ -228,7 +227,7 @@ ati_gdev_subdriver(pointer options) } } - free(ATIGDevs); + xfree(ATIGDevs); /* load subdrivers as primary modules and only if they do not get loaded * from other device sections diff --git a/driver/xf86-video-ati/src/ati.h b/driver/xf86-video-ati/src/ati.h index b7120d9f4..86c40a116 100644 --- a/driver/xf86-video-ati/src/ati.h +++ b/driver/xf86-video-ati/src/ati.h @@ -26,6 +26,7 @@ #include #include #include "xf86Pci.h" +#include "xf86PciInfo.h" #include "xf86.h" diff --git a/driver/xf86-video-ati/src/ati_pciids_gen.h b/driver/xf86-video-ati/src/ati_pciids_gen.h index ff7c91b7b..3304e8430 100644 --- a/driver/xf86-video-ati/src/ati_pciids_gen.h +++ b/driver/xf86-video-ati/src/ati_pciids_gen.h @@ -2,7 +2,6 @@ #define PCI_CHIP_RV380_3151 0x3151 #define PCI_CHIP_RV380_3152 0x3152 #define PCI_CHIP_RV380_3154 0x3154 -#define PCI_CHIP_RV380_3155 0x3155 #define PCI_CHIP_RV380_3E50 0x3E50 #define PCI_CHIP_RV380_3E54 0x3E54 #define PCI_CHIP_RS100_4136 0x4136 @@ -25,6 +24,7 @@ #define PCI_CHIP_MACH32 0x4158 #define PCI_CHIP_RS250_4237 0x4237 #define PCI_CHIP_R200_BB 0x4242 +#define PCI_CHIP_R200_BC 0x4243 #define PCI_CHIP_RS100_4336 0x4336 #define PCI_CHIP_RS200_4337 0x4337 #define PCI_CHIP_MACH64CT 0x4354 @@ -60,8 +60,6 @@ #define PCI_CHIP_R420_JN 0x4A4E #define PCI_CHIP_R420_4A4F 0x4A4F #define PCI_CHIP_R420_JP 0x4A50 -#define PCI_CHIP_R420_JT 0x4A54 -#define PCI_CHIP_R481_4B48 0x4B48 #define PCI_CHIP_R481_4B49 0x4B49 #define PCI_CHIP_R481_4B4A 0x4B4A #define PCI_CHIP_R481_4B4B 0x4B4B @@ -336,7 +334,6 @@ #define PCI_CHIP_RV770_9440 0x9440 #define PCI_CHIP_RV770_9441 0x9441 #define PCI_CHIP_RV770_9442 0x9442 -#define PCI_CHIP_RV770_9443 0x9443 #define PCI_CHIP_RV770_9444 0x9444 #define PCI_CHIP_RV770_9446 0x9446 #define PCI_CHIP_RV770_944A 0x944A @@ -348,34 +345,21 @@ #define PCI_CHIP_RV770_9456 0x9456 #define PCI_CHIP_RV770_945A 0x945A #define PCI_CHIP_RV770_945B 0x945B -#define PCI_CHIP_RV770_945E 0x945E #define PCI_CHIP_RV790_9460 0x9460 #define PCI_CHIP_RV790_9462 0x9462 #define PCI_CHIP_RV770_946A 0x946A #define PCI_CHIP_RV770_946B 0x946B #define PCI_CHIP_RV770_947A 0x947A #define PCI_CHIP_RV770_947B 0x947B -#define PCI_CHIP_RV730_9480 0x9480 #define PCI_CHIP_RV730_9487 0x9487 -#define PCI_CHIP_RV730_9488 0x9488 #define PCI_CHIP_RV730_9489 0x9489 -#define PCI_CHIP_RV730_948A 0x948A #define PCI_CHIP_RV730_948F 0x948F #define PCI_CHIP_RV730_9490 0x9490 #define PCI_CHIP_RV730_9491 0x9491 -#define PCI_CHIP_RV730_9495 0x9495 #define PCI_CHIP_RV730_9498 0x9498 #define PCI_CHIP_RV730_949C 0x949C #define PCI_CHIP_RV730_949E 0x949E #define PCI_CHIP_RV730_949F 0x949F -#define PCI_CHIP_RV740_94A0 0x94A0 -#define PCI_CHIP_RV740_94A1 0x94A1 -#define PCI_CHIP_RV740_94A3 0x94A3 -#define PCI_CHIP_RV740_94B1 0x94B1 -#define PCI_CHIP_RV740_94B3 0x94B3 -#define PCI_CHIP_RV740_94B4 0x94B4 -#define PCI_CHIP_RV740_94B5 0x94B5 -#define PCI_CHIP_RV740_94B9 0x94B9 #define PCI_CHIP_RV610_94C0 0x94C0 #define PCI_CHIP_RV610_94C1 0x94C1 #define PCI_CHIP_RV610_94C3 0x94C3 @@ -403,14 +387,11 @@ #define PCI_CHIP_RV670_9519 0x9519 #define PCI_CHIP_RV710_9540 0x9540 #define PCI_CHIP_RV710_9541 0x9541 -#define PCI_CHIP_RV710_9542 0x9542 #define PCI_CHIP_RV710_954E 0x954E #define PCI_CHIP_RV710_954F 0x954F #define PCI_CHIP_RV710_9552 0x9552 #define PCI_CHIP_RV710_9553 0x9553 #define PCI_CHIP_RV710_9555 0x9555 -#define PCI_CHIP_RV710_9557 0x9557 -#define PCI_CHIP_RV710_955F 0x955F #define PCI_CHIP_RV630_9580 0x9580 #define PCI_CHIP_RV630_9581 0x9581 #define PCI_CHIP_RV630_9583 0x9583 @@ -424,6 +405,7 @@ #define PCI_CHIP_RV630_958D 0x958D #define PCI_CHIP_RV630_958E 0x958E #define PCI_CHIP_RV630_958F 0x958F +#define PCI_CHIP_RV710_9542 0x9542 #define PCI_CHIP_RV620_95C0 0x95C0 #define PCI_CHIP_RV620_95C2 0x95C2 #define PCI_CHIP_RV620_95C4 0x95C4 @@ -451,122 +433,8 @@ #define PCI_CHIP_RS780_9614 0x9614 #define PCI_CHIP_RS780_9615 0x9615 #define PCI_CHIP_RS780_9616 0x9616 -#define PCI_CHIP_SUMO_9640 0x9640 -#define PCI_CHIP_SUMO_9641 0x9641 -#define PCI_CHIP_SUMO2_9642 0x9642 -#define PCI_CHIP_SUMO2_9643 0x9643 -#define PCI_CHIP_SUMO2_9644 0x9644 -#define PCI_CHIP_SUMO2_9645 0x9645 -#define PCI_CHIP_SUMO_9647 0x9647 -#define PCI_CHIP_SUMO_9648 0x9648 -#define PCI_CHIP_SUMO_964A 0x964A -#define PCI_CHIP_SUMO_964E 0x964E -#define PCI_CHIP_SUMO_964F 0x964F #define PCI_CHIP_RS880_9710 0x9710 #define PCI_CHIP_RS880_9711 0x9711 #define PCI_CHIP_RS880_9712 0x9712 #define PCI_CHIP_RS880_9713 0x9713 #define PCI_CHIP_RS880_9714 0x9714 -#define PCI_CHIP_RS880_9715 0x9715 -#define PCI_CHIP_PALM_9802 0x9802 -#define PCI_CHIP_PALM_9803 0x9803 -#define PCI_CHIP_PALM_9804 0x9804 -#define PCI_CHIP_PALM_9805 0x9805 -#define PCI_CHIP_PALM_9806 0x9806 -#define PCI_CHIP_PALM_9807 0x9807 -#define PCI_CHIP_CYPRESS_6880 0x6880 -#define PCI_CHIP_CYPRESS_6888 0x6888 -#define PCI_CHIP_CYPRESS_6889 0x6889 -#define PCI_CHIP_CYPRESS_688A 0x688A -#define PCI_CHIP_CYPRESS_688C 0x688C -#define PCI_CHIP_CYPRESS_688D 0x688D -#define PCI_CHIP_CYPRESS_6898 0x6898 -#define PCI_CHIP_CYPRESS_6899 0x6899 -#define PCI_CHIP_CYPRESS_689B 0x689B -#define PCI_CHIP_CYPRESS_689E 0x689E -#define PCI_CHIP_HEMLOCK_689C 0x689C -#define PCI_CHIP_HEMLOCK_689D 0x689D -#define PCI_CHIP_JUNIPER_68A0 0x68A0 -#define PCI_CHIP_JUNIPER_68A1 0x68A1 -#define PCI_CHIP_JUNIPER_68A8 0x68A8 -#define PCI_CHIP_JUNIPER_68A9 0x68A9 -#define PCI_CHIP_JUNIPER_68B0 0x68B0 -#define PCI_CHIP_JUNIPER_68B8 0x68B8 -#define PCI_CHIP_JUNIPER_68B9 0x68B9 -#define PCI_CHIP_JUNIPER_68BA 0x68BA -#define PCI_CHIP_JUNIPER_68BE 0x68BE -#define PCI_CHIP_JUNIPER_68BF 0x68BF -#define PCI_CHIP_REDWOOD_68C0 0x68C0 -#define PCI_CHIP_REDWOOD_68C1 0x68C1 -#define PCI_CHIP_REDWOOD_68C7 0x68C7 -#define PCI_CHIP_REDWOOD_68C8 0x68C8 -#define PCI_CHIP_REDWOOD_68C9 0x68C9 -#define PCI_CHIP_REDWOOD_68D8 0x68D8 -#define PCI_CHIP_REDWOOD_68D9 0x68D9 -#define PCI_CHIP_REDWOOD_68DA 0x68DA -#define PCI_CHIP_REDWOOD_68DE 0x68DE -#define PCI_CHIP_CEDAR_68E0 0x68E0 -#define PCI_CHIP_CEDAR_68E1 0x68E1 -#define PCI_CHIP_CEDAR_68E4 0x68E4 -#define PCI_CHIP_CEDAR_68E5 0x68E5 -#define PCI_CHIP_CEDAR_68E8 0x68E8 -#define PCI_CHIP_CEDAR_68E9 0x68E9 -#define PCI_CHIP_CEDAR_68F1 0x68F1 -#define PCI_CHIP_CEDAR_68F2 0x68F2 -#define PCI_CHIP_CEDAR_68F8 0x68F8 -#define PCI_CHIP_CEDAR_68F9 0x68F9 -#define PCI_CHIP_CEDAR_68FE 0x68FE -#define PCI_CHIP_CAYMAN_6700 0x6700 -#define PCI_CHIP_CAYMAN_6701 0x6701 -#define PCI_CHIP_CAYMAN_6702 0x6702 -#define PCI_CHIP_CAYMAN_6703 0x6703 -#define PCI_CHIP_CAYMAN_6704 0x6704 -#define PCI_CHIP_CAYMAN_6705 0x6705 -#define PCI_CHIP_CAYMAN_6706 0x6706 -#define PCI_CHIP_CAYMAN_6707 0x6707 -#define PCI_CHIP_CAYMAN_6708 0x6708 -#define PCI_CHIP_CAYMAN_6709 0x6709 -#define PCI_CHIP_CAYMAN_6718 0x6718 -#define PCI_CHIP_CAYMAN_6719 0x6719 -#define PCI_CHIP_CAYMAN_671C 0x671C -#define PCI_CHIP_CAYMAN_671D 0x671D -#define PCI_CHIP_CAYMAN_671F 0x671F -#define PCI_CHIP_BARTS_6720 0x6720 -#define PCI_CHIP_BARTS_6721 0x6721 -#define PCI_CHIP_BARTS_6722 0x6722 -#define PCI_CHIP_BARTS_6723 0x6723 -#define PCI_CHIP_BARTS_6724 0x6724 -#define PCI_CHIP_BARTS_6725 0x6725 -#define PCI_CHIP_BARTS_6726 0x6726 -#define PCI_CHIP_BARTS_6727 0x6727 -#define PCI_CHIP_BARTS_6728 0x6728 -#define PCI_CHIP_BARTS_6729 0x6729 -#define PCI_CHIP_BARTS_6738 0x6738 -#define PCI_CHIP_BARTS_6739 0x6739 -#define PCI_CHIP_BARTS_673E 0x673E -#define PCI_CHIP_TURKS_6740 0x6740 -#define PCI_CHIP_TURKS_6741 0x6741 -#define PCI_CHIP_TURKS_6742 0x6742 -#define PCI_CHIP_TURKS_6743 0x6743 -#define PCI_CHIP_TURKS_6744 0x6744 -#define PCI_CHIP_TURKS_6745 0x6745 -#define PCI_CHIP_TURKS_6746 0x6746 -#define PCI_CHIP_TURKS_6747 0x6747 -#define PCI_CHIP_TURKS_6748 0x6748 -#define PCI_CHIP_TURKS_6749 0x6749 -#define PCI_CHIP_TURKS_6750 0x6750 -#define PCI_CHIP_TURKS_6758 0x6758 -#define PCI_CHIP_TURKS_6759 0x6759 -#define PCI_CHIP_TURKS_675F 0x675F -#define PCI_CHIP_CAICOS_6760 0x6760 -#define PCI_CHIP_CAICOS_6761 0x6761 -#define PCI_CHIP_CAICOS_6762 0x6762 -#define PCI_CHIP_CAICOS_6763 0x6763 -#define PCI_CHIP_CAICOS_6764 0x6764 -#define PCI_CHIP_CAICOS_6765 0x6765 -#define PCI_CHIP_CAICOS_6766 0x6766 -#define PCI_CHIP_CAICOS_6767 0x6767 -#define PCI_CHIP_CAICOS_6768 0x6768 -#define PCI_CHIP_CAICOS_6770 0x6770 -#define PCI_CHIP_CAICOS_6778 0x6778 -#define PCI_CHIP_CAICOS_6779 0x6779 diff --git a/driver/xf86-video-ati/src/atipciids.h b/driver/xf86-video-ati/src/atipciids.h index 04b59600f..47c03c790 100644 --- a/driver/xf86-video-ati/src/atipciids.h +++ b/driver/xf86-video-ati/src/atipciids.h @@ -41,10 +41,6 @@ #define PCI_VENDOR_DELL 0x1028 #define PCI_VENDOR_VIA 0x1106 #define PCI_VENDOR_INTEL 0x8086 -#ifndef PCI_VENDOR_HP -#define PCI_VENDOR_HP 0x103c -#endif -#define PCI_VENDOR_SONY 0x104D #include "ati_pciids_gen.h" diff --git a/driver/xf86-video-ati/src/atombios_crtc.c b/driver/xf86-video-ati/src/atombios_crtc.c index 8b89bcd51..9bc1ad2f0 100644 --- a/driver/xf86-video-ati/src/atombios_crtc.c +++ b/driver/xf86-video-ati/src/atombios_crtc.c @@ -33,14 +33,13 @@ #include "config.h" #endif /* DPMS */ -#ifdef HAVE_XEXTPROTO_71 +#ifdef HAVE_X11_EXTENSIONS_DPMSCONST_H #include #else #define DPMS_SERVER #include #endif -#include #include "radeon.h" #include "radeon_reg.h" #include "radeon_macros.h" @@ -172,65 +171,50 @@ atombios_crtc_dpms(xf86CrtcPtr crtc, int mode) RADEONInfoPtr info = RADEONPTR(crtc->scrn); switch (mode) { case DPMSModeOn: - atombios_enable_crtc(info->atomBIOS, radeon_crtc->crtc_id, 1); - if (IS_DCE3_VARIANT) - atombios_enable_crtc_memreq(info->atomBIOS, radeon_crtc->crtc_id, 1); - atombios_blank_crtc(info->atomBIOS, radeon_crtc->crtc_id, 0); - break; case DPMSModeStandby: case DPMSModeSuspend: + if (IS_DCE3_VARIANT) + atombios_enable_crtc_memreq(info->atomBIOS, radeon_crtc->crtc_id, 1); + atombios_enable_crtc(info->atomBIOS, radeon_crtc->crtc_id, 1); + atombios_blank_crtc(info->atomBIOS, radeon_crtc->crtc_id, 0); + break; case DPMSModeOff: atombios_blank_crtc(info->atomBIOS, radeon_crtc->crtc_id, 1); + atombios_enable_crtc(info->atomBIOS, radeon_crtc->crtc_id, 0); if (IS_DCE3_VARIANT) atombios_enable_crtc_memreq(info->atomBIOS, radeon_crtc->crtc_id, 0); - atombios_enable_crtc(info->atomBIOS, radeon_crtc->crtc_id, 0); break; } } static AtomBiosResult -atombios_set_crtc_timing(xf86CrtcPtr crtc, DisplayModePtr mode) +atombios_set_crtc_timing(atomBiosHandlePtr atomBIOS, SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION *crtc_param) { - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(crtc->scrn); AtomBiosArgRec data; unsigned char *space; - uint16_t misc = 0; - SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION param; - memset(¶m, 0, sizeof(param)); + SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION conv_param; - param.usH_Total = cpu_to_le16(mode->CrtcHTotal); - param.usH_Disp = cpu_to_le16(mode->CrtcHDisplay); - param.usH_SyncStart = cpu_to_le16(mode->CrtcHSyncStart); - param.usH_SyncWidth = cpu_to_le16(mode->CrtcHSyncEnd - mode->CrtcHSyncStart); - param.usV_Total = cpu_to_le16(mode->CrtcVTotal); - param.usV_Disp = cpu_to_le16(mode->CrtcVDisplay); - param.usV_SyncStart = cpu_to_le16(mode->CrtcVSyncStart); - param.usV_SyncWidth = cpu_to_le16(mode->CrtcVSyncEnd - mode->CrtcVSyncStart); - - if (mode->Flags & V_NVSYNC) - misc |= ATOM_VSYNC_POLARITY; - - if (mode->Flags & V_NHSYNC) - misc |= ATOM_HSYNC_POLARITY; - - if (mode->Flags & V_CSYNC) - misc |= ATOM_COMPOSITESYNC; - - if (mode->Flags & V_INTERLACE) - misc |= ATOM_INTERLACE; - - if (mode->Flags & V_DBLSCAN) - misc |= ATOM_DOUBLE_CLOCK_MODE; - - param.susModeMiscInfo.usAccess = cpu_to_le16(misc); - param.ucCRTC = radeon_crtc->crtc_id; + conv_param.usH_Total = cpu_to_le16(crtc_param->usH_Total); + conv_param.usH_Disp = cpu_to_le16(crtc_param->usH_Disp); + conv_param.usH_SyncStart = cpu_to_le16(crtc_param->usH_SyncStart); + conv_param.usH_SyncWidth = cpu_to_le16(crtc_param->usH_SyncWidth); + conv_param.usV_Total = cpu_to_le16(crtc_param->usV_Total); + conv_param.usV_Disp = cpu_to_le16(crtc_param->usV_Disp); + conv_param.usV_SyncStart = cpu_to_le16(crtc_param->usV_SyncStart); + conv_param.usV_SyncWidth = cpu_to_le16(crtc_param->usV_SyncWidth); + conv_param.susModeMiscInfo.usAccess = cpu_to_le16(crtc_param->susModeMiscInfo.usAccess); + conv_param.ucCRTC = crtc_param->ucCRTC; + conv_param.ucOverscanRight = crtc_param->ucOverscanRight; + conv_param.ucOverscanLeft = crtc_param->ucOverscanLeft; + conv_param.ucOverscanBottom = crtc_param->ucOverscanBottom; + conv_param.ucOverscanTop = crtc_param->ucOverscanTop; + conv_param.ucReserved = crtc_param->ucReserved; data.exec.index = GetIndexIntoMasterTable(COMMAND, SetCRTC_Timing); data.exec.dataSpace = (void *)&space; - data.exec.pspace = ¶m; + data.exec.pspace = &conv_param; - if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { + if (RHDAtomBiosFunc(atomBIOS->scrnIndex, atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { ErrorF("Set CRTC Timing success\n"); return ATOM_SUCCESS ; } @@ -240,48 +224,28 @@ atombios_set_crtc_timing(xf86CrtcPtr crtc, DisplayModePtr mode) } static AtomBiosResult -atombios_set_crtc_dtd_timing(xf86CrtcPtr crtc, DisplayModePtr mode) +atombios_set_crtc_dtd_timing(atomBiosHandlePtr atomBIOS, SET_CRTC_USING_DTD_TIMING_PARAMETERS *crtc_param) { - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(crtc->scrn); AtomBiosArgRec data; unsigned char *space; - uint16_t misc = 0; - SET_CRTC_USING_DTD_TIMING_PARAMETERS param; - memset(¶m, 0, sizeof(param)); + SET_CRTC_USING_DTD_TIMING_PARAMETERS conv_param; - param.usH_Size = cpu_to_le16(mode->CrtcHDisplay); - param.usH_Blanking_Time = cpu_to_le16(mode->CrtcHBlankEnd - mode->CrtcHDisplay); - param.usV_Size = cpu_to_le16(mode->CrtcVDisplay); - param.usV_Blanking_Time = cpu_to_le16(mode->CrtcVBlankEnd - mode->CrtcVDisplay); - param.usH_SyncOffset = cpu_to_le16(mode->CrtcHSyncStart - mode->CrtcHDisplay); - param.usH_SyncWidth = cpu_to_le16(mode->CrtcHSyncEnd - mode->CrtcHSyncStart); - param.usV_SyncOffset = cpu_to_le16(mode->CrtcVSyncStart - mode->CrtcVDisplay); - param.usV_SyncWidth = cpu_to_le16(mode->CrtcVSyncEnd - mode->CrtcVSyncStart); - - if (mode->Flags & V_NVSYNC) - misc |= ATOM_VSYNC_POLARITY; - - if (mode->Flags & V_NHSYNC) - misc |= ATOM_HSYNC_POLARITY; - - if (mode->Flags & V_CSYNC) - misc |= ATOM_COMPOSITESYNC; - - if (mode->Flags & V_INTERLACE) - misc |= ATOM_INTERLACE; - - if (mode->Flags & V_DBLSCAN) - misc |= ATOM_DOUBLE_CLOCK_MODE; - - param.susModeMiscInfo.usAccess = cpu_to_le16(misc); - param.ucCRTC= radeon_crtc->crtc_id; + conv_param.usH_Size = cpu_to_le16(crtc_param->usH_Size); + conv_param.usH_Blanking_Time= cpu_to_le16(crtc_param->usH_Blanking_Time); + conv_param.usV_Size = cpu_to_le16(crtc_param->usV_Size); + conv_param.usV_Blanking_Time= cpu_to_le16(crtc_param->usV_Blanking_Time); + conv_param.usH_SyncOffset= cpu_to_le16(crtc_param->usH_SyncOffset); + conv_param.usH_SyncWidth= cpu_to_le16(crtc_param->usH_SyncWidth); + conv_param.usV_SyncOffset= cpu_to_le16(crtc_param->usV_SyncOffset); + conv_param.usV_SyncWidth= cpu_to_le16(crtc_param->usV_SyncWidth); + conv_param.susModeMiscInfo.usAccess = cpu_to_le16(crtc_param->susModeMiscInfo.usAccess); + conv_param.ucCRTC= crtc_param->ucCRTC; data.exec.index = GetIndexIntoMasterTable(COMMAND, SetCRTC_UsingDTDTiming); data.exec.dataSpace = (void *)&space; - data.exec.pspace = ¶m; + data.exec.pspace = &conv_param; - if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { + if (RHDAtomBiosFunc(atomBIOS->scrnIndex, atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { ErrorF("Set DTD CRTC Timing success\n"); return ATOM_SUCCESS ; } @@ -290,237 +254,78 @@ atombios_set_crtc_dtd_timing(xf86CrtcPtr crtc, DisplayModePtr mode) return ATOM_NOT_IMPLEMENTED; } -static void -atombios_pick_pll(xf86CrtcPtr crtc) +void +atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode) { RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(crtc->scrn); - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); - xf86OutputPtr output; - RADEONOutputPrivatePtr radeon_output; - int o, c; - uint32_t pll_use_mask = 0; - Bool is_dp = FALSE; - - if (IS_DCE4_VARIANT) { - for (o = 0; o < xf86_config->num_output; o++) { - output = xf86_config->output[o]; - if (output->crtc == crtc) { - int mode = atombios_get_encoder_mode(output); - radeon_output = output->driver_private; - - if (mode == ATOM_ENCODER_MODE_DP) { - is_dp = TRUE; - break; - } else { - for (c = 0; c < xf86_config->num_crtc; c++) { - xf86CrtcPtr test_crtc = xf86_config->crtc[c]; - RADEONCrtcPrivatePtr radeon_test_crtc = test_crtc->driver_private; - - if (crtc != test_crtc && (radeon_test_crtc->pll_id >= 0)) - pll_use_mask |= (1 << radeon_test_crtc->pll_id); - - } - } - } - } - /* DP clock comes from DCPLL, DP PHY CLK comes from ext source - * setting ATOM_PPLL_INVALID skips the PPLL programming for DP - */ - if (is_dp) - radeon_crtc->pll_id = ATOM_PPLL_INVALID; - else if (!(pll_use_mask & 1)) - radeon_crtc->pll_id = ATOM_PPLL1; - else - radeon_crtc->pll_id = ATOM_PPLL2; - } else - radeon_crtc->pll_id = radeon_crtc->crtc_id; - - ErrorF("Picked PLL %d\n", radeon_crtc->pll_id); - - for (o = 0; o < xf86_config->num_output; o++) { - output = xf86_config->output[o]; - if (output->crtc == crtc) { - radeon_output = output->driver_private; - radeon_output->pll_id = radeon_crtc->pll_id; - } - } -} - -union adjust_pixel_clock { - ADJUST_DISPLAY_PLL_PS_ALLOCATION v1; - ADJUST_DISPLAY_PLL_PS_ALLOCATION_V3 v3; -}; - -static uint32_t atombios_adjust_pll(xf86CrtcPtr crtc, DisplayModePtr mode, int *pll_flags_p) -{ - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - ScrnInfoPtr pScrn = crtc->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONInfoPtr info = RADEONPTR(crtc->scrn); xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); - uint32_t adjusted_clock = mode->Clock; + unsigned char *RADEONMMIO = info->MMIO; + int index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); + uint32_t sclock = mode->Clock; + uint32_t ref_div = 0, fb_div = 0, post_div = 0; + int major, minor, i; + SET_PIXEL_CLOCK_PS_ALLOCATION spc_param; + PIXEL_CLOCK_PARAMETERS_V2 *spc2_ptr; + PIXEL_CLOCK_PARAMETERS_V3 *spc3_ptr; + xf86OutputPtr output; RADEONOutputPrivatePtr radeon_output = NULL; radeon_encoder_ptr radeon_encoder = NULL; - xf86OutputPtr output; int pll_flags = 0; - int i; + uint32_t temp; - if (IS_AVIVO_VARIANT) { - if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, TRUE)) - radeon_crtc->pll_algo = RADEON_PLL_NEW; - else - radeon_crtc->pll_algo = RADEON_PLL_OLD; - } else { - if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, FALSE)) - radeon_crtc->pll_algo = RADEON_PLL_NEW; - else - radeon_crtc->pll_algo = RADEON_PLL_OLD; - } + void *ptr; + AtomBiosArgRec data; + unsigned char *space; + memset(&spc_param, 0, sizeof(spc_param)); if (IS_AVIVO_VARIANT) { - if ((info->ChipFamily == CHIP_FAMILY_RS600) || - (info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740)) - pll_flags |= /*RADEON_PLL_USE_FRAC_FB_DIV |*/ - RADEON_PLL_PREFER_CLOSEST_LOWER; - if (IS_DCE32_VARIANT && mode->Clock > 200000) /* range limits??? */ + if (IS_DCE3_VARIANT && mode->Clock > 200000) /* range limits??? */ pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; else pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; + + /* disable spread spectrum clocking for now -- thanks Hedy Lamarr */ + if (radeon_crtc->crtc_id == 0) { + temp = INREG(AVIVO_P1PLL_INT_SS_CNTL); + OUTREG(AVIVO_P1PLL_INT_SS_CNTL, temp & ~1); + } else { + temp = INREG(AVIVO_P2PLL_INT_SS_CNTL); + OUTREG(AVIVO_P2PLL_INT_SS_CNTL, temp & ~1); + } } else { pll_flags |= RADEON_PLL_LEGACY; - if (mode->Clock > 200000) /* range limits??? */ - pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; - else - pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; - } - - for (i = 0; i < xf86_config->num_output; i++) { - output = xf86_config->output[i]; - if (output->crtc == crtc) { - radeon_output = output->driver_private; - radeon_encoder = radeon_get_encoder(output); - if (IS_AVIVO_VARIANT) { - /* DVO wants 2x pixel clock if the DVO chip is in 12 bit mode */ - if (radeon_encoder && - (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1) && - !IS_DCE3_VARIANT) - adjusted_clock *= 2; - if (radeon_output->active_device & - (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT)) { - pll_flags |= RADEON_PLL_PREFER_CLOSEST_LOWER; - radeon_crtc->pll_algo = RADEON_PLL_OLD; - } - } else { + for (i = 0; i < xf86_config->num_output; i++) { + xf86OutputPtr output = xf86_config->output[i]; + RADEONOutputPrivatePtr radeon_output = output->driver_private; + + if (output->crtc == crtc) { if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) pll_flags |= RADEON_PLL_NO_ODD_POST_DIV; if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) pll_flags |= (RADEON_PLL_USE_BIOS_DIVS | RADEON_PLL_USE_REF_DIV); } - if (IS_DCE3_VARIANT) - break; } + + if (mode->Clock > 200000) /* range limits??? */ + pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; + else + pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; } - - if (IS_DCE3_VARIANT) { - union adjust_pixel_clock args; - int major, minor, index; - AtomBiosArgRec data; - unsigned char *space; - memset(&args, 0, sizeof(args)); + RADEONComputePLL(&info->pll, mode->Clock, &temp, &fb_div, &ref_div, &post_div, pll_flags); + sclock = temp; - index = GetIndexIntoMasterTable(COMMAND, AdjustDisplayPll); - - atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); - - data.exec.index = index; - data.exec.dataSpace = (void *)&space; - data.exec.pspace = &args; - - switch(major) { - case 1: - switch(minor) { - case 1: - case 2: - args.v1.usPixelClock = cpu_to_le16(adjusted_clock / 10); - args.v1.ucTransmitterID = radeon_encoder->encoder_id; - args.v1.ucEncodeMode = atombios_get_encoder_mode(output); - - ErrorF("before %d\n", args.v1.usPixelClock); - if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { - adjusted_clock = le16_to_cpu(args.v1.usPixelClock) * 10; - } - ErrorF("after %d\n", args.v1.usPixelClock); - break; - case 3: - args.v3.sInput.usPixelClock = cpu_to_le16(adjusted_clock / 10); - args.v3.sInput.ucTransmitterID = radeon_encoder->encoder_id; - args.v3.sInput.ucEncodeMode = atombios_get_encoder_mode(output); - args.v3.sInput.ucDispPllConfig = 0; - if (radeon_output->coherent_mode || (args.v3.sInput.ucEncodeMode == ATOM_ENCODER_MODE_DP)) - args.v3.sInput.ucDispPllConfig |= DISPPLL_CONFIG_COHERENT_MODE; - if (adjusted_clock > 165000) - args.v3.sInput.ucDispPllConfig |= DISPPLL_CONFIG_DUAL_LINK; - // if SS - // args.v3.sInput.ucDispPllConfig |= DISPPLL_CONFIG_SS_ENABLE; - - ErrorF("before %d 0x%x\n", args.v3.sInput.usPixelClock, args.v3.sInput.ucDispPllConfig); - if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { - adjusted_clock = args.v3.sOutput.ulDispPllFreq * 10; - if (args.v3.sOutput.ucRefDiv) { - pll_flags |= RADEON_PLL_USE_REF_DIV; - info->pll.reference_div = args.v3.sOutput.ucRefDiv; - } - if (args.v3.sOutput.ucPostDiv) { - pll_flags |= RADEON_PLL_USE_POST_DIV; - info->pll.post_div = args.v3.sOutput.ucPostDiv; - } - ErrorF("after %d %d %d\n", args.v3.sOutput.ulDispPllFreq, - args.v3.sOutput.ucRefDiv, args.v3.sOutput.ucPostDiv); - } - break; - default: - ErrorF("%s: Unknown table version %d %d\n", __func__, major, minor); - goto out; - } - break; - default: - ErrorF("%s: Unknown table version %d %d\n", __func__, major, minor); - goto out; - } - } -out: - *pll_flags_p = pll_flags; - return adjusted_clock; -} - -union set_pixel_clock { - SET_PIXEL_CLOCK_PS_ALLOCATION base; - PIXEL_CLOCK_PARAMETERS v1; - PIXEL_CLOCK_PARAMETERS_V2 v2; - PIXEL_CLOCK_PARAMETERS_V3 v3; - PIXEL_CLOCK_PARAMETERS_V5 v5; -}; - -static void -atombios_crtc_set_dcpll(xf86CrtcPtr crtc) -{ - RADEONInfoPtr info = RADEONPTR(crtc->scrn); - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); - xf86OutputPtr output = NULL; - RADEONOutputPrivatePtr radeon_output = NULL; - radeon_encoder_ptr radeon_encoder = NULL; - int index; - int major, minor, i; - union set_pixel_clock args; - AtomBiosArgRec data; - unsigned char *space; - - memset(&args, 0, sizeof(args)); + xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO, + "crtc(%d) Clock: mode %d, PLL %lu\n", + radeon_crtc->crtc_id, mode->Clock, (long unsigned int)sclock * 10); + xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO, + "crtc(%d) PLL : refdiv %u, fbdiv 0x%X(%u), pdiv %u\n", + radeon_crtc->crtc_id, (unsigned int)ref_div, (unsigned int)fb_div, (unsigned int)fb_div, (unsigned int)post_div); + /* Can't really do cloning easily on DCE3 cards */ for (i = 0; i < xf86_config->num_output; i++) { output = xf86_config->output[i]; if (output->crtc == crtc) { @@ -540,121 +345,6 @@ atombios_crtc_set_dcpll(xf86CrtcPtr crtc) return; } - index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); - atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); - - /*ErrorF("table is %d %d\n", major, minor);*/ - switch(major) { - case 1: - switch(minor) { - case 5: - args.v5.ucCRTC = ATOM_CRTC_INVALID; - /* XXX: get this from the firmwareinfo table */ - args.v5.usPixelClock = info->default_dispclk; - args.v5.ucPpll = ATOM_DCPLL; - break; - default: - ErrorF("Unknown table version\n"); - exit(-1); - } - break; - default: - ErrorF("Unknown table version\n"); - exit(-1); - } - - data.exec.index = index; - data.exec.dataSpace = (void *)&space; - data.exec.pspace = &args; - - if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { - ErrorF("Set DCPLL success\n"); - return; - } - - ErrorF("Set DCPLL failed\n"); - return; -} - -static void -atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode) -{ - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - ScrnInfoPtr pScrn = crtc->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int index; - uint32_t sclock; - uint32_t ref_div = 0, fb_div = 0, frac_fb_div = 0, post_div = 0; - int major, minor; - union set_pixel_clock args; - xf86OutputPtr output = NULL; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); - radeon_encoder_ptr radeon_encoder = NULL; - int pll_flags = 0; - uint32_t temp; - AtomBiosArgRec data; - unsigned char *space; - int i; - - memset(&args, 0, sizeof(args)); - - if (IS_DCE4_VARIANT) { - /* XXX 6 crtcs, but only 2 plls */ - switch (radeon_crtc->pll_id) { - case ATOM_PPLL1: - temp = INREG(EVERGREEN_P1PLL_SS_CNTL); - OUTREG(EVERGREEN_P1PLL_SS_CNTL, temp & ~EVERGREEN_PxPLL_SS_EN); - break; - case ATOM_PPLL2: - temp = INREG(EVERGREEN_P2PLL_SS_CNTL); - OUTREG(EVERGREEN_P2PLL_SS_CNTL, temp & ~EVERGREEN_PxPLL_SS_EN); - break; - } - } else { - if (radeon_crtc->crtc_id == 0) { - temp = INREG(AVIVO_P1PLL_INT_SS_CNTL); - OUTREG(AVIVO_P1PLL_INT_SS_CNTL, temp & ~1); - } else { - temp = INREG(AVIVO_P2PLL_INT_SS_CNTL); - OUTREG(AVIVO_P2PLL_INT_SS_CNTL, temp & ~1); - } - } - - if (IS_DCE3_VARIANT) { - for (i = 0; i < xf86_config->num_output; i++) { - output = xf86_config->output[i]; - if (output->crtc == crtc) { - radeon_encoder = radeon_get_encoder(output); - break; - } - } - - if (output->driver_private == NULL) { - xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, "No output assigned to crtc!\n"); - return; - } - if (radeon_encoder == NULL) { - xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, "No encoder assigned to output!\n"); - return; - } - } - - sclock = atombios_adjust_pll(crtc, mode, &pll_flags); - - RADEONComputePLL(crtc, &info->pll, sclock, &temp, - &fb_div, &frac_fb_div, &ref_div, &post_div, pll_flags); - sclock = temp; /* 10 khz */ - - xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO, - "crtc(%d) Clock: mode %d, PLL %lu\n", - radeon_crtc->crtc_id, mode->Clock, (long unsigned int)sclock * 10); - xf86DrvMsg(crtc->scrn->scrnIndex, X_INFO, - "crtc(%d) PLL : refdiv %u, fbdiv 0x%X(%u), fracfbdiv %u, pdiv %u\n", - radeon_crtc->crtc_id, (unsigned int)ref_div, (unsigned int)fb_div, - (unsigned int)fb_div, (unsigned int)frac_fb_div, (unsigned int)post_div); - - index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); /*ErrorF("table is %d %d\n", major, minor);*/ @@ -663,37 +353,28 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode) switch(minor) { case 1: case 2: - args.v2.usPixelClock = cpu_to_le16(mode->Clock / 10); - args.v2.usRefDiv = cpu_to_le16(ref_div); - args.v2.usFbDiv = cpu_to_le16(fb_div); - args.v2.ucFracFbDiv = frac_fb_div; - args.v2.ucPostDiv = post_div; - args.v2.ucPpll = radeon_crtc->pll_id; - args.v2.ucCRTC = radeon_crtc->crtc_id; - args.v2.ucRefDivSrc = 1; + spc2_ptr = (PIXEL_CLOCK_PARAMETERS_V2*)&spc_param.sPCLKInput; + spc2_ptr->usPixelClock = cpu_to_le16(sclock); + spc2_ptr->usRefDiv = cpu_to_le16(ref_div); + spc2_ptr->usFbDiv = cpu_to_le16(fb_div); + spc2_ptr->ucPostDiv = post_div; + spc2_ptr->ucPpll = radeon_crtc->crtc_id ? ATOM_PPLL2 : ATOM_PPLL1; + spc2_ptr->ucCRTC = radeon_crtc->crtc_id; + spc2_ptr->ucRefDivSrc = 1; + ptr = &spc_param; break; case 3: - args.v3.usPixelClock = cpu_to_le16(mode->Clock / 10); - args.v3.usRefDiv = cpu_to_le16(ref_div); - args.v3.usFbDiv = cpu_to_le16(fb_div); - args.v3.ucFracFbDiv = frac_fb_div; - args.v3.ucPostDiv = post_div; - args.v3.ucPpll = radeon_crtc->pll_id; - args.v3.ucMiscInfo = (radeon_crtc->crtc_id << 2); - args.v3.ucTransmitterId = radeon_encoder->encoder_id; - args.v3.ucEncoderMode = atombios_get_encoder_mode(output); - break; - case 5: - args.v5.ucCRTC = radeon_crtc->crtc_id; - args.v5.usPixelClock = cpu_to_le16(mode->Clock / 10); - args.v5.ucRefDiv = ref_div; - args.v5.usFbDiv = cpu_to_le16(fb_div); - args.v5.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000); - args.v5.ucPostDiv = post_div; - args.v5.ucPpll = radeon_crtc->pll_id; - args.v5.ucMiscInfo = 0; //HDMI depth - args.v5.ucTransmitterID = radeon_encoder->encoder_id; - args.v5.ucEncoderMode = atombios_get_encoder_mode(output); + spc3_ptr = (PIXEL_CLOCK_PARAMETERS_V3*)&spc_param.sPCLKInput; + spc3_ptr->usPixelClock = cpu_to_le16(sclock); + spc3_ptr->usRefDiv = cpu_to_le16(ref_div); + spc3_ptr->usFbDiv = cpu_to_le16(fb_div); + spc3_ptr->ucPostDiv = post_div; + spc3_ptr->ucPpll = radeon_crtc->crtc_id ? ATOM_PPLL2 : ATOM_PPLL1; + spc3_ptr->ucMiscInfo = (radeon_crtc->crtc_id << 2); + spc3_ptr->ucTransmitterId = radeon_encoder->encoder_id; + spc3_ptr->ucEncoderMode = atombios_get_encoder_mode(output); + + ptr = &spc_param; break; default: ErrorF("Unknown table version\n"); @@ -705,9 +386,9 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode) exit(-1); } - data.exec.index = index; + data.exec.index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); data.exec.dataSpace = (void *)&space; - data.exec.pspace = &args; + data.exec.pspace = ptr; if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { ErrorF("Set CRTC %d PLL success\n", radeon_crtc->crtc_id); @@ -718,263 +399,6 @@ atombios_crtc_set_pll(xf86CrtcPtr crtc, DisplayModePtr mode) return; } -static void evergreen_set_base_format(xf86CrtcPtr crtc, - DisplayModePtr mode, - DisplayModePtr adjusted_mode, - int x, int y) -{ - ScrnInfoPtr pScrn = crtc->scrn; - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - uint64_t fb_location = crtc->scrn->fbOffset + info->fbLocation; - uint32_t fb_format; - uint32_t fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_NONE); - - switch (crtc->scrn->bitsPerPixel) { - case 15: - fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | - EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB1555)); - break; - case 16: - fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_16BPP) | - EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB565)); -#if X_BYTE_ORDER == X_BIG_ENDIAN - fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN16); -#endif - break; - case 24: - case 32: - fb_format = (EVERGREEN_GRPH_DEPTH(EVERGREEN_GRPH_DEPTH_32BPP) | - EVERGREEN_GRPH_FORMAT(EVERGREEN_GRPH_FORMAT_ARGB8888)); -#if X_BYTE_ORDER == X_BIG_ENDIAN - fb_swap = EVERGREEN_GRPH_ENDIAN_SWAP(EVERGREEN_GRPH_ENDIAN_8IN32); -#endif - break; - default: - FatalError("Unsupported screen depth: %d\n", xf86GetDepth()); - } - - switch (radeon_crtc->crtc_id) { - case 0: - default: - OUTREG(AVIVO_D1VGA_CONTROL, 0); - break; - case 1: - OUTREG(AVIVO_D2VGA_CONTROL, 0); - break; - case 2: - OUTREG(EVERGREEN_D3VGA_CONTROL, 0); - break; - case 3: - OUTREG(EVERGREEN_D4VGA_CONTROL, 0); - break; - case 4: - OUTREG(EVERGREEN_D5VGA_CONTROL, 0); - break; - case 5: - OUTREG(EVERGREEN_D6VGA_CONTROL, 0); - break; - } - - /* setup fb format and location - */ - if (crtc->rotatedData != NULL) { - /* x/y offset is already included */ - x = 0; - y = 0; - fb_location = fb_location + (char *)crtc->rotatedData - (char *)info->FB; - } - - - OUTREG(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, - (fb_location >> 32) & 0xf); - OUTREG(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, - (fb_location >> 32) & 0xf); - OUTREG(EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, - fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK); - OUTREG(EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, - fb_location & EVERGREEN_GRPH_SURFACE_ADDRESS_MASK); - OUTREG(EVERGREEN_GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); - OUTREG(EVERGREEN_GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap); - - OUTREG(EVERGREEN_GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_GRPH_X_START + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_GRPH_Y_START + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_GRPH_X_END + radeon_crtc->crtc_offset, info->virtualX); - OUTREG(EVERGREEN_GRPH_Y_END + radeon_crtc->crtc_offset, info->virtualY); - OUTREG(EVERGREEN_GRPH_PITCH + radeon_crtc->crtc_offset, - crtc->scrn->displayWidth); - OUTREG(EVERGREEN_GRPH_ENABLE + radeon_crtc->crtc_offset, 1); - - OUTREG(EVERGREEN_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, mode->VDisplay); - x &= ~3; - y &= ~1; - OUTREG(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, (x << 16) | y); - OUTREG(EVERGREEN_VIEWPORT_SIZE + radeon_crtc->crtc_offset, (mode->HDisplay << 16) | mode->VDisplay); - - if (adjusted_mode->Flags & V_INTERLACE) - OUTREG(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, EVERGREEN_INTERLEAVE_EN); - else - OUTREG(EVERGREEN_DATA_FORMAT + radeon_crtc->crtc_offset, 0); - -} - -static void avivo_set_base_format(xf86CrtcPtr crtc, - DisplayModePtr mode, - DisplayModePtr adjusted_mode, - int x, int y) -{ - ScrnInfoPtr pScrn = crtc->scrn; - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - uint64_t fb_location = crtc->scrn->fbOffset + info->fbLocation; - uint32_t fb_format; -#if X_BYTE_ORDER == X_BIG_ENDIAN - uint32_t fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; -#endif - - switch (crtc->scrn->bitsPerPixel) { - case 15: - fb_format = AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | AVIVO_D1GRPH_CONTROL_16BPP_ARGB1555; - break; - case 16: - fb_format = AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | AVIVO_D1GRPH_CONTROL_16BPP_RGB565; -#if X_BYTE_ORDER == X_BIG_ENDIAN - fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT; -#endif - break; - case 24: - case 32: - fb_format = AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888; -#if X_BYTE_ORDER == X_BIG_ENDIAN - fb_swap = R600_D1GRPH_SWAP_ENDIAN_32BIT; -#endif - break; - default: - FatalError("Unsupported screen depth: %d\n", xf86GetDepth()); - } - - if (info->tilingEnabled && (crtc->rotatedData == NULL)) { - fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE; - } - - if (radeon_crtc->crtc_id == 0) - OUTREG(AVIVO_D1VGA_CONTROL, 0); - else - OUTREG(AVIVO_D2VGA_CONTROL, 0); - - /* setup fb format and location - */ - if (crtc->rotatedData != NULL) { - /* x/y offset is already included */ - x = 0; - y = 0; - fb_location = fb_location + (char *)crtc->rotatedData - (char *)info->FB; - } - - if (info->ChipFamily >= CHIP_FAMILY_RV770) { - if (radeon_crtc->crtc_id) { - OUTREG(R700_D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, (fb_location >> 32) & 0xf); - OUTREG(R700_D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, (fb_location >> 32) & 0xf); - } else { - OUTREG(R700_D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, (fb_location >> 32) & 0xf); - OUTREG(R700_D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, (fb_location >> 32) & 0xf); - } - } - OUTREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, - fb_location & 0xffffffff); - OUTREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, - fb_location & 0xffffffff); - OUTREG(AVIVO_D1GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); - -#if X_BYTE_ORDER == X_BIG_ENDIAN - if (info->ChipFamily >= CHIP_FAMILY_R600) - OUTREG(R600_D1GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap); -#endif - - OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); - OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); - OUTREG(AVIVO_D1GRPH_X_START + radeon_crtc->crtc_offset, 0); - OUTREG(AVIVO_D1GRPH_Y_START + radeon_crtc->crtc_offset, 0); - OUTREG(AVIVO_D1GRPH_X_END + radeon_crtc->crtc_offset, info->virtualX); - OUTREG(AVIVO_D1GRPH_Y_END + radeon_crtc->crtc_offset, info->virtualY); - OUTREG(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, - crtc->scrn->displayWidth); - OUTREG(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1); - - OUTREG(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, mode->VDisplay); - x &= ~3; - y &= ~1; - OUTREG(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, (x << 16) | y); - OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, - (mode->HDisplay << 16) | mode->VDisplay); - - if (mode->Flags & V_INTERLACE) - OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, - AVIVO_D1MODE_INTERLEAVE_EN); - else - OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, 0); -} - -static void legacy_set_base_format(xf86CrtcPtr crtc, - DisplayModePtr mode, - DisplayModePtr adjusted_mode, - int x, int y) -{ - ScrnInfoPtr pScrn = crtc->scrn; - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int format = 0; - uint32_t crtc_gen_cntl, crtc2_gen_cntl, crtc_pitch; - - RADEONInitCommonRegisters(info->ModeReg, info); - RADEONInitSurfaceCntl(crtc, info->ModeReg); - RADEONRestoreCommonRegisters(pScrn, info->ModeReg); - - switch (info->CurrentLayout.pixel_code) { - case 4: format = 1; break; - case 8: format = 2; break; - case 15: format = 3; break; /* 555 */ - case 16: format = 4; break; /* 565 */ - case 24: format = 5; break; /* RGB */ - case 32: format = 6; break; /* xRGB */ - default: - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Unsupported pixel depth (%d)\n", - info->CurrentLayout.bitsPerPixel); - } - - crtc_pitch = (((pScrn->displayWidth * pScrn->bitsPerPixel) + - ((pScrn->bitsPerPixel * 8) -1)) / - (pScrn->bitsPerPixel * 8)); - crtc_pitch |= crtc_pitch << 16; - - switch (radeon_crtc->crtc_id) { - case 0: - crtc_gen_cntl = INREG(RADEON_CRTC_GEN_CNTL) & 0xfffff0ff; - crtc_gen_cntl |= (format << 8); - OUTREG(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl); - OUTREG(RADEON_CRTC_PITCH, crtc_pitch); - RADEONInitCrtcBase(crtc, info->ModeReg, x, y); - RADEONRestoreCrtcBase(pScrn, info->ModeReg); - break; - case 1: - crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL) & 0xfffff0ff; - crtc2_gen_cntl |= (format << 8); - OUTREG(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); - OUTREG(RADEON_CRTC2_PITCH, crtc_pitch); - RADEONInitCrtc2Base(crtc, info->ModeReg, x, y); - RADEONRestoreCrtc2Base(pScrn, info->ModeReg); - OUTREG(RADEON_FP_H2_SYNC_STRT_WID, INREG(RADEON_CRTC2_H_SYNC_STRT_WID)); - OUTREG(RADEON_FP_V2_SYNC_STRT_WID, INREG(RADEON_CRTC2_V_SYNC_STRT_WID)); - break; - } -} - void atombios_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, @@ -984,37 +408,244 @@ atombios_crtc_mode_set(xf86CrtcPtr crtc, ScrnInfoPtr pScrn = crtc->scrn; RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; RADEONInfoPtr info = RADEONPTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + unsigned long fb_location = crtc->scrn->fbOffset + info->fbLocation; + int need_tv_timings = 0; + int i, ret; + SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION crtc_timing; + SET_CRTC_USING_DTD_TIMING_PARAMETERS crtc_dtd_timing; Bool tilingChanged = FALSE; + memset(&crtc_timing, 0, sizeof(crtc_timing)); + memset(&crtc_dtd_timing, 0, sizeof(crtc_dtd_timing)); if (info->allowColorTiling) { - radeon_crtc->can_tile = (mode->Flags & (V_DBLSCAN | V_INTERLACE)) ? FALSE : TRUE; + radeon_crtc->can_tile = (adjusted_mode->Flags & (V_DBLSCAN | V_INTERLACE)) ? FALSE : TRUE; tilingChanged = RADEONSetTiling(pScrn); } + for (i = 0; i < xf86_config->num_output; i++) { + xf86OutputPtr output = xf86_config->output[i]; + RADEONOutputPrivatePtr radeon_output = output->driver_private; + radeon_tvout_ptr tvout = &radeon_output->tvout; + + if (output->crtc == crtc) { + if (radeon_output->MonType == MT_STV || radeon_output->MonType == MT_CTV) { + if (tvout->tvStd == TV_STD_NTSC || + tvout->tvStd == TV_STD_NTSC_J || + tvout->tvStd == TV_STD_PAL_M) + need_tv_timings = 1; + else + need_tv_timings = 2; + + } + } + } + + crtc_timing.ucCRTC = radeon_crtc->crtc_id; + if (need_tv_timings) { + ret = RADEONATOMGetTVTimings(pScrn, need_tv_timings - 1, &crtc_timing, &adjusted_mode->Clock); + if (ret == FALSE) { + need_tv_timings = 0; + } + } + + if (!need_tv_timings) { + crtc_timing.usH_Total = adjusted_mode->CrtcHTotal; + crtc_timing.usH_Disp = adjusted_mode->CrtcHDisplay; + crtc_timing.usH_SyncStart = adjusted_mode->CrtcHSyncStart; + crtc_timing.usH_SyncWidth = adjusted_mode->CrtcHSyncEnd - adjusted_mode->CrtcHSyncStart; + + crtc_timing.usV_Total = adjusted_mode->CrtcVTotal; + crtc_timing.usV_Disp = adjusted_mode->CrtcVDisplay; + crtc_timing.usV_SyncStart = adjusted_mode->CrtcVSyncStart; + crtc_timing.usV_SyncWidth = adjusted_mode->CrtcVSyncEnd - adjusted_mode->CrtcVSyncStart; + + if (adjusted_mode->Flags & V_NVSYNC) + crtc_timing.susModeMiscInfo.usAccess |= ATOM_VSYNC_POLARITY; + + if (adjusted_mode->Flags & V_NHSYNC) + crtc_timing.susModeMiscInfo.usAccess |= ATOM_HSYNC_POLARITY; + + if (adjusted_mode->Flags & V_CSYNC) + crtc_timing.susModeMiscInfo.usAccess |= ATOM_COMPOSITESYNC; + + if (adjusted_mode->Flags & V_INTERLACE) + crtc_timing.susModeMiscInfo.usAccess |= ATOM_INTERLACE; + + if (adjusted_mode->Flags & V_DBLSCAN) + crtc_timing.susModeMiscInfo.usAccess |= ATOM_DOUBLE_CLOCK_MODE; + + if (!IS_AVIVO_VARIANT && (radeon_crtc->crtc_id == 0)) { + crtc_dtd_timing.ucCRTC = radeon_crtc->crtc_id; + crtc_dtd_timing.usH_Size = adjusted_mode->CrtcHDisplay; + crtc_dtd_timing.usV_Size = adjusted_mode->CrtcVDisplay; + crtc_dtd_timing.usH_Blanking_Time = adjusted_mode->CrtcHBlankEnd - adjusted_mode->CrtcHDisplay; + crtc_dtd_timing.usV_Blanking_Time = adjusted_mode->CrtcVBlankEnd - adjusted_mode->CrtcVDisplay; + crtc_dtd_timing.usH_SyncOffset = adjusted_mode->CrtcHSyncStart - adjusted_mode->CrtcHDisplay; + crtc_dtd_timing.usV_SyncOffset = adjusted_mode->CrtcVSyncStart - adjusted_mode->CrtcVDisplay; + crtc_dtd_timing.usH_SyncWidth = adjusted_mode->CrtcHSyncEnd - adjusted_mode->CrtcHSyncStart; + crtc_dtd_timing.usV_SyncWidth = adjusted_mode->CrtcVSyncEnd - adjusted_mode->CrtcVSyncStart; + ErrorF("%d %d %d %d %d %d %d %d\n", crtc_dtd_timing.usH_Size, crtc_dtd_timing.usH_SyncOffset, + crtc_dtd_timing.usH_SyncWidth, crtc_dtd_timing.usH_Blanking_Time, + crtc_dtd_timing.usV_Size, crtc_dtd_timing.usV_SyncOffset, + crtc_dtd_timing.usV_SyncWidth, crtc_dtd_timing.usV_Blanking_Time); + + if (adjusted_mode->Flags & V_NVSYNC) + crtc_dtd_timing.susModeMiscInfo.usAccess |= ATOM_VSYNC_POLARITY; + + if (adjusted_mode->Flags & V_NHSYNC) + crtc_dtd_timing.susModeMiscInfo.usAccess |= ATOM_HSYNC_POLARITY; + + if (adjusted_mode->Flags & V_CSYNC) + crtc_dtd_timing.susModeMiscInfo.usAccess |= ATOM_COMPOSITESYNC; + + if (adjusted_mode->Flags & V_INTERLACE) + crtc_dtd_timing.susModeMiscInfo.usAccess |= ATOM_INTERLACE; + + if (adjusted_mode->Flags & V_DBLSCAN) + crtc_dtd_timing.susModeMiscInfo.usAccess |= ATOM_DOUBLE_CLOCK_MODE; + } + } + ErrorF("Mode %dx%d - %d %d %d\n", adjusted_mode->CrtcHDisplay, adjusted_mode->CrtcVDisplay, adjusted_mode->CrtcHTotal, adjusted_mode->CrtcVTotal, adjusted_mode->Flags); RADEONInitMemMapRegisters(pScrn, info->ModeReg, info); RADEONRestoreMemMapRegisters(pScrn, info->ModeReg); - if (IS_DCE4_VARIANT) - atombios_crtc_set_dcpll(crtc); - atombios_pick_pll(crtc); atombios_crtc_set_pll(crtc, adjusted_mode); - if (IS_DCE4_VARIANT) - atombios_set_crtc_dtd_timing(crtc, adjusted_mode); - else { - atombios_set_crtc_timing(crtc, adjusted_mode); - if (!IS_AVIVO_VARIANT && (radeon_crtc->crtc_id == 0)) - atombios_set_crtc_dtd_timing(crtc, adjusted_mode); - } + atombios_set_crtc_timing(info->atomBIOS, &crtc_timing); + if (!IS_AVIVO_VARIANT && (radeon_crtc->crtc_id == 0)) + atombios_set_crtc_dtd_timing(info->atomBIOS, &crtc_dtd_timing); - if (IS_DCE4_VARIANT) - evergreen_set_base_format(crtc, mode, adjusted_mode, x, y); - else if (IS_AVIVO_VARIANT) - avivo_set_base_format(crtc, mode, adjusted_mode, x, y); - else - legacy_set_base_format(crtc, mode, adjusted_mode, x, y); + if (IS_AVIVO_VARIANT) { + uint32_t fb_format; +#if X_BYTE_ORDER == X_BIG_ENDIAN + uint32_t fb_swap = R600_D1GRPH_SWAP_ENDIAN_NONE; +#endif + + switch (crtc->scrn->bitsPerPixel) { + case 15: + fb_format = AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | AVIVO_D1GRPH_CONTROL_16BPP_ARGB1555; + break; + case 16: + fb_format = AVIVO_D1GRPH_CONTROL_DEPTH_16BPP | AVIVO_D1GRPH_CONTROL_16BPP_RGB565; +#if X_BYTE_ORDER == X_BIG_ENDIAN + fb_swap = R600_D1GRPH_SWAP_ENDIAN_16BIT; +#endif + break; + case 24: + case 32: + fb_format = AVIVO_D1GRPH_CONTROL_DEPTH_32BPP | AVIVO_D1GRPH_CONTROL_32BPP_ARGB8888; +#if X_BYTE_ORDER == X_BIG_ENDIAN + fb_swap = R600_D1GRPH_SWAP_ENDIAN_32BIT; +#endif + break; + default: + FatalError("Unsupported screen depth: %d\n", xf86GetDepth()); + } + + if (info->tilingEnabled && (crtc->rotatedData == NULL)) { + fb_format |= AVIVO_D1GRPH_MACRO_ADDRESS_MODE; + } + + if (radeon_crtc->crtc_id == 0) + OUTREG(AVIVO_D1VGA_CONTROL, 0); + else + OUTREG(AVIVO_D2VGA_CONTROL, 0); + + /* setup fb format and location + */ + if (crtc->rotatedData != NULL) { + /* x/y offset is already included */ + x = 0; + y = 0; + fb_location = fb_location + (char *)crtc->rotatedData - (char *)info->FB; + } + + OUTREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, fb_location); + OUTREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS + radeon_crtc->crtc_offset, fb_location); + OUTREG(AVIVO_D1GRPH_CONTROL + radeon_crtc->crtc_offset, fb_format); + +#if X_BYTE_ORDER == X_BIG_ENDIAN + if (info->ChipFamily >= CHIP_FAMILY_R600) + OUTREG(R600_D1GRPH_SWAP_CONTROL + radeon_crtc->crtc_offset, fb_swap); +#endif + + OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_X + radeon_crtc->crtc_offset, 0); + OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y + radeon_crtc->crtc_offset, 0); + OUTREG(AVIVO_D1GRPH_X_START + radeon_crtc->crtc_offset, 0); + OUTREG(AVIVO_D1GRPH_Y_START + radeon_crtc->crtc_offset, 0); + OUTREG(AVIVO_D1GRPH_X_END + radeon_crtc->crtc_offset, info->virtualX); + OUTREG(AVIVO_D1GRPH_Y_END + radeon_crtc->crtc_offset, info->virtualY); + OUTREG(AVIVO_D1GRPH_PITCH + radeon_crtc->crtc_offset, + crtc->scrn->displayWidth); + OUTREG(AVIVO_D1GRPH_ENABLE + radeon_crtc->crtc_offset, 1); + + OUTREG(AVIVO_D1MODE_DESKTOP_HEIGHT + radeon_crtc->crtc_offset, mode->VDisplay); + x &= ~3; + y &= ~1; + OUTREG(AVIVO_D1MODE_VIEWPORT_START + radeon_crtc->crtc_offset, (x << 16) | y); + OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE + radeon_crtc->crtc_offset, + (mode->HDisplay << 16) | mode->VDisplay); + + if (adjusted_mode->Flags & V_INTERLACE) + OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, + AVIVO_D1MODE_INTERLEAVE_EN); + else + OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, + 0); + } else { + int format = 0; + uint32_t crtc_gen_cntl, crtc2_gen_cntl, crtc_pitch; + + + RADEONInitCommonRegisters(info->ModeReg, info); + RADEONInitSurfaceCntl(crtc, info->ModeReg); + ErrorF("restore common\n"); + RADEONRestoreCommonRegisters(pScrn, info->ModeReg); + + switch (info->CurrentLayout.pixel_code) { + case 4: format = 1; break; + case 8: format = 2; break; + case 15: format = 3; break; /* 555 */ + case 16: format = 4; break; /* 565 */ + case 24: format = 5; break; /* RGB */ + case 32: format = 6; break; /* xRGB */ + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unsupported pixel depth (%d)\n", + info->CurrentLayout.bitsPerPixel); + } + + crtc_pitch = (((pScrn->displayWidth * pScrn->bitsPerPixel) + + ((pScrn->bitsPerPixel * 8) -1)) / + (pScrn->bitsPerPixel * 8)); + crtc_pitch |= crtc_pitch << 16; + + switch (radeon_crtc->crtc_id) { + case 0: + ErrorF("init crtc1\n"); + crtc_gen_cntl = INREG(RADEON_CRTC_GEN_CNTL) & 0xfffff0ff; + crtc_gen_cntl |= (format << 8); + OUTREG(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl); + OUTREG(RADEON_CRTC_PITCH, crtc_pitch); + RADEONInitCrtcBase(crtc, info->ModeReg, x, y); + RADEONRestoreCrtcBase(pScrn, info->ModeReg); + break; + case 1: + crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL) & 0xfffff0ff; + crtc2_gen_cntl |= (format << 8); + OUTREG(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); + OUTREG(RADEON_CRTC2_PITCH, crtc_pitch); + RADEONInitCrtc2Base(crtc, info->ModeReg, x, y); + RADEONRestoreCrtc2Base(pScrn, info->ModeReg); + OUTREG(RADEON_FP_H2_SYNC_STRT_WID, INREG(RADEON_CRTC2_H_SYNC_STRT_WID)); + OUTREG(RADEON_FP_V2_SYNC_STRT_WID, INREG(RADEON_CRTC2_V_SYNC_STRT_WID)); + break; + } + } if (info->DispPriority) RADEONInitDispBandwidth(pScrn); @@ -1045,10 +676,9 @@ RADEONInitDispBandwidthAVIVO(ScrnInfoPtr pScrn, unsigned char *RADEONMMIO = info->MMIO; uint32_t dc_lb_memory_split; - float available_bandwidth = 0; - float read_delay_latency = 1000; - int i; - Bool sideport = FALSE; + float mem_bw, peak_disp_bw; + float min_mem_eff = 0.8; /* XXX: taken from legacy method */ + float pix_clk, pix_clk2; /* in MHz */ /* * Set display0/1 priority up in the memory controller for @@ -1059,8 +689,7 @@ RADEONInitDispBandwidthAVIVO(ScrnInfoPtr pScrn, uint32_t mc_init_misc_lat_timer = 0; if (info->ChipFamily == CHIP_FAMILY_RV515) mc_init_misc_lat_timer = INMC(pScrn, RV515_MC_INIT_MISC_LAT_TIMER); - else if ((info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740)) + else if (info->ChipFamily == CHIP_FAMILY_RS690) mc_init_misc_lat_timer = INMC(pScrn, RS690_MC_INIT_MISC_LAT_TIMER); mc_init_misc_lat_timer &= ~(R300_MC_DISP1R_INIT_LAT_MASK << R300_MC_DISP1R_INIT_LAT_SHIFT); @@ -1073,11 +702,33 @@ RADEONInitDispBandwidthAVIVO(ScrnInfoPtr pScrn, if (info->ChipFamily == CHIP_FAMILY_RV515) OUTMC(pScrn, RV515_MC_INIT_MISC_LAT_TIMER, mc_init_misc_lat_timer); - else if ((info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740)) + else if (info->ChipFamily == CHIP_FAMILY_RS690) OUTMC(pScrn, RS690_MC_INIT_MISC_LAT_TIMER, mc_init_misc_lat_timer); } + /* XXX: fix me for AVIVO + * Determine if there is enough bandwidth for current display mode + */ + mem_bw = info->mclk * (info->RamWidth / 8) * (info->IsDDR ? 2 : 1); + + pix_clk = 0; + pix_clk2 = 0; + peak_disp_bw = 0; + if (mode1) { + pix_clk = mode1->Clock/1000.0; + peak_disp_bw += (pix_clk * pixel_bytes1); + } + if (mode2) { + pix_clk2 = mode2->Clock/1000.0; + peak_disp_bw += (pix_clk2 * pixel_bytes2); + } + + if (peak_disp_bw >= mem_bw * min_mem_eff) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "You may not have enough display bandwidth for current mode\n" + "If you have flickering problem, try to lower resolution, refresh rate, or color depth\n"); + } + /* * Line Buffer Setup * There is a single line buffer shared by both display controllers. @@ -1093,8 +744,10 @@ RADEONInitDispBandwidthAVIVO(ScrnInfoPtr pScrn, * 14:4; D2 allocation follows D1. */ + /* is auto or manual better ? */ dc_lb_memory_split = INREG(AVIVO_DC_LB_MEMORY_SPLIT) & ~AVIVO_DC_LB_MEMORY_SPLIT_MASK; dc_lb_memory_split &= ~AVIVO_DC_LB_MEMORY_SPLIT_SHIFT_MODE; +#if 1 /* auto */ if (mode1 && mode2) { if (mode1->HDisplay > mode2->HDisplay) { @@ -1114,8 +767,7 @@ RADEONInitDispBandwidthAVIVO(ScrnInfoPtr pScrn, } else if (mode2) { dc_lb_memory_split |= AVIVO_DC_LB_MEMORY_SPLIT_D1_1Q_D2_3Q; } - OUTREG(AVIVO_DC_LB_MEMORY_SPLIT, dc_lb_memory_split); -#if 0 +#else /* manual */ dc_lb_memory_split |= AVIVO_DC_LB_MEMORY_SPLIT_SHIFT_MODE; dc_lb_memory_split &= ~(AVIVO_DC_LB_DISP1_END_ADR_MASK << AVIVO_DC_LB_DISP1_END_ADR_SHIFT); @@ -1128,414 +780,11 @@ RADEONInitDispBandwidthAVIVO(ScrnInfoPtr pScrn, OUTREG(AVIVO_DC_LB_MEMORY_SPLIT, dc_lb_memory_split); #endif - /* fixme - * Still need to implement the actual watermark calculation - * for rs600. This just allows us to force high display - * priority. + /* + * Watermark setup + * TODO... + * Unforunately, I haven't been able to dig up the avivo watermark programming + * guide yet. -AGD */ - if (info->ChipFamily == CHIP_FAMILY_RS600) { - if (info->DispPriority == 2) { - uint32_t priority_cnt; - - if (mode1) { - priority_cnt = INREG(AVIVO_D1MODE_PRIORITY_A_CNT); - priority_cnt |= AVIVO_DxMODE_PRIORITY_ALWAYS_ON; - OUTREG(AVIVO_D1MODE_PRIORITY_A_CNT, priority_cnt); - - priority_cnt = INREG(AVIVO_D1MODE_PRIORITY_B_CNT); - priority_cnt |= AVIVO_DxMODE_PRIORITY_ALWAYS_ON; - OUTREG(AVIVO_D1MODE_PRIORITY_B_CNT, priority_cnt); - } - - if (mode2) { - priority_cnt = INREG(AVIVO_D2MODE_PRIORITY_A_CNT); - priority_cnt |= AVIVO_DxMODE_PRIORITY_ALWAYS_ON; - OUTREG(AVIVO_D2MODE_PRIORITY_A_CNT, priority_cnt); - - priority_cnt = INREG(AVIVO_D2MODE_PRIORITY_B_CNT); - priority_cnt |= AVIVO_DxMODE_PRIORITY_ALWAYS_ON; - OUTREG(AVIVO_D2MODE_PRIORITY_B_CNT, priority_cnt); - } - } - return; - } - - /* IGP bandwidth - get from integrated systems table - * SYSTEM_MEMORY_BANDWIDTH (Mbyte/s) = SYSTEM_MEMORY_CLOCK (MHz) * (1+DDR) * 8 * EFF * Num of channels - * SIDEPORT_MEMORY_BANDWIDTH = SIDEPORT_MEMORY_CLOCK * 2(byte) * 2(DDR) * 0.7(Eff) - * CORE_CLOCK_BANDWIDTH (Mbyte/s) = SCLK (MHz) * 16 / Dynamic Engine clock Divider - * HT_LINK_BANDWIDTH = HT_LINK_CLOCK * 2 * HT_LINK_WIDTH/8 * HT_LINK_EFF - * system read delay - * READ_DLY_MAX_LATENCY: 5000 ns - * sideport read delay - * READ_DLY_MAX_LATENCY: 370 * MCLK + 800 ns - * MCLK is the sideport memory clock period in ns (MCLK = 1000 / MCLKfreq MHz) - */ - - if (info->IsIGP) { - float core_clock_bandwidth = ((float)info->pm.mode[info->pm.current_mode].sclk / 100) * 16 / 1; - - if (sideport) { - float sideport_memory_bandwidth = (info->igp_sideport_mclk / 2) * 2 * 2 * 0.7; - float mclk = 1000 / info->igp_sideport_mclk; - read_delay_latency = 370 * mclk * 800; - available_bandwidth = MIN(sideport_memory_bandwidth, core_clock_bandwidth); - } else { - float system_memory_bandwidth = (info->igp_system_mclk / 2) * (1 + 1) * 8 * 0.5 * 1; - float ht_link_bandwidth = info->igp_ht_link_clk * 2 * (info->igp_ht_link_width / 8) * 0.8; - read_delay_latency = 5000; - available_bandwidth = MIN(system_memory_bandwidth, MIN(ht_link_bandwidth, core_clock_bandwidth)); - } - } - - /* calculate for each display */ - for (i = 0; i < 2; i++) { - DisplayModePtr current = NULL; - //RADEONCrtcPrivatePtr radeon_crtc = pRADEONEnt->Controller[i]; - float pclk, sclk, sclkfreq = 0; - float consumption_time, consumption_rate; - int num_line_pair, request_fifo_depth, lb_request_fifo_depth; - int max_req; - uint32_t lb_max_req_outstanding, priority_cnt; - float line_time, active_time, chunk_time; - float worst_case_latency, tolerable_latency; - float fill_rate; - int priority_mark_max, priority_mark, priority_mark2; - int width, estimated_width; - /* FIXME: handle the scalers better */ - Bool d1_scale_en = pRADEONEnt->Controller[0]->scaler_enabled; - Bool d2_scale_en = pRADEONEnt->Controller[1]->scaler_enabled; - float vtaps1 = 2; /* XXX */ - float vsc1 = pRADEONEnt->Controller[0]->vsc; - float hsc1 = pRADEONEnt->Controller[0]->hsc; - float vtaps2 = 2; /* XXX */ - float vsc2 = pRADEONEnt->Controller[1]->vsc; - float hsc2 = pRADEONEnt->Controller[1]->hsc; - - if (i == 0) - current = mode1; - else - current = mode2; - - if (current == NULL) - continue; - - /* Determine consumption rate - pclk = pixel clock period(ns) - vtaps = number of vertical taps, - vsc = vertical scaling ratio, defined as source/destination - hsc = horizontal scaling ration, defined as source/destination - */ - - pclk = 1000 / ((float)current->Clock / 1000); - - if (i == 0) { - if (d1_scale_en) - consumption_time = pclk / ((MAX(vtaps1, vsc1) * hsc1) / vtaps1); - else - consumption_time = pclk; - } else { - if (d2_scale_en) - consumption_time = pclk / ((MAX(vtaps2, vsc2) * hsc2) / vtaps2); - else - consumption_time = pclk; - } - - consumption_rate = 1 / consumption_time; - - /* Determine request line buffer fifo depth - NumLinePair = Number of line pairs to request(1 = 2 lines, 2 = 4 lines) - LBRequestFifoDepth = Number of chunk requests the LB can put into the request FIFO for a display - width = viewport width in pixels - */ - if (i == 0) { - if (vsc1 > 2) - num_line_pair = 2; - else - num_line_pair = 1; - } else { - if (vsc2 > 2) - num_line_pair = 2; - else - num_line_pair = 1; - } - - width = current->CrtcHDisplay; - request_fifo_depth = ceil(width/256) * num_line_pair; - if (request_fifo_depth < 4) - lb_request_fifo_depth = 4; - else - lb_request_fifo_depth = request_fifo_depth; - - if (info->IsIGP) { - if ((info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740)) - OUTREG(RS690_DCP_CONTROL, 0); - else if ((info->ChipFamily == CHIP_FAMILY_RS780) || - (info->ChipFamily == CHIP_FAMILY_RS880)) - OUTREG(RS690_DCP_CONTROL, 2); - max_req = lb_request_fifo_depth - 1; - } else - max_req = lb_request_fifo_depth; - - /*ErrorF("max_req %d: 0x%x\n", i, max_req);*/ - - lb_max_req_outstanding = INREG(AVIVO_LB_MAX_REQ_OUTSTANDING); - if (i == 0) { - lb_max_req_outstanding &= ~(AVIVO_LB_D1_MAX_REQ_OUTSTANDING_MASK << AVIVO_LB_D1_MAX_REQ_OUTSTANDING_SHIFT); - lb_max_req_outstanding |= (max_req & AVIVO_LB_D1_MAX_REQ_OUTSTANDING_MASK) << AVIVO_LB_D1_MAX_REQ_OUTSTANDING_SHIFT; - } else { - lb_max_req_outstanding &= ~(AVIVO_LB_D2_MAX_REQ_OUTSTANDING_MASK << AVIVO_LB_D2_MAX_REQ_OUTSTANDING_SHIFT); - lb_max_req_outstanding |= (max_req & AVIVO_LB_D2_MAX_REQ_OUTSTANDING_MASK) << AVIVO_LB_D2_MAX_REQ_OUTSTANDING_SHIFT; - } - OUTREG(AVIVO_LB_MAX_REQ_OUTSTANDING, lb_max_req_outstanding); - - /* Determine line time - LineTime = total time for one line of displayhtotal = total number of horizontal pixels - pclk = pixel clock period(ns) - */ - line_time = current->CrtcHTotal * pclk; - - /* Determine active time - ActiveTime = time of active region of display within one line, - hactive = total number of horizontal active pixels - htotal = total number of horizontal pixels - */ - active_time = line_time * current->CrtcHDisplay / current->CrtcHTotal; - - /* Determine chunk time - ChunkTime = the time it takes the DCP to send one chunk of data - to the LB which consists of pipeline delay and inter chunk gap - sclk = system clock(ns) - */ - if (info->IsIGP) { - sclk = 1000 / (available_bandwidth / 16); - /* Sclkfreq = sclk in MHz = 1000/sclk (because sclk is in ns). */ - sclkfreq = 1000 / sclk; - chunk_time = sclk * 256 * 1.3; - } else { - sclk = 1000 / ((float)info->pm.mode[info->pm.current_mode].sclk / 100); - chunk_time = sclk * 600; - } - - /* Determine the worst case latency - NumLinePair = Number of line pairs to request(1 = 2 lines, 2 = 4 lines) - WorstCaseLatency = The worst case time from urgent to when the MC starts - to return data - READ_DELAY_IDLE_MAX = constant of 1us - ChunkTime = the time it takes the DCP to send one chunk of data to the LB - which consists of pipeline delay and - inter chunk gap - */ - if (info->IsIGP) { - if (num_line_pair > 1) - worst_case_latency = read_delay_latency + 3 * chunk_time; - else - worst_case_latency = read_delay_latency + 2 * chunk_time; - } else { - if (num_line_pair > 1) - worst_case_latency = read_delay_latency + 3 * chunk_time; - else - worst_case_latency = read_delay_latency + chunk_time; - } - - /* Determine the tolerable latency - TolerableLatency = Any given request has only 1 line time for the data to be returned - LBRequestFifoDepth = Number of chunk requests the LB can put into the request FIFO for a display - LineTime = total time for one line of display - ChunkTime = the time it takes the DCP to send one chunk of data to the LB which consists of - pipeline delay and inter chunk gap - */ - if ((2 + lb_request_fifo_depth) >= request_fifo_depth) - tolerable_latency = line_time; - else - tolerable_latency = line_time - (request_fifo_depth - lb_request_fifo_depth - 2) * chunk_time; - - if (mode1 && mode2) { - int d1bpp, d2bpp; - int d1_graph_enable = 1; - int d2_graph_enable = 1; - int d1_ovl_enable = 0; - int d2_ovl_enable = 0; - int d1grph_depth, d2grph_depth; - int d1ovl_depth = 0; - int d2ovl_depth = 0; - int d1_num_line_pair, d2_num_line_pair; - float d1_fill_rate_coeff, d2_fill_rate_coeff; - - switch (pixel_bytes1) { - case 2: - d1grph_depth = 1; - break; - case 4: - d1grph_depth = 2; - break; - default: - d1grph_depth = 0; - break; - } - - switch (pixel_bytes2) { - case 2: - d2grph_depth = 1; - break; - case 4: - d2grph_depth = 2; - break; - default: - d2grph_depth = 0; - break; - } - - /* If both displays are active, determine line buffer fill rate */ - if (d1_scale_en && (vsc1 > 2)) - d1_num_line_pair = 2; - else - d1_num_line_pair = 1; - - if (d2_scale_en && (vsc2 > 2)) - d2_num_line_pair = 2; - else - d2_num_line_pair = 1; - - if (info->IsIGP) { - d1bpp = (d1_graph_enable * pow(2, d1grph_depth) * 8) + (d1_ovl_enable * pow(2, d1ovl_depth) * 8); - d2bpp = (d2_graph_enable * pow(2, d2grph_depth) * 8) + (d2_ovl_enable * pow(2, d2ovl_depth) * 8); - - if (d1bpp > 64) - d1_fill_rate_coeff = d1bpp * d1_num_line_pair; - else - d1_fill_rate_coeff = d1_num_line_pair; - - if (d2bpp > 64) - d2_fill_rate_coeff = d2bpp * d2_num_line_pair; - else - d2_fill_rate_coeff = d2_num_line_pair; - - fill_rate = sclkfreq / (d1_fill_rate_coeff + d2_fill_rate_coeff); - } else { - d1bpp = (d1grph_depth + d1ovl_depth) * 16; - d2bpp = (d2grph_depth + d2ovl_depth) * 16; - - if (d1bpp > 64) - d1_fill_rate_coeff = d1bpp / d1_num_line_pair; - else - d1_fill_rate_coeff = d1_num_line_pair; - - if (d2bpp > 64) - d2_fill_rate_coeff = d2bpp / d2_num_line_pair; - else - d2_fill_rate_coeff = d2_num_line_pair; - - fill_rate = sclk / (d1_fill_rate_coeff + d2_fill_rate_coeff); - - /* Convert line buffer fill rate from period to frequency */ - fill_rate = 1 / fill_rate; - } - } else { - int dxbpp; - int dx_grph_enable = 1; - int dx_ovl_enable = 0; - int dxgrph_depth; - int dxovl_depth = 0; - int cpp; - - if (i == 0) - cpp = pixel_bytes1; - else - cpp = pixel_bytes2; - - switch (cpp) { - case 2: - dxgrph_depth = 1; - break; - case 4: - dxgrph_depth = 2; - break; - default: - dxgrph_depth = 0; - break; - } - - /* If only one display active, the line buffer fill rate becomes */ - if (info->IsIGP) { - dxbpp = (dx_grph_enable * pow(2, dxgrph_depth) * 8) + (dx_ovl_enable * pow(2, dxovl_depth) * 8); - if (dxbpp > 64) - fill_rate = sclkfreq / dxbpp / num_line_pair; - else - fill_rate = sclkfreq / num_line_pair; - } else { - dxbpp = (dxgrph_depth + dxovl_depth) * 16; - - if (dxbpp > 64) - fill_rate = sclk / dxbpp / num_line_pair; - else - fill_rate = sclk / num_line_pair; - - /* Convert line buffer fill rate from period to frequency */ - fill_rate = 1 / fill_rate; - } - } - - /* Determine the maximum priority mark - width = viewport width in pixels - */ - priority_mark_max = ceil(width/16); - - /* Determine estimated width */ - estimated_width = (tolerable_latency - worst_case_latency) / consumption_time; - - /* Determine priority mark based on active time */ - if (info->IsIGP) { - if (estimated_width > width) - priority_mark = 10; - else - priority_mark = priority_mark_max - ceil(estimated_width / 16); - } else { - if (estimated_width > width) - priority_mark = priority_mark_max; - else - priority_mark = priority_mark_max - ceil(estimated_width / 16); - } - - /* Determine priority mark 2 based on worst case latency, - consumption rate, fill rate and active time - */ - if (info->IsIGP) { - if (consumption_rate > fill_rate) - priority_mark2 = ceil((worst_case_latency * consumption_rate + (consumption_rate - fill_rate) * active_time) / 1000 / 16); - else - priority_mark2 = ceil(worst_case_latency * consumption_rate / 1000 / 16); - } else { - if (consumption_rate > fill_rate) - priority_mark2 = ceil(worst_case_latency * consumption_rate + (consumption_rate - fill_rate) * active_time / 16); - else - priority_mark2 = ceil(worst_case_latency * consumption_rate / 16); - } - - /* Determine final priority mark and clamp if necessary */ - priority_mark = max(priority_mark, priority_mark2); - if (priority_mark < 0) - priority_mark = 0; - else if (priority_mark > priority_mark_max) - priority_mark = priority_mark_max; - - priority_cnt = priority_mark & AVIVO_DxMODE_PRIORITY_MARK_MASK; - - if (info->DispPriority == 2) - priority_cnt |= AVIVO_DxMODE_PRIORITY_ALWAYS_ON; - - /*ErrorF("priority_mark %d: 0x%x\n", i, priority_mark);*/ - - /* Determine which display to program priority mark for */ - /* FIXME: program DxMODE_PRIORITY_B_CNT for slower sclk */ - if (i == 0) { - OUTREG(AVIVO_D1MODE_PRIORITY_A_CNT, priority_cnt); - OUTREG(AVIVO_D1MODE_PRIORITY_B_CNT, priority_cnt); - } else { - OUTREG(AVIVO_D2MODE_PRIORITY_A_CNT, priority_cnt); - OUTREG(AVIVO_D2MODE_PRIORITY_B_CNT, priority_cnt); - } - } } diff --git a/driver/xf86-video-ati/src/atombios_output.c b/driver/xf86-video-ati/src/atombios_output.c index 85c12e3a0..30ef6418b 100644 --- a/driver/xf86-video-ati/src/atombios_output.c +++ b/driver/xf86-video-ati/src/atombios_output.c @@ -34,7 +34,7 @@ #include "config.h" #endif /* DPMS */ -#ifdef HAVE_XEXTPROTO_71 +#ifdef HAVE_X11_EXTENSIONS_DPMSCONST_H #include #else #define DPMS_SERVER @@ -64,114 +64,6 @@ const char *device_name[12] = { "DFP5", }; -#define AUX_NATIVE_WRITE 0x8 -#define AUX_NATIVE_READ 0x9 - -#define AUX_I2C_WRITE 0x0 -#define AUX_I2C_READ 0x1 -#define AUX_I2C_STATUS 0x2 -#define AUX_I2C_MOT 0x4 - -#define DP_DPCD_REV 0x0 -#define DP_MAX_LINK_RATE 0x1 -#define DP_MAX_LANE_COUNT 0x2 -#define DP_MAX_DOWNSPREAD 0x3 -#define DP_NORP 0x4 -#define DP_DOWNSTREAMPORT_PRESENT 0x5 -#define DP_MAIN_LINK_CHANNEL_CONFIG 0x6 -#define DP_DP11_DOWNSTREAM_PORT_COUNT 0x7 - -/* from intel i830_dp.h */ -#define DP_LINK_BW_SET 0x100 -//# define DP_LINK_BW_1_62 0x06 -//# define DP_LINK_BW_2_7 0x0a -#define DP_LANE_COUNT_SET 0x101 -# define DP_LANE_COUNT_MASK 0x0f -# define DP_LANE_COUNT_ENHANCED_FRAME_EN (1 << 7) - -#define DP_TRAINING_PATTERN_SET 0x102 - -# define DP_TRAINING_PATTERN_DISABLE 0 -# define DP_TRAINING_PATTERN_1 1 -# define DP_TRAINING_PATTERN_2 2 -# define DP_TRAINING_PATTERN_MASK 0x3 - -# define DP_LINK_QUAL_PATTERN_DISABLE (0 << 2) -# define DP_LINK_QUAL_PATTERN_D10_2 (1 << 2) -# define DP_LINK_QUAL_PATTERN_ERROR_RATE (2 << 2) -# define DP_LINK_QUAL_PATTERN_PRBS7 (3 << 2) -# define DP_LINK_QUAL_PATTERN_MASK (3 << 2) -# define DP_RECOVERED_CLOCK_OUT_EN (1 << 4) -# define DP_LINK_SCRAMBLING_DISABLE (1 << 5) - -# define DP_SYMBOL_ERROR_COUNT_BOTH (0 << 6) -# define DP_SYMBOL_ERROR_COUNT_DISPARITY (1 << 6) -# define DP_SYMBOL_ERROR_COUNT_SYMBOL (2 << 6) -# define DP_SYMBOL_ERROR_COUNT_MASK (3 << 6) - -#define DP_TRAINING_LANE0_SET 0x103 -#define DP_TRAINING_LANE1_SET 0x104 -#define DP_TRAINING_LANE2_SET 0x105 -#define DP_TRAINING_LANE3_SET 0x106 -# define DP_TRAIN_VOLTAGE_SWING_MASK 0x3 -# define DP_TRAIN_VOLTAGE_SWING_SHIFT 0 -# define DP_TRAIN_MAX_SWING_REACHED (1 << 2) -# define DP_TRAIN_VOLTAGE_SWING_400 (0 << 0) -# define DP_TRAIN_VOLTAGE_SWING_600 (1 << 0) -# define DP_TRAIN_VOLTAGE_SWING_800 (2 << 0) -# define DP_TRAIN_VOLTAGE_SWING_1200 (3 << 0) - -# define DP_TRAIN_PRE_EMPHASIS_MASK (3 << 3) -# define DP_TRAIN_PRE_EMPHASIS_0 (0 << 3) -# define DP_TRAIN_PRE_EMPHASIS_3_5 (1 << 3) -# define DP_TRAIN_PRE_EMPHASIS_6 (2 << 3) -# define DP_TRAIN_PRE_EMPHASIS_9_5 (3 << 3) - -# define DP_TRAIN_PRE_EMPHASIS_SHIFT 3 -# define DP_TRAIN_MAX_PRE_EMPHASIS_REACHED (1 << 5) -#define DP_DOWNSPREAD_CTRL 0x107 -# define DP_SPREAD_AMP_0_5 (1 << 4) - -#define DP_MAIN_LINK_CHANNEL_CODING_SET 0x108 -# define DP_SET_ANSI_8B10B (1 << 0) - -#define DP_LANE0_1_STATUS 0x202 -#define DP_LANE2_3_STATUS 0x203 - -# define DP_LANE_CR_DONE (1 << 0) -# define DP_LANE_CHANNEL_EQ_DONE (1 << 1) -# define DP_LANE_SYMBOL_LOCKED (1 << 2) - -#define DP_LANE_ALIGN_STATUS_UPDATED 0x204 -#define DP_INTERLANE_ALIGN_DONE (1 << 0) -#define DP_DOWNSTREAM_PORT_STATUS_CHANGED (1 << 6) -#define DP_LINK_STATUS_UPDATED (1 << 7) - -#define DP_SINK_STATUS 0x205 - -#define DP_RECEIVE_PORT_0_STATUS (1 << 0) -#define DP_RECEIVE_PORT_1_STATUS (1 << 1) - -#define DP_ADJUST_REQUEST_LANE0_1 0x206 -#define DP_ADJUST_REQUEST_LANE2_3 0x207 - -#define DP_ADJUST_VOLTAGE_SWING_LANE0_MASK 0x03 -#define DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT 0 -#define DP_ADJUST_PRE_EMPHASIS_LANE0_MASK 0x0c -#define DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT 2 -#define DP_ADJUST_VOLTAGE_SWING_LANE1_MASK 0x30 -#define DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT 4 -#define DP_ADJUST_PRE_EMPHASIS_LANE1_MASK 0xc0 -#define DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT 6 - -#define DP_LINK_STATUS_SIZE 6 -#define DP_LINK_CONFIGURATION_SIZE 9 - -#define DP_SET_POWER_D0 0x1 -#define DP_SET_POWER_D3 0x2 - -static void do_displayport_link_train(xf86OutputPtr output); - static int atombios_output_dac_setup(xf86OutputPtr output, int action) { @@ -515,7 +407,7 @@ atombios_maybe_hdmi_mode(xf86OutputPtr output) { #ifndef EDID_COMPLETE_RAWDATA /* there's no getting this right unless we have complete EDID */ - return ATOM_ENCODER_MODE_DVI; + return ATOM_ENCODER_MODE_HDMI; #else if (output && xf86MonitorIsHDMI(output->MonInfo)) return ATOM_ENCODER_MODE_HDMI; @@ -527,8 +419,6 @@ atombios_maybe_hdmi_mode(xf86OutputPtr output) int atombios_get_encoder_mode(xf86OutputPtr output) { - ScrnInfoPtr pScrn = output->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); RADEONOutputPrivatePtr radeon_output = output->driver_private; /* DVI should really be atombios_maybe_hdmi_mode() as well */ @@ -545,24 +435,16 @@ atombios_get_encoder_mode(xf86OutputPtr output) break; case CONNECTOR_HDMI_TYPE_A: case CONNECTOR_HDMI_TYPE_B: - if (IS_DCE4_VARIANT) - return ATOM_ENCODER_MODE_DVI; - else - return atombios_maybe_hdmi_mode(output); + return atombios_maybe_hdmi_mode(output); break; case CONNECTOR_LVDS: return ATOM_ENCODER_MODE_LVDS; break; case CONNECTOR_DISPLAY_PORT: - case CONNECTOR_EDP: if (radeon_output->MonType == MT_DP) return ATOM_ENCODER_MODE_DP; - else { - if (IS_DCE4_VARIANT) - return ATOM_ENCODER_MODE_DVI; - else - return atombios_maybe_hdmi_mode(output); - } + else + return atombios_maybe_hdmi_mode(output); break; case CONNECTOR_DVI_A: case CONNECTOR_VGA: @@ -581,243 +463,128 @@ atombios_get_encoder_mode(xf86OutputPtr output) } static const int dp_clocks[] = { - 5400, // 1 lane, 1.62 Ghz - 9000, // 1 lane, 2.70 Ghz - 10800, // 2 lane, 1.62 Ghz - 18000, // 2 lane, 2.70 Ghz - 21600, // 4 lane, 1.62 Ghz - 36000, // 4 lane, 2.70 Ghz + 16200, + 27000, + 32400, + 54000, + 0, + 0, + 64800, + 108000, }; static const int num_dp_clocks = sizeof(dp_clocks) / sizeof(int); -# define DP_LINK_BW_1_62 0x06 -# define DP_LINK_BW_2_7 0x0a -static int radeon_dp_max_lane_count(xf86OutputPtr output); - static int -dp_lanes_for_mode_clock(xf86OutputPtr output, int mode_clock) +dp_lanes_for_mode_clock(int mode_clock) { - RADEONOutputPrivatePtr radeon_output = output->driver_private; int i; - int max_link_bw = radeon_output->dpcd[1]; - int max_lane_count = radeon_dp_max_lane_count(output); - - switch (max_link_bw) { - case DP_LINK_BW_1_62: - default: - for (i = 0; i < num_dp_clocks; i++) { - if (i % 2) - continue; - switch (max_lane_count) { - case 1: - if (i > 1) - return 0; - break; - case 2: - if (i > 3) - return 0; - break; - case 4: - default: - break; - } - if (dp_clocks[i] > (mode_clock/10)) { - if (i < 2) - return 1; - else if (i < 4) - return 2; - else - return 4; - } - } - break; - case DP_LINK_BW_2_7: - for (i = 0; i < num_dp_clocks; i++) { - switch (max_lane_count) { - case 1: - if (i > 1) - return 0; - break; - case 2: - if (i > 3) - return 0; - break; - case 4: - default: - break; - } - if (dp_clocks[i] > (mode_clock/10)) { - if (i < 2) - return 1; - else if (i < 4) - return 2; - else - return 4; - } - } - break; - } + + for (i = 0; i < num_dp_clocks; i++) + if (dp_clocks[i] > (mode_clock / 10)) + return (i / 2) + 1; return 0; } static int -dp_link_clock_for_mode_clock(xf86OutputPtr output, int mode_clock) +dp_link_clock_for_mode_clock(int mode_clock) { - RADEONOutputPrivatePtr radeon_output = output->driver_private; int i; - int max_link_bw = radeon_output->dpcd[1]; - int max_lane_count = radeon_dp_max_lane_count(output); - switch (max_link_bw) { - case DP_LINK_BW_1_62: - default: - for (i = 0; i < num_dp_clocks; i++) { - if (i % 2) - continue; - switch (max_lane_count) { - case 1: - if (i > 1) - return 0; - break; - case 2: - if (i > 3) - return 0; - break; - case 4: - default: - break; - } - if (dp_clocks[i] > (mode_clock/10)) - return 16200; - } - break; - case DP_LINK_BW_2_7: - for (i = 0; i < num_dp_clocks; i++) { - switch (max_lane_count) { - case 1: - if (i > 1) - return 0; - break; - case 2: - if (i > 3) - return 0; - break; - case 4: - default: - break; - } - if (dp_clocks[i] > (mode_clock/10)) - return (i % 2) ? 27000 : 16200; - } - break; - } + for (i = 0; i < num_dp_clocks; i++) + if (dp_clocks[i] > (mode_clock / 10)) + return (dp_clocks[i % 2]); return 0; } -/* - * DIG Encoder/Transmitter Setup - * - * DCE 3.0/3.1 - * - 2 DIG transmitter blocks. UNIPHY (links A and B) and LVTMA. - * Supports up to 3 digital outputs - * - 2 DIG encoder blocks. - * DIG1 can drive UNIPHY link A or link B - * DIG2 can drive UNIPHY link B or LVTMA - * - * DCE 3.2 - * - 3 DIG transmitter blocks. UNIPHY0/1/2 (links A and B). - * Supports up to 5 digital outputs - * - 2 DIG encoder blocks. - * DIG1/2 can drive UNIPHY0/1/2 link A or link B - * - * DCE 4.0 - * - 3 DIG transmitter blocks UNPHY0/1/2 (links A and B). - * Supports up to 6 digital outputs - * - 6 DIG encoder blocks. - * - DIG to PHY mapping is hardcoded - * DIG1 drives UNIPHY0 link A, A+B - * DIG2 drives UNIPHY0 link B - * DIG3 drives UNIPHY1 link A, A+B - * DIG4 drives UNIPHY1 link B - * DIG5 drives UNIPHY2 link A, A+B - * DIG6 drives UNIPHY2 link B - * - * Routing - * crtc -> dig encoder -> UNIPHY/LVTMA (1 or 2 links) - * Examples: - * crtc0 -> dig2 -> LVTMA links A+B - * crtc1 -> dig1 -> UNIPHY0 link B - * crtc0 -> dig1 -> UNIPHY2 link A -> LVDS - * crtc1 -> dig2 -> UNIPHY1 link B+A -> TMDS/HDMI - */ - -union dig_encoder_control { - DIG_ENCODER_CONTROL_PS_ALLOCATION v1; - DIG_ENCODER_CONTROL_PARAMETERS_V2 v2; - DIG_ENCODER_CONTROL_PARAMETERS_V3 v3; -}; - static int atombios_output_dig_encoder_setup(xf86OutputPtr output, int action) { RADEONOutputPrivatePtr radeon_output = output->driver_private; RADEONInfoPtr info = RADEONPTR(output->scrn); radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); - union dig_encoder_control disp_data; + DIG_ENCODER_CONTROL_PS_ALLOCATION disp_data; AtomBiosArgRec data; unsigned char *space; - int index = 0, major, minor; + int index = 0, major, minor, num = 0; int clock = radeon_output->pixel_clock; + int dig_block = radeon_output->dig_block; if (radeon_encoder == NULL) return ATOM_NOT_IMPLEMENTED; memset(&disp_data,0, sizeof(disp_data)); - if (IS_DCE4_VARIANT) - index = GetIndexIntoMasterTable(COMMAND, DIGxEncoderControl); - else if (radeon_output->dig_encoder) - index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); - else - index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); - - atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); - - disp_data.v1.ucAction = action; - disp_data.v1.usPixelClock = cpu_to_le16(clock / 10); - disp_data.v1.ucEncoderMode = atombios_get_encoder_mode(output); - - if (disp_data.v1.ucEncoderMode == ATOM_ENCODER_MODE_DP) { - if (dp_link_clock_for_mode_clock(output, clock) == 27000) - disp_data.v1.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; - disp_data.v1.ucLaneNum = dp_lanes_for_mode_clock(output, clock); - } else if (clock > 165000) - disp_data.v1.ucLaneNum = 8; - else - disp_data.v1.ucLaneNum = 4; - - if (IS_DCE4_VARIANT) { - disp_data.v3.acConfig.ucDigSel = radeon_output->dig_encoder; - disp_data.v3.ucBitPerColor = PANEL_8BIT_PER_COLOR; + if (IS_DCE32_VARIANT) { + if (dig_block) + index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); + else + index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); + num = dig_block + 1; } else { switch (radeon_encoder->encoder_id) { case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: - disp_data.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; + index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); + num = 1; break; - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: - disp_data.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER2; - break; - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: - disp_data.v1.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER3; + index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); + num = 2; break; } + } + + atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); + + disp_data.ucAction = action; + disp_data.usPixelClock = cpu_to_le16(clock / 10); + + if (IS_DCE32_VARIANT) { + switch (radeon_encoder->encoder_id) { + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: + disp_data.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER1; + break; + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: + disp_data.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER2; + break; + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: + disp_data.ucConfig = ATOM_ENCODER_CONFIG_V2_TRANSMITTER3; + break; + } + } else { + switch (radeon_encoder->encoder_id) { + case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: + disp_data.ucConfig = ATOM_ENCODER_CONFIG_UNIPHY; + break; + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: + disp_data.ucConfig = ATOM_ENCODER_CONFIG_LVTMA; + break; + } + } + + disp_data.ucEncoderMode = atombios_get_encoder_mode(output); + + if (disp_data.ucEncoderMode == ATOM_ENCODER_MODE_DP) { if (radeon_output->linkb) - disp_data.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKB; + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKB; else - disp_data.v1.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; + + if (dp_link_clock_for_mode_clock(clock) == 27000) + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ; + + disp_data.ucLaneNum = dp_lanes_for_mode_clock(clock); + } else if (clock > 165000) { + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA_B; + disp_data.ucLaneNum = 8; + } else { + if (radeon_output->linkb) + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKB; + else + disp_data.ucConfig |= ATOM_ENCODER_CONFIG_LINKA; + + disp_data.ucLaneNum = 4; } data.exec.index = index; @@ -825,11 +592,11 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, int action) data.exec.pspace = &disp_data; if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { - ErrorF("Output DIG%d encoder setup success\n", radeon_output->dig_encoder); + ErrorF("Output DIG%d encoder setup success\n", num); return ATOM_SUCCESS; } - ErrorF("Output DIG%d setup failed\n", radeon_output->dig_encoder); + ErrorF("Output DIG%d setup failed\n", num); return ATOM_NOT_IMPLEMENTED; } @@ -837,11 +604,10 @@ atombios_output_dig_encoder_setup(xf86OutputPtr output, int action) union dig_transmitter_control { DIG_TRANSMITTER_CONTROL_PS_ALLOCATION v1; DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 v2; - DIG_TRANSMITTER_CONTROL_PARAMETERS_V3 v3; }; static int -atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action, uint8_t lane_num, uint8_t lane_set) +atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action) { RADEONOutputPrivatePtr radeon_output = output->driver_private; RADEONInfoPtr info = RADEONPTR(output->scrn); @@ -852,13 +618,14 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action, uint8_t int index = 0, num = 0; int major, minor; int clock = radeon_output->pixel_clock; + int dig_block = radeon_output->dig_block; if (radeon_encoder == NULL) return ATOM_NOT_IMPLEMENTED; memset(&disp_data,0, sizeof(disp_data)); - if (IS_DCE32_VARIANT || IS_DCE4_VARIANT) + if (IS_DCE32_VARIANT) index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl); else { switch (radeon_encoder->encoder_id) { @@ -874,69 +641,20 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action, uint8_t atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); disp_data.v1.ucAction = action; - if (action == ATOM_TRANSMITTER_ACTION_INIT) { - disp_data.v1.usInitInfo = radeon_output->connector_object_id; - } else if (action == ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH) { - disp_data.v1.asMode.ucLaneSel = lane_num; - disp_data.v1.asMode.ucLaneSet = lane_set; - } else { - if (radeon_output->MonType == MT_DP) - disp_data.v1.usPixelClock = - cpu_to_le16(dp_link_clock_for_mode_clock(output, clock)); - else if (clock > 165000) - disp_data.v1.usPixelClock = cpu_to_le16((clock / 2) / 10); - else - disp_data.v1.usPixelClock = cpu_to_le16(clock / 10); - } - if (IS_DCE4_VARIANT) { - if (radeon_output->MonType == MT_DP) - disp_data.v3.ucLaneNum = dp_lanes_for_mode_clock(output, clock); - else if (clock > 165000) - disp_data.v3.ucLaneNum = 8; - else - disp_data.v3.ucLaneNum = 4; - - if (radeon_output->linkb) { - disp_data.v3.acConfig.ucLinkSel = 1; + if (IS_DCE32_VARIANT) { + if (radeon_output->MonType == MT_DP) { + disp_data.v2.usPixelClock = + cpu_to_le16(dp_link_clock_for_mode_clock(clock)); + disp_data.v2.acConfig.fDPConnector = 1; + } else if (clock > 165000) { + disp_data.v2.usPixelClock = cpu_to_le16((clock * 10 * 2) / 100); + disp_data.v2.acConfig.fDualLinkConnector = 1; + } else { + disp_data.v2.usPixelClock = cpu_to_le16((clock * 10 * 4) / 100); + } + if (dig_block) disp_data.v2.acConfig.ucEncoderSel = 1; - } - - // select the PLL for the UNIPHY - if (radeon_output->MonType == MT_DP && info->dp_extclk) - disp_data.v3.acConfig.ucRefClkSource = 2; /* ext clk */ - else - disp_data.v3.acConfig.ucRefClkSource = radeon_output->pll_id; - - switch (radeon_encoder->encoder_id) { - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: - disp_data.v3.acConfig.ucTransmitterSel = 0; - num = 0; - break; - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: - disp_data.v3.acConfig.ucTransmitterSel = 1; - num = 1; - break; - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: - disp_data.v3.acConfig.ucTransmitterSel = 2; - num = 2; - break; - } - - if (radeon_output->MonType == MT_DP) - disp_data.v3.acConfig.fCoherentMode = 1; /* DP requires coherent */ - else if (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT)) { - if (radeon_output->coherent_mode) - disp_data.v3.acConfig.fCoherentMode = 1; - if (clock > 165000) - disp_data.v3.acConfig.fDualLinkConnector = 1; - } - } else if (IS_DCE32_VARIANT) { - if (radeon_output->dig_encoder) - disp_data.v2.acConfig.ucEncoderSel = 1; - - if (radeon_output->linkb) - disp_data.v2.acConfig.ucLinkSel = 1; switch (radeon_encoder->encoder_id) { case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: @@ -953,31 +671,36 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action, uint8_t break; } - if (radeon_output->MonType == MT_DP) - disp_data.v2.acConfig.fCoherentMode = 1; /* DP requires coherent */ - else if (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT)) { - if (radeon_output->coherent_mode) + if (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT)) { + if (radeon_output->coherent_mode) { disp_data.v2.acConfig.fCoherentMode = 1; - if (clock > 165000) - disp_data.v2.acConfig.fDualLinkConnector = 1; + xf86DrvMsg(output->scrn->scrnIndex, X_INFO, "UNIPHY%d transmitter: Coherent Mode enabled\n",disp_data.v2.acConfig.ucTransmitterSel); + } else + xf86DrvMsg(output->scrn->scrnIndex, X_INFO, "UNIPHY%d transmitter: Coherent Mode disabled\n",disp_data.v2.acConfig.ucTransmitterSel); } } else { disp_data.v1.ucConfig = ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; - if (radeon_output->dig_encoder) - disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; + if (radeon_output->MonType == MT_DP) + disp_data.v1.usPixelClock = + cpu_to_le16(dp_link_clock_for_mode_clock(clock)); else - disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; + disp_data.v1.usPixelClock = cpu_to_le16((clock) / 10); switch (radeon_encoder->encoder_id) { case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; if (info->IsIGP) { if (clock > 165000) { + disp_data.v1.ucConfig |= (ATOM_TRANSMITTER_CONFIG_8LANE_LINK | + ATOM_TRANSMITTER_CONFIG_LINKA_B); + if (radeon_output->igp_lane_info & 0x3) disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_7; else if (radeon_output->igp_lane_info & 0xc) disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_15; } else { + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA; if (radeon_output->igp_lane_info & 0x1) disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3; else if (radeon_output->igp_lane_info & 0x2) @@ -987,21 +710,46 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action, uint8_t else if (radeon_output->igp_lane_info & 0x8) disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_12_15; } + } else { + if (clock > 165000) + disp_data.v1.ucConfig |= (ATOM_TRANSMITTER_CONFIG_8LANE_LINK | + ATOM_TRANSMITTER_CONFIG_LINKA_B | + ATOM_TRANSMITTER_CONFIG_LANE_0_7); + else { + /* XXX */ + if (radeon_output->linkb) + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB | ATOM_TRANSMITTER_CONFIG_LANE_0_3; + else + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA | ATOM_TRANSMITTER_CONFIG_LANE_0_3; + } + } + break; + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; + if (clock > 165000) + disp_data.v1.ucConfig |= (ATOM_TRANSMITTER_CONFIG_8LANE_LINK | + ATOM_TRANSMITTER_CONFIG_LINKA_B | + ATOM_TRANSMITTER_CONFIG_LANE_0_7); + else { + /* XXX */ + if (radeon_output->linkb) + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB | ATOM_TRANSMITTER_CONFIG_LANE_0_3; + else + disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA | ATOM_TRANSMITTER_CONFIG_LANE_0_3; } break; } - if (radeon_output->linkb) - disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB; - else - disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA; - if (radeon_output->MonType == MT_DP) - disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT; /* DP requires coherent */ - else if (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT)) { - if (radeon_output->coherent_mode) + if (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT)) { + if (radeon_output->coherent_mode && + radeon_output->MonType != MT_DP) { disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT; - if (clock > 165000) - disp_data.v1.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK; + xf86DrvMsg(output->scrn->scrnIndex, X_INFO, + "DIG%d transmitter: Coherent Mode enabled\n", num); + } else { + xf86DrvMsg(output->scrn->scrnIndex, X_INFO, + "DIG%d transmitter: Coherent Mode disabled\n", num); + } } } @@ -1022,238 +770,234 @@ atombios_output_dig_transmitter_setup(xf86OutputPtr output, int action, uint8_t } -static void atom_rv515_force_tv_scaler(ScrnInfoPtr pScrn, RADEONCrtcPrivatePtr radeon_crtc) +static void atom_rv515_force_tv_scaler(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - int index_reg = 0x6578, data_reg = 0x657c; - index_reg += radeon_crtc->crtc_offset; - data_reg += radeon_crtc->crtc_offset; - - OUTREG(0x659C + radeon_crtc->crtc_offset, 0x0); - OUTREG(0x6594 + radeon_crtc->crtc_offset, 0x705); - OUTREG(0x65A4 + radeon_crtc->crtc_offset, 0x10001); - OUTREG(0x65D8 + radeon_crtc->crtc_offset, 0x0); - OUTREG(0x65B0 + radeon_crtc->crtc_offset, 0x0); - OUTREG(0x65C0 + radeon_crtc->crtc_offset, 0x0); - OUTREG(0x65D4 + radeon_crtc->crtc_offset, 0x0); - OUTREG(index_reg,0x0); - OUTREG(data_reg,0x841880A8); - OUTREG(index_reg,0x1); - OUTREG(data_reg,0x84208680); - OUTREG(index_reg,0x2); - OUTREG(data_reg,0xBFF880B0); - OUTREG(index_reg,0x100); - OUTREG(data_reg,0x83D88088); - OUTREG(index_reg,0x101); - OUTREG(data_reg,0x84608680); - OUTREG(index_reg,0x102); - OUTREG(data_reg,0xBFF080D0); - OUTREG(index_reg,0x200); - OUTREG(data_reg,0x83988068); - OUTREG(index_reg,0x201); - OUTREG(data_reg,0x84A08680); - OUTREG(index_reg,0x202); - OUTREG(data_reg,0xBFF080F8); - OUTREG(index_reg,0x300); - OUTREG(data_reg,0x83588058); - OUTREG(index_reg,0x301); - OUTREG(data_reg,0x84E08660); - OUTREG(index_reg,0x302); - OUTREG(data_reg,0xBFF88120); - OUTREG(index_reg,0x400); - OUTREG(data_reg,0x83188040); - OUTREG(index_reg,0x401); - OUTREG(data_reg,0x85008660); - OUTREG(index_reg,0x402); - OUTREG(data_reg,0xBFF88150); - OUTREG(index_reg,0x500); - OUTREG(data_reg,0x82D88030); - OUTREG(index_reg,0x501); - OUTREG(data_reg,0x85408640); - OUTREG(index_reg,0x502); - OUTREG(data_reg,0xBFF88180); - OUTREG(index_reg,0x600); - OUTREG(data_reg,0x82A08018); - OUTREG(index_reg,0x601); - OUTREG(data_reg,0x85808620); - OUTREG(index_reg,0x602); - OUTREG(data_reg,0xBFF081B8); - OUTREG(index_reg,0x700); - OUTREG(data_reg,0x82608010); - OUTREG(index_reg,0x701); - OUTREG(data_reg,0x85A08600); - OUTREG(index_reg,0x702); - OUTREG(data_reg,0x800081F0); - OUTREG(index_reg,0x800); - OUTREG(data_reg,0x8228BFF8); - OUTREG(index_reg,0x801); - OUTREG(data_reg,0x85E085E0); - OUTREG(index_reg,0x802); - OUTREG(data_reg,0xBFF88228); - OUTREG(index_reg,0x10000); - OUTREG(data_reg,0x82A8BF00); - OUTREG(index_reg,0x10001); - OUTREG(data_reg,0x82A08CC0); - OUTREG(index_reg,0x10002); - OUTREG(data_reg,0x8008BEF8); - OUTREG(index_reg,0x10100); - OUTREG(data_reg,0x81F0BF28); - OUTREG(index_reg,0x10101); - OUTREG(data_reg,0x83608CA0); - OUTREG(index_reg,0x10102); - OUTREG(data_reg,0x8018BED0); - OUTREG(index_reg,0x10200); - OUTREG(data_reg,0x8148BF38); - OUTREG(index_reg,0x10201); - OUTREG(data_reg,0x84408C80); - OUTREG(index_reg,0x10202); - OUTREG(data_reg,0x8008BEB8); - OUTREG(index_reg,0x10300); - OUTREG(data_reg,0x80B0BF78); - OUTREG(index_reg,0x10301); - OUTREG(data_reg,0x85008C20); - OUTREG(index_reg,0x10302); - OUTREG(data_reg,0x8020BEA0); - OUTREG(index_reg,0x10400); - OUTREG(data_reg,0x8028BF90); - OUTREG(index_reg,0x10401); - OUTREG(data_reg,0x85E08BC0); - OUTREG(index_reg,0x10402); - OUTREG(data_reg,0x8018BE90); - OUTREG(index_reg,0x10500); - OUTREG(data_reg,0xBFB8BFB0); - OUTREG(index_reg,0x10501); - OUTREG(data_reg,0x86C08B40); - OUTREG(index_reg,0x10502); - OUTREG(data_reg,0x8010BE90); - OUTREG(index_reg,0x10600); - OUTREG(data_reg,0xBF58BFC8); - OUTREG(index_reg,0x10601); - OUTREG(data_reg,0x87A08AA0); - OUTREG(index_reg,0x10602); - OUTREG(data_reg,0x8010BE98); - OUTREG(index_reg,0x10700); - OUTREG(data_reg,0xBF10BFF0); - OUTREG(index_reg,0x10701); - OUTREG(data_reg,0x886089E0); - OUTREG(index_reg,0x10702); - OUTREG(data_reg,0x8018BEB0); - OUTREG(index_reg,0x10800); - OUTREG(data_reg,0xBED8BFE8); - OUTREG(index_reg,0x10801); - OUTREG(data_reg,0x89408940); - OUTREG(index_reg,0x10802); - OUTREG(data_reg,0xBFE8BED8); - OUTREG(index_reg,0x20000); - OUTREG(data_reg,0x80008000); - OUTREG(index_reg,0x20001); - OUTREG(data_reg,0x90008000); - OUTREG(index_reg,0x20002); - OUTREG(data_reg,0x80008000); - OUTREG(index_reg,0x20003); - OUTREG(data_reg,0x80008000); - OUTREG(index_reg,0x20100); - OUTREG(data_reg,0x80108000); - OUTREG(index_reg,0x20101); - OUTREG(data_reg,0x8FE0BF70); - OUTREG(index_reg,0x20102); - OUTREG(data_reg,0xBFE880C0); - OUTREG(index_reg,0x20103); - OUTREG(data_reg,0x80008000); - OUTREG(index_reg,0x20200); - OUTREG(data_reg,0x8018BFF8); - OUTREG(index_reg,0x20201); - OUTREG(data_reg,0x8F80BF08); - OUTREG(index_reg,0x20202); - OUTREG(data_reg,0xBFD081A0); - OUTREG(index_reg,0x20203); - OUTREG(data_reg,0xBFF88000); - OUTREG(index_reg,0x20300); - OUTREG(data_reg,0x80188000); - OUTREG(index_reg,0x20301); - OUTREG(data_reg,0x8EE0BEC0); - OUTREG(index_reg,0x20302); - OUTREG(data_reg,0xBFB082A0); - OUTREG(index_reg,0x20303); - OUTREG(data_reg,0x80008000); - OUTREG(index_reg,0x20400); - OUTREG(data_reg,0x80188000); - OUTREG(index_reg,0x20401); - OUTREG(data_reg,0x8E00BEA0); - OUTREG(index_reg,0x20402); - OUTREG(data_reg,0xBF8883C0); - OUTREG(index_reg,0x20403); - OUTREG(data_reg,0x80008000); - OUTREG(index_reg,0x20500); - OUTREG(data_reg,0x80188000); - OUTREG(index_reg,0x20501); - OUTREG(data_reg,0x8D00BE90); - OUTREG(index_reg,0x20502); - OUTREG(data_reg,0xBF588500); - OUTREG(index_reg,0x20503); - OUTREG(data_reg,0x80008008); - OUTREG(index_reg,0x20600); - OUTREG(data_reg,0x80188000); - OUTREG(index_reg,0x20601); - OUTREG(data_reg,0x8BC0BE98); - OUTREG(index_reg,0x20602); - OUTREG(data_reg,0xBF308660); - OUTREG(index_reg,0x20603); - OUTREG(data_reg,0x80008008); - OUTREG(index_reg,0x20700); - OUTREG(data_reg,0x80108000); - OUTREG(index_reg,0x20701); - OUTREG(data_reg,0x8A80BEB0); - OUTREG(index_reg,0x20702); - OUTREG(data_reg,0xBF0087C0); - OUTREG(index_reg,0x20703); - OUTREG(data_reg,0x80008008); - OUTREG(index_reg,0x20800); - OUTREG(data_reg,0x80108000); - OUTREG(index_reg,0x20801); - OUTREG(data_reg,0x8920BED0); - OUTREG(index_reg,0x20802); - OUTREG(data_reg,0xBED08920); - OUTREG(index_reg,0x20803); - OUTREG(data_reg,0x80008010); - OUTREG(index_reg,0x30000); - OUTREG(data_reg,0x90008000); - OUTREG(index_reg,0x30001); - OUTREG(data_reg,0x80008000); - OUTREG(index_reg,0x30100); - OUTREG(data_reg,0x8FE0BF90); - OUTREG(index_reg,0x30101); - OUTREG(data_reg,0xBFF880A0); - OUTREG(index_reg,0x30200); - OUTREG(data_reg,0x8F60BF40); - OUTREG(index_reg,0x30201); - OUTREG(data_reg,0xBFE88180); - OUTREG(index_reg,0x30300); - OUTREG(data_reg,0x8EC0BF00); - OUTREG(index_reg,0x30301); - OUTREG(data_reg,0xBFC88280); - OUTREG(index_reg,0x30400); - OUTREG(data_reg,0x8DE0BEE0); - OUTREG(index_reg,0x30401); - OUTREG(data_reg,0xBFA083A0); - OUTREG(index_reg,0x30500); - OUTREG(data_reg,0x8CE0BED0); - OUTREG(index_reg,0x30501); - OUTREG(data_reg,0xBF7884E0); - OUTREG(index_reg,0x30600); - OUTREG(data_reg,0x8BA0BED8); - OUTREG(index_reg,0x30601); - OUTREG(data_reg,0xBF508640); - OUTREG(index_reg,0x30700); - OUTREG(data_reg,0x8A60BEE8); - OUTREG(index_reg,0x30701); - OUTREG(data_reg,0xBF2087A0); - OUTREG(index_reg,0x30800); - OUTREG(data_reg,0x8900BF00); - OUTREG(index_reg,0x30801); - OUTREG(data_reg,0xBF008900); + OUTREG(0x659C,0x0); + OUTREG(0x6594,0x705); + OUTREG(0x65A4,0x10001); + OUTREG(0x65D8,0x0); + OUTREG(0x65B0,0x0); + OUTREG(0x65C0,0x0); + OUTREG(0x65D4,0x0); + OUTREG(0x6578,0x0); + OUTREG(0x657C,0x841880A8); + OUTREG(0x6578,0x1); + OUTREG(0x657C,0x84208680); + OUTREG(0x6578,0x2); + OUTREG(0x657C,0xBFF880B0); + OUTREG(0x6578,0x100); + OUTREG(0x657C,0x83D88088); + OUTREG(0x6578,0x101); + OUTREG(0x657C,0x84608680); + OUTREG(0x6578,0x102); + OUTREG(0x657C,0xBFF080D0); + OUTREG(0x6578,0x200); + OUTREG(0x657C,0x83988068); + OUTREG(0x6578,0x201); + OUTREG(0x657C,0x84A08680); + OUTREG(0x6578,0x202); + OUTREG(0x657C,0xBFF080F8); + OUTREG(0x6578,0x300); + OUTREG(0x657C,0x83588058); + OUTREG(0x6578,0x301); + OUTREG(0x657C,0x84E08660); + OUTREG(0x6578,0x302); + OUTREG(0x657C,0xBFF88120); + OUTREG(0x6578,0x400); + OUTREG(0x657C,0x83188040); + OUTREG(0x6578,0x401); + OUTREG(0x657C,0x85008660); + OUTREG(0x6578,0x402); + OUTREG(0x657C,0xBFF88150); + OUTREG(0x6578,0x500); + OUTREG(0x657C,0x82D88030); + OUTREG(0x6578,0x501); + OUTREG(0x657C,0x85408640); + OUTREG(0x6578,0x502); + OUTREG(0x657C,0xBFF88180); + OUTREG(0x6578,0x600); + OUTREG(0x657C,0x82A08018); + OUTREG(0x6578,0x601); + OUTREG(0x657C,0x85808620); + OUTREG(0x6578,0x602); + OUTREG(0x657C,0xBFF081B8); + OUTREG(0x6578,0x700); + OUTREG(0x657C,0x82608010); + OUTREG(0x6578,0x701); + OUTREG(0x657C,0x85A08600); + OUTREG(0x6578,0x702); + OUTREG(0x657C,0x800081F0); + OUTREG(0x6578,0x800); + OUTREG(0x657C,0x8228BFF8); + OUTREG(0x6578,0x801); + OUTREG(0x657C,0x85E085E0); + OUTREG(0x6578,0x802); + OUTREG(0x657C,0xBFF88228); + OUTREG(0x6578,0x10000); + OUTREG(0x657C,0x82A8BF00); + OUTREG(0x6578,0x10001); + OUTREG(0x657C,0x82A08CC0); + OUTREG(0x6578,0x10002); + OUTREG(0x657C,0x8008BEF8); + OUTREG(0x6578,0x10100); + OUTREG(0x657C,0x81F0BF28); + OUTREG(0x6578,0x10101); + OUTREG(0x657C,0x83608CA0); + OUTREG(0x6578,0x10102); + OUTREG(0x657C,0x8018BED0); + OUTREG(0x6578,0x10200); + OUTREG(0x657C,0x8148BF38); + OUTREG(0x6578,0x10201); + OUTREG(0x657C,0x84408C80); + OUTREG(0x6578,0x10202); + OUTREG(0x657C,0x8008BEB8); + OUTREG(0x6578,0x10300); + OUTREG(0x657C,0x80B0BF78); + OUTREG(0x6578,0x10301); + OUTREG(0x657C,0x85008C20); + OUTREG(0x6578,0x10302); + OUTREG(0x657C,0x8020BEA0); + OUTREG(0x6578,0x10400); + OUTREG(0x657C,0x8028BF90); + OUTREG(0x6578,0x10401); + OUTREG(0x657C,0x85E08BC0); + OUTREG(0x6578,0x10402); + OUTREG(0x657C,0x8018BE90); + OUTREG(0x6578,0x10500); + OUTREG(0x657C,0xBFB8BFB0); + OUTREG(0x6578,0x10501); + OUTREG(0x657C,0x86C08B40); + OUTREG(0x6578,0x10502); + OUTREG(0x657C,0x8010BE90); + OUTREG(0x6578,0x10600); + OUTREG(0x657C,0xBF58BFC8); + OUTREG(0x6578,0x10601); + OUTREG(0x657C,0x87A08AA0); + OUTREG(0x6578,0x10602); + OUTREG(0x657C,0x8010BE98); + OUTREG(0x6578,0x10700); + OUTREG(0x657C,0xBF10BFF0); + OUTREG(0x6578,0x10701); + OUTREG(0x657C,0x886089E0); + OUTREG(0x6578,0x10702); + OUTREG(0x657C,0x8018BEB0); + OUTREG(0x6578,0x10800); + OUTREG(0x657C,0xBED8BFE8); + OUTREG(0x6578,0x10801); + OUTREG(0x657C,0x89408940); + OUTREG(0x6578,0x10802); + OUTREG(0x657C,0xBFE8BED8); + OUTREG(0x6578,0x20000); + OUTREG(0x657C,0x80008000); + OUTREG(0x6578,0x20001); + OUTREG(0x657C,0x90008000); + OUTREG(0x6578,0x20002); + OUTREG(0x657C,0x80008000); + OUTREG(0x6578,0x20003); + OUTREG(0x657C,0x80008000); + OUTREG(0x6578,0x20100); + OUTREG(0x657C,0x80108000); + OUTREG(0x6578,0x20101); + OUTREG(0x657C,0x8FE0BF70); + OUTREG(0x6578,0x20102); + OUTREG(0x657C,0xBFE880C0); + OUTREG(0x6578,0x20103); + OUTREG(0x657C,0x80008000); + OUTREG(0x6578,0x20200); + OUTREG(0x657C,0x8018BFF8); + OUTREG(0x6578,0x20201); + OUTREG(0x657C,0x8F80BF08); + OUTREG(0x6578,0x20202); + OUTREG(0x657C,0xBFD081A0); + OUTREG(0x6578,0x20203); + OUTREG(0x657C,0xBFF88000); + OUTREG(0x6578,0x20300); + OUTREG(0x657C,0x80188000); + OUTREG(0x6578,0x20301); + OUTREG(0x657C,0x8EE0BEC0); + OUTREG(0x6578,0x20302); + OUTREG(0x657C,0xBFB082A0); + OUTREG(0x6578,0x20303); + OUTREG(0x657C,0x80008000); + OUTREG(0x6578,0x20400); + OUTREG(0x657C,0x80188000); + OUTREG(0x6578,0x20401); + OUTREG(0x657C,0x8E00BEA0); + OUTREG(0x6578,0x20402); + OUTREG(0x657C,0xBF8883C0); + OUTREG(0x6578,0x20403); + OUTREG(0x657C,0x80008000); + OUTREG(0x6578,0x20500); + OUTREG(0x657C,0x80188000); + OUTREG(0x6578,0x20501); + OUTREG(0x657C,0x8D00BE90); + OUTREG(0x6578,0x20502); + OUTREG(0x657C,0xBF588500); + OUTREG(0x6578,0x20503); + OUTREG(0x657C,0x80008008); + OUTREG(0x6578,0x20600); + OUTREG(0x657C,0x80188000); + OUTREG(0x6578,0x20601); + OUTREG(0x657C,0x8BC0BE98); + OUTREG(0x6578,0x20602); + OUTREG(0x657C,0xBF308660); + OUTREG(0x6578,0x20603); + OUTREG(0x657C,0x80008008); + OUTREG(0x6578,0x20700); + OUTREG(0x657C,0x80108000); + OUTREG(0x6578,0x20701); + OUTREG(0x657C,0x8A80BEB0); + OUTREG(0x6578,0x20702); + OUTREG(0x657C,0xBF0087C0); + OUTREG(0x6578,0x20703); + OUTREG(0x657C,0x80008008); + OUTREG(0x6578,0x20800); + OUTREG(0x657C,0x80108000); + OUTREG(0x6578,0x20801); + OUTREG(0x657C,0x8920BED0); + OUTREG(0x6578,0x20802); + OUTREG(0x657C,0xBED08920); + OUTREG(0x6578,0x20803); + OUTREG(0x657C,0x80008010); + OUTREG(0x6578,0x30000); + OUTREG(0x657C,0x90008000); + OUTREG(0x6578,0x30001); + OUTREG(0x657C,0x80008000); + OUTREG(0x6578,0x30100); + OUTREG(0x657C,0x8FE0BF90); + OUTREG(0x6578,0x30101); + OUTREG(0x657C,0xBFF880A0); + OUTREG(0x6578,0x30200); + OUTREG(0x657C,0x8F60BF40); + OUTREG(0x6578,0x30201); + OUTREG(0x657C,0xBFE88180); + OUTREG(0x6578,0x30300); + OUTREG(0x657C,0x8EC0BF00); + OUTREG(0x6578,0x30301); + OUTREG(0x657C,0xBFC88280); + OUTREG(0x6578,0x30400); + OUTREG(0x657C,0x8DE0BEE0); + OUTREG(0x6578,0x30401); + OUTREG(0x657C,0xBFA083A0); + OUTREG(0x6578,0x30500); + OUTREG(0x657C,0x8CE0BED0); + OUTREG(0x6578,0x30501); + OUTREG(0x657C,0xBF7884E0); + OUTREG(0x6578,0x30600); + OUTREG(0x657C,0x8BA0BED8); + OUTREG(0x6578,0x30601); + OUTREG(0x657C,0xBF508640); + OUTREG(0x6578,0x30700); + OUTREG(0x657C,0x8A60BEE8); + OUTREG(0x6578,0x30701); + OUTREG(0x657C,0xBF2087A0); + OUTREG(0x6578,0x30800); + OUTREG(0x657C,0x8900BF00); + OUTREG(0x6578,0x30801); + OUTREG(0x657C,0xBF008900); } static int @@ -1442,7 +1186,7 @@ atombios_output_scaler_setup(xf86OutputPtr output) if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT) && info->ChipFamily >= CHIP_FAMILY_RV515 && info->ChipFamily <= CHIP_FAMILY_RV570) { ErrorF("forcing TV scaler\n"); - atom_rv515_force_tv_scaler(output->scrn, radeon_crtc); + atom_rv515_force_tv_scaler(output->scrn); } ErrorF("scaler %d setup success\n", radeon_crtc->crtc_id); return ATOM_SUCCESS; @@ -1464,8 +1208,6 @@ atombios_output_dpms(xf86OutputPtr output, int mode) unsigned char *space; int index = 0; Bool is_dig = FALSE; - unsigned char *RADEONMMIO = info->MMIO; - uint32_t reg = 0; if (radeon_encoder == NULL) return; @@ -1497,83 +1239,51 @@ atombios_output_dpms(xf86OutputPtr output, int mode) break; case ENCODER_OBJECT_ID_INTERNAL_DAC1: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: - if (IS_DCE32_VARIANT) + if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) + index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); + else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) + index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); + else index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); - else { - if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) - index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); - else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) - index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); - else - index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); - } break; case ENCODER_OBJECT_ID_INTERNAL_DAC2: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: - if (IS_DCE32_VARIANT) + if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) + index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); + else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) + index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); + else index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); - else { - if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) - index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); - else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) - index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); - else - index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); - } break; } switch (mode) { case DPMSModeOn: radeon_encoder->devices |= radeon_output->active_device; - if (is_dig) { - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); - if (((radeon_output->ConnectorType == CONNECTOR_DISPLAY_PORT) || - (radeon_output->ConnectorType == CONNECTOR_EDP)) && - (radeon_output->MonType == MT_DP)) { - do_displayport_link_train(output); - if (IS_DCE4_VARIANT) - atombios_output_dig_encoder_setup(output, ATOM_ENCODER_CMD_DP_VIDEO_ON); - } - } + if (is_dig) + atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT); else { disp_data.ucAction = ATOM_ENABLE; data.exec.index = index; data.exec.dataSpace = (void *)&space; data.exec.pspace = &disp_data; - /* workaround for DVOOutputControl on some RS690 systems */ - if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) { - reg = INREG(RADEON_BIOS_3_SCRATCH); - OUTREG(RADEON_BIOS_3_SCRATCH, reg & ~ATOM_S3_DFP2I_ACTIVE); - } if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) ErrorF("Output %s enable success\n", device_name[radeon_get_device_index(radeon_output->active_device)]); else ErrorF("Output %s enable failed\n", device_name[radeon_get_device_index(radeon_output->active_device)]); - if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DDI) - OUTREG(RADEON_BIOS_3_SCRATCH, reg); } - /* at least for TV atom fails to reassociate the correct crtc source at dpms on */ - if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) - atombios_set_output_crtc_source(output); break; case DPMSModeStandby: case DPMSModeSuspend: case DPMSModeOff: radeon_encoder->devices &= ~(radeon_output->active_device); if (!radeon_encoder->devices) { - if (is_dig) { - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT, 0, 0); - if (((radeon_output->ConnectorType == CONNECTOR_DISPLAY_PORT) || - (radeon_output->ConnectorType == CONNECTOR_EDP)) && - (radeon_output->MonType == MT_DP)) { - if (IS_DCE4_VARIANT) - atombios_output_dig_encoder_setup(output, ATOM_ENCODER_CMD_DP_VIDEO_OFF); - } - } else { + if (is_dig) + atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT); + else { disp_data.ucAction = ATOM_DISABLE; data.exec.index = index; data.exec.dataSpace = (void *)&space; @@ -1592,12 +1302,7 @@ atombios_output_dpms(xf86OutputPtr output, int mode) } } -union crtc_source_param { - SELECT_CRTC_SOURCE_PS_ALLOCATION v1; - SELECT_CRTC_SOURCE_PARAMETERS_V2 v2; -}; - -void +static void atombios_set_output_crtc_source(xf86OutputPtr output) { RADEONOutputPrivatePtr radeon_output = output->driver_private; @@ -1606,15 +1311,16 @@ atombios_set_output_crtc_source(xf86OutputPtr output) radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); AtomBiosArgRec data; unsigned char *space; - union crtc_source_param args; + SELECT_CRTC_SOURCE_PS_ALLOCATION crtc_src_param; + SELECT_CRTC_SOURCE_PARAMETERS_V2 crtc_src_param2; int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source); int major, minor; if (radeon_encoder == NULL) return; - memset(&args, 0, sizeof(args)); - + memset(&crtc_src_param, 0, sizeof(crtc_src_param)); + memset(&crtc_src_param2, 0, sizeof(crtc_src_param2)); atombios_get_command_table_version(info->atomBIOS, index, &major, &minor); /*ErrorF("select crtc source table is %d %d\n", major, minor);*/ @@ -1626,101 +1332,89 @@ atombios_set_output_crtc_source(xf86OutputPtr output) case 1: default: if (IS_AVIVO_VARIANT) - args.v1.ucCRTC = radeon_crtc->crtc_id; + crtc_src_param.ucCRTC = radeon_crtc->crtc_id; else { if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1) - args.v1.ucCRTC = radeon_crtc->crtc_id; + crtc_src_param.ucCRTC = radeon_crtc->crtc_id; else - args.v1.ucCRTC = radeon_crtc->crtc_id << 2; + crtc_src_param.ucCRTC = radeon_crtc->crtc_id << 2; } switch (radeon_encoder->encoder_id) { case ENCODER_OBJECT_ID_INTERNAL_TMDS1: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1: - args.v1.ucDevice = ATOM_DEVICE_DFP1_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_DFP1_INDEX; break; case ENCODER_OBJECT_ID_INTERNAL_LVDS: case ENCODER_OBJECT_ID_INTERNAL_LVTM1: if (radeon_output->active_device & ATOM_DEVICE_LCD1_SUPPORT) - args.v1.ucDevice = ATOM_DEVICE_LCD1_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_LCD1_INDEX; else - args.v1.ucDevice = ATOM_DEVICE_DFP3_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_DFP3_INDEX; break; case ENCODER_OBJECT_ID_INTERNAL_DVO1: case ENCODER_OBJECT_ID_INTERNAL_DDI: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: - args.v1.ucDevice = ATOM_DEVICE_DFP2_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_DFP2_INDEX; break; case ENCODER_OBJECT_ID_INTERNAL_DAC1: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) - args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_TV1_INDEX; else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) - args.v1.ucDevice = ATOM_DEVICE_CV_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_CV_INDEX; else - args.v1.ucDevice = ATOM_DEVICE_CRT1_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_CRT1_INDEX; break; case ENCODER_OBJECT_ID_INTERNAL_DAC2: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) - args.v1.ucDevice = ATOM_DEVICE_TV1_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_TV1_INDEX; else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) - args.v1.ucDevice = ATOM_DEVICE_CV_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_CV_INDEX; else - args.v1.ucDevice = ATOM_DEVICE_CRT2_INDEX; + crtc_src_param.ucDevice = ATOM_DEVICE_CRT2_INDEX; break; } - /*ErrorF("device sourced: 0x%x\n", args.v1.ucDevice);*/ + data.exec.pspace = &crtc_src_param; + /*ErrorF("device sourced: 0x%x\n", crtc_src_param.ucDevice);*/ break; case 2: - args.v2.ucCRTC = radeon_crtc->crtc_id; - args.v2.ucEncodeMode = atombios_get_encoder_mode(output); + crtc_src_param2.ucCRTC = radeon_crtc->crtc_id; + crtc_src_param2.ucEncodeMode = atombios_get_encoder_mode(output); switch (radeon_encoder->encoder_id) { case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: - switch (radeon_output->dig_encoder) { - case 0: - args.v2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; - break; - case 1: - args.v2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; - break; - case 2: - args.v2.ucEncoderID = ASIC_INT_DIG3_ENCODER_ID; - break; - case 3: - args.v2.ucEncoderID = ASIC_INT_DIG4_ENCODER_ID; - break; - case 4: - args.v2.ucEncoderID = ASIC_INT_DIG5_ENCODER_ID; - break; - case 5: - args.v2.ucEncoderID = ASIC_INT_DIG6_ENCODER_ID; - break; - } + if (IS_DCE32_VARIANT) { + if (radeon_crtc->crtc_id) + crtc_src_param2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; + else + crtc_src_param2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; + } else + crtc_src_param2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; break; - case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1: - args.v2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID; + case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: + crtc_src_param2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; break; case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1: if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) - args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + crtc_src_param2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) - args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + crtc_src_param2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; else - args.v2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID; + crtc_src_param2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID; break; case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) - args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + crtc_src_param2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; else if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT)) - args.v2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + crtc_src_param2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; else - args.v2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID; + crtc_src_param2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID; break; } - /*ErrorF("device sourced: 0x%x\n", args.v2.ucEncoderID);*/ + data.exec.pspace = &crtc_src_param2; + /*ErrorF("device sourced: 0x%x\n", crtc_src_param2.ucEncoderID);*/ break; } break; @@ -1729,7 +1423,6 @@ atombios_set_output_crtc_source(xf86OutputPtr output) exit(-1); } - data.exec.pspace = &args; data.exec.index = index; data.exec.dataSpace = (void *)&space; @@ -1767,128 +1460,29 @@ atombios_apply_output_quirks(xf86OutputPtr output, DisplayModePtr mode) } /* set scaler clears this on some chips */ - if (!(radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT))) { - if (IS_AVIVO_VARIANT && (mode->Flags & V_INTERLACE)) - OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, AVIVO_D1MODE_INTERLEAVE_EN); - } - - if (IS_DCE32_VARIANT && - (!IS_DCE4_VARIANT) && - (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT))) { - radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); - if (radeon_encoder == NULL) - return; - /* XXX: need to sort out why transmitter control table sometimes sets this to a - * different golden value. - */ - if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_UNIPHY2) { - OUTREG(0x7ec4, 0x00824002); - } - } + if (IS_AVIVO_VARIANT && (mode->Flags & V_INTERLACE)) + OUTREG(AVIVO_D1MODE_DATA_FORMAT + radeon_crtc->crtc_offset, AVIVO_D1MODE_INTERLEAVE_EN); } -void -atombios_pick_dig_encoder(xf86OutputPtr output) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(output->scrn); - RADEONOutputPrivatePtr radeon_output = output->driver_private; - RADEONInfoPtr info = RADEONPTR(output->scrn); - radeon_encoder_ptr radeon_encoder = NULL; - Bool is_lvtma = FALSE; - int i, mode; - uint32_t dig_enc_use_mask = 0; - - /* non digital encoders don't need a dig block */ - mode = atombios_get_encoder_mode(output); - if (mode == ATOM_ENCODER_MODE_CRT || - mode == ATOM_ENCODER_MODE_TV || - mode == ATOM_ENCODER_MODE_CV) - return; - - if (IS_DCE4_VARIANT) { - radeon_encoder = radeon_get_encoder(output); - - if (IS_DCE41_VARIANT) { - if (radeon_output->linkb) - radeon_output->dig_encoder = 1; - else - radeon_output->dig_encoder = 0; - } else { - switch (radeon_encoder->encoder_id) { - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY: - if (radeon_output->linkb) - radeon_output->dig_encoder = 1; - else - radeon_output->dig_encoder = 0; - break; - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY1: - if (radeon_output->linkb) - radeon_output->dig_encoder = 3; - else - radeon_output->dig_encoder = 2; - break; - case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: - if (radeon_output->linkb) - radeon_output->dig_encoder = 5; - else - radeon_output->dig_encoder = 4; - break; - default: - ErrorF("Unknown encoder\n"); - break; - } - } - return; - } - - if (IS_DCE32_VARIANT) { - RADEONCrtcPrivatePtr radeon_crtc = output->crtc->driver_private; - radeon_output->dig_encoder = radeon_crtc->crtc_id; - return; - } - - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr test = xf86_config->output[i]; - RADEONOutputPrivatePtr radeon_test = test->driver_private; - radeon_encoder = radeon_get_encoder(test); - - if (!radeon_encoder || !test->crtc) - continue; - - if (output == test && radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA) - is_lvtma = TRUE; - if (output != test && (radeon_test->dig_encoder >= 0)) - dig_enc_use_mask |= (1 << radeon_test->dig_encoder); - - } - if (is_lvtma) { - if (dig_enc_use_mask & 0x2) - ErrorF("Need digital encoder 2 for LVTMA and it isn't free - stealing\n"); - radeon_output->dig_encoder = 1; - return; - } - if (!(dig_enc_use_mask & 1)) - radeon_output->dig_encoder = 0; - else - radeon_output->dig_encoder = 1; -} void atombios_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) { RADEONOutputPrivatePtr radeon_output = output->driver_private; + RADEONCrtcPrivatePtr radeon_crtc = output->crtc->driver_private; radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); RADEONInfoPtr info = RADEONPTR(output->scrn); if (radeon_encoder == NULL) - return; + return; radeon_output->pixel_clock = adjusted_mode->Clock; + radeon_output->dig_block = radeon_crtc->crtc_id; atombios_output_overscan_setup(output, mode, adjusted_mode); atombios_output_scaler_setup(output); atombios_set_output_crtc_source(output); - if (IS_AVIVO_VARIANT && !IS_DCE4_VARIANT) { + if (IS_AVIVO_VARIANT) { if (radeon_output->active_device & (ATOM_DEVICE_CV_SUPPORT | ATOM_DEVICE_TV_SUPPORT)) atombios_output_yuv_setup(output, TRUE); else @@ -1907,21 +1501,13 @@ atombios_output_mode_set(xf86OutputPtr output, case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA: /* disable encoder and transmitter */ - /* setup and enable the encoder and transmitter */ - if (IS_DCE4_VARIANT) { - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); - atombios_output_dig_encoder_setup(output, ATOM_ENCODER_CMD_SETUP); - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_INIT, 0, 0); - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); - } else { - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_DISABLE, 0, 0); - atombios_output_dig_encoder_setup(output, ATOM_DISABLE); - atombios_output_dig_encoder_setup(output, ATOM_ENABLE); + atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_DISABLE); + atombios_output_dig_encoder_setup(output, ATOM_DISABLE); - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_INIT, 0, 0); - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_SETUP, 0, 0); - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE, 0, 0); - } + /* setup and enable the encoder and transmitter */ + atombios_output_dig_encoder_setup(output, ATOM_ENABLE); + atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_SETUP); + atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_ENABLE); break; case ENCODER_OBJECT_ID_INTERNAL_DDI: atombios_output_ddia_setup(output, ATOM_ENABLE); @@ -1935,12 +1521,8 @@ atombios_output_mode_set(xf86OutputPtr output, case ENCODER_OBJECT_ID_INTERNAL_DAC2: case ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2: atombios_output_dac_setup(output, ATOM_ENABLE); - if (radeon_output->devices & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) { - if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) - atombios_output_tv_setup(output, ATOM_ENABLE); - else - atombios_output_tv_setup(output, ATOM_DISABLE); - } + if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) + atombios_output_tv_setup(output, ATOM_ENABLE); break; } atombios_apply_output_quirks(output, adjusted_mode); @@ -2022,7 +1604,7 @@ atombios_dac_detect(xf86OutputPtr output) RADEONOutputPrivatePtr radeon_output = output->driver_private; RADEONMonitorType MonType = MT_NONE; AtomBiosResult ret; - RADEONSavePtr save = info->ModeReg; + uint32_t bios_0_scratch; if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT) { if (xf86ReturnOptValBool(info->Options, OPTION_FORCE_TVOUT, FALSE)) { @@ -2036,24 +1618,24 @@ atombios_dac_detect(xf86OutputPtr output) ret = atom_bios_dac_load_detect(info->atomBIOS, output); if (ret == ATOM_SUCCESS) { if (info->ChipFamily >= CHIP_FAMILY_R600) - save->bios_0_scratch = INREG(R600_BIOS_0_SCRATCH); + bios_0_scratch = INREG(R600_BIOS_0_SCRATCH); else - save->bios_0_scratch = INREG(RADEON_BIOS_0_SCRATCH); - /*ErrorF("DAC connect %08X\n", (unsigned int)save->bios_0_scratch);*/ + bios_0_scratch = INREG(RADEON_BIOS_0_SCRATCH); + /*ErrorF("DAC connect %08X\n", (unsigned int)bios_0_scratch);*/ if (radeon_output->devices & ATOM_DEVICE_CRT1_SUPPORT) { - if (save->bios_0_scratch & ATOM_S0_CRT1_MASK) + if (bios_0_scratch & ATOM_S0_CRT1_MASK) MonType = MT_CRT; } else if (radeon_output->devices & ATOM_DEVICE_CRT2_SUPPORT) { - if (save->bios_0_scratch & ATOM_S0_CRT2_MASK) + if (bios_0_scratch & ATOM_S0_CRT2_MASK) MonType = MT_CRT; } else if (radeon_output->devices & ATOM_DEVICE_CV_SUPPORT) { - if (save->bios_0_scratch & (ATOM_S0_CV_MASK | ATOM_S0_CV_MASK_A)) + if (bios_0_scratch & (ATOM_S0_CV_MASK | ATOM_S0_CV_MASK_A)) MonType = MT_CV; } else if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT) { - if (save->bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A)) + if (bios_0_scratch & (ATOM_S0_TV1_COMPOSITE | ATOM_S0_TV1_COMPOSITE_A)) MonType = MT_CTV; - else if (save->bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A)) + else if (bios_0_scratch & (ATOM_S0_TV1_SVIDEO | ATOM_S0_TV1_SVIDEO_A)) MonType = MT_STV; } } @@ -2061,714 +1643,3 @@ atombios_dac_detect(xf86OutputPtr output) return MonType; } - -static inline int atom_dp_get_encoder_id(xf86OutputPtr output) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - int ret = 0; - if (radeon_output->dig_encoder) - ret |= ATOM_DP_CONFIG_DIG2_ENCODER; - else - ret |= ATOM_DP_CONFIG_DIG1_ENCODER; - if (radeon_output->linkb) - ret |= ATOM_DP_CONFIG_LINK_B; - else - ret |= ATOM_DP_CONFIG_LINK_A; - return ret; -} - -union aux_channel_transaction { - PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION v1; - PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS_V2 v2; -}; - -Bool -RADEONProcessAuxCH(xf86OutputPtr output, uint8_t *req_bytes, uint8_t num_bytes, - uint8_t *read_byte, uint8_t read_buf_len, uint8_t delay) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - RADEONInfoPtr info = RADEONPTR(output->scrn); - union aux_channel_transaction args; - AtomBiosArgRec data; - unsigned char *space; - unsigned char *base; - int retry_count = 0; - - memset(&args, 0, sizeof(args)); - if (info->atomBIOS->fbBase) - base = info->FB + info->atomBIOS->fbBase; - else if (info->atomBIOS->scratchBase) - base = (unsigned char *)info->atomBIOS->scratchBase; - else - return FALSE; - -retry: - memcpy(base, req_bytes, num_bytes); - - args.v1.lpAuxRequest = 0; - args.v1.lpDataOut = 16; - args.v1.ucDataOutLen = 0; - args.v1.ucChannelID = radeon_output->ucI2cId; - args.v1.ucDelay = delay / 10; /* 10 usec */ - if (IS_DCE4_VARIANT) - args.v2.ucHPD_ID = radeon_output->hpd_id; - - data.exec.index = GetIndexIntoMasterTable(COMMAND, ProcessAuxChannelTransaction); - data.exec.dataSpace = (void *)&space; - data.exec.pspace = &args; - - RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data); - if (args.v1.ucReplyStatus && !args.v1.ucDataOutLen) { - if (args.v1.ucReplyStatus == 0x20 && retry_count++ < 10) - goto retry; - ErrorF("failed to get auxch %02x%02x %02x %02x %02x after %d retries\n", - req_bytes[1], req_bytes[0], req_bytes[2], req_bytes[3], args.v1.ucReplyStatus, retry_count); - return FALSE; - } - if (args.v1.ucDataOutLen && read_byte && read_buf_len) { - if (read_buf_len < args.v1.ucDataOutLen) { - ErrorF("%s: Buffer too small for return answer %d %d\n", __func__, read_buf_len, args.v1.ucDataOutLen); - return FALSE; - } - { - int len = read_buf_len < args.v1.ucDataOutLen ? read_buf_len : args.v1.ucDataOutLen; - memcpy(read_byte, base+16, len); - } - } - return TRUE; -} - -static int -RADEONDPEncoderService(xf86OutputPtr output, int action, uint8_t ucconfig, uint8_t lane_num) -{ - RADEONInfoPtr info = RADEONPTR(output->scrn); - DP_ENCODER_SERVICE_PARAMETERS args; - AtomBiosArgRec data; - unsigned char *space; - - memset(&args, 0, sizeof(args)); - - args.ucLinkClock = 0; - args.ucConfig = ucconfig; - args.ucAction = action; - args.ucLaneNum = lane_num; - args.ucStatus = 0; - - data.exec.index = GetIndexIntoMasterTable(COMMAND, DPEncoderService); - data.exec.dataSpace = (void *)&space; - data.exec.pspace = &args; - - RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data); - - ErrorF("%s: %d %d\n", __func__, action, args.ucStatus); - return args.ucStatus; -} - -int RADEON_DP_GetSinkType(xf86OutputPtr output) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - - return RADEONDPEncoderService(output, ATOM_DP_ACTION_GET_SINK_TYPE, radeon_output->ucI2cId, 0); -} - -static Bool atom_dp_aux_native_write(xf86OutputPtr output, uint16_t address, - uint8_t send_bytes, uint8_t *send) -{ - uint8_t msg[20]; - uint8_t msg_len, dp_msg_len; - int ret; - - dp_msg_len = 4; - msg[0] = address; - msg[1] = address >> 8; - msg[2] = AUX_NATIVE_WRITE << 4; - dp_msg_len += send_bytes; - msg[3] = (dp_msg_len << 4)| (send_bytes - 1); - - if (0) - ErrorF("writing %02x %02x %02x, %d, %d\n", msg[0], msg[1], msg[3], send_bytes, dp_msg_len); - if (send_bytes > 16) - return FALSE; - - memcpy(&msg[4], send, send_bytes); - msg_len = 4 + send_bytes; - ret = RADEONProcessAuxCH(output, msg, msg_len, NULL, 0, 0); - return ret; -} - -static Bool atom_dp_aux_native_read(xf86OutputPtr output, uint16_t address, - uint8_t delay, - uint8_t expected_bytes, uint8_t *read_p) -{ - uint8_t msg[20]; - uint8_t msg_len, dp_msg_len; - int ret; - - msg_len = 4; - dp_msg_len = 4; - msg[0] = address; - msg[1] = address >> 8; - msg[2] = AUX_NATIVE_READ << 4; - msg[3] = (dp_msg_len) << 4; - msg[3] |= expected_bytes - 1; - - if (0) - ErrorF("reading %02x %02x %02x, %d, %d\n", msg[0], msg[1], msg[3], expected_bytes, dp_msg_len); - ret = RADEONProcessAuxCH(output, msg, msg_len, read_p, expected_bytes, delay); - return ret; -} - -/* fill out the DPCD structure */ -void RADEON_DP_GetDPCD(xf86OutputPtr output) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - uint8_t msg[25]; - int ret; - - ret = atom_dp_aux_native_read(output, DP_DPCD_REV, 0, 8, msg); - if (ret) { - memcpy(radeon_output->dpcd, msg, 8); - if (0) { - int i; - ErrorF("DPCD: "); - for (i = 0; i < 8; i++) - ErrorF("%02x ", radeon_output->dpcd[i]); - ErrorF("\n"); - } - ret = atom_dp_aux_native_read(output, DP_LINK_BW_SET, 0, 2, msg); - if (0) { - ErrorF("0x200: %02x %02x\n", msg[0], msg[1]); - } - return; - } - radeon_output->dpcd[0] = 0; - return; -} - - -enum dp_aux_i2c_mode { - dp_aux_i2c_start, - dp_aux_i2c_write, - dp_aux_i2c_read, - dp_aux_i2c_stop, -}; - - -static Bool atom_dp_aux_i2c_transaction(xf86OutputPtr output, uint16_t address, - enum dp_aux_i2c_mode mode, - uint8_t write_byte, uint8_t *read_byte) -{ - uint8_t msg[8], msg_len, dp_msg_len; - int ret; - int auxch_cmd = 0; - - memset(msg, 0, 8); - - if (mode != dp_aux_i2c_stop) - auxch_cmd = AUX_I2C_MOT; - - if (address & 1) - auxch_cmd |= AUX_I2C_READ; - else - auxch_cmd |= AUX_I2C_WRITE; - - msg[2] = auxch_cmd << 4; - - msg[4] = 0; - msg[0] = (address >> 1); - msg[1] = (address >> 9); - - msg_len = 4; - dp_msg_len = 3; - switch (mode) { - case dp_aux_i2c_read: - /* bottom bits is byte count - 1 so for 1 byte == 0 */ - dp_msg_len += 1; - break; - case dp_aux_i2c_write: - dp_msg_len += 2; - msg[4] = write_byte; - msg_len++; - break; - default: - break; - } - msg[3] = dp_msg_len << 4; - - ret = RADEONProcessAuxCH(output, msg, msg_len, read_byte, 1, 0); - return ret; -} - -static Bool -atom_dp_i2c_address(I2CDevPtr dev, I2CSlaveAddr addr) -{ - I2CBusPtr bus = dev->pI2CBus; - xf86OutputPtr output = bus->DriverPrivate.ptr; - RADEONOutputPrivatePtr radeon_output = output->driver_private; - int ret; - - radeon_output->dp_i2c_addr = addr; - radeon_output->dp_i2c_running = TRUE; - - /* call i2c start */ - ret = atom_dp_aux_i2c_transaction(output, radeon_output->dp_i2c_addr, - dp_aux_i2c_start, 0, NULL); - - return ret; -} -static Bool -atom_dp_i2c_start(I2CBusPtr bus, int timeout) -{ - ErrorF("%s\n", __func__); - return TRUE; -} - -static void -atom_dp_i2c_stop(I2CDevPtr dev) -{ - I2CBusPtr bus = dev->pI2CBus; - xf86OutputPtr output = bus->DriverPrivate.ptr; - RADEONOutputPrivatePtr radeon_output = output->driver_private; - - if (radeon_output->dp_i2c_running) - atom_dp_aux_i2c_transaction(output, radeon_output->dp_i2c_addr, - dp_aux_i2c_stop, 0, NULL); - radeon_output->dp_i2c_running = FALSE; -} - - -static Bool -atom_dp_i2c_put_byte(I2CDevPtr dev, I2CByte byte) -{ - I2CBusPtr bus = dev->pI2CBus; - xf86OutputPtr output = bus->DriverPrivate.ptr; - RADEONOutputPrivatePtr radeon_output = output->driver_private; - Bool ret; - - ret = (atom_dp_aux_i2c_transaction(output, radeon_output->dp_i2c_addr, - dp_aux_i2c_write, byte, NULL)); - return ret; -} - -static Bool -atom_dp_i2c_get_byte(I2CDevPtr dev, I2CByte *byte_ret, Bool last) -{ - I2CBusPtr bus = dev->pI2CBus; - xf86OutputPtr output = bus->DriverPrivate.ptr; - RADEONOutputPrivatePtr radeon_output = output->driver_private; - Bool ret; - - ret = (atom_dp_aux_i2c_transaction(output, radeon_output->dp_i2c_addr, - dp_aux_i2c_read, 0, byte_ret)); - return ret; -} - -Bool -RADEON_DP_I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, char *name, xf86OutputPtr output) -{ - I2CBusPtr pI2CBus; - - pI2CBus = xf86CreateI2CBusRec(); - if (!pI2CBus) return FALSE; - - pI2CBus->BusName = name; - pI2CBus->scrnIndex = pScrn->scrnIndex; - pI2CBus->I2CGetByte = atom_dp_i2c_get_byte; - pI2CBus->I2CPutByte = atom_dp_i2c_put_byte; - pI2CBus->I2CAddress = atom_dp_i2c_address; - pI2CBus->I2CStart = atom_dp_i2c_start; - pI2CBus->I2CStop = atom_dp_i2c_stop; - pI2CBus->DriverPrivate.ptr = output; - - /* - * These were set incorrectly in the server pre-1.3, Having - * duplicate settings is sub-optimal, but this lets the driver - * work with older servers - */ - pI2CBus->ByteTimeout = 2200; /* VESA DDC spec 3 p. 43 (+10 %) */ - pI2CBus->StartTimeout = 550; - pI2CBus->BitTimeout = 40; - pI2CBus->AcknTimeout = 40; - pI2CBus->RiseFallTime = 20; - - if (!xf86I2CBusInit(pI2CBus)) - return FALSE; - - *bus_ptr = pI2CBus; - return TRUE; -} - - -static uint8_t dp_link_status(uint8_t link_status[DP_LINK_STATUS_SIZE], int r) -{ - return link_status[r - DP_LANE0_1_STATUS]; -} - -static uint8_t dp_get_lane_status(uint8_t link_status[DP_LINK_STATUS_SIZE], int lane) -{ - int i = DP_LANE0_1_STATUS + (lane >> 1); - int s = (lane & 1) * 4; - uint8_t l = dp_link_status(link_status, i); - return (l >> s) & 0xf; -} - -static Bool dp_clock_recovery_ok(uint8_t link_status[DP_LINK_STATUS_SIZE], int lane_count) -{ - int lane; - - uint8_t lane_status; - - for (lane = 0; lane < lane_count; lane++) { - lane_status = dp_get_lane_status(link_status, lane); - if ((lane_status & DP_LANE_CR_DONE) == 0) - return FALSE; - } - return TRUE; -} - - -/* Check to see if channel eq is done on all channels */ -#define CHANNEL_EQ_BITS (DP_LANE_CR_DONE|\ - DP_LANE_CHANNEL_EQ_DONE|\ - DP_LANE_SYMBOL_LOCKED) -static Bool -dp_channel_eq_ok(uint8_t link_status[DP_LINK_STATUS_SIZE], int lane_count) -{ - uint8_t lane_align; - uint8_t lane_status; - int lane; - - lane_align = dp_link_status(link_status, - DP_LANE_ALIGN_STATUS_UPDATED); - if ((lane_align & DP_INTERLANE_ALIGN_DONE) == 0) - return FALSE; - for (lane = 0; lane < lane_count; lane++) { - lane_status = dp_get_lane_status(link_status, lane); - if ((lane_status & CHANNEL_EQ_BITS) != CHANNEL_EQ_BITS) - return FALSE; - } - return TRUE; -} - -/* - * Fetch AUX CH registers 0x202 - 0x207 which contain - * link status information - */ -static Bool -atom_dp_get_link_status(xf86OutputPtr output, - uint8_t link_status[DP_LINK_STATUS_SIZE]) -{ - ScrnInfoPtr pScrn = output->scrn; - int ret; - ret = atom_dp_aux_native_read(output, DP_LANE0_1_STATUS, 100, - DP_LINK_STATUS_SIZE, link_status); - if (!ret) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "dp link status failed\n"); - return FALSE; - } - ErrorF("link status %02x %02x %02x %02x %02x %02x\n", link_status[0], link_status[1], - link_status[2], link_status[3], link_status[4], link_status[5]); - - return TRUE; -} - -static uint8_t -dp_get_adjust_request_voltage(uint8_t link_status[DP_LINK_STATUS_SIZE], - int lane) - -{ - int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1); - int s = ((lane & 1) ? - DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT : - DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT); - uint8_t l = dp_link_status(link_status, i); - - return ((l >> s) & 3) << DP_TRAIN_VOLTAGE_SWING_SHIFT; -} - -static uint8_t -dp_get_adjust_request_pre_emphasis(uint8_t link_status[DP_LINK_STATUS_SIZE], - int lane) -{ - int i = DP_ADJUST_REQUEST_LANE0_1 + (lane >> 1); - int s = ((lane & 1) ? - DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT : - DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT); - uint8_t l = dp_link_status(link_status, i); - - return ((l >> s) & 3) << DP_TRAIN_PRE_EMPHASIS_SHIFT; -} - -static char *voltage_names[] = { - "0.4V", "0.6V", "0.8V", "1.2V" -}; -static char *pre_emph_names[] = { - "0dB", "3.5dB", "6dB", "9.5dB" -}; - -/* - * These are source-specific values; current Intel hardware supports - * a maximum voltage of 800mV and a maximum pre-emphasis of 6dB - */ -#define DP_VOLTAGE_MAX DP_TRAIN_VOLTAGE_SWING_1200 - -static uint8_t -dp_pre_emphasis_max(uint8_t voltage_swing) -{ - switch (voltage_swing & DP_TRAIN_VOLTAGE_SWING_MASK) { - case DP_TRAIN_VOLTAGE_SWING_400: - return DP_TRAIN_PRE_EMPHASIS_6; - case DP_TRAIN_VOLTAGE_SWING_600: - return DP_TRAIN_PRE_EMPHASIS_6; - case DP_TRAIN_VOLTAGE_SWING_800: - return DP_TRAIN_PRE_EMPHASIS_3_5; - case DP_TRAIN_VOLTAGE_SWING_1200: - default: - return DP_TRAIN_PRE_EMPHASIS_0; - } -} - -static void dp_set_training(xf86OutputPtr output, uint8_t training) -{ - atom_dp_aux_native_write(output, DP_TRAINING_PATTERN_SET, 1, &training); -} - -static void dp_set_power(xf86OutputPtr output, uint8_t power_state) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - - if (radeon_output->dpcd[0] >= 0x11) { - atom_dp_aux_native_write(output, 0x600, 1, &power_state); - } -} - -static void -dp_get_adjust_train(xf86OutputPtr output, - uint8_t link_status[DP_LINK_STATUS_SIZE], - int lane_count, - uint8_t train_set[4]) -{ - ScrnInfoPtr pScrn = output->scrn; - uint8_t v = 0; - uint8_t p = 0; - int lane; - - for (lane = 0; lane < lane_count; lane++) { - uint8_t this_v = dp_get_adjust_request_voltage(link_status, lane); - uint8_t this_p = dp_get_adjust_request_pre_emphasis(link_status, lane); - - if (0) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "requested signal parameters: lane %d voltage %s pre_emph %s\n", - lane, - voltage_names[this_v >> DP_TRAIN_VOLTAGE_SWING_SHIFT], - pre_emph_names[this_p >> DP_TRAIN_PRE_EMPHASIS_SHIFT]); - } - if (this_v > v) - v = this_v; - if (this_p > p) - p = this_p; - } - - if (v >= DP_VOLTAGE_MAX) - v = DP_VOLTAGE_MAX | DP_TRAIN_MAX_SWING_REACHED; - - if (p >= dp_pre_emphasis_max(v)) - p = dp_pre_emphasis_max(v) | DP_TRAIN_MAX_PRE_EMPHASIS_REACHED; - - if (0) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "using signal parameters: voltage %s pre_emph %s\n", - voltage_names[(v & DP_TRAIN_VOLTAGE_SWING_MASK) >> DP_TRAIN_VOLTAGE_SWING_SHIFT], - pre_emph_names[(p & DP_TRAIN_PRE_EMPHASIS_MASK) >> DP_TRAIN_PRE_EMPHASIS_SHIFT]); - } - for (lane = 0; lane < 4; lane++) - train_set[lane] = v | p; -} - -static int radeon_dp_max_lane_count(xf86OutputPtr output) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - int max_lane_count = 4; - - if (radeon_output->dpcd[0] >= 0x11) { - max_lane_count = radeon_output->dpcd[2] & 0x1f; - switch(max_lane_count) { - case 1: case 2: case 4: - break; - default: - max_lane_count = 4; - } - } - return max_lane_count; -} - -Bool radeon_dp_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - int clock = adjusted_mode->Clock; - - radeon_output->dp_lane_count = dp_lanes_for_mode_clock(output, clock); - radeon_output->dp_clock = dp_link_clock_for_mode_clock(output, clock); - if (!radeon_output->dp_lane_count || !radeon_output->dp_clock) - return FALSE; - return TRUE; -} - -static void dp_update_dpvs_emph(xf86OutputPtr output, uint8_t train_set[4]) -{ - RADEONOutputPrivatePtr radeon_output = output->driver_private; - int i; - for (i = 0; i < radeon_output->dp_lane_count; i++) - atombios_output_dig_transmitter_setup(output, ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH, i, train_set[i]); - - atom_dp_aux_native_write(output, DP_TRAINING_LANE0_SET, radeon_output->dp_lane_count, train_set); -} - -static void do_displayport_link_train(xf86OutputPtr output) -{ - ScrnInfoPtr pScrn = output->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONOutputPrivatePtr radeon_output = output->driver_private; - int enc_id = atom_dp_get_encoder_id(output); - Bool clock_recovery; - uint8_t link_status[DP_LINK_STATUS_SIZE]; - uint8_t tries, voltage, ss_cntl; - uint8_t train_set[4]; - int i; - Bool channel_eq; - uint8_t dp_link_configuration[DP_LINK_CONFIGURATION_SIZE]; - - memset(train_set, 0, 4); - - /* set up link configuration */ - memset(dp_link_configuration, 0, DP_LINK_CONFIGURATION_SIZE); - - if (radeon_output->dp_clock == 27000) - dp_link_configuration[0] = DP_LINK_BW_2_7; - else - dp_link_configuration[0] = DP_LINK_BW_1_62; - dp_link_configuration[1] = radeon_output->dp_lane_count; - - if (radeon_output->dpcd[0] >= 0x11) { - dp_link_configuration[1] |= DP_LANE_COUNT_ENHANCED_FRAME_EN; - } - - /* power up to D0 */ - dp_set_power(output, DP_SET_POWER_D0); - - /* disable training */ - dp_set_training(output, DP_TRAINING_PATTERN_DISABLE); - - /* write link rate / num / eh framing */ - atom_dp_aux_native_write(output, DP_LINK_BW_SET, 2, - dp_link_configuration); - - /* write ss cntl */ - ss_cntl = 0; - atom_dp_aux_native_write(output, DP_DOWNSPREAD_CTRL, 1, - &ss_cntl); - - /* start local training start */ - if (IS_DCE4_VARIANT) { - atombios_output_dig_encoder_setup(output, ATOM_ENCODER_CMD_DP_LINK_TRAINING_START); - atombios_output_dig_encoder_setup(output, ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1); - } else { - RADEONDPEncoderService(output, ATOM_DP_ACTION_TRAINING_START, enc_id, 0); - RADEONDPEncoderService(output, ATOM_DP_ACTION_TRAINING_PATTERN_SEL, enc_id, 0); - } - - usleep(400); - dp_set_training(output, DP_TRAINING_PATTERN_1); - dp_update_dpvs_emph(output, train_set); - - /* loop around doing configuration reads and DP encoder setups */ - clock_recovery = FALSE; - tries = 0; - voltage = 0xff; - for (;;) { - usleep(100); - if (!atom_dp_get_link_status(output, link_status)) - break; - - if (dp_clock_recovery_ok(link_status, radeon_output->dp_lane_count)) { - clock_recovery = TRUE; - break; - } - - for (i = 0; i < radeon_output->dp_lane_count; i++) - if ((train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0) - break; - if (i == radeon_output->dp_lane_count) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "clock recovery reached max voltage\n"); - break; - } - - /* Check to see if we've tried the same voltage 5 times */ - if ((train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) { - ++tries; - if (tries == 5) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "clock recovery tried 5 times\n"); - break; - } - } else - tries = 0; - - voltage = train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK; - - dp_get_adjust_train(output, link_status, radeon_output->dp_lane_count, train_set); - dp_update_dpvs_emph(output, train_set); - - } - - if (!clock_recovery) - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "clock recovery failed\n"); - - /* channel equalization */ - tries = 0; - channel_eq = FALSE; - dp_set_training(output, DP_TRAINING_PATTERN_2); - if (IS_DCE4_VARIANT) - atombios_output_dig_encoder_setup(output, ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN2); - else - RADEONDPEncoderService(output, ATOM_DP_ACTION_TRAINING_PATTERN_SEL, enc_id, 1); - - for (;;) { - usleep(400); - if (!atom_dp_get_link_status(output, link_status)) - break; - - if (dp_channel_eq_ok(link_status, radeon_output->dp_lane_count)) { - channel_eq = TRUE; - break; - } - - /* Try 5 times */ - if (tries > 5) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "channel eq failed: 5 tries\n"); - break; - } - - /* Compute new train_set as requested by target */ - dp_get_adjust_train(output, link_status, radeon_output->dp_lane_count, train_set); - dp_update_dpvs_emph(output, train_set); - - ++tries; - } - - if (!channel_eq) - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "channel eq failed\n"); - - dp_set_training(output, DP_TRAINING_PATTERN_DISABLE); - if (IS_DCE4_VARIANT) - atombios_output_dig_encoder_setup(output, ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE); - else - RADEONDPEncoderService(output, ATOM_DP_ACTION_TRAINING_COMPLETE, enc_id, 0); - -} - diff --git a/driver/xf86-video-ati/src/cayman_accel.c b/driver/xf86-video-ati/src/cayman_accel.c deleted file mode 100644 index 1dfaecebf..000000000 --- a/driver/xf86-video-ati/src/cayman_accel.c +++ /dev/null @@ -1,307 +0,0 @@ -/* - * Copyright 2011 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 (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 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. - * - * Authors: Alex Deucher - * - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef XF86DRM_MODE - -#include "xf86.h" - -#include - -#include "radeon.h" -#include "radeon_reg.h" -#include "cayman_reg.h" -#include "evergreen_state.h" - -#include "radeon_drm.h" -#include "radeon_vbo.h" -#include "radeon_exa_shared.h" - -/* - * Setup of default state - */ - -void -cayman_set_default_state(ScrnInfoPtr pScrn) -{ - tex_resource_t tex_res; - shader_config_t fs_conf; - int i; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - if (accel_state->XInited3D) - return; - - memset(&tex_res, 0, sizeof(tex_resource_t)); - memset(&fs_conf, 0, sizeof(shader_config_t)); - - accel_state->XInited3D = TRUE; - - evergreen_start_3d(pScrn); - - BEGIN_BATCH(21); - EREG(SQ_LDS_ALLOC_PS, 0); - - PACK0(SQ_ESGS_RING_ITEMSIZE, 6); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - - PACK0(SQ_GS_VERT_ITEMSIZE, 4); - E32(0); - E32(0); - E32(0); - E32(0); - - PACK0(SQ_VTX_BASE_VTX_LOC, 2); - E32(0); - E32(0); - END_BATCH(); - - /* DB */ - BEGIN_BATCH(3 + 2); - EREG(DB_Z_INFO, 0); - RELOC_BATCH(accel_state->shaders_bo, RADEON_GEM_DOMAIN_VRAM, 0); - END_BATCH(); - - BEGIN_BATCH(3 + 2); - EREG(DB_STENCIL_INFO, 0); - RELOC_BATCH(accel_state->shaders_bo, RADEON_GEM_DOMAIN_VRAM, 0); - END_BATCH(); - - BEGIN_BATCH(3 + 2); - EREG(DB_HTILE_DATA_BASE, 0); - RELOC_BATCH(accel_state->shaders_bo, RADEON_GEM_DOMAIN_VRAM, 0); - END_BATCH(); - - BEGIN_BATCH(52); - EREG(DB_DEPTH_INFO, 0); - EREG(DB_DEPTH_CONTROL, 0); - - PACK0(PA_SC_VPORT_ZMIN_0, 2); - EFLOAT(0.0); // PA_SC_VPORT_ZMIN_0 - EFLOAT(1.0); // PA_SC_VPORT_ZMAX_0 - - PACK0(DB_RENDER_CONTROL, 5); - E32(STENCIL_COMPRESS_DISABLE_bit | DEPTH_COMPRESS_DISABLE_bit); // DB_RENDER_CONTROL - E32(0); // DB_COUNT_CONTROL - E32(0); // DB_DEPTH_VIEW - E32(0x2a); // DB_RENDER_OVERRIDE - E32(0); // DB_RENDER_OVERRIDE2 - - PACK0(DB_STENCIL_CLEAR, 2); - E32(0); // DB_STENCIL_CLEAR - E32(0); // DB_DEPTH_CLEAR - - EREG(DB_ALPHA_TO_MASK, ((2 << ALPHA_TO_MASK_OFFSET0_shift) | - (2 << ALPHA_TO_MASK_OFFSET1_shift) | - (2 << ALPHA_TO_MASK_OFFSET2_shift) | - (2 << ALPHA_TO_MASK_OFFSET3_shift))); - - EREG(DB_SHADER_CONTROL, ((EARLY_Z_THEN_LATE_Z << Z_ORDER_shift) | - DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ - - // SX - EREG(SX_MISC, 0); - - // CB - PACK0(SX_ALPHA_TEST_CONTROL, 5); - E32(0); // SX_ALPHA_TEST_CONTROL - E32(0x00000000); //CB_BLEND_RED - E32(0x00000000); //CB_BLEND_GREEN - E32(0x00000000); //CB_BLEND_BLUE - E32(0x00000000); //CB_BLEND_ALPHA - - EREG(CB_SHADER_MASK, OUTPUT0_ENABLE_mask); - - // SC - EREG(PA_SC_WINDOW_OFFSET, ((0 << WINDOW_X_OFFSET_shift) | - (0 << WINDOW_Y_OFFSET_shift))); - EREG(PA_SC_CLIPRECT_RULE, CLIP_RULE_mask); - EREG(PA_SC_EDGERULE, 0xAAAAAAAA); - EREG(PA_SU_HARDWARE_SCREEN_OFFSET, 0); - END_BATCH(); - - /* clip boolean is set to always visible -> doesn't matter */ - for (i = 0; i < PA_SC_CLIPRECT_0_TL_num; i++) - evergreen_set_clip_rect (pScrn, i, 0, 0, 8192, 8192); - - for (i = 0; i < PA_SC_VPORT_SCISSOR_0_TL_num; i++) - evergreen_set_vport_scissor (pScrn, i, 0, 0, 8192, 8192); - - BEGIN_BATCH(73); - PACK0(PA_SC_MODE_CNTL_0, 2); - E32(0); // PA_SC_MODE_CNTL_0 - E32(0); // PA_SC_MODE_CNTL_1 - - PACK0(PA_SC_CENTROID_PRIORITY_0, 27); - E32((0 << DISTANCE_0_shift) | - (1 << DISTANCE_1_shift) | - (2 << DISTANCE_2_shift) | - (3 << DISTANCE_3_shift) | - (4 << DISTANCE_4_shift) | - (5 << DISTANCE_5_shift) | - (6 << DISTANCE_6_shift) | - (7 << DISTANCE_7_shift)); // PA_SC_CENTROID_PRIORITY_0 - E32((8 << DISTANCE_8_shift) | - (9 << DISTANCE_9_shift) | - (10 << DISTANCE_10_shift) | - (11 << DISTANCE_11_shift) | - (12 << DISTANCE_12_shift) | - (13 << DISTANCE_13_shift) | - (14 << DISTANCE_14_shift) | - (15 << DISTANCE_15_shift)); // PA_SC_CENTROID_PRIORITY_1 - E32(0); // PA_SC_LINE_CNTL - E32(0); // PA_SC_AA_CONFIG - E32(((X_ROUND_TO_EVEN << PA_SU_VTX_CNTL__ROUND_MODE_shift) | - PIX_CENTER_bit)); // PA_SU_VTX_CNTL - EFLOAT(1.0); // PA_CL_GB_VERT_CLIP_ADJ - EFLOAT(1.0); // PA_CL_GB_VERT_DISC_ADJ - EFLOAT(1.0); // PA_CL_GB_HORZ_CLIP_ADJ - EFLOAT(1.0); // PA_CL_GB_HORZ_DISC_ADJ - E32(0); // PA_SC_AA_SAMPLE_LOCS_PIXEL_* - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); // PA_SC_AA_SAMPLE_LOCS__PIXEL_* - E32(0xFFFFFFFF); // PA_SC_AA_MASK_* - E32(0xFFFFFFFF); // PA_SC_AA_MASK_* - - // CL - PACK0(PA_CL_CLIP_CNTL, 8); - E32(CLIP_DISABLE_bit); // PA_CL_CLIP_CNTL - E32(FACE_bit); // PA_SU_SC_MODE_CNTL - E32(VTX_XY_FMT_bit); // PA_CL_VTE_CNTL - E32(0); // PA_CL_VS_OUT_CNTL - E32(0); // PA_CL_NANINF_CNTL - E32(0); // PA_SU_LINE_STIPPLE_CNTL - E32(0); // PA_SU_LINE_STIPPLE_SCALE - E32(0); // PA_SU_PRIM_FILTER_CNTL - - // SU - PACK0(PA_SU_POLY_OFFSET_DB_FMT_CNTL, 6); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - - /* src = semantic id 0; mask = semantic id 1 */ - EREG(SPI_VS_OUT_ID_0, ((0 << SEMANTIC_0_shift) | - (1 << SEMANTIC_1_shift))); - PACK0(SPI_PS_INPUT_CNTL_0 + (0 << 2), 2); - /* SPI_PS_INPUT_CNTL_0 maps to GPR[0] - load with semantic id 0 */ - E32(((0 << SEMANTIC_shift) | - (0x01 << DEFAULT_VAL_shift))); - /* SPI_PS_INPUT_CNTL_1 maps to GPR[1] - load with semantic id 1 */ - E32(((1 << SEMANTIC_shift) | - (0x01 << DEFAULT_VAL_shift))); - - PACK0(SPI_INPUT_Z, 13); - E32(0); // SPI_INPUT_Z - E32(0); // SPI_FOG_CNTL - E32(LINEAR_CENTROID_ENA__X_ON_AT_CENTROID << LINEAR_CENTROID_ENA_shift); // SPI_BARYC_CNTL - E32(0); // SPI_PS_IN_CONTROL_2 - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); // SPI_GPR_MGMT - E32(0); // SPI_LDS_MGMT - E32(0); // SPI_STACK_MGMT - E32(0); // SPI_WAVE_MGMT_1 - E32(0); // SPI_WAVE_MGMT_2 - END_BATCH(); - - // clear FS - fs_conf.bo = accel_state->shaders_bo; - evergreen_fs_setup(pScrn, &fs_conf, RADEON_GEM_DOMAIN_VRAM); - - // VGT - BEGIN_BATCH(46); - - PACK0(VGT_MAX_VTX_INDX, 4); - E32(0xffffff); - E32(0); - E32(0); - E32(0); - - PACK0(VGT_INSTANCE_STEP_RATE_0, 2); - E32(0); - E32(0); - - PACK0(VGT_REUSE_OFF, 2); - E32(0); - E32(0); - - PACK0(PA_SU_POINT_SIZE, 17); - E32(0); // PA_SU_POINT_SIZE - E32(0); // PA_SU_POINT_MINMAX - E32((8 << PA_SU_LINE_CNTL__WIDTH_shift)); /* Line width 1 pixel */ // PA_SU_LINE_CNTL - E32(0); // PA_SC_LINE_STIPPLE - E32(0); // VGT_OUTPUT_PATH_CNTL - E32(0); // VGT_HOS_CNTL - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); // VGT_GS_MODE - - EREG(VGT_PRIMITIVEID_EN, 0); - EREG(VGT_MULTI_PRIM_IB_RESET_EN, 0); - EREG(VGT_SHADER_STAGES_EN, 0); - - PACK0(VGT_STRMOUT_CONFIG, 2); - E32(0); - E32(0); - END_BATCH(); -} - -#endif diff --git a/driver/xf86-video-ati/src/cayman_reg.h b/driver/xf86-video-ati/src/cayman_reg.h deleted file mode 100644 index e994d607c..000000000 --- a/driver/xf86-video-ati/src/cayman_reg.h +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Cayman Register documentation - * - * Copyright (C) 2011 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 COPYRIGHT HOLDER(S) 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. - */ - -#ifndef _CAYMAN_REG_H_ -#define _CAYMAN_REG_H_ - -/* - * Register definitions - */ - -#include "cayman_reg_auto.h" - -enum { - SHADER_TYPE_PS, - SHADER_TYPE_VS, - SHADER_TYPE_GS, - SHADER_TYPE_HS, - SHADER_TYPE_LS, - SHADER_TYPE_CS, - SHADER_TYPE_FS, -}; - - -/* SET_*_REG offsets + ends */ -#define SET_CONFIG_REG_offset 0x00008000 -#define SET_CONFIG_REG_end 0x0000ac00 -#define SET_CONTEXT_REG_offset 0x00028000 -#define SET_CONTEXT_REG_end 0x00029000 -#define SET_RESOURCE_offset 0x00030000 -#define SET_RESOURCE_end 0x00038000 -#define SET_SAMPLER_offset 0x0003c000 -#define SET_SAMPLER_end 0x0003c600 -#define SET_CTL_CONST_offset 0x0003cff0 -#define SET_CTL_CONST_end 0x0003ff0c -#define SET_LOOP_CONST_offset 0x0003a200 -#define SET_LOOP_CONST_end 0x0003a500 -#define SET_BOOL_CONST_offset 0x0003a500 -#define SET_BOOL_CONST_end 0x0003a518 - - -/* Packet3 commands */ -enum { - IT_NOP = 0x10, - IT_INDIRECT_BUFFER_END = 0x17, - IT_SET_PREDICATION = 0x20, - IT_COND_EXEC = 0x22, - IT_PRED_EXEC = 0x23, - IT_DRAW_INDEX_2 = 0x27, - IT_CONTEXT_CONTROL = 0x28, - IT_DRAW_INDEX_OFFSET = 0x29, - IT_INDEX_TYPE = 0x2A, - IT_DRAW_INDEX = 0x2B, - IT_DRAW_INDEX_AUTO = 0x2D, - IT_DRAW_INDEX_IMMD = 0x2E, - IT_NUM_INSTANCES = 0x2F, - IT_INDIRECT_BUFFER = 0x32, - IT_STRMOUT_BUFFER_UPDATE = 0x34, - IT_MEM_SEMAPHORE = 0x39, - IT_MPEG_INDEX = 0x3A, - IT_WAIT_REG_MEM = 0x3C, - IT_MEM_WRITE = 0x3D, - IT_SURFACE_SYNC = 0x43, - IT_ME_INITIALIZE = 0x44, - IT_COND_WRITE = 0x45, - IT_EVENT_WRITE = 0x46, - IT_EVENT_WRITE_EOP = 0x47, - IT_EVENT_WRITE_EOS = 0x48, - IT_SET_CONFIG_REG = 0x68, - IT_SET_CONTEXT_REG = 0x69, - IT_SET_ALU_CONST = 0x6A, - IT_SET_BOOL_CONST = 0x6B, - IT_SET_LOOP_CONST = 0x6C, - IT_SET_RESOURCE = 0x6D, - IT_SET_SAMPLER = 0x6E, - IT_SET_CTL_CONST = 0x6F, -}; - -/* IT_WAIT_REG_MEM operation encoding */ - -#define IT_WAIT_ALWAYS (0 << 0) -#define IT_WAIT_LT (1 << 0) -#define IT_WAIT_LE (2 << 0) -#define IT_WAIT_EQ (3 << 0) -#define IT_WAIT_NE (4 << 0) -#define IT_WAIT_GE (5 << 0) -#define IT_WAIT_GT (6 << 0) -#define IT_WAIT_REG (0 << 4) -#define IT_WAIT_MEM (1 << 4) - -#define IT_WAIT_ADDR(x) ((x) >> 2) - -enum { - - SQ_LDS_ALLOC_PS = 0x288ec, - SQ_DYN_GPR_CNTL_PS_FLUSH_REQ = 0x8d8c, - - CP_COHER_CNTL = 0x85f0, - DEST_BASE_0_ENA_bit = 1 << 0, - DEST_BASE_1_ENA_bit = 1 << 1, - SO0_DEST_BASE_ENA_bit = 1 << 2, - SO1_DEST_BASE_ENA_bit = 1 << 3, - SO2_DEST_BASE_ENA_bit = 1 << 4, - SO3_DEST_BASE_ENA_bit = 1 << 5, - CB0_DEST_BASE_ENA_bit = 1 << 6, - CB1_DEST_BASE_ENA_bit = 1 << 7, - CB2_DEST_BASE_ENA_bit = 1 << 8, - CB3_DEST_BASE_ENA_bit = 1 << 9, - CB4_DEST_BASE_ENA_bit = 1 << 10, - CB5_DEST_BASE_ENA_bit = 1 << 11, - CB6_DEST_BASE_ENA_bit = 1 << 12, - CB7_DEST_BASE_ENA_bit = 1 << 13, - DB_DEST_BASE_ENA_bit = 1 << 14, - CB8_DEST_BASE_ENA_bit = 1 << 15, - CB9_DEST_BASE_ENA_bit = 1 << 16, - CB10_DEST_BASE_ENA_bit = 1 << 17, - CB11_DEST_BASE_ENA_bit = 1 << 18, - FULL_CACHE_ENA_bit = 1 << 20, - TC_ACTION_ENA_bit = 1 << 23, - CB_ACTION_ENA_bit = 1 << 25, - DB_ACTION_ENA_bit = 1 << 26, - SH_ACTION_ENA_bit = 1 << 27, - SX_ACTION_ENA_bit = 1 << 28, - CP_COHER_SIZE = 0x85f4, - CP_COHER_BASE = 0x85f8, - CP_COHER_STATUS = 0x85fc, - MATCHING_GFX_CNTX_mask = 0xff << 0, - MATCHING_GFX_CNTX_shift = 0, - STATUS_bit = 1 << 31, - -// SQ_VTX_CONSTANT_WORD2_0 = 0x00030008, -// SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask = 0x3f << 20, - FMT_INVALID=0, FMT_8, FMT_4_4, FMT_3_3_2, - FMT_16=5, FMT_16_FLOAT, FMT_8_8, - FMT_5_6_5, FMT_6_5_5, FMT_1_5_5_5, FMT_4_4_4_4, - FMT_5_5_5_1, FMT_32, FMT_32_FLOAT, FMT_16_16, - FMT_16_16_FLOAT=16, FMT_8_24, FMT_8_24_FLOAT, FMT_24_8, - FMT_24_8_FLOAT, FMT_10_11_11, FMT_10_11_11_FLOAT, FMT_11_11_10, - FMT_11_11_10_FLOAT, FMT_2_10_10_10, FMT_8_8_8_8, FMT_10_10_10_2, - FMT_X24_8_32_FLOAT, FMT_32_32, FMT_32_32_FLOAT, FMT_16_16_16_16, - FMT_16_16_16_16_FLOAT=32, FMT_32_32_32_32=34, FMT_32_32_32_32_FLOAT, - FMT_1 = 37, FMT_GB_GR=39, - FMT_BG_RG, FMT_32_AS_8, FMT_32_AS_8_8, FMT_5_9_9_9_SHAREDEXP, - FMT_8_8_8, FMT_16_16_16, FMT_16_16_16_FLOAT, FMT_32_32_32, - FMT_32_32_32_FLOAT=48, - -// High level register file lengths - SQ_FETCH_RESOURCE = SQ_TEX_RESOURCE_WORD0_0, - SQ_FETCH_RESOURCE_ps_num = 176, - SQ_FETCH_RESOURCE_vs_num = 160, - SQ_FETCH_RESOURCE_gs_num = 160, - SQ_FETCH_RESOURCE_hs_num = 160, - SQ_FETCH_RESOURCE_ls_num = 160, - SQ_FETCH_RESOURCE_cs_num = 176, - SQ_FETCH_RESOURCE_fs_num = 32, - SQ_FETCH_RESOURCE_all_num = 1024, - SQ_FETCH_RESOURCE_offset = 32, - SQ_FETCH_RESOURCE_ps = 0, // 0...175 - SQ_FETCH_RESOURCE_vs = SQ_FETCH_RESOURCE_ps + SQ_FETCH_RESOURCE_ps_num, // 176...335 - SQ_FETCH_RESOURCE_gs = SQ_FETCH_RESOURCE_vs + SQ_FETCH_RESOURCE_vs_num, // 336...495 - SQ_FETCH_RESOURCE_hs = SQ_FETCH_RESOURCE_gs + SQ_FETCH_RESOURCE_gs_num, // 496...655 - SQ_FETCH_RESOURCE_ls = SQ_FETCH_RESOURCE_hs + SQ_FETCH_RESOURCE_hs_num, // 656...815 - SQ_FETCH_RESOURCE_cs = SQ_FETCH_RESOURCE_ls + SQ_FETCH_RESOURCE_ls_num, // 816...991 - SQ_FETCH_RESOURCE_fs = SQ_FETCH_RESOURCE_cs + SQ_FETCH_RESOURCE_cs_num, // 992...1023 - - SQ_TEX_SAMPLER_WORD = SQ_TEX_SAMPLER_WORD0_0, - SQ_TEX_SAMPLER_WORD_ps_num = 18, - SQ_TEX_SAMPLER_WORD_vs_num = 18, - SQ_TEX_SAMPLER_WORD_gs_num = 18, - SQ_TEX_SAMPLER_WORD_hs_num = 18, - SQ_TEX_SAMPLER_WORD_ls_num = 18, - SQ_TEX_SAMPLER_WORD_cs_num = 18, - SQ_TEX_SAMPLER_WORD_all_num = 108, - SQ_TEX_SAMPLER_WORD_offset = 12, - SQ_TEX_SAMPLER_WORD_ps = 0, // 0...17 - SQ_TEX_SAMPLER_WORD_vs = SQ_TEX_SAMPLER_WORD_ps + SQ_TEX_SAMPLER_WORD_ps_num, // 18...35 - SQ_TEX_SAMPLER_WORD_gs = SQ_TEX_SAMPLER_WORD_vs + SQ_TEX_SAMPLER_WORD_vs_num, // 36...53 - SQ_TEX_SAMPLER_WORD_hs = SQ_TEX_SAMPLER_WORD_gs + SQ_TEX_SAMPLER_WORD_gs_num, // 54...71 - SQ_TEX_SAMPLER_WORD_ls = SQ_TEX_SAMPLER_WORD_hs + SQ_TEX_SAMPLER_WORD_hs_num, // 72...89 - SQ_TEX_SAMPLER_WORD_cs = SQ_TEX_SAMPLER_WORD_ls + SQ_TEX_SAMPLER_WORD_ls_num, // 90...107 - - SQ_LOOP_CONST = SQ_LOOP_CONST_0, - SQ_LOOP_CONST_ps_num = 32, - SQ_LOOP_CONST_vs_num = 32, - SQ_LOOP_CONST_gs_num = 32, - SQ_LOOP_CONST_hs_num = 32, - SQ_LOOP_CONST_ls_num = 32, - SQ_LOOP_CONST_cs_num = 32, - SQ_LOOP_CONST_all_num = 192, - SQ_LOOP_CONST_offset = 4, - SQ_LOOP_CONST_ps = 0, // 0...31 - SQ_LOOP_CONST_vs = SQ_LOOP_CONST_ps + SQ_LOOP_CONST_ps_num, // 32...63 - SQ_LOOP_CONST_gs = SQ_LOOP_CONST_vs + SQ_LOOP_CONST_vs_num, // 64...95 - SQ_LOOP_CONST_hs = SQ_LOOP_CONST_gs + SQ_LOOP_CONST_gs_num, // 96...127 - SQ_LOOP_CONST_ls = SQ_LOOP_CONST_hs + SQ_LOOP_CONST_hs_num, // 128...159 - SQ_LOOP_CONST_cs = SQ_LOOP_CONST_ls + SQ_LOOP_CONST_ls_num, // 160...191 - - SQ_BOOL_CONST = SQ_BOOL_CONST_0, /* 32 bits each */ - SQ_BOOL_CONST_ps_num = 1, - SQ_BOOL_CONST_vs_num = 1, - SQ_BOOL_CONST_gs_num = 1, - SQ_BOOL_CONST_hs_num = 1, - SQ_BOOL_CONST_ls_num = 1, - SQ_BOOL_CONST_cs_num = 1, - SQ_BOOL_CONST_all_num = 6, - SQ_BOOL_CONST_offset = 4, - SQ_BOOL_CONST_ps = 0, - SQ_BOOL_CONST_vs = SQ_BOOL_CONST_ps + SQ_BOOL_CONST_ps_num, - SQ_BOOL_CONST_gs = SQ_BOOL_CONST_vs + SQ_BOOL_CONST_vs_num, - SQ_BOOL_CONST_hs = SQ_BOOL_CONST_gs + SQ_BOOL_CONST_gs_num, - SQ_BOOL_CONST_ls = SQ_BOOL_CONST_hs + SQ_BOOL_CONST_hs_num, - SQ_BOOL_CONST_cs = SQ_BOOL_CONST_ls + SQ_BOOL_CONST_ls_num, - -}; - -#endif diff --git a/driver/xf86-video-ati/src/cayman_reg_auto.h b/driver/xf86-video-ati/src/cayman_reg_auto.h deleted file mode 100644 index 460c1e5ae..000000000 --- a/driver/xf86-video-ati/src/cayman_reg_auto.h +++ /dev/null @@ -1,4351 +0,0 @@ -/* - * Cayman Register documentation - * - * Copyright (C) 2011 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 COPYRIGHT HOLDER(S) 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. - */ - -#ifndef _CAYMAN_REG_AUTO -#define _CAYMAN_REG_AUTO - -enum { - - VGT_VTX_VECT_EJECT_REG = 0x000088b0, - PRIM_COUNT_mask = 0x3ff << 0, - PRIM_COUNT_shift = 0, - VGT_LAST_COPY_STATE = 0x000088c0, - SRC_STATE_ID_mask = 0x07 << 0, - SRC_STATE_ID_shift = 0, - DST_STATE_ID_mask = 0x07 << 16, - DST_STATE_ID_shift = 16, - VGT_CACHE_INVALIDATION = 0x000088c4, - CACHE_INVALIDATION_mask = 0x03 << 0, - CACHE_INVALIDATION_shift = 0, - VC_ONLY = 0x00, - TC_ONLY = 0x01, - VC_AND_TC = 0x02, - VS_NO_EXTRA_BUFFER_bit = 1 << 5, - AUTO_INVLD_EN_mask = 0x03 << 6, - AUTO_INVLD_EN_shift = 6, - VGT_GS_VERTEX_REUSE = 0x000088d4, - VERT_REUSE_mask = 0x1f << 0, - VERT_REUSE_shift = 0, - VGT_CNTL_STATUS = 0x000088f0, - VGT_OUT_INDX_BUSY_bit = 1 << 0, - VGT_OUT_BUSY_bit = 1 << 1, - VGT_PT_BUSY_bit = 1 << 2, - VGT_TE_BUSY_bit = 1 << 3, - VGT_VR_BUSY_bit = 1 << 4, - VGT_PI_BUSY_bit = 1 << 5, - VGT_INVLD_BUSY_bit = 1 << 6, - VGT_GS_BUSY_bit = 1 << 7, - VGT_HS_BUSY_bit = 1 << 8, - VGT_TE11_BUSY_bit = 1 << 9, - VGT_BUSY_bit = 1 << 10, - VGT_PRIMITIVE_TYPE = 0x00008958, - VGT_PRIMITIVE_TYPE__PRIM_TYPE_mask = 0x3f << 0, - VGT_PRIMITIVE_TYPE__PRIM_TYPE_shift = 0, - DI_PT_NONE = 0x00, - DI_PT_POINTLIST = 0x01, - DI_PT_LINELIST = 0x02, - DI_PT_LINESTRIP = 0x03, - DI_PT_TRILIST = 0x04, - DI_PT_TRIFAN = 0x05, - DI_PT_TRISTRIP = 0x06, - DI_PT_UNUSED_0 = 0x07, - DI_PT_UNUSED_1 = 0x08, - DI_PT_PATCH = 0x09, - DI_PT_LINELIST_ADJ = 0x0a, - DI_PT_LINESTRIP_ADJ = 0x0b, - DI_PT_TRILIST_ADJ = 0x0c, - DI_PT_TRISTRIP_ADJ = 0x0d, - DI_PT_UNUSED_3 = 0x0e, - DI_PT_UNUSED_4 = 0x0f, - DI_PT_TRI_WITH_WFLAGS = 0x10, - DI_PT_RECTLIST = 0x11, - DI_PT_LINELOOP = 0x12, - DI_PT_QUADLIST = 0x13, - DI_PT_QUADSTRIP = 0x14, - DI_PT_POLYGON = 0x15, - DI_PT_2D_COPY_RECT_LIST_V0 = 0x16, - DI_PT_2D_COPY_RECT_LIST_V1 = 0x17, - DI_PT_2D_COPY_RECT_LIST_V2 = 0x18, - DI_PT_2D_COPY_RECT_LIST_V3 = 0x19, - DI_PT_2D_FILL_RECT_LIST = 0x1a, - DI_PT_2D_LINE_STRIP = 0x1b, - DI_PT_2D_TRI_STRIP = 0x1c, - VGT_INDEX_TYPE = 0x0000895c, - INDEX_TYPE_mask = 0x03 << 0, - INDEX_TYPE_shift = 0, - DI_INDEX_SIZE_16_BIT = 0x00, - DI_INDEX_SIZE_32_BIT = 0x01, - VGT_STRMOUT_BUFFER_FILLED_SIZE_0 = 0x00008960, - VGT_STRMOUT_BUFFER_FILLED_SIZE_1 = 0x00008964, - VGT_STRMOUT_BUFFER_FILLED_SIZE_2 = 0x00008968, - VGT_STRMOUT_BUFFER_FILLED_SIZE_3 = 0x0000896c, - VGT_NUM_INDICES = 0x00008970, - VGT_NUM_INSTANCES = 0x00008974, - VGT_SYS_CONFIG = 0x0000898c, - DUAL_CORE_EN_bit = 1 << 0, - MAX_LS_HS_THDGRP_mask = 0x3f << 1, - MAX_LS_HS_THDGRP_shift = 1, - PA_CL_CNTL_STATUS = 0x00008a10, - CL_BUSY_bit = 1 << 31, - PA_CL_ENHANCE = 0x00008a14, - CLIP_VTX_REORDER_ENA_bit = 1 << 0, - NUM_CLIP_SEQ_mask = 0x03 << 1, - NUM_CLIP_SEQ_shift = 1, - CLIPPED_PRIM_SEQ_STALL_bit = 1 << 3, - VE_NAN_PROC_DISABLE_bit = 1 << 4, - PA_SU_CNTL_STATUS = 0x00008a50, - SU_BUSY_bit = 1 << 31, - PA_SU_LINE_STIPPLE_VALUE = 0x00008a60, - LINE_STIPPLE_VALUE_mask = 0xffffff << 0, - LINE_STIPPLE_VALUE_shift = 0, - PA_SC_LINE_STIPPLE_STATE = 0x00008b10, - CURRENT_PTR_mask = 0x0f << 0, - CURRENT_PTR_shift = 0, - CURRENT_COUNT_mask = 0xff << 8, - CURRENT_COUNT_shift = 8, - SQ_CONFIG = 0x00008c00, - VC_ENABLE_bit = 1 << 0, - EXPORT_SRC_C_bit = 1 << 1, - GFX_PRIO_mask = 0x03 << 2, - GFX_PRIO_shift = 2, - CS1_PRIO_mask = 0x03 << 4, - CS1_PRIO_shift = 4, - CS2_PRIO_mask = 0x03 << 6, - CS2_PRIO_shift = 6, - SQ_GPR_RESOURCE_MGMT_1 = 0x00008c04, - SQ_GPR_RESOURCE_MGMT_1__NUM_PS_GPRS_mask = 0xff << 0, - SQ_GPR_RESOURCE_MGMT_1__NUM_PS_GPRS_shift = 0, - SQ_GPR_RESOURCE_MGMT_1__NUM_VS_GPRS_mask = 0xff << 16, - SQ_GPR_RESOURCE_MGMT_1__NUM_VS_GPRS_shift = 16, - NUM_CLAUSE_TEMP_GPRS_mask = 0x0f << 28, - NUM_CLAUSE_TEMP_GPRS_shift = 28, - SQ_GLOBAL_GPR_RESOURCE_MGMT_1 = 0x00008c10, - PS_GGPR_BASE_mask = 0xff << 0, - PS_GGPR_BASE_shift = 0, - VS_GGPR_BASE_mask = 0xff << 8, - VS_GGPR_BASE_shift = 8, - GS_GGPR_BASE_mask = 0xff << 16, - GS_GGPR_BASE_shift = 16, - ES_GGPR_BASE_mask = 0xff << 24, - ES_GGPR_BASE_shift = 24, - SQ_GLOBAL_GPR_RESOURCE_MGMT_2 = 0x00008c14, - HS_GGPR_BASE_mask = 0xff << 0, - HS_GGPR_BASE_shift = 0, - LS_GGPR_BASE_mask = 0xff << 8, - LS_GGPR_BASE_shift = 8, - CS_GGPR_BASE_mask = 0xff << 16, - CS_GGPR_BASE_shift = 16, - SQ_ESGS_RING_BASE = 0x00008c40, - SQ_ESGS_RING_SIZE = 0x00008c44, - SQ_GSVS_RING_BASE = 0x00008c48, - SQ_GSVS_RING_SIZE = 0x00008c4c, - SQ_ESTMP_RING_BASE = 0x00008c50, - SQ_ESTMP_RING_SIZE = 0x00008c54, - SQ_GSTMP_RING_BASE = 0x00008c58, - SQ_GSTMP_RING_SIZE = 0x00008c5c, - SQ_VSTMP_RING_BASE = 0x00008c60, - SQ_VSTMP_RING_SIZE = 0x00008c64, - SQ_PSTMP_RING_BASE = 0x00008c68, - SQ_PSTMP_RING_SIZE = 0x00008c6c, - SQ_ALU_WORD1_OP3 = 0x00008dfc, - SRC2_SEL_mask = 0x1ff << 0, - SRC2_SEL_shift = 0, - SQ_ALU_SRC_LDS_OQ_A = 0xdb, - SQ_ALU_SRC_LDS_OQ_B = 0xdc, - SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, - SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, - SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, - SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, - SQ_ALU_SRC_TIME_HI = 0xe3, - SQ_ALU_SRC_TIME_LO = 0xe4, - SQ_ALU_SRC_MASK_HI = 0xe5, - SQ_ALU_SRC_MASK_LO = 0xe6, - SQ_ALU_SRC_HW_WAVE_ID = 0xe7, - SQ_ALU_SRC_SIMD_ID = 0xe8, - SQ_ALU_SRC_SE_ID = 0xe9, - SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, - SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, - SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, - SQ_ALU_SRC_HW_ALU_ODD = 0xed, - SQ_ALU_SRC_LOOP_IDX = 0xee, - SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, - SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, - SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, - SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, - SQ_ALU_SRC_1_DBL_L = 0xf4, - SQ_ALU_SRC_1_DBL_M = 0xf5, - SQ_ALU_SRC_0_5_DBL_L = 0xf6, - SQ_ALU_SRC_0_5_DBL_M = 0xf7, - SQ_ALU_SRC_0 = 0xf8, - SQ_ALU_SRC_1 = 0xf9, - SQ_ALU_SRC_1_INT = 0xfa, - SQ_ALU_SRC_M_1_INT = 0xfb, - SQ_ALU_SRC_0_5 = 0xfc, - SQ_ALU_SRC_LITERAL = 0xfd, - SQ_ALU_SRC_PV = 0xfe, - SQ_ALU_SRC_PS = 0xff, - SRC2_REL_bit = 1 << 9, - SRC2_CHAN_mask = 0x03 << 10, - SRC2_CHAN_shift = 10, - SQ_CHAN_X = 0x00, - SQ_CHAN_Y = 0x01, - SQ_CHAN_Z = 0x02, - SQ_CHAN_W = 0x03, - SRC2_NEG_bit = 1 << 12, - SQ_ALU_WORD1_OP3__ALU_INST_mask = 0x1f << 13, - SQ_ALU_WORD1_OP3__ALU_INST_shift = 13, - SQ_OP3_INST_BFE_UINT = 0x04, - SQ_OP3_INST_BFE_INT = 0x05, - SQ_OP3_INST_BFI_INT = 0x06, - SQ_OP3_INST_FMA = 0x07, - SQ_OP3_INST_CNDNE_64 = 0x09, - SQ_OP3_INST_FMA_64 = 0x0a, - SQ_OP3_INST_LERP_UINT = 0x0b, - SQ_OP3_INST_BIT_ALIGN_INT = 0x0c, - SQ_OP3_INST_BYTE_ALIGN_INT = 0x0d, - SQ_OP3_INST_SAD_ACCUM_UINT = 0x0e, - SQ_OP3_INST_SAD_ACCUM_HI_UINT = 0x0f, - SQ_OP3_INST_MULADD_UINT24 = 0x10, - SQ_OP3_INST_LDS_IDX_OP = 0x11, - SQ_OP3_INST_MULADD = 0x14, - SQ_OP3_INST_MULADD_M2 = 0x15, - SQ_OP3_INST_MULADD_M4 = 0x16, - SQ_OP3_INST_MULADD_D2 = 0x17, - SQ_OP3_INST_MULADD_IEEE = 0x18, - SQ_OP3_INST_CNDE = 0x19, - SQ_OP3_INST_CNDGT = 0x1a, - SQ_OP3_INST_CNDGE = 0x1b, - SQ_OP3_INST_CNDE_INT = 0x1c, - SQ_OP3_INST_CNDGT_INT = 0x1d, - SQ_OP3_INST_CNDGE_INT = 0x1e, - SQ_OP3_INST_MUL_LIT = 0x1f, - SQ_ALU_WORD1_LDS_DIRECT_LITERAL_LO = 0x00008dfc, - OFFSET_A_mask = 0x1fff << 0, - OFFSET_A_shift = 0, - STRIDE_A_mask = 0x7f << 13, - STRIDE_A_shift = 13, - THREAD_REL_A_bit = 1 << 22, - SQ_TEX_WORD2 = 0x00008dfc, - OFFSET_X_mask = 0x1f << 0, - OFFSET_X_shift = 0, - OFFSET_Y_mask = 0x1f << 5, - OFFSET_Y_shift = 5, - OFFSET_Z_mask = 0x1f << 10, - OFFSET_Z_shift = 10, - SAMPLER_ID_mask = 0x1f << 15, - SAMPLER_ID_shift = 15, - SQ_TEX_WORD2__SRC_SEL_X_mask = 0x07 << 20, - SQ_TEX_WORD2__SRC_SEL_X_shift = 20, - SQ_SEL_X = 0x00, - SQ_SEL_Y = 0x01, - SQ_SEL_Z = 0x02, - SQ_SEL_W = 0x03, - SQ_SEL_0 = 0x04, - SQ_SEL_1 = 0x05, - SQ_TEX_WORD2__SRC_SEL_Y_mask = 0x07 << 23, - SQ_TEX_WORD2__SRC_SEL_Y_shift = 23, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SRC_SEL_Z_mask = 0x07 << 26, - SRC_SEL_Z_shift = 26, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SRC_SEL_W_mask = 0x07 << 29, - SRC_SEL_W_shift = 29, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_CF_ALLOC_EXPORT_WORD1 = 0x00008dfc, - BURST_COUNT_mask = 0x0f << 16, - BURST_COUNT_shift = 16, - VALID_PIXEL_MODE_bit = 1 << 20, - SQ_CF_ALLOC_EXPORT_WORD1__CF_INST_mask = 0xff << 22, - SQ_CF_ALLOC_EXPORT_WORD1__CF_INST_shift = 22, - SQ_CF_INST_MEM_STREAM0_BUF0 = 0x40, - SQ_CF_INST_MEM_STREAM0_BUF1 = 0x41, - SQ_CF_INST_MEM_STREAM0_BUF2 = 0x42, - SQ_CF_INST_MEM_STREAM0_BUF3 = 0x43, - SQ_CF_INST_MEM_STREAM1_BUF0 = 0x44, - SQ_CF_INST_MEM_STREAM1_BUF1 = 0x45, - SQ_CF_INST_MEM_STREAM1_BUF2 = 0x46, - SQ_CF_INST_MEM_STREAM1_BUF3 = 0x47, - SQ_CF_INST_MEM_STREAM2_BUF0 = 0x48, - SQ_CF_INST_MEM_STREAM2_BUF1 = 0x49, - SQ_CF_INST_MEM_STREAM2_BUF2 = 0x4a, - SQ_CF_INST_MEM_STREAM2_BUF3 = 0x4b, - SQ_CF_INST_MEM_STREAM3_BUF0 = 0x4c, - SQ_CF_INST_MEM_STREAM3_BUF1 = 0x4d, - SQ_CF_INST_MEM_STREAM3_BUF2 = 0x4e, - SQ_CF_INST_MEM_STREAM3_BUF3 = 0x4f, - SQ_CF_INST_MEM_SCRATCH = 0x50, - SQ_CF_INST_MEM_RING = 0x52, - SQ_CF_INST_EXPORT = 0x53, - SQ_CF_INST_EXPORT_DONE = 0x54, - SQ_CF_INST_MEM_EXPORT = 0x55, - SQ_CF_INST_MEM_RAT = 0x56, - SQ_CF_INST_MEM_RAT_CACHELESS = 0x57, - SQ_CF_INST_MEM_RING1 = 0x58, - SQ_CF_INST_MEM_RING2 = 0x59, - SQ_CF_INST_MEM_RING3 = 0x5a, - SQ_CF_INST_MEM_EXPORT_COMBINED = 0x5b, - SQ_CF_INST_MEM_RAT_COMBINED_CACHELESS = 0x5c, - SQ_CF_INST_MEM_RAT_COMBINED = 0x5d, - SQ_CF_INST_EXPORT_DONE_END_IS_NEXT = 0x5e, - MARK_bit = 1 << 30, - BARRIER_bit = 1 << 31, - SQ_CF_ALU_WORD1 = 0x00008dfc, - KCACHE_MODE1_mask = 0x03 << 0, - KCACHE_MODE1_shift = 0, - SQ_CF_KCACHE_NOP = 0x00, - SQ_CF_KCACHE_LOCK_1 = 0x01, - SQ_CF_KCACHE_LOCK_2 = 0x02, - SQ_CF_KCACHE_LOCK_LOOP_INDEX = 0x03, - KCACHE_ADDR0_mask = 0xff << 2, - KCACHE_ADDR0_shift = 2, - KCACHE_ADDR1_mask = 0xff << 10, - KCACHE_ADDR1_shift = 10, - SQ_CF_ALU_WORD1__COUNT_mask = 0x7f << 18, - SQ_CF_ALU_WORD1__COUNT_shift = 18, - SQ_CF_ALU_WORD1__ALT_CONST_bit = 1 << 25, - SQ_CF_ALU_WORD1__CF_INST_mask = 0x0f << 26, - SQ_CF_ALU_WORD1__CF_INST_shift = 26, - SQ_CF_INST_ALU = 0x08, - SQ_CF_INST_ALU_PUSH_BEFORE = 0x09, - SQ_CF_INST_ALU_POP_AFTER = 0x0a, - SQ_CF_INST_ALU_POP2_AFTER = 0x0b, - SQ_CF_INST_ALU_EXTENDED = 0x0c, - SQ_CF_INST_ALU_CONTINUE = 0x0d, - SQ_CF_INST_ALU_BREAK = 0x0e, - SQ_CF_INST_ALU_ELSE_AFTER = 0x0f, - WHOLE_QUAD_MODE_bit = 1 << 30, -/* BARRIER_bit = 1 << 31, */ - SQ_TEX_WORD1 = 0x00008dfc, - SQ_TEX_WORD1__DST_GPR_mask = 0x7f << 0, - SQ_TEX_WORD1__DST_GPR_shift = 0, - SQ_TEX_WORD1__DST_REL_bit = 1 << 7, - SQ_TEX_WORD1__DST_SEL_X_mask = 0x07 << 9, - SQ_TEX_WORD1__DST_SEL_X_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_SEL_MASK = 0x07, - SQ_TEX_WORD1__DST_SEL_Y_mask = 0x07 << 12, - SQ_TEX_WORD1__DST_SEL_Y_shift = 12, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_TEX_WORD1__DST_SEL_Z_mask = 0x07 << 15, - SQ_TEX_WORD1__DST_SEL_Z_shift = 15, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_TEX_WORD1__DST_SEL_W_mask = 0x07 << 18, - SQ_TEX_WORD1__DST_SEL_W_shift = 18, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_TEX_WORD1__LOD_BIAS_mask = 0x7f << 21, - SQ_TEX_WORD1__LOD_BIAS_shift = 21, - COORD_TYPE_X_bit = 1 << 28, - COORD_TYPE_Y_bit = 1 << 29, - COORD_TYPE_Z_bit = 1 << 30, - COORD_TYPE_W_bit = 1 << 31, - SQ_ALU_WORD1_OP2_MOVA = 0x00008dfc, - MOVA_DST_mask = 0x7f << 21, - MOVA_DST_shift = 21, - SQ_ALU_MOVA_DST_AR_X = 0x00, - SQ_ALU_MOVA_DST_CF_PC = 0x01, - SQ_ALU_MOVA_DST_CF_IDX0 = 0x02, - SQ_ALU_MOVA_DST_CF_IDX1 = 0x03, - SQ_ALU_MOVA_DST_CLAUSE_GLOBAL_B0 = 0x04, - SQ_ALU_MOVA_DST_CLAUSE_GLOBAL_B1 = 0x05, - SQ_ALU_MOVA_DST_CLAUSE_GLOBAL_B2 = 0x06, - SQ_ALU_MOVA_DST_CLAUSE_GLOBAL_B3 = 0x07, - SQ_VTX_WORD0 = 0x00008dfc, - VTX_INST_mask = 0x1f << 0, - VTX_INST_shift = 0, - SQ_VTX_INST_FETCH = 0x00, - SQ_VTX_INST_SEMANTIC = 0x01, - SQ_VTX_INST_GET_BUFFER_RESINFO = 0x0e, - FETCH_TYPE_mask = 0x03 << 5, - FETCH_TYPE_shift = 5, - SQ_VTX_FETCH_VERTEX_DATA = 0x00, - SQ_VTX_FETCH_INSTANCE_DATA = 0x01, - SQ_VTX_FETCH_NO_INDEX_OFFSET = 0x02, - FETCH_WHOLE_QUAD_bit = 1 << 7, - BUFFER_ID_mask = 0xff << 8, - BUFFER_ID_shift = 8, - SQ_VTX_WORD0__SRC_GPR_mask = 0x7f << 16, - SQ_VTX_WORD0__SRC_GPR_shift = 16, - SRC_REL_bit = 1 << 23, - SQ_VTX_WORD0__SRC_SEL_X_mask = 0x03 << 24, - SQ_VTX_WORD0__SRC_SEL_X_shift = 24, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ - SQ_VTX_WORD0__SRC_SEL_Y_mask = 0x03 << 26, - SQ_VTX_WORD0__SRC_SEL_Y_shift = 26, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ - STRUCTURED_READ_mask = 0x03 << 28, - STRUCTURED_READ_shift = 28, - SQ_VTX_STRU_READ_OFF = 0x00, - SQ_VTX_STRU_READ_GPR_OFFSET = 0x01, - SQ_VTX_STRU_READ_INST_OFFSET = 0x02, - LDS_REQ_bit = 1 << 30, - COALESCED_READ_bit = 1 << 31, - SQ_CF_ALLOC_EXPORT_WORD1_SWIZ = 0x00008dfc, - SEL_X_mask = 0x07 << 0, - SEL_X_shift = 0, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SEL_Y_mask = 0x07 << 3, - SEL_Y_shift = 3, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SEL_Z_mask = 0x07 << 6, - SEL_Z_shift = 6, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SEL_W_mask = 0x07 << 9, - SEL_W_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD0 = 0x00008dfc, - MEM_INST_mask = 0x1f << 0, - MEM_INST_shift = 0, - SQ_MEM_INST_MEM = 0x02, - SQ_MEM_RD_WORD0__ELEM_SIZE_mask = 0x03 << 5, - SQ_MEM_RD_WORD0__ELEM_SIZE_shift = 5, -/* FETCH_WHOLE_QUAD_bit = 1 << 7, */ - MEM_OP_mask = 0x07 << 8, - MEM_OP_shift = 8, - SQ_MEM_OP_RD_SCRATCH = 0x00, - SQ_MEM_OP_RD_SCATTER = 0x02, - SQ_MEM_OP_GDS = 0x04, - SQ_MEM_OP_TF_WRITE = 0x05, - SQ_MEM_RD_WORD0__UNCACHED_bit = 1 << 11, - INDEXED_bit = 1 << 12, - SQ_MEM_RD_WORD0__SRC_SEL_Y_mask = 0x03 << 13, - SQ_MEM_RD_WORD0__SRC_SEL_Y_shift = 13, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ - SQ_MEM_RD_WORD0__SRC_GPR_mask = 0x7f << 16, - SQ_MEM_RD_WORD0__SRC_GPR_shift = 16, -/* SRC_REL_bit = 1 << 23, */ - SQ_MEM_RD_WORD0__SRC_SEL_X_mask = 0x03 << 24, - SQ_MEM_RD_WORD0__SRC_SEL_X_shift = 24, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ - BURST_CNT_mask = 0x0f << 26, - BURST_CNT_shift = 26, -/* LDS_REQ_bit = 1 << 30, */ -/* COALESCED_READ_bit = 1 << 31, */ - SQ_ALU_WORD1 = 0x00008dfc, - SQ_ALU_WORD1__ENCODING_mask = 0x07 << 15, - SQ_ALU_WORD1__ENCODING_shift = 15, - BANK_SWIZZLE_mask = 0x07 << 18, - BANK_SWIZZLE_shift = 18, - SQ_ALU_VEC_012 = 0x00, - SQ_ALU_VEC_021 = 0x01, - SQ_ALU_VEC_120 = 0x02, - SQ_ALU_VEC_102 = 0x03, - SQ_ALU_VEC_201 = 0x04, - SQ_ALU_VEC_210 = 0x05, - SQ_ALU_WORD1__DST_GPR_mask = 0x7f << 21, - SQ_ALU_WORD1__DST_GPR_shift = 21, - SQ_ALU_WORD1__DST_REL_bit = 1 << 28, - DST_CHAN_mask = 0x03 << 29, - DST_CHAN_shift = 29, - CHAN_X = 0x00, - CHAN_Y = 0x01, - CHAN_Z = 0x02, - CHAN_W = 0x03, - SQ_ALU_WORD1__CLAMP_bit = 1 << 31, - SQ_CF_ALU_WORD0_EXT = 0x00008dfc, - KCACHE_BANK_INDEX_MODE0_mask = 0x03 << 4, - KCACHE_BANK_INDEX_MODE0_shift = 4, - SQ_CF_INDEX_NONE = 0x00, - SQ_CF_INDEX_0 = 0x01, - SQ_CF_INDEX_1 = 0x02, - SQ_CF_INVALID = 0x03, - KCACHE_BANK_INDEX_MODE1_mask = 0x03 << 6, - KCACHE_BANK_INDEX_MODE1_shift = 6, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - KCACHE_BANK_INDEX_MODE2_mask = 0x03 << 8, - KCACHE_BANK_INDEX_MODE2_shift = 8, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - KCACHE_BANK_INDEX_MODE3_mask = 0x03 << 10, - KCACHE_BANK_INDEX_MODE3_shift = 10, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - KCACHE_BANK2_mask = 0x0f << 22, - KCACHE_BANK2_shift = 22, - KCACHE_BANK3_mask = 0x0f << 26, - KCACHE_BANK3_shift = 26, - KCACHE_MODE2_mask = 0x03 << 30, - KCACHE_MODE2_shift = 30, -/* SQ_CF_KCACHE_NOP = 0x00, */ -/* SQ_CF_KCACHE_LOCK_1 = 0x01, */ -/* SQ_CF_KCACHE_LOCK_2 = 0x02, */ -/* SQ_CF_KCACHE_LOCK_LOOP_INDEX = 0x03, */ - SQ_ALU_WORD0_LDS_IDX_OP = 0x00008dfc, - SRC0_SEL_mask = 0x1ff << 0, - SRC0_SEL_shift = 0, -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ - SRC0_REL_bit = 1 << 9, - SRC0_CHAN_mask = 0x03 << 10, - SRC0_CHAN_shift = 10, -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - IDX_OFFSET_4_bit = 1 << 12, - SRC1_SEL_mask = 0x1ff << 13, - SRC1_SEL_shift = 13, -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ - SRC1_REL_bit = 1 << 22, - SRC1_CHAN_mask = 0x03 << 23, - SRC1_CHAN_shift = 23, -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - IDX_OFFSET_5_bit = 1 << 25, - INDEX_MODE_mask = 0x07 << 26, - INDEX_MODE_shift = 26, - SQ_INDEX_AR_X = 0x00, - SQ_INDEX_LOOP = 0x04, - SQ_INDEX_GLOBAL = 0x05, - SQ_INDEX_GLOBAL_AR_X = 0x06, - PRED_SEL_mask = 0x03 << 29, - PRED_SEL_shift = 29, - SQ_PRED_SEL_OFF = 0x00, - SQ_PRED_SEL_ZERO = 0x02, - SQ_PRED_SEL_ONE = 0x03, - LAST_bit = 1 << 31, - SQ_MEM_GDS_WORD2 = 0x00008dfc, - SQ_MEM_GDS_WORD2__DST_SEL_X_mask = 0x07 << 0, - SQ_MEM_GDS_WORD2__DST_SEL_X_shift = 0, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_GDS_WORD2__DST_SEL_Y_mask = 0x07 << 3, - SQ_MEM_GDS_WORD2__DST_SEL_Y_shift = 3, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_GDS_WORD2__DST_SEL_Z_mask = 0x07 << 6, - SQ_MEM_GDS_WORD2__DST_SEL_Z_shift = 6, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_GDS_WORD2__DST_SEL_W_mask = 0x07 << 9, - SQ_MEM_GDS_WORD2__DST_SEL_W_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_CF_ALLOC_EXPORT_WORD0_RAT = 0x00008dfc, - RAT_ID_mask = 0x0f << 0, - RAT_ID_shift = 0, - RAT_INST_mask = 0x3f << 4, - RAT_INST_shift = 4, - SQ_EXPORT_RAT_INST_NOP = 0x00, - SQ_EXPORT_RAT_INST_STORE_TYPED = 0x01, - SQ_EXPORT_RAT_INST_STORE_RAW = 0x02, - SQ_EXPORT_RAT_INST_STORE_RAW_FDENORM = 0x03, - SQ_EXPORT_RAT_INST_CMPXCHG_INT = 0x04, - SQ_EXPORT_RAT_INST_CMPXCHG_FLT = 0x05, - SQ_EXPORT_RAT_INST_CMPXCHG_FDENORM = 0x06, - SQ_EXPORT_RAT_INST_ADD = 0x07, - SQ_EXPORT_RAT_INST_SUB = 0x08, - SQ_EXPORT_RAT_INST_RSUB = 0x09, - SQ_EXPORT_RAT_INST_MIN_INT = 0x0a, - SQ_EXPORT_RAT_INST_MIN_UINT = 0x0b, - SQ_EXPORT_RAT_INST_MAX_INT = 0x0c, - SQ_EXPORT_RAT_INST_MAX_UINT = 0x0d, - SQ_EXPORT_RAT_INST_AND = 0x0e, - SQ_EXPORT_RAT_INST_OR = 0x0f, - SQ_EXPORT_RAT_INST_XOR = 0x10, - SQ_EXPORT_RAT_INST_MSKOR = 0x11, - SQ_EXPORT_RAT_INST_INC_UINT = 0x12, - SQ_EXPORT_RAT_INST_DEC_UINT = 0x13, - SQ_EXPORT_RAT_INST_NOP_RTN = 0x20, - SQ_EXPORT_RAT_INST_XCHG_RTN = 0x22, - SQ_EXPORT_RAT_INST_XCHG_FDENORM_RTN = 0x23, - SQ_EXPORT_RAT_INST_CMPXCHG_INT_RTN = 0x24, - SQ_EXPORT_RAT_INST_CMPXCHG_FLT_RTN = 0x25, - SQ_EXPORT_RAT_INST_CMPXCHG_FDENORM_RTN = 0x26, - SQ_EXPORT_RAT_INST_ADD_RTN = 0x27, - SQ_EXPORT_RAT_INST_SUB_RTN = 0x28, - SQ_EXPORT_RAT_INST_RSUB_RTN = 0x29, - SQ_EXPORT_RAT_INST_MIN_INT_RTN = 0x2a, - SQ_EXPORT_RAT_INST_MIN_UINT_RTN = 0x2b, - SQ_EXPORT_RAT_INST_MAX_INT_RTN = 0x2c, - SQ_EXPORT_RAT_INST_MAX_UINT_RTN = 0x2d, - SQ_EXPORT_RAT_INST_AND_RTN = 0x2e, - SQ_EXPORT_RAT_INST_OR_RTN = 0x2f, - SQ_EXPORT_RAT_INST_XOR_RTN = 0x30, - SQ_EXPORT_RAT_INST_MSKOR_RTN = 0x31, - SQ_EXPORT_RAT_INST_INC_UINT_RTN = 0x32, - SQ_EXPORT_RAT_INST_DEC_UINT_RTN = 0x33, - RAT_INDEX_MODE_mask = 0x03 << 11, - RAT_INDEX_MODE_shift = 11, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - SQ_CF_ALLOC_EXPORT_WORD0_RAT__TYPE_mask = 0x03 << 13, - SQ_CF_ALLOC_EXPORT_WORD0_RAT__TYPE_shift = 13, - SQ_EXPORT_PIXEL = 0x00, - SQ_EXPORT_POS = 0x01, - SQ_EXPORT_PARAM = 0x02, - X_UNUSED_FOR_SX_EXPORTS = 0x03, - RW_GPR_mask = 0x7f << 15, - RW_GPR_shift = 15, - RW_REL_bit = 1 << 22, - INDEX_GPR_mask = 0x7f << 23, - INDEX_GPR_shift = 23, - SQ_CF_ALLOC_EXPORT_WORD0_RAT__ELEM_SIZE_mask = 0x03 << 30, - SQ_CF_ALLOC_EXPORT_WORD0_RAT__ELEM_SIZE_shift = 30, - SQ_CF_ALU_WORD0 = 0x00008dfc, - SQ_CF_ALU_WORD0__ADDR_mask = 0x3fffff << 0, - SQ_CF_ALU_WORD0__ADDR_shift = 0, - KCACHE_BANK0_mask = 0x0f << 22, - KCACHE_BANK0_shift = 22, - KCACHE_BANK1_mask = 0x0f << 26, - KCACHE_BANK1_shift = 26, - KCACHE_MODE0_mask = 0x03 << 30, - KCACHE_MODE0_shift = 30, -/* SQ_CF_KCACHE_NOP = 0x00, */ -/* SQ_CF_KCACHE_LOCK_1 = 0x01, */ -/* SQ_CF_KCACHE_LOCK_2 = 0x02, */ -/* SQ_CF_KCACHE_LOCK_LOOP_INDEX = 0x03, */ - SQ_MEM_GDS_WORD1 = 0x00008dfc, - SQ_MEM_GDS_WORD1__DST_GPR_mask = 0x7f << 0, - SQ_MEM_GDS_WORD1__DST_GPR_shift = 0, - DST_REL_MODE_mask = 0x03 << 7, - DST_REL_MODE_shift = 7, - SQ_REL_NONE = 0x00, - SQ_REL_LOOP = 0x01, - SQ_REL_GLOBAL = 0x02, - GDS_OP_mask = 0x3f << 9, - GDS_OP_shift = 9, - SQ_DS_INST_ADD = 0x00, - SQ_DS_INST_SUB = 0x01, - SQ_DS_INST_RSUB = 0x02, - SQ_DS_INST_INC = 0x03, - SQ_DS_INST_DEC = 0x04, - SQ_DS_INST_MIN_INT = 0x05, - SQ_DS_INST_MAX_INT = 0x06, - SQ_DS_INST_MIN_UINT = 0x07, - SQ_DS_INST_MAX_UINT = 0x08, - SQ_DS_INST_AND = 0x09, - SQ_DS_INST_OR = 0x0a, - SQ_DS_INST_XOR = 0x0b, - SQ_DS_INST_MSKOR = 0x0c, - SQ_DS_INST_WRITE = 0x0d, - SQ_DS_INST_WRITE_REL = 0x0e, - SQ_DS_INST_WRITE2 = 0x0f, - SQ_DS_INST_CMP_STORE = 0x10, - SQ_DS_INST_CMP_STORE_SPF = 0x11, - SQ_DS_INST_BYTE_WRITE = 0x12, - SQ_DS_INST_SHORT_WRITE = 0x13, - SQ_DS_INST_ADD_RET = 0x20, - SQ_DS_INST_SUB_RET = 0x21, - SQ_DS_INST_RSUB_RET = 0x22, - SQ_DS_INST_INC_RET = 0x23, - SQ_DS_INST_DEC_RET = 0x24, - SQ_DS_INST_MIN_INT_RET = 0x25, - SQ_DS_INST_MAX_INT_RET = 0x26, - SQ_DS_INST_MIN_UINT_RET = 0x27, - SQ_DS_INST_MAX_UINT_RET = 0x28, - SQ_DS_INST_AND_RET = 0x29, - SQ_DS_INST_OR_RET = 0x2a, - SQ_DS_INST_XOR_RET = 0x2b, - SQ_DS_INST_MSKOR_RET = 0x2c, - SQ_DS_INST_XCHG_RET = 0x2d, - SQ_DS_INST_XCHG_REL_RET = 0x2e, - SQ_DS_INST_XCHG2_RET = 0x2f, - SQ_DS_INST_CMP_XCHG_RET = 0x30, - SQ_DS_INST_CMP_XCHG_SPF_RET = 0x31, - SQ_DS_INST_READ_RET = 0x32, - SQ_DS_INST_READ_REL_RET = 0x33, - SQ_DS_INST_READ2_RET = 0x34, - SQ_DS_INST_READWRITE_RET = 0x35, - SQ_DS_INST_BYTE_READ_RET = 0x36, - SQ_DS_INST_UBYTE_READ_RET = 0x37, - SQ_DS_INST_SHORT_READ_RET = 0x38, - SQ_DS_INST_USHORT_READ_RET = 0x39, - SQ_DS_INST_ATOMIC_ORDERED_ALLOC_RET = 0x3f, - DS_OFFSET_mask = 0x7f << 16, - DS_OFFSET_shift = 16, - UAV_INDEX_MODE_mask = 0x03 << 24, - UAV_INDEX_MODE_shift = 24, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - UAV_ID_mask = 0x0f << 26, - UAV_ID_shift = 26, - ALLOC_CONSUME_bit = 1 << 30, - BCAST_FIRST_REQ_bit = 1 << 31, - SQ_MEM_RD_WORD2 = 0x00008dfc, - ARRAY_BASE_mask = 0x1fff << 0, - ARRAY_BASE_shift = 0, - SQ_MEM_RD_WORD2__ENDIAN_SWAP_mask = 0x03 << 16, - SQ_MEM_RD_WORD2__ENDIAN_SWAP_shift = 16, - SQ_ENDIAN_NONE = 0x00, - SQ_ENDIAN_8IN16 = 0x01, - SQ_ENDIAN_8IN32 = 0x02, - SQ_MEM_RD_WORD2__ARRAY_SIZE_mask = 0xfff << 20, - SQ_MEM_RD_WORD2__ARRAY_SIZE_shift = 20, - SQ_CF_ALU_WORD1_EXT = 0x00008dfc, - KCACHE_MODE3_mask = 0x03 << 0, - KCACHE_MODE3_shift = 0, -/* SQ_CF_KCACHE_NOP = 0x00, */ -/* SQ_CF_KCACHE_LOCK_1 = 0x01, */ -/* SQ_CF_KCACHE_LOCK_2 = 0x02, */ -/* SQ_CF_KCACHE_LOCK_LOOP_INDEX = 0x03, */ - KCACHE_ADDR2_mask = 0xff << 2, - KCACHE_ADDR2_shift = 2, - KCACHE_ADDR3_mask = 0xff << 10, - KCACHE_ADDR3_shift = 10, - SQ_CF_ALU_WORD1_EXT__CF_INST_mask = 0x0f << 26, - SQ_CF_ALU_WORD1_EXT__CF_INST_shift = 26, -/* SQ_CF_INST_ALU = 0x08, */ -/* SQ_CF_INST_ALU_PUSH_BEFORE = 0x09, */ -/* SQ_CF_INST_ALU_POP_AFTER = 0x0a, */ -/* SQ_CF_INST_ALU_POP2_AFTER = 0x0b, */ -/* SQ_CF_INST_ALU_EXTENDED = 0x0c, */ -/* SQ_CF_INST_ALU_CONTINUE = 0x0d, */ -/* SQ_CF_INST_ALU_BREAK = 0x0e, */ -/* SQ_CF_INST_ALU_ELSE_AFTER = 0x0f, */ -/* BARRIER_bit = 1 << 31, */ - SQ_CF_GWS_WORD0 = 0x00008dfc, - VALUE_mask = 0x3ff << 0, - VALUE_shift = 0, - RESOURCE_mask = 0x1f << 16, - RESOURCE_shift = 16, - SIGN_bit = 1 << 25, - VAL_INDEX_MODE_mask = 0x03 << 26, - VAL_INDEX_MODE_shift = 26, - SQ_GWS_INDEX_NONE = 0x00, - SQ_GWS_INDEX_0 = 0x01, - SQ_GWS_INDEX_1 = 0x02, - SQ_GWS_INDEX_MIX = 0x03, - RSRC_INDEX_MODE_mask = 0x03 << 28, - RSRC_INDEX_MODE_shift = 28, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - GWS_OPCODE_mask = 0x03 << 30, - GWS_OPCODE_shift = 30, - SQ_GWS_SEMA_V = 0x00, - SQ_GWS_SEMA_P = 0x01, - SQ_GWS_BARRIER = 0x02, - SQ_GWS_INIT = 0x03, - SQ_VTX_WORD2 = 0x00008dfc, - SQ_VTX_WORD2__OFFSET_mask = 0xffff << 0, - SQ_VTX_WORD2__OFFSET_shift = 0, - SQ_VTX_WORD2__ENDIAN_SWAP_mask = 0x03 << 16, - SQ_VTX_WORD2__ENDIAN_SWAP_shift = 16, -/* SQ_ENDIAN_NONE = 0x00, */ -/* SQ_ENDIAN_8IN16 = 0x01, */ -/* SQ_ENDIAN_8IN32 = 0x02, */ - CONST_BUF_NO_STRIDE_bit = 1 << 18, - SQ_VTX_WORD2__ALT_CONST_bit = 1 << 20, - BUFFER_INDEX_MODE_mask = 0x03 << 21, - BUFFER_INDEX_MODE_shift = 21, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - SQ_ALU_WORD1_OP2_EXECUTE_MASK = 0x00008dfc, - EXECUTE_MASK_OP_mask = 0x03 << 5, - EXECUTE_MASK_OP_shift = 5, - SQ_ALU_EXECUTE_MASK_OP_DEACTIVATE = 0x00, - SQ_ALU_EXECUTE_MASK_OP_BREAK = 0x01, - SQ_ALU_EXECUTE_MASK_OP_CONTINUE = 0x02, - SQ_ALU_EXECUTE_MASK_OP_KILL = 0x03, - SQ_CF_ALLOC_EXPORT_WORD1_BUF = 0x00008dfc, - SQ_CF_ALLOC_EXPORT_WORD1_BUF__ARRAY_SIZE_mask = 0xfff << 0, - SQ_CF_ALLOC_EXPORT_WORD1_BUF__ARRAY_SIZE_shift = 0, - COMP_MASK_mask = 0x0f << 12, - COMP_MASK_shift = 12, - SQ_CF_WORD0 = 0x00008dfc, - SQ_CF_WORD0__ADDR_mask = 0xffffff << 0, - SQ_CF_WORD0__ADDR_shift = 0, - JUMPTABLE_SEL_mask = 0x07 << 24, - JUMPTABLE_SEL_shift = 24, - SQ_CF_JUMPTABLE_SEL_CONST_A = 0x00, - SQ_CF_JUMPTABLE_SEL_CONST_B = 0x01, - SQ_CF_JUMPTABLE_SEL_CONST_C = 0x02, - SQ_CF_JUMPTABLE_SEL_CONST_D = 0x03, - SQ_CF_JUMPTABLE_SEL_INDEX_0 = 0x04, - SQ_CF_JUMPTABLE_SEL_INDEX_1 = 0x05, - SQ_CF_ALLOC_EXPORT_WORD0 = 0x00008dfc, -/* ARRAY_BASE_mask = 0x1fff << 0, */ -/* ARRAY_BASE_shift = 0, */ - SQ_CF_ALLOC_EXPORT_WORD0__TYPE_mask = 0x03 << 13, - SQ_CF_ALLOC_EXPORT_WORD0__TYPE_shift = 13, -/* SQ_EXPORT_PIXEL = 0x00, */ -/* SQ_EXPORT_POS = 0x01, */ -/* SQ_EXPORT_PARAM = 0x02, */ -/* X_UNUSED_FOR_SX_EXPORTS = 0x03, */ -/* RW_GPR_mask = 0x7f << 15, */ -/* RW_GPR_shift = 15, */ -/* RW_REL_bit = 1 << 22, */ -/* INDEX_GPR_mask = 0x7f << 23, */ -/* INDEX_GPR_shift = 23, */ - SQ_CF_ALLOC_EXPORT_WORD0__ELEM_SIZE_mask = 0x03 << 30, - SQ_CF_ALLOC_EXPORT_WORD0__ELEM_SIZE_shift = 30, - SQ_MEM_GDS_WORD0 = 0x00008dfc, -/* MEM_INST_mask = 0x1f << 0, */ -/* MEM_INST_shift = 0, */ -/* SQ_MEM_INST_MEM = 0x02, */ -/* MEM_OP_mask = 0x07 << 8, */ -/* MEM_OP_shift = 8, */ -/* SQ_MEM_OP_RD_SCRATCH = 0x00, */ -/* SQ_MEM_OP_RD_SCATTER = 0x02, */ -/* SQ_MEM_OP_GDS = 0x04, */ -/* SQ_MEM_OP_TF_WRITE = 0x05, */ - SQ_MEM_GDS_WORD0__SRC_GPR_mask = 0x7f << 11, - SQ_MEM_GDS_WORD0__SRC_GPR_shift = 11, - SRC_REL_MODE_mask = 0x03 << 18, - SRC_REL_MODE_shift = 18, -/* SQ_REL_NONE = 0x00, */ -/* SQ_REL_LOOP = 0x01, */ -/* SQ_REL_GLOBAL = 0x02, */ - SQ_MEM_GDS_WORD0__SRC_SEL_X_mask = 0x07 << 20, - SQ_MEM_GDS_WORD0__SRC_SEL_X_shift = 20, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_MEM_GDS_WORD0__SRC_SEL_Y_mask = 0x07 << 23, - SQ_MEM_GDS_WORD0__SRC_SEL_Y_shift = 23, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SRC_SEL_Z_mask = 0x07 << 26, */ -/* SRC_SEL_Z_shift = 26, */ -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_ALU_WORD1_LDS_DIRECT_LITERAL_HI = 0x00008dfc, - OFFSET_B_mask = 0x1fff << 0, - OFFSET_B_shift = 0, - STRIDE_B_mask = 0x7f << 13, - STRIDE_B_shift = 13, - THREAD_REL_B_bit = 1 << 22, - DIRECT_READ_32_bit = 1 << 31, - SQ_VTX_WORD1 = 0x00008dfc, - SQ_VTX_WORD1__DST_SEL_X_mask = 0x07 << 9, - SQ_VTX_WORD1__DST_SEL_X_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_VTX_WORD1__DST_SEL_Y_mask = 0x07 << 12, - SQ_VTX_WORD1__DST_SEL_Y_shift = 12, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_VTX_WORD1__DST_SEL_Z_mask = 0x07 << 15, - SQ_VTX_WORD1__DST_SEL_Z_shift = 15, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_VTX_WORD1__DST_SEL_W_mask = 0x07 << 18, - SQ_VTX_WORD1__DST_SEL_W_shift = 18, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - USE_CONST_FIELDS_bit = 1 << 21, - SQ_VTX_WORD1__DATA_FORMAT_mask = 0x3f << 22, - SQ_VTX_WORD1__DATA_FORMAT_shift = 22, - SQ_VTX_WORD1__NUM_FORMAT_ALL_mask = 0x03 << 28, - SQ_VTX_WORD1__NUM_FORMAT_ALL_shift = 28, - SQ_NUM_FORMAT_NORM = 0x00, - SQ_NUM_FORMAT_INT = 0x01, - SQ_NUM_FORMAT_SCALED = 0x02, - SQ_VTX_WORD1__FORMAT_COMP_ALL_bit = 1 << 30, - SQ_VTX_WORD1__SRF_MODE_ALL_bit = 1 << 31, - SQ_ALU_WORD1_OP2 = 0x00008dfc, - SRC0_ABS_bit = 1 << 0, - SRC1_ABS_bit = 1 << 1, - UPDATE_EXECUTE_MASK_bit = 1 << 2, - UPDATE_PRED_bit = 1 << 3, - WRITE_MASK_bit = 1 << 4, - OMOD_mask = 0x03 << 5, - OMOD_shift = 5, - SQ_ALU_OMOD_OFF = 0x00, - SQ_ALU_OMOD_M2 = 0x01, - SQ_ALU_OMOD_M4 = 0x02, - SQ_ALU_OMOD_D2 = 0x03, - SQ_ALU_WORD1_OP2__ALU_INST_mask = 0x7ff << 7, - SQ_ALU_WORD1_OP2__ALU_INST_shift = 7, - SQ_OP2_INST_ADD = 0x00, - SQ_OP2_INST_MUL = 0x01, - SQ_OP2_INST_MUL_IEEE = 0x02, - SQ_OP2_INST_MAX = 0x03, - SQ_OP2_INST_MIN = 0x04, - SQ_OP2_INST_MAX_DX10 = 0x05, - SQ_OP2_INST_MIN_DX10 = 0x06, - SQ_OP2_INST_SETE = 0x08, - SQ_OP2_INST_SETGT = 0x09, - SQ_OP2_INST_SETGE = 0x0a, - SQ_OP2_INST_SETNE = 0x0b, - SQ_OP2_INST_SETE_DX10 = 0x0c, - SQ_OP2_INST_SETGT_DX10 = 0x0d, - SQ_OP2_INST_SETGE_DX10 = 0x0e, - SQ_OP2_INST_SETNE_DX10 = 0x0f, - SQ_OP2_INST_FRACT = 0x10, - SQ_OP2_INST_TRUNC = 0x11, - SQ_OP2_INST_CEIL = 0x12, - SQ_OP2_INST_RNDNE = 0x13, - SQ_OP2_INST_FLOOR = 0x14, - SQ_OP2_INST_ASHR_INT = 0x15, - SQ_OP2_INST_LSHR_INT = 0x16, - SQ_OP2_INST_LSHL_INT = 0x17, - SQ_OP2_INST_MOV = 0x19, - SQ_OP2_INST_NOP = 0x1a, - SQ_OP2_INST_PRED_SETGT_UINT = 0x1e, - SQ_OP2_INST_PRED_SETGE_UINT = 0x1f, - SQ_OP2_INST_PRED_SETE = 0x20, - SQ_OP2_INST_PRED_SETGT = 0x21, - SQ_OP2_INST_PRED_SETGE = 0x22, - SQ_OP2_INST_PRED_SETNE = 0x23, - SQ_OP2_INST_PRED_SET_INV = 0x24, - SQ_OP2_INST_PRED_SET_POP = 0x25, - SQ_OP2_INST_PRED_SET_CLR = 0x26, - SQ_OP2_INST_PRED_SET_RESTORE = 0x27, - SQ_OP2_INST_PRED_SETE_PUSH = 0x28, - SQ_OP2_INST_PRED_SETGT_PUSH = 0x29, - SQ_OP2_INST_PRED_SETGE_PUSH = 0x2a, - SQ_OP2_INST_PRED_SETNE_PUSH = 0x2b, - SQ_OP2_INST_KILLE = 0x2c, - SQ_OP2_INST_KILLGT = 0x2d, - SQ_OP2_INST_KILLGE = 0x2e, - SQ_OP2_INST_KILLNE = 0x2f, - SQ_OP2_INST_AND_INT = 0x30, - SQ_OP2_INST_OR_INT = 0x31, - SQ_OP2_INST_XOR_INT = 0x32, - SQ_OP2_INST_NOT_INT = 0x33, - SQ_OP2_INST_ADD_INT = 0x34, - SQ_OP2_INST_SUB_INT = 0x35, - SQ_OP2_INST_MAX_INT = 0x36, - SQ_OP2_INST_MIN_INT = 0x37, - SQ_OP2_INST_MAX_UINT = 0x38, - SQ_OP2_INST_MIN_UINT = 0x39, - SQ_OP2_INST_SETE_INT = 0x3a, - SQ_OP2_INST_SETGT_INT = 0x3b, - SQ_OP2_INST_SETGE_INT = 0x3c, - SQ_OP2_INST_SETNE_INT = 0x3d, - SQ_OP2_INST_SETGT_UINT = 0x3e, - SQ_OP2_INST_SETGE_UINT = 0x3f, - SQ_OP2_INST_KILLGT_UINT = 0x40, - SQ_OP2_INST_KILLGE_UINT = 0x41, - SQ_OP2_INST_PRED_SETE_INT = 0x42, - SQ_OP2_INST_PRED_SETGT_INT = 0x43, - SQ_OP2_INST_PRED_SETGE_INT = 0x44, - SQ_OP2_INST_PRED_SETNE_INT = 0x45, - SQ_OP2_INST_KILLE_INT = 0x46, - SQ_OP2_INST_KILLGT_INT = 0x47, - SQ_OP2_INST_KILLGE_INT = 0x48, - SQ_OP2_INST_KILLNE_INT = 0x49, - SQ_OP2_INST_PRED_SETE_PUSH_INT = 0x4a, - SQ_OP2_INST_PRED_SETGT_PUSH_INT = 0x4b, - SQ_OP2_INST_PRED_SETGE_PUSH_INT = 0x4c, - SQ_OP2_INST_PRED_SETNE_PUSH_INT = 0x4d, - SQ_OP2_INST_PRED_SETLT_PUSH_INT = 0x4e, - SQ_OP2_INST_PRED_SETLE_PUSH_INT = 0x4f, - SQ_OP2_INST_FLT_TO_INT = 0x50, - SQ_OP2_INST_BFREV_INT = 0x51, - SQ_OP2_INST_ADDC_UINT = 0x52, - SQ_OP2_INST_SUBB_UINT = 0x53, - SQ_OP2_INST_GROUP_BARRIER = 0x54, - SQ_OP2_INST_GROUP_SEQ_BEGIN = 0x55, - SQ_OP2_INST_GROUP_SEQ_END = 0x56, - SQ_OP2_INST_SET_MODE = 0x57, - SQ_OP2_INST_SET_CF_IDX0 = 0x58, - SQ_OP2_INST_SET_CF_IDX1 = 0x59, - SQ_OP2_INST_SET_LDS_SIZE = 0x5a, - SQ_OP2_INST_EXP_IEEE = 0x81, - SQ_OP2_INST_LOG_CLAMPED = 0x82, - SQ_OP2_INST_LOG_IEEE = 0x83, - SQ_OP2_INST_RECIP_CLAMPED = 0x84, - SQ_OP2_INST_RECIP_FF = 0x85, - SQ_OP2_INST_RECIP_IEEE = 0x86, - SQ_OP2_INST_RECIPSQRT_CLAMPED = 0x87, - SQ_OP2_INST_RECIPSQRT_FF = 0x88, - SQ_OP2_INST_RECIPSQRT_IEEE = 0x89, - SQ_OP2_INST_SQRT_IEEE = 0x8a, - SQ_OP2_INST_SIN = 0x8d, - SQ_OP2_INST_COS = 0x8e, - SQ_OP2_INST_MULLO_INT = 0x8f, - SQ_OP2_INST_MULHI_INT = 0x90, - SQ_OP2_INST_MULLO_UINT = 0x91, - SQ_OP2_INST_MULHI_UINT = 0x92, - SQ_OP2_INST_RECIP_INT = 0x93, - SQ_OP2_INST_RECIP_UINT = 0x94, - SQ_OP2_INST_RECIP_64 = 0x95, - SQ_OP2_INST_RECIP_CLAMPED_64 = 0x96, - SQ_OP2_INST_RECIPSQRT_64 = 0x97, - SQ_OP2_INST_RECIPSQRT_CLAMPED_64 = 0x98, - SQ_OP2_INST_SQRT_64 = 0x99, - SQ_OP2_INST_FLT_TO_UINT = 0x9a, - SQ_OP2_INST_INT_TO_FLT = 0x9b, - SQ_OP2_INST_UINT_TO_FLT = 0x9c, - SQ_OP2_INST_BFM_INT = 0xa0, - SQ_OP2_INST_FLT32_TO_FLT16 = 0xa2, - SQ_OP2_INST_FLT16_TO_FLT32 = 0xa3, - SQ_OP2_INST_UBYTE0_FLT = 0xa4, - SQ_OP2_INST_UBYTE1_FLT = 0xa5, - SQ_OP2_INST_UBYTE2_FLT = 0xa6, - SQ_OP2_INST_UBYTE3_FLT = 0xa7, - SQ_OP2_INST_BCNT_INT = 0xaa, - SQ_OP2_INST_FFBH_UINT = 0xab, - SQ_OP2_INST_FFBL_INT = 0xac, - SQ_OP2_INST_FFBH_INT = 0xad, - SQ_OP2_INST_FLT_TO_UINT4 = 0xae, - SQ_OP2_INST_DOT_IEEE = 0xaf, - SQ_OP2_INST_FLT_TO_INT_RPI = 0xb0, - SQ_OP2_INST_FLT_TO_INT_FLOOR = 0xb1, - SQ_OP2_INST_MULHI_UINT24 = 0xb2, - SQ_OP2_INST_MBCNT_32HI_INT = 0xb3, - SQ_OP2_INST_OFFSET_TO_FLT = 0xb4, - SQ_OP2_INST_MUL_UINT24 = 0xb5, - SQ_OP2_INST_BCNT_ACCUM_PREV_INT = 0xb6, - SQ_OP2_INST_MBCNT_32LO_ACCUM_PREV_INT = 0xb7, - SQ_OP2_INST_SETE_64 = 0xb8, - SQ_OP2_INST_SETNE_64 = 0xb9, - SQ_OP2_INST_SETGT_64 = 0xba, - SQ_OP2_INST_SETGE_64 = 0xbb, - SQ_OP2_INST_MIN_64 = 0xbc, - SQ_OP2_INST_MAX_64 = 0xbd, - SQ_OP2_INST_DOT4 = 0xbe, - SQ_OP2_INST_DOT4_IEEE = 0xbf, - SQ_OP2_INST_CUBE = 0xc0, - SQ_OP2_INST_MAX4 = 0xc1, - SQ_OP2_INST_FREXP_64 = 0xc4, - SQ_OP2_INST_LDEXP_64 = 0xc5, - SQ_OP2_INST_FRACT_64 = 0xc6, - SQ_OP2_INST_PRED_SETGT_64 = 0xc7, - SQ_OP2_INST_PRED_SETE_64 = 0xc8, - SQ_OP2_INST_PRED_SETGE_64 = 0xc9, - SQ_OP2_INST_MUL_64 = 0xca, - SQ_OP2_INST_ADD_64 = 0xcb, - SQ_OP2_INST_MOVA_INT = 0xcc, - SQ_OP2_INST_FLT64_TO_FLT32 = 0xcd, - SQ_OP2_INST_FLT32_TO_FLT64 = 0xce, - SQ_OP2_INST_SAD_ACCUM_PREV_UINT = 0xcf, - SQ_OP2_INST_DOT = 0xd0, - SQ_OP2_INST_MUL_PREV = 0xd1, - SQ_OP2_INST_MUL_IEEE_PREV = 0xd2, - SQ_OP2_INST_ADD_PREV = 0xd3, - SQ_OP2_INST_MULADD_PREV = 0xd4, - SQ_OP2_INST_MULADD_IEEE_PREV = 0xd5, - SQ_OP2_INST_INTERP_XY = 0xd6, - SQ_OP2_INST_INTERP_ZW = 0xd7, - SQ_OP2_INST_INTERP_X = 0xd8, - SQ_OP2_INST_INTERP_Z = 0xd9, - SQ_OP2_INST_STORE_FLAGS = 0xda, - SQ_OP2_INST_LOAD_STORE_FLAGS = 0xdb, - SQ_OP2_INST_INTERP_LOAD_P0 = 0xe0, - SQ_OP2_INST_INTERP_LOAD_P10 = 0xe1, - SQ_OP2_INST_INTERP_LOAD_P20 = 0xe2, - SQ_CF_WORD1 = 0x00008dfc, - POP_COUNT_mask = 0x07 << 0, - POP_COUNT_shift = 0, - CF_CONST_mask = 0x1f << 3, - CF_CONST_shift = 3, - COND_mask = 0x03 << 8, - COND_shift = 8, - SQ_CF_COND_ACTIVE = 0x00, - SQ_CF_COND_FALSE = 0x01, - SQ_CF_COND_BOOL = 0x02, - SQ_CF_COND_NOT_BOOL = 0x03, - SQ_CF_WORD1__COUNT_mask = 0x3f << 10, - SQ_CF_WORD1__COUNT_shift = 10, -/* VALID_PIXEL_MODE_bit = 1 << 20, */ - SQ_CF_WORD1__CF_INST_mask = 0xff << 22, - SQ_CF_WORD1__CF_INST_shift = 22, - SQ_CF_INST_NOP = 0x00, - SQ_CF_INST_TC = 0x01, - SQ_CF_INST_VC = 0x02, - SQ_CF_INST_GDS = 0x03, - SQ_CF_INST_LOOP_START = 0x04, - SQ_CF_INST_LOOP_END = 0x05, - SQ_CF_INST_LOOP_START_DX10 = 0x06, - SQ_CF_INST_LOOP_START_NO_AL = 0x07, - SQ_CF_INST_LOOP_CONTINUE = 0x08, - SQ_CF_INST_LOOP_BREAK = 0x09, - SQ_CF_INST_JUMP = 0x0a, - SQ_CF_INST_PUSH = 0x0b, - SQ_CF_INST_ELSE = 0x0d, - SQ_CF_INST_POP = 0x0e, - SQ_CF_INST_CALL = 0x12, - SQ_CF_INST_CALL_FS = 0x13, - SQ_CF_INST_RETURN = 0x14, - SQ_CF_INST_EMIT_VERTEX = 0x15, - SQ_CF_INST_EMIT_CUT_VERTEX = 0x16, - SQ_CF_INST_CUT_VERTEX = 0x17, - SQ_CF_INST_KILL = 0x18, - SQ_CF_INST_WAIT_ACK = 0x1a, - SQ_CF_INST_TC_ACK = 0x1b, - SQ_CF_INST_VC_ACK = 0x1c, - SQ_CF_INST_JUMPTABLE = 0x1d, - SQ_CF_INST_GLOBAL_WAVE_SYNC = 0x1e, - SQ_CF_INST_HALT = 0x1f, - SQ_CF_INST_END = 0x20, - SQ_CF_INST_LDS_DEALLOC = 0x21, - SQ_CF_INST_PUSH_WQM = 0x22, - SQ_CF_INST_POP_WQM = 0x23, - SQ_CF_INST_ELSE_WQM = 0x24, - SQ_CF_INST_JUMP_ANY = 0x25, - SQ_CF_INST_REACTIVATE = 0x26, - SQ_CF_INST_REACTIVATE_WQM = 0x27, - SQ_CF_INST_INTERRUPT = 0x28, - SQ_CF_INST_INTERRUPT_AND_SLEEP = 0x29, - SQ_CF_INST_SET_PRIORITY = 0x2a, -/* BARRIER_bit = 1 << 31, */ - SQ_VTX_WORD1_SEM = 0x00008dfc, - SEMANTIC_ID_mask = 0xff << 0, - SEMANTIC_ID_shift = 0, - SQ_TEX_WORD0 = 0x00008dfc, - TEX_INST_mask = 0x1f << 0, - TEX_INST_shift = 0, - SQ_TEX_INST_LD = 0x03, - SQ_TEX_INST_GET_TEXTURE_RESINFO = 0x04, - SQ_TEX_INST_GET_NUMBER_OF_SAMPLES = 0x05, - SQ_TEX_INST_GET_LOD = 0x06, - SQ_TEX_INST_GET_GRADIENTS_H = 0x07, - SQ_TEX_INST_GET_GRADIENTS_V = 0x08, - SQ_TEX_INST_SET_TEXTURE_OFFSETS = 0x09, - SQ_TEX_INST_KEEP_GRADIENTS = 0x0a, - SQ_TEX_INST_SET_GRADIENTS_H = 0x0b, - SQ_TEX_INST_SET_GRADIENTS_V = 0x0c, - SQ_TEX_INST_PASS = 0x0d, - SQ_TEX_INST_SAMPLE = 0x10, - SQ_TEX_INST_SAMPLE_L = 0x11, - SQ_TEX_INST_SAMPLE_LB = 0x12, - SQ_TEX_INST_SAMPLE_LZ = 0x13, - SQ_TEX_INST_SAMPLE_G = 0x14, - SQ_TEX_INST_GATHER4 = 0x15, - SQ_TEX_INST_SAMPLE_G_LB = 0x16, - SQ_TEX_INST_GATHER4_O = 0x17, - SQ_TEX_INST_SAMPLE_C = 0x18, - SQ_TEX_INST_SAMPLE_C_L = 0x19, - SQ_TEX_INST_SAMPLE_C_LB = 0x1a, - SQ_TEX_INST_SAMPLE_C_LZ = 0x1b, - SQ_TEX_INST_SAMPLE_C_G = 0x1c, - SQ_TEX_INST_GATHER4_C = 0x1d, - SQ_TEX_INST_SAMPLE_C_G_LB = 0x1e, - SQ_TEX_INST_GATHER4_C_O = 0x1f, - INST_MOD_mask = 0x03 << 5, - INST_MOD_shift = 5, -/* FETCH_WHOLE_QUAD_bit = 1 << 7, */ - RESOURCE_ID_mask = 0xff << 8, - RESOURCE_ID_shift = 8, - SQ_TEX_WORD0__SRC_GPR_mask = 0x7f << 16, - SQ_TEX_WORD0__SRC_GPR_shift = 16, -/* SRC_REL_bit = 1 << 23, */ - SQ_TEX_WORD0__ALT_CONST_bit = 1 << 24, - RESOURCE_INDEX_MODE_mask = 0x03 << 25, - RESOURCE_INDEX_MODE_shift = 25, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - SAMPLER_INDEX_MODE_mask = 0x03 << 27, - SAMPLER_INDEX_MODE_shift = 27, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - SQ_VTX_WORD1_GPR = 0x00008dfc, - SQ_VTX_WORD1_GPR__DST_GPR_mask = 0x7f << 0, - SQ_VTX_WORD1_GPR__DST_GPR_shift = 0, - SQ_VTX_WORD1_GPR__DST_REL_bit = 1 << 7, - SQ_ALU_WORD1_LDS_IDX_OP = 0x00008dfc, -/* SRC2_SEL_mask = 0x1ff << 0, */ -/* SRC2_SEL_shift = 0, */ -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ -/* SRC2_REL_bit = 1 << 9, */ -/* SRC2_CHAN_mask = 0x03 << 10, */ -/* SRC2_CHAN_shift = 10, */ -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - IDX_OFFSET_1_bit = 1 << 12, - SQ_ALU_WORD1_LDS_IDX_OP__ALU_INST_mask = 0x1f << 13, - SQ_ALU_WORD1_LDS_IDX_OP__ALU_INST_shift = 13, -/* SQ_OP3_INST_BFE_UINT = 0x04, */ -/* SQ_OP3_INST_BFE_INT = 0x05, */ -/* SQ_OP3_INST_BFI_INT = 0x06, */ -/* SQ_OP3_INST_FMA = 0x07, */ -/* SQ_OP3_INST_CNDNE_64 = 0x09, */ -/* SQ_OP3_INST_FMA_64 = 0x0a, */ -/* SQ_OP3_INST_LERP_UINT = 0x0b, */ -/* SQ_OP3_INST_BIT_ALIGN_INT = 0x0c, */ -/* SQ_OP3_INST_BYTE_ALIGN_INT = 0x0d, */ -/* SQ_OP3_INST_SAD_ACCUM_UINT = 0x0e, */ -/* SQ_OP3_INST_SAD_ACCUM_HI_UINT = 0x0f, */ -/* SQ_OP3_INST_MULADD_UINT24 = 0x10, */ -/* SQ_OP3_INST_LDS_IDX_OP = 0x11, */ -/* SQ_OP3_INST_MULADD = 0x14, */ -/* SQ_OP3_INST_MULADD_M2 = 0x15, */ -/* SQ_OP3_INST_MULADD_M4 = 0x16, */ -/* SQ_OP3_INST_MULADD_D2 = 0x17, */ -/* SQ_OP3_INST_MULADD_IEEE = 0x18, */ -/* SQ_OP3_INST_CNDE = 0x19, */ -/* SQ_OP3_INST_CNDGT = 0x1a, */ -/* SQ_OP3_INST_CNDGE = 0x1b, */ -/* SQ_OP3_INST_CNDE_INT = 0x1c, */ -/* SQ_OP3_INST_CNDGT_INT = 0x1d, */ -/* SQ_OP3_INST_CNDGE_INT = 0x1e, */ -/* SQ_OP3_INST_MUL_LIT = 0x1f, */ -/* BANK_SWIZZLE_mask = 0x07 << 18, */ -/* BANK_SWIZZLE_shift = 18, */ -/* SQ_ALU_VEC_012 = 0x00, */ -/* SQ_ALU_VEC_021 = 0x01, */ -/* SQ_ALU_VEC_120 = 0x02, */ -/* SQ_ALU_VEC_102 = 0x03, */ -/* SQ_ALU_VEC_201 = 0x04, */ -/* SQ_ALU_VEC_210 = 0x05, */ - LDS_OP_mask = 0x3f << 21, - LDS_OP_shift = 21, -/* SQ_DS_INST_ADD = 0x00, */ -/* SQ_DS_INST_SUB = 0x01, */ -/* SQ_DS_INST_RSUB = 0x02, */ -/* SQ_DS_INST_INC = 0x03, */ -/* SQ_DS_INST_DEC = 0x04, */ -/* SQ_DS_INST_MIN_INT = 0x05, */ -/* SQ_DS_INST_MAX_INT = 0x06, */ -/* SQ_DS_INST_MIN_UINT = 0x07, */ -/* SQ_DS_INST_MAX_UINT = 0x08, */ -/* SQ_DS_INST_AND = 0x09, */ -/* SQ_DS_INST_OR = 0x0a, */ -/* SQ_DS_INST_XOR = 0x0b, */ -/* SQ_DS_INST_MSKOR = 0x0c, */ -/* SQ_DS_INST_WRITE = 0x0d, */ -/* SQ_DS_INST_WRITE_REL = 0x0e, */ -/* SQ_DS_INST_WRITE2 = 0x0f, */ -/* SQ_DS_INST_CMP_STORE = 0x10, */ -/* SQ_DS_INST_CMP_STORE_SPF = 0x11, */ -/* SQ_DS_INST_BYTE_WRITE = 0x12, */ -/* SQ_DS_INST_SHORT_WRITE = 0x13, */ -/* SQ_DS_INST_ADD_RET = 0x20, */ -/* SQ_DS_INST_SUB_RET = 0x21, */ -/* SQ_DS_INST_RSUB_RET = 0x22, */ -/* SQ_DS_INST_INC_RET = 0x23, */ -/* SQ_DS_INST_DEC_RET = 0x24, */ -/* SQ_DS_INST_MIN_INT_RET = 0x25, */ -/* SQ_DS_INST_MAX_INT_RET = 0x26, */ -/* SQ_DS_INST_MIN_UINT_RET = 0x27, */ -/* SQ_DS_INST_MAX_UINT_RET = 0x28, */ -/* SQ_DS_INST_AND_RET = 0x29, */ -/* SQ_DS_INST_OR_RET = 0x2a, */ -/* SQ_DS_INST_XOR_RET = 0x2b, */ -/* SQ_DS_INST_MSKOR_RET = 0x2c, */ -/* SQ_DS_INST_XCHG_RET = 0x2d, */ -/* SQ_DS_INST_XCHG_REL_RET = 0x2e, */ -/* SQ_DS_INST_XCHG2_RET = 0x2f, */ -/* SQ_DS_INST_CMP_XCHG_RET = 0x30, */ -/* SQ_DS_INST_CMP_XCHG_SPF_RET = 0x31, */ -/* SQ_DS_INST_READ_RET = 0x32, */ -/* SQ_DS_INST_READ_REL_RET = 0x33, */ -/* SQ_DS_INST_READ2_RET = 0x34, */ -/* SQ_DS_INST_READWRITE_RET = 0x35, */ -/* SQ_DS_INST_BYTE_READ_RET = 0x36, */ -/* SQ_DS_INST_UBYTE_READ_RET = 0x37, */ -/* SQ_DS_INST_SHORT_READ_RET = 0x38, */ -/* SQ_DS_INST_USHORT_READ_RET = 0x39, */ -/* SQ_DS_INST_ATOMIC_ORDERED_ALLOC_RET = 0x3f, */ - IDX_OFFSET_0_bit = 1 << 27, - IDX_OFFSET_2_bit = 1 << 28, -/* DST_CHAN_mask = 0x03 << 29, */ -/* DST_CHAN_shift = 29, */ -/* CHAN_X = 0x00, */ -/* CHAN_Y = 0x01, */ -/* CHAN_Z = 0x02, */ -/* CHAN_W = 0x03, */ - IDX_OFFSET_3_bit = 1 << 31, - SQ_CF_ENCODING_WORD1 = 0x00008dfc, - SQ_CF_ENCODING_WORD1__ENCODING_mask = 0x03 << 28, - SQ_CF_ENCODING_WORD1__ENCODING_shift = 28, - SQ_CF_ENCODING_INST_CF = 0x00, - SQ_CF_ENCODING_INST_ALLOC_EXPORT = 0x01, - SQ_CF_ENCODING_INST_ALU0 = 0x02, - SQ_CF_ENCODING_INST_ALU1 = 0x03, - SQ_ALU_WORD0 = 0x00008dfc, -/* SRC0_SEL_mask = 0x1ff << 0, */ -/* SRC0_SEL_shift = 0, */ -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ -/* SRC0_REL_bit = 1 << 9, */ -/* SRC0_CHAN_mask = 0x03 << 10, */ -/* SRC0_CHAN_shift = 10, */ -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - SRC0_NEG_bit = 1 << 12, -/* SRC1_SEL_mask = 0x1ff << 13, */ -/* SRC1_SEL_shift = 13, */ -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ -/* SRC1_REL_bit = 1 << 22, */ -/* SRC1_CHAN_mask = 0x03 << 23, */ -/* SRC1_CHAN_shift = 23, */ -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - SRC1_NEG_bit = 1 << 25, -/* INDEX_MODE_mask = 0x07 << 26, */ -/* INDEX_MODE_shift = 26, */ -/* SQ_INDEX_AR_X = 0x00, */ -/* SQ_INDEX_LOOP = 0x04, */ -/* SQ_INDEX_GLOBAL = 0x05, */ -/* SQ_INDEX_GLOBAL_AR_X = 0x06, */ -/* PRED_SEL_mask = 0x03 << 29, */ -/* PRED_SEL_shift = 29, */ -/* SQ_PRED_SEL_OFF = 0x00, */ -/* SQ_PRED_SEL_ZERO = 0x02, */ -/* SQ_PRED_SEL_ONE = 0x03, */ -/* LAST_bit = 1 << 31, */ - SQ_MEM_RD_WORD1 = 0x00008dfc, - SQ_MEM_RD_WORD1__DST_GPR_mask = 0x7f << 0, - SQ_MEM_RD_WORD1__DST_GPR_shift = 0, - SQ_MEM_RD_WORD1__DST_REL_bit = 1 << 7, - SQ_MEM_RD_WORD1__DST_SEL_X_mask = 0x07 << 9, - SQ_MEM_RD_WORD1__DST_SEL_X_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DST_SEL_Y_mask = 0x07 << 12, - SQ_MEM_RD_WORD1__DST_SEL_Y_shift = 12, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DST_SEL_Z_mask = 0x07 << 15, - SQ_MEM_RD_WORD1__DST_SEL_Z_shift = 15, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DST_SEL_W_mask = 0x07 << 18, - SQ_MEM_RD_WORD1__DST_SEL_W_shift = 18, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DATA_FORMAT_mask = 0x3f << 22, - SQ_MEM_RD_WORD1__DATA_FORMAT_shift = 22, - SQ_MEM_RD_WORD1__NUM_FORMAT_ALL_mask = 0x03 << 28, - SQ_MEM_RD_WORD1__NUM_FORMAT_ALL_shift = 28, -/* SQ_NUM_FORMAT_NORM = 0x00, */ -/* SQ_NUM_FORMAT_INT = 0x01, */ -/* SQ_NUM_FORMAT_SCALED = 0x02, */ - SQ_MEM_RD_WORD1__FORMAT_COMP_ALL_bit = 1 << 30, - SQ_MEM_RD_WORD1__SRF_MODE_ALL_bit = 1 << 31, - SQ_LSTMP_RING_BASE = 0x00008e10, - SQ_LSTMP_RING_SIZE = 0x00008e14, - SQ_HSTMP_RING_BASE = 0x00008e18, - SQ_HSTMP_RING_SIZE = 0x00008e1c, - SQ_EX_ALLOC_TABLE_SLOTS = 0x00008e48, - PIX_SLOTS_mask = 0x7f << 0, - PIX_SLOTS_shift = 0, - POS_SLOTS_mask = 0x7f << 8, - POS_SLOTS_shift = 8, - SMX_SLOTS_mask = 0x7f << 16, - SMX_SLOTS_shift = 16, - SX_EXPORT_BUFFER_SIZES = 0x0000900c, - COLOR_BUFFER_SIZE_mask = 0xff << 0, - COLOR_BUFFER_SIZE_shift = 0, - POSITION_BUFFER_SIZE_mask = 0xff << 8, - POSITION_BUFFER_SIZE_shift = 8, - SMX_BUFFER_SIZE_mask = 0xff << 16, - SMX_BUFFER_SIZE_shift = 16, - SX_MEMORY_EXPORT_BASE = 0x00009010, - SX_MEMORY_EXPORT_SIZE = 0x00009014, - SPI_CONFIG_CNTL = 0x00009100, - GPR_WRITE_PRIORITY_mask = 0x3ffff << 0, - GPR_WRITE_PRIORITY_shift = 0, - SPI_CONFIG_CNTL_1 = 0x0000913c, - VTX_DONE_DELAY_mask = 0x0f << 0, - VTX_DONE_DELAY_shift = 0, - X_DELAY_14_CLKS = 0x00, - X_DELAY_16_CLKS = 0x01, - X_DELAY_18_CLKS = 0x02, - X_DELAY_20_CLKS = 0x03, - X_DELAY_22_CLKS = 0x04, - X_DELAY_24_CLKS = 0x05, - X_DELAY_26_CLKS = 0x06, - X_DELAY_28_CLKS = 0x07, - X_DELAY_30_CLKS = 0x08, - X_DELAY_32_CLKS = 0x09, - X_DELAY_34_CLKS = 0x0a, - X_DELAY_4_CLKS = 0x0b, - X_DELAY_6_CLKS = 0x0c, - X_DELAY_8_CLKS = 0x0d, - X_DELAY_10_CLKS = 0x0e, - X_DELAY_12_CLKS = 0x0f, - INTERP_ONE_PRIM_PER_ROW_bit = 1 << 4, - BC_OPTIMIZE_DISABLE_bit = 1 << 5, - PC_LIMIT_ENABLE_bit = 1 << 6, - PC_LIMIT_STRICT_bit = 1 << 7, - PC_LIMIT_SIZE_mask = 0xffff << 16, - PC_LIMIT_SIZE_shift = 16, - TD_CNTL = 0x00009494, - SYNC_PHASE_SH_mask = 0x03 << 0, - SYNC_PHASE_SH_shift = 0, - PAD_STALL_EN_bit = 1 << 8, - EXTEND_LDS_STALL_mask = 0x03 << 9, - EXTEND_LDS_STALL_shift = 9, - X_0 = 0x00, - EXTEND_LDS_STALL__X_1 = 0x01, - X_2 = 0x02, - X_3 = 0x03, - GATHER4_FLOAT_MODE_bit = 1 << 16, - LD_FLOAT_MODE_bit = 1 << 18, - GATHER4_DX9_MODE_bit = 1 << 19, - TD_STATUS = 0x00009498, - BUSY_bit = 1 << 31, - DB_SUBTILE_CONTROL = 0x00009858, - MSAA1_X_mask = 0x03 << 0, - MSAA1_X_shift = 0, - MSAA1_Y_mask = 0x03 << 2, - MSAA1_Y_shift = 2, - MSAA2_X_mask = 0x03 << 4, - MSAA2_X_shift = 4, - MSAA2_Y_mask = 0x03 << 6, - MSAA2_Y_shift = 6, - MSAA4_X_mask = 0x03 << 8, - MSAA4_X_shift = 8, - MSAA4_Y_mask = 0x03 << 10, - MSAA4_Y_shift = 10, - MSAA8_X_mask = 0x03 << 12, - MSAA8_X_shift = 12, - MSAA8_Y_mask = 0x03 << 14, - MSAA8_Y_shift = 14, - MSAA16_X_mask = 0x03 << 16, - MSAA16_X_shift = 16, - MSAA16_Y_mask = 0x03 << 18, - MSAA16_Y_shift = 18, - DB_ZPASS_COUNT_LOW = 0x00009870, - DB_ZPASS_COUNT_HI = 0x00009874, - COUNT_HI_mask = 0x7fffffff << 0, - COUNT_HI_shift = 0, - TD_PS_BORDER_COLOR_INDEX = 0x0000a400, - INDEX_mask = 0x1f << 0, - INDEX_shift = 0, - TD_PS_BORDER_COLOR_RED = 0x0000a404, - TD_PS_BORDER_COLOR_GREEN = 0x0000a408, - TD_PS_BORDER_COLOR_BLUE = 0x0000a40c, - TD_PS_BORDER_COLOR_ALPHA = 0x0000a410, - TD_VS_BORDER_COLOR_INDEX = 0x0000a414, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_VS_BORDER_COLOR_RED = 0x0000a418, - TD_VS_BORDER_COLOR_GREEN = 0x0000a41c, - TD_VS_BORDER_COLOR_BLUE = 0x0000a420, - TD_VS_BORDER_COLOR_ALPHA = 0x0000a424, - TD_GS_BORDER_COLOR_INDEX = 0x0000a428, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_GS_BORDER_COLOR_RED = 0x0000a42c, - TD_GS_BORDER_COLOR_GREEN = 0x0000a430, - TD_GS_BORDER_COLOR_BLUE = 0x0000a434, - TD_GS_BORDER_COLOR_ALPHA = 0x0000a438, - TD_HS_BORDER_COLOR_INDEX = 0x0000a43c, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_HS_BORDER_COLOR_RED = 0x0000a440, - TD_HS_BORDER_COLOR_GREEN = 0x0000a444, - TD_HS_BORDER_COLOR_BLUE = 0x0000a448, - TD_HS_BORDER_COLOR_ALPHA = 0x0000a44c, - TD_LS_BORDER_COLOR_INDEX = 0x0000a450, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_LS_BORDER_COLOR_RED = 0x0000a454, - TD_LS_BORDER_COLOR_GREEN = 0x0000a458, - TD_LS_BORDER_COLOR_BLUE = 0x0000a45c, - TD_LS_BORDER_COLOR_ALPHA = 0x0000a460, - TD_CS_BORDER_COLOR_INDEX = 0x0000a464, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_CS_BORDER_COLOR_RED = 0x0000a468, - TD_CS_BORDER_COLOR_GREEN = 0x0000a46c, - TD_CS_BORDER_COLOR_BLUE = 0x0000a470, - TD_CS_BORDER_COLOR_ALPHA = 0x0000a474, - DB_RENDER_CONTROL = 0x00028000, - DEPTH_CLEAR_ENABLE_bit = 1 << 0, - STENCIL_CLEAR_ENABLE_bit = 1 << 1, - DEPTH_COPY_bit = 1 << 2, - STENCIL_COPY_bit = 1 << 3, - RESUMMARIZE_ENABLE_bit = 1 << 4, - STENCIL_COMPRESS_DISABLE_bit = 1 << 5, - DEPTH_COMPRESS_DISABLE_bit = 1 << 6, - COPY_CENTROID_bit = 1 << 7, - COPY_SAMPLE_mask = 0x0f << 8, - COPY_SAMPLE_shift = 8, - DB_COUNT_CONTROL = 0x00028004, - ZPASS_INCREMENT_DISABLE_bit = 1 << 0, - PERFECT_ZPASS_COUNTS_bit = 1 << 1, - SAMPLE_RATE_mask = 0x07 << 4, - SAMPLE_RATE_shift = 4, - DB_DEPTH_VIEW = 0x00028008, - SLICE_START_mask = 0x7ff << 0, - SLICE_START_shift = 0, - SLICE_MAX_mask = 0x7ff << 13, - SLICE_MAX_shift = 13, - Z_READ_ONLY_bit = 1 << 24, - STENCIL_READ_ONLY_bit = 1 << 25, - DB_RENDER_OVERRIDE = 0x0002800c, - FORCE_HIZ_ENABLE_mask = 0x03 << 0, - FORCE_HIZ_ENABLE_shift = 0, - FORCE_OFF = 0x00, - FORCE_ENABLE = 0x01, - FORCE_DISABLE = 0x02, - FORCE_RESERVED = 0x03, - FORCE_HIS_ENABLE0_mask = 0x03 << 2, - FORCE_HIS_ENABLE0_shift = 2, -/* FORCE_OFF = 0x00, */ -/* FORCE_ENABLE = 0x01, */ -/* FORCE_DISABLE = 0x02, */ -/* FORCE_RESERVED = 0x03, */ - FORCE_HIS_ENABLE1_mask = 0x03 << 4, - FORCE_HIS_ENABLE1_shift = 4, -/* FORCE_OFF = 0x00, */ -/* FORCE_ENABLE = 0x01, */ -/* FORCE_DISABLE = 0x02, */ -/* FORCE_RESERVED = 0x03, */ - FORCE_SHADER_Z_ORDER_bit = 1 << 6, - FAST_Z_DISABLE_bit = 1 << 7, - FAST_STENCIL_DISABLE_bit = 1 << 8, - NOOP_CULL_DISABLE_bit = 1 << 9, - FORCE_COLOR_KILL_bit = 1 << 10, - FORCE_Z_READ_bit = 1 << 11, - FORCE_STENCIL_READ_bit = 1 << 12, - FORCE_FULL_Z_RANGE_mask = 0x03 << 13, - FORCE_FULL_Z_RANGE_shift = 13, -/* FORCE_OFF = 0x00, */ -/* FORCE_ENABLE = 0x01, */ -/* FORCE_DISABLE = 0x02, */ -/* FORCE_RESERVED = 0x03, */ - FORCE_QC_SMASK_CONFLICT_bit = 1 << 15, - DISABLE_VIEWPORT_CLAMP_bit = 1 << 16, - IGNORE_SC_ZRANGE_bit = 1 << 17, - DISABLE_FULLY_COVERED_bit = 1 << 18, - FORCE_Z_LIMIT_SUMM_mask = 0x03 << 19, - FORCE_Z_LIMIT_SUMM_shift = 19, - FORCE_SUMM_OFF = 0x00, - FORCE_SUMM_MINZ = 0x01, - FORCE_SUMM_MAXZ = 0x02, - FORCE_SUMM_BOTH = 0x03, - MAX_TILES_IN_DTT_mask = 0x1f << 21, - MAX_TILES_IN_DTT_shift = 21, - DISABLE_TILE_RATE_TILES_bit = 1 << 26, - FORCE_Z_DIRTY_bit = 1 << 27, - FORCE_STENCIL_DIRTY_bit = 1 << 28, - FORCE_Z_VALID_bit = 1 << 29, - FORCE_STENCIL_VALID_bit = 1 << 30, - PRESERVE_COMPRESSION_bit = 1 << 31, - DB_RENDER_OVERRIDE2 = 0x00028010, - PARTIAL_SQUAD_LAUNCH_CONTROL_mask = 0x03 << 0, - PARTIAL_SQUAD_LAUNCH_CONTROL_shift = 0, - PSLC_AUTO = 0x00, - PSLC_ON_HANG_ONLY = 0x01, - PSLC_ASAP = 0x02, - PSLC_COUNTDOWN = 0x03, - PARTIAL_SQUAD_LAUNCH_COUNTDOWN_mask = 0x07 << 2, - PARTIAL_SQUAD_LAUNCH_COUNTDOWN_shift = 2, - DISABLE_ZMASK_EXPCLEAR_OPTIMIZATIO_bit = 1 << 5, - DISABLE_SMEM_EXPCLEAR_OPTIMIZATION_bit = 1 << 6, - DISABLE_COLOR_ON_VALIDATION_bit = 1 << 7, - DECOMPRESS_Z_ON_FLUSH_bit = 1 << 8, - DB_HTILE_DATA_BASE = 0x00028014, - DB_STENCIL_CLEAR = 0x00028028, - DB_STENCIL_CLEAR__CLEAR_mask = 0xff << 0, - DB_STENCIL_CLEAR__CLEAR_shift = 0, - DB_DEPTH_CLEAR = 0x0002802c, - PA_SC_SCREEN_SCISSOR_TL = 0x00028030, - PA_SC_SCREEN_SCISSOR_TL__TL_X_mask = 0xffff << 0, - PA_SC_SCREEN_SCISSOR_TL__TL_X_shift = 0, - PA_SC_SCREEN_SCISSOR_TL__TL_Y_mask = 0xffff << 16, - PA_SC_SCREEN_SCISSOR_TL__TL_Y_shift = 16, - PA_SC_SCREEN_SCISSOR_BR = 0x00028034, - PA_SC_SCREEN_SCISSOR_BR__BR_X_mask = 0xffff << 0, - PA_SC_SCREEN_SCISSOR_BR__BR_X_shift = 0, - PA_SC_SCREEN_SCISSOR_BR__BR_Y_mask = 0xffff << 16, - PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift = 16, - DB_DEPTH_INFO = 0x0002803c, - ADDR5_SWIZZLE_MASK_mask = 0x0f << 0, - ADDR5_SWIZZLE_MASK_shift = 0, - DB_Z_INFO = 0x00028040, - DB_Z_INFO__FORMAT_mask = 0x03 << 0, - DB_Z_INFO__FORMAT_shift = 0, - Z_INVALID = 0x00, - Z_16 = 0x01, - Z_24 = 0x02, - Z_32_FLOAT = 0x03, - DB_Z_INFO__NUM_SAMPLES_mask = 0x03 << 2, - DB_Z_INFO__NUM_SAMPLES_shift = 2, - DB_Z_INFO__ARRAY_MODE_mask = 0x0f << 4, - DB_Z_INFO__ARRAY_MODE_shift = 4, - ARRAY_1D_TILED_THIN1 = 0x02, - ARRAY_2D_TILED_THIN1 = 0x04, - DB_Z_INFO__TILE_SPLIT_mask = 0x07 << 8, - DB_Z_INFO__TILE_SPLIT_shift = 8, - ADDR_SURF_TILE_SPLIT_64B = 0x00, - ADDR_SURF_TILE_SPLIT_128B = 0x01, - ADDR_SURF_TILE_SPLIT_256B = 0x02, - ADDR_SURF_TILE_SPLIT_512B = 0x03, - ADDR_SURF_TILE_SPLIT_1KB = 0x04, - ADDR_SURF_TILE_SPLIT_2KB = 0x05, - ADDR_SURF_TILE_SPLIT_4KB = 0x06, - DB_Z_INFO__NUM_BANKS_mask = 0x03 << 12, - DB_Z_INFO__NUM_BANKS_shift = 12, - ADDR_SURF_2_BANK = 0x00, - ADDR_SURF_4_BANK = 0x01, - ADDR_SURF_8_BANK = 0x02, - ADDR_SURF_16_BANK = 0x03, - DB_Z_INFO__BANK_WIDTH_mask = 0x03 << 16, - DB_Z_INFO__BANK_WIDTH_shift = 16, - ADDR_SURF_BANK_WIDTH_1 = 0x00, - ADDR_SURF_BANK_WIDTH_2 = 0x01, - ADDR_SURF_BANK_WIDTH_4 = 0x02, - ADDR_SURF_BANK_WIDTH_8 = 0x03, - DB_Z_INFO__BANK_HEIGHT_mask = 0x03 << 20, - DB_Z_INFO__BANK_HEIGHT_shift = 20, - ADDR_SURF_BANK_HEIGHT_1 = 0x00, - ADDR_SURF_BANK_HEIGHT_2 = 0x01, - ADDR_SURF_BANK_HEIGHT_4 = 0x02, - ADDR_SURF_BANK_HEIGHT_8 = 0x03, - DB_Z_INFO__MACRO_TILE_ASPECT_mask = 0x03 << 24, - DB_Z_INFO__MACRO_TILE_ASPECT_shift = 24, - ADDR_SURF_MACRO_ASPECT_1 = 0x00, - ADDR_SURF_MACRO_ASPECT_2 = 0x01, - ADDR_SURF_MACRO_ASPECT_4 = 0x02, - ADDR_SURF_MACRO_ASPECT_8 = 0x03, - ALLOW_EXPCLEAR_bit = 1 << 27, - READ_SIZE_bit = 1 << 28, - TILE_SURFACE_ENABLE_bit = 1 << 29, - ZRANGE_PRECISION_bit = 1 << 31, - DB_STENCIL_INFO = 0x00028044, - DB_STENCIL_INFO__FORMAT_bit = 1 << 0, - DB_STENCIL_INFO__TILE_SPLIT_mask = 0x07 << 8, - DB_STENCIL_INFO__TILE_SPLIT_shift = 8, -/* ADDR_SURF_TILE_SPLIT_64B = 0x00, */ -/* ADDR_SURF_TILE_SPLIT_128B = 0x01, */ -/* ADDR_SURF_TILE_SPLIT_256B = 0x02, */ -/* ADDR_SURF_TILE_SPLIT_512B = 0x03, */ -/* ADDR_SURF_TILE_SPLIT_1KB = 0x04, */ -/* ADDR_SURF_TILE_SPLIT_2KB = 0x05, */ -/* ADDR_SURF_TILE_SPLIT_4KB = 0x06, */ -/* ALLOW_EXPCLEAR_bit = 1 << 27, */ - TILE_STENCIL_DISABLE_bit = 1 << 29, - DB_Z_READ_BASE = 0x00028048, - DB_STENCIL_READ_BASE = 0x0002804c, - DB_Z_WRITE_BASE = 0x00028050, - DB_STENCIL_WRITE_BASE = 0x00028054, - DB_DEPTH_SIZE = 0x00028058, - PITCH_TILE_MAX_mask = 0x7ff << 0, - PITCH_TILE_MAX_shift = 0, - HEIGHT_TILE_MAX_mask = 0x7ff << 11, - HEIGHT_TILE_MAX_shift = 11, - DB_DEPTH_SLICE = 0x0002805c, - SLICE_TILE_MAX_mask = 0x3fffff << 0, - SLICE_TILE_MAX_shift = 0, - SQ_ALU_CONST_BUFFER_SIZE_PS_0 = 0x00028140, - SQ_ALU_CONST_BUFFER_SIZE_PS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_PS_0__DATA_mask = 0x1ff << 0, - SQ_ALU_CONST_BUFFER_SIZE_PS_0__DATA_shift = 0, - SQ_ALU_CONST_BUFFER_SIZE_VS_0 = 0x00028180, - SQ_ALU_CONST_BUFFER_SIZE_VS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_VS_0__DATA_mask = 0x1ff << 0, - SQ_ALU_CONST_BUFFER_SIZE_VS_0__DATA_shift = 0, - SQ_ALU_CONST_BUFFER_SIZE_GS_0 = 0x000281c0, - SQ_ALU_CONST_BUFFER_SIZE_GS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_GS_0__DATA_mask = 0x1ff << 0, - SQ_ALU_CONST_BUFFER_SIZE_GS_0__DATA_shift = 0, - PA_SC_WINDOW_OFFSET = 0x00028200, - WINDOW_X_OFFSET_mask = 0xffff << 0, - WINDOW_X_OFFSET_shift = 0, - WINDOW_Y_OFFSET_mask = 0xffff << 16, - WINDOW_Y_OFFSET_shift = 16, - PA_SC_WINDOW_SCISSOR_TL = 0x00028204, - PA_SC_WINDOW_SCISSOR_TL__TL_X_mask = 0x7fff << 0, - PA_SC_WINDOW_SCISSOR_TL__TL_X_shift = 0, - PA_SC_WINDOW_SCISSOR_TL__TL_Y_mask = 0x7fff << 16, - PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift = 16, - WINDOW_OFFSET_DISABLE_bit = 1 << 31, - PA_SC_WINDOW_SCISSOR_BR = 0x00028208, - PA_SC_WINDOW_SCISSOR_BR__BR_X_mask = 0x7fff << 0, - PA_SC_WINDOW_SCISSOR_BR__BR_X_shift = 0, - PA_SC_WINDOW_SCISSOR_BR__BR_Y_mask = 0x7fff << 16, - PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift = 16, - PA_SC_CLIPRECT_RULE = 0x0002820c, - CLIP_RULE_mask = 0xffff << 0, - CLIP_RULE_shift = 0, - PA_SC_CLIPRECT_0_TL = 0x00028210, - PA_SC_CLIPRECT_0_TL_num = 4, - PA_SC_CLIPRECT_0_TL_offset = 8, - PA_SC_CLIPRECT_0_TL__TL_X_mask = 0x7fff << 0, - PA_SC_CLIPRECT_0_TL__TL_X_shift = 0, - PA_SC_CLIPRECT_0_TL__TL_Y_mask = 0x7fff << 16, - PA_SC_CLIPRECT_0_TL__TL_Y_shift = 16, - PA_SC_CLIPRECT_0_BR = 0x00028214, - PA_SC_CLIPRECT_0_BR_num = 4, - PA_SC_CLIPRECT_0_BR_offset = 8, - PA_SC_CLIPRECT_0_BR__BR_X_mask = 0x7fff << 0, - PA_SC_CLIPRECT_0_BR__BR_X_shift = 0, - PA_SC_CLIPRECT_0_BR__BR_Y_mask = 0x7fff << 16, - PA_SC_CLIPRECT_0_BR__BR_Y_shift = 16, - PA_SC_EDGERULE = 0x00028230, - ER_TRI_mask = 0x0f << 0, - ER_TRI_shift = 0, - ER_POINT_mask = 0x0f << 4, - ER_POINT_shift = 4, - ER_RECT_mask = 0x0f << 8, - ER_RECT_shift = 8, - ER_LINE_LR_mask = 0x3f << 12, - ER_LINE_LR_shift = 12, - ER_LINE_RL_mask = 0x3f << 18, - ER_LINE_RL_shift = 18, - ER_LINE_TB_mask = 0x0f << 24, - ER_LINE_TB_shift = 24, - ER_LINE_BT_mask = 0x0f << 28, - ER_LINE_BT_shift = 28, - PA_SU_HARDWARE_SCREEN_OFFSET = 0x00028234, - HW_SCREEN_OFFSET_X_mask = 0x1f << 0, - HW_SCREEN_OFFSET_X_shift = 0, - HW_SCREEN_OFFSET_Y_mask = 0x1f << 8, - HW_SCREEN_OFFSET_Y_shift = 8, - CB_TARGET_MASK = 0x00028238, - TARGET0_ENABLE_mask = 0x0f << 0, - TARGET0_ENABLE_shift = 0, - TARGET1_ENABLE_mask = 0x0f << 4, - TARGET1_ENABLE_shift = 4, - TARGET2_ENABLE_mask = 0x0f << 8, - TARGET2_ENABLE_shift = 8, - TARGET3_ENABLE_mask = 0x0f << 12, - TARGET3_ENABLE_shift = 12, - TARGET4_ENABLE_mask = 0x0f << 16, - TARGET4_ENABLE_shift = 16, - TARGET5_ENABLE_mask = 0x0f << 20, - TARGET5_ENABLE_shift = 20, - TARGET6_ENABLE_mask = 0x0f << 24, - TARGET6_ENABLE_shift = 24, - TARGET7_ENABLE_mask = 0x0f << 28, - TARGET7_ENABLE_shift = 28, - CB_SHADER_MASK = 0x0002823c, - OUTPUT0_ENABLE_mask = 0x0f << 0, - OUTPUT0_ENABLE_shift = 0, - OUTPUT1_ENABLE_mask = 0x0f << 4, - OUTPUT1_ENABLE_shift = 4, - OUTPUT2_ENABLE_mask = 0x0f << 8, - OUTPUT2_ENABLE_shift = 8, - OUTPUT3_ENABLE_mask = 0x0f << 12, - OUTPUT3_ENABLE_shift = 12, - OUTPUT4_ENABLE_mask = 0x0f << 16, - OUTPUT4_ENABLE_shift = 16, - OUTPUT5_ENABLE_mask = 0x0f << 20, - OUTPUT5_ENABLE_shift = 20, - OUTPUT6_ENABLE_mask = 0x0f << 24, - OUTPUT6_ENABLE_shift = 24, - OUTPUT7_ENABLE_mask = 0x0f << 28, - OUTPUT7_ENABLE_shift = 28, - PA_SC_GENERIC_SCISSOR_TL = 0x00028240, - PA_SC_GENERIC_SCISSOR_TL__TL_X_mask = 0x7fff << 0, - PA_SC_GENERIC_SCISSOR_TL__TL_X_shift = 0, - PA_SC_GENERIC_SCISSOR_TL__TL_Y_mask = 0x7fff << 16, - PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift = 16, -/* WINDOW_OFFSET_DISABLE_bit = 1 << 31, */ - PA_SC_GENERIC_SCISSOR_BR = 0x00028244, - PA_SC_GENERIC_SCISSOR_BR__BR_X_mask = 0x7fff << 0, - PA_SC_GENERIC_SCISSOR_BR__BR_X_shift = 0, - PA_SC_GENERIC_SCISSOR_BR__BR_Y_mask = 0x7fff << 16, - PA_SC_GENERIC_SCISSOR_BR__BR_Y_shift = 16, - PA_SC_VPORT_SCISSOR_0_TL = 0x00028250, - PA_SC_VPORT_SCISSOR_0_TL_num = 16, - PA_SC_VPORT_SCISSOR_0_TL_offset = 8, - PA_SC_VPORT_SCISSOR_0_TL__TL_X_mask = 0x7fff << 0, - PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift = 0, - PA_SC_VPORT_SCISSOR_0_TL__TL_Y_mask = 0x7fff << 16, - PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift = 16, -/* WINDOW_OFFSET_DISABLE_bit = 1 << 31, */ - PA_SC_VPORT_SCISSOR_0_BR = 0x00028254, - PA_SC_VPORT_SCISSOR_0_BR_num = 16, - PA_SC_VPORT_SCISSOR_0_BR_offset = 8, - PA_SC_VPORT_SCISSOR_0_BR__BR_X_mask = 0x7fff << 0, - PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift = 0, - PA_SC_VPORT_SCISSOR_0_BR__BR_Y_mask = 0x7fff << 16, - PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift = 16, - PA_SC_VPORT_ZMIN_0 = 0x000282d0, - PA_SC_VPORT_ZMIN_0_num = 16, - PA_SC_VPORT_ZMIN_0_offset = 8, - PA_SC_VPORT_ZMAX_0 = 0x000282d4, - PA_SC_VPORT_ZMAX_0_num = 16, - PA_SC_VPORT_ZMAX_0_offset = 8, - SX_MISC = 0x00028350, - MULTIPASS_bit = 1 << 0, - SX_SURFACE_SYNC = 0x00028354, - SURFACE_SYNC_MASK_mask = 0x3ff << 0, - SURFACE_SYNC_MASK_shift = 0, - SX_SCATTER_EXPORT_BASE = 0x00028358, - SX_SCATTER_EXPORT_SIZE = 0x0002835c, - SQ_VTX_SEMANTIC_0 = 0x00028380, - SQ_VTX_SEMANTIC_0_num = 32, -/* SEMANTIC_ID_mask = 0xff << 0, */ -/* SEMANTIC_ID_shift = 0, */ - VGT_MAX_VTX_INDX = 0x00028400, - VGT_MIN_VTX_INDX = 0x00028404, - VGT_INDX_OFFSET = 0x00028408, - VGT_MULTI_PRIM_IB_RESET_INDX = 0x0002840c, - SX_ALPHA_TEST_CONTROL = 0x00028410, - ALPHA_FUNC_mask = 0x07 << 0, - ALPHA_FUNC_shift = 0, - REF_NEVER = 0x00, - REF_LESS = 0x01, - REF_EQUAL = 0x02, - REF_LEQUAL = 0x03, - REF_GREATER = 0x04, - REF_NOTEQUAL = 0x05, - REF_GEQUAL = 0x06, - REF_ALWAYS = 0x07, - ALPHA_TEST_ENABLE_bit = 1 << 3, - ALPHA_TEST_BYPASS_bit = 1 << 8, - CB_BLEND_RED = 0x00028414, - CB_BLEND_GREEN = 0x00028418, - CB_BLEND_BLUE = 0x0002841c, - CB_BLEND_ALPHA = 0x00028420, - DB_STENCILREFMASK = 0x00028430, - STENCILREF_mask = 0xff << 0, - STENCILREF_shift = 0, - STENCILMASK_mask = 0xff << 8, - STENCILMASK_shift = 8, - STENCILWRITEMASK_mask = 0xff << 16, - STENCILWRITEMASK_shift = 16, - DB_STENCILREFMASK_BF = 0x00028434, - STENCILREF_BF_mask = 0xff << 0, - STENCILREF_BF_shift = 0, - STENCILMASK_BF_mask = 0xff << 8, - STENCILMASK_BF_shift = 8, - STENCILWRITEMASK_BF_mask = 0xff << 16, - STENCILWRITEMASK_BF_shift = 16, - SX_ALPHA_REF = 0x00028438, - PA_CL_VPORT_XSCALE_0 = 0x0002843c, - PA_CL_VPORT_XSCALE_0_num = 16, - PA_CL_VPORT_XSCALE_0_offset = 24, - PA_CL_VPORT_XOFFSET_0 = 0x00028440, - PA_CL_VPORT_XOFFSET_0_num = 16, - PA_CL_VPORT_XOFFSET_0_offset = 24, - PA_CL_VPORT_YSCALE_0 = 0x00028444, - PA_CL_VPORT_YSCALE_0_num = 16, - PA_CL_VPORT_YSCALE_0_offset = 24, - PA_CL_VPORT_YOFFSET_0 = 0x00028448, - PA_CL_VPORT_YOFFSET_0_num = 16, - PA_CL_VPORT_YOFFSET_0_offset = 24, - PA_CL_VPORT_ZSCALE_0 = 0x0002844c, - PA_CL_VPORT_ZSCALE_0_num = 16, - PA_CL_VPORT_ZSCALE_0_offset = 24, - PA_CL_VPORT_ZOFFSET_0 = 0x00028450, - PA_CL_VPORT_ZOFFSET_0_num = 16, - PA_CL_VPORT_ZOFFSET_0_offset = 24, - PA_CL_UCP_0_X = 0x000285bc, - PA_CL_UCP_0_X_num = 6, - PA_CL_UCP_0_X_offset = 16, - PA_CL_UCP_0_Y = 0x000285c0, - PA_CL_UCP_0_Y_num = 6, - PA_CL_UCP_0_Y_offset = 16, - PA_CL_UCP_0_Z = 0x000285c4, - PA_CL_UCP_0_Z_num = 6, - PA_CL_UCP_0_Z_offset = 16, - PA_CL_UCP_0_W = 0x000285c8, - PA_CL_UCP_0_W_num = 6, - PA_CL_UCP_0_W_offset = 16, - SPI_VS_OUT_ID_0 = 0x0002861c, - SPI_VS_OUT_ID_0_num = 10, - SEMANTIC_0_mask = 0xff << 0, - SEMANTIC_0_shift = 0, - SEMANTIC_1_mask = 0xff << 8, - SEMANTIC_1_shift = 8, - SEMANTIC_2_mask = 0xff << 16, - SEMANTIC_2_shift = 16, - SEMANTIC_3_mask = 0xff << 24, - SEMANTIC_3_shift = 24, - SPI_PS_INPUT_CNTL_0 = 0x00028644, - SPI_PS_INPUT_CNTL_0_num = 32, - SEMANTIC_mask = 0xff << 0, - SEMANTIC_shift = 0, - DEFAULT_VAL_mask = 0x03 << 8, - DEFAULT_VAL_shift = 8, - X_0_0F = 0x00, - FLAT_SHADE_bit = 1 << 10, - CYL_WRAP_mask = 0x0f << 13, - CYL_WRAP_shift = 13, - PT_SPRITE_TEX_bit = 1 << 17, - SPI_VS_OUT_CONFIG = 0x000286c4, - VS_PER_COMPONENT_bit = 1 << 0, - VS_EXPORT_COUNT_mask = 0x1f << 1, - VS_EXPORT_COUNT_shift = 1, - VS_HALF_PACK_bit = 1 << 6, - VS_EXPORTS_FOG_bit = 1 << 8, - VS_OUT_FOG_VEC_ADDR_mask = 0x1f << 9, - VS_OUT_FOG_VEC_ADDR_shift = 9, - SPI_PS_IN_CONTROL_0 = 0x000286cc, - NUM_INTERP_mask = 0x3f << 0, - NUM_INTERP_shift = 0, - POSITION_ENA_bit = 1 << 8, - POSITION_CENTROID_bit = 1 << 9, - POSITION_ADDR_mask = 0x1f << 10, - POSITION_ADDR_shift = 10, - PARAM_GEN_mask = 0x0f << 15, - PARAM_GEN_shift = 15, - PERSP_GRADIENT_ENA_bit = 1 << 28, - LINEAR_GRADIENT_ENA_bit = 1 << 29, - POSITION_SAMPLE_bit = 1 << 30, - SPI_PS_IN_CONTROL_1 = 0x000286d0, - FRONT_FACE_ENA_bit = 1 << 8, - FRONT_FACE_ALL_BITS_bit = 1 << 11, - FRONT_FACE_ADDR_mask = 0x1f << 12, - FRONT_FACE_ADDR_shift = 12, - FOG_ADDR_mask = 0x7f << 17, - FOG_ADDR_shift = 17, - FIXED_PT_POSITION_ENA_bit = 1 << 24, - FIXED_PT_POSITION_ADDR_mask = 0x1f << 25, - FIXED_PT_POSITION_ADDR_shift = 25, - POSITION_ULC_bit = 1 << 30, - SPI_INTERP_CONTROL_0 = 0x000286d4, - FLAT_SHADE_ENA_bit = 1 << 0, - PNT_SPRITE_ENA_bit = 1 << 1, - PNT_SPRITE_OVRD_X_mask = 0x07 << 2, - PNT_SPRITE_OVRD_X_shift = 2, - SPI_PNT_SPRITE_SEL_0 = 0x00, - SPI_PNT_SPRITE_SEL_1 = 0x01, - SPI_PNT_SPRITE_SEL_S = 0x02, - SPI_PNT_SPRITE_SEL_T = 0x03, - SPI_PNT_SPRITE_SEL_NONE = 0x04, - PNT_SPRITE_OVRD_Y_mask = 0x07 << 5, - PNT_SPRITE_OVRD_Y_shift = 5, -/* SPI_PNT_SPRITE_SEL_0 = 0x00, */ -/* SPI_PNT_SPRITE_SEL_1 = 0x01, */ -/* SPI_PNT_SPRITE_SEL_S = 0x02, */ -/* SPI_PNT_SPRITE_SEL_T = 0x03, */ -/* SPI_PNT_SPRITE_SEL_NONE = 0x04, */ - PNT_SPRITE_OVRD_Z_mask = 0x07 << 8, - PNT_SPRITE_OVRD_Z_shift = 8, -/* SPI_PNT_SPRITE_SEL_0 = 0x00, */ -/* SPI_PNT_SPRITE_SEL_1 = 0x01, */ -/* SPI_PNT_SPRITE_SEL_S = 0x02, */ -/* SPI_PNT_SPRITE_SEL_T = 0x03, */ -/* SPI_PNT_SPRITE_SEL_NONE = 0x04, */ - PNT_SPRITE_OVRD_W_mask = 0x07 << 11, - PNT_SPRITE_OVRD_W_shift = 11, -/* SPI_PNT_SPRITE_SEL_0 = 0x00, */ -/* SPI_PNT_SPRITE_SEL_1 = 0x01, */ -/* SPI_PNT_SPRITE_SEL_S = 0x02, */ -/* SPI_PNT_SPRITE_SEL_T = 0x03, */ -/* SPI_PNT_SPRITE_SEL_NONE = 0x04, */ - PNT_SPRITE_TOP_1_bit = 1 << 14, - SPI_INPUT_Z = 0x000286d8, - PROVIDE_Z_TO_SPI_bit = 1 << 0, - SPI_FOG_CNTL = 0x000286dc, - PASS_FOG_THROUGH_PS_bit = 1 << 0, - SPI_BARYC_CNTL = 0x000286e0, - PERSP_CENTER_ENA_mask = 0x03 << 0, - PERSP_CENTER_ENA_shift = 0, - X_OFF = 0x00, - PERSP_CENTER_ENA__X_ON_AT_CENTER = 0x01, - PERSP_CENTER_ENA__X_ON_AT_CENTROID = 0x02, - PERSP_CENTROID_ENA_mask = 0x03 << 4, - PERSP_CENTROID_ENA_shift = 4, -/* X_OFF = 0x00, */ - PERSP_CENTROID_ENA__X_ON_AT_CENTROID = 0x01, - PERSP_CENTROID_ENA__X_ON_AT_CENTER = 0x02, - PERSP_SAMPLE_ENA_mask = 0x03 << 8, - PERSP_SAMPLE_ENA_shift = 8, -/* X_OFF = 0x00, */ - PERSP_PULL_MODEL_ENA_mask = 0x03 << 12, - PERSP_PULL_MODEL_ENA_shift = 12, -/* X_OFF = 0x00, */ - LINEAR_CENTER_ENA_mask = 0x03 << 16, - LINEAR_CENTER_ENA_shift = 16, -/* X_OFF = 0x00, */ - LINEAR_CENTER_ENA__X_ON_AT_CENTER = 0x01, - LINEAR_CENTER_ENA__X_ON_AT_CENTROID = 0x02, - LINEAR_CENTROID_ENA_mask = 0x03 << 20, - LINEAR_CENTROID_ENA_shift = 20, -/* X_OFF = 0x00, */ - LINEAR_CENTROID_ENA__X_ON_AT_CENTROID = 0x01, - LINEAR_CENTROID_ENA__X_ON_AT_CENTER = 0x02, - LINEAR_SAMPLE_ENA_mask = 0x03 << 24, - LINEAR_SAMPLE_ENA_shift = 24, -/* X_OFF = 0x00, */ - SPI_PS_IN_CONTROL_2 = 0x000286e4, - LINE_STIPPLE_TEX_ADDR_mask = 0xff << 0, - LINE_STIPPLE_TEX_ADDR_shift = 0, - LINE_STIPPLE_TEX_ENA_bit = 1 << 8, - SPI_GPR_MGMT = 0x000286f8, - SPI_GPR_MGMT__NUM_PS_GPRS_mask = 0x1f << 0, - SPI_GPR_MGMT__NUM_PS_GPRS_shift = 0, - SPI_GPR_MGMT__NUM_VS_GPRS_mask = 0x1f << 5, - SPI_GPR_MGMT__NUM_VS_GPRS_shift = 5, - NUM_GS_GPRS_mask = 0x1f << 10, - NUM_GS_GPRS_shift = 10, - NUM_ES_GPRS_mask = 0x1f << 15, - NUM_ES_GPRS_shift = 15, - NUM_HS_GPRS_mask = 0x1f << 20, - NUM_HS_GPRS_shift = 20, - NUM_LS_GPRS_mask = 0x1f << 25, - NUM_LS_GPRS_shift = 25, - SPI_LDS_MGMT = 0x000286fc, - NUM_PS_LDS_mask = 0xff << 0, - NUM_PS_LDS_shift = 0, - NUM_LS_LDS_mask = 0xff << 8, - NUM_LS_LDS_shift = 8, - SPI_STACK_MGMT = 0x00028700, - NUM_PS_STACK_mask = 0x1f << 0, - NUM_PS_STACK_shift = 0, - NUM_VS_STACK_mask = 0x1f << 5, - NUM_VS_STACK_shift = 5, - NUM_GS_STACK_mask = 0x1f << 10, - NUM_GS_STACK_shift = 10, - NUM_ES_STACK_mask = 0x1f << 15, - NUM_ES_STACK_shift = 15, - NUM_HS_STACK_mask = 0x1f << 20, - NUM_HS_STACK_shift = 20, - NUM_LS_STACK_mask = 0x1f << 25, - NUM_LS_STACK_shift = 25, - SPI_WAVE_MGMT_1 = 0x00028704, - NUM_PS_WAVES_mask = 0x1f << 0, - NUM_PS_WAVES_shift = 0, - NUM_VS_WAVES_mask = 0x1f << 5, - NUM_VS_WAVES_shift = 5, - NUM_GS_WAVES_mask = 0x1f << 10, - NUM_GS_WAVES_shift = 10, - NUM_ES_WAVES_mask = 0x1f << 15, - NUM_ES_WAVES_shift = 15, - NUM_HS_WAVES_mask = 0x1f << 20, - NUM_HS_WAVES_shift = 20, - NUM_LS_WAVES_mask = 0x1f << 25, - NUM_LS_WAVES_shift = 25, - SPI_WAVE_MGMT_2 = 0x00028708, - NUM_CS_WAVES_ONE_RING_mask = 0x1f << 0, - NUM_CS_WAVES_ONE_RING_shift = 0, - NUM_CS_WAVES_MULTI_RING_mask = 0x1f << 5, - NUM_CS_WAVES_MULTI_RING_shift = 5, - CB_BLEND0_CONTROL = 0x00028780, - CB_BLEND0_CONTROL_num = 8, - COLOR_SRCBLEND_mask = 0x1f << 0, - COLOR_SRCBLEND_shift = 0, - BLEND_ZERO = 0x00, - BLEND_ONE = 0x01, - BLEND_SRC_COLOR = 0x02, - BLEND_ONE_MINUS_SRC_COLOR = 0x03, - BLEND_SRC_ALPHA = 0x04, - BLEND_ONE_MINUS_SRC_ALPHA = 0x05, - BLEND_DST_ALPHA = 0x06, - BLEND_ONE_MINUS_DST_ALPHA = 0x07, - BLEND_DST_COLOR = 0x08, - BLEND_ONE_MINUS_DST_COLOR = 0x09, - BLEND_SRC_ALPHA_SATURATE = 0x0a, - BLEND_BOTH_SRC_ALPHA = 0x0b, - BLEND_BOTH_INV_SRC_ALPHA = 0x0c, - BLEND_CONSTANT_COLOR = 0x0d, - BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, - BLEND_SRC1_COLOR = 0x0f, - BLEND_INV_SRC1_COLOR = 0x10, - BLEND_SRC1_ALPHA = 0x11, - BLEND_INV_SRC1_ALPHA = 0x12, - BLEND_CONSTANT_ALPHA = 0x13, - BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, - COLOR_COMB_FCN_mask = 0x07 << 5, - COLOR_COMB_FCN_shift = 5, - COMB_DST_PLUS_SRC = 0x00, - COMB_SRC_MINUS_DST = 0x01, - COMB_MIN_DST_SRC = 0x02, - COMB_MAX_DST_SRC = 0x03, - COMB_DST_MINUS_SRC = 0x04, - COLOR_DESTBLEND_mask = 0x1f << 8, - COLOR_DESTBLEND_shift = 8, -/* BLEND_ZERO = 0x00, */ -/* BLEND_ONE = 0x01, */ -/* BLEND_SRC_COLOR = 0x02, */ -/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ -/* BLEND_SRC_ALPHA = 0x04, */ -/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ -/* BLEND_DST_ALPHA = 0x06, */ -/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ -/* BLEND_DST_COLOR = 0x08, */ -/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ -/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ -/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ -/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ -/* BLEND_CONSTANT_COLOR = 0x0d, */ -/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ -/* BLEND_SRC1_COLOR = 0x0f, */ -/* BLEND_INV_SRC1_COLOR = 0x10, */ -/* BLEND_SRC1_ALPHA = 0x11, */ -/* BLEND_INV_SRC1_ALPHA = 0x12, */ -/* BLEND_CONSTANT_ALPHA = 0x13, */ -/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ - ALPHA_SRCBLEND_mask = 0x1f << 16, - ALPHA_SRCBLEND_shift = 16, -/* BLEND_ZERO = 0x00, */ -/* BLEND_ONE = 0x01, */ -/* BLEND_SRC_COLOR = 0x02, */ -/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ -/* BLEND_SRC_ALPHA = 0x04, */ -/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ -/* BLEND_DST_ALPHA = 0x06, */ -/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ -/* BLEND_DST_COLOR = 0x08, */ -/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ -/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ -/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ -/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ -/* BLEND_CONSTANT_COLOR = 0x0d, */ -/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ -/* BLEND_SRC1_COLOR = 0x0f, */ -/* BLEND_INV_SRC1_COLOR = 0x10, */ -/* BLEND_SRC1_ALPHA = 0x11, */ -/* BLEND_INV_SRC1_ALPHA = 0x12, */ -/* BLEND_CONSTANT_ALPHA = 0x13, */ -/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ - ALPHA_COMB_FCN_mask = 0x07 << 21, - ALPHA_COMB_FCN_shift = 21, -/* COMB_DST_PLUS_SRC = 0x00, */ -/* COMB_SRC_MINUS_DST = 0x01, */ -/* COMB_MIN_DST_SRC = 0x02, */ -/* COMB_MAX_DST_SRC = 0x03, */ -/* COMB_DST_MINUS_SRC = 0x04, */ - ALPHA_DESTBLEND_mask = 0x1f << 24, - ALPHA_DESTBLEND_shift = 24, -/* BLEND_ZERO = 0x00, */ -/* BLEND_ONE = 0x01, */ -/* BLEND_SRC_COLOR = 0x02, */ -/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ -/* BLEND_SRC_ALPHA = 0x04, */ -/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ -/* BLEND_DST_ALPHA = 0x06, */ -/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ -/* BLEND_DST_COLOR = 0x08, */ -/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ -/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ -/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ -/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ -/* BLEND_CONSTANT_COLOR = 0x0d, */ -/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ -/* BLEND_SRC1_COLOR = 0x0f, */ -/* BLEND_INV_SRC1_COLOR = 0x10, */ -/* BLEND_SRC1_ALPHA = 0x11, */ -/* BLEND_INV_SRC1_ALPHA = 0x12, */ -/* BLEND_CONSTANT_ALPHA = 0x13, */ -/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ - SEPARATE_ALPHA_BLEND_bit = 1 << 29, - CB_BLEND0_CONTROL__ENABLE_bit = 1 << 30, - PA_CL_POINT_X_RAD = 0x000287d4, - PA_CL_POINT_Y_RAD = 0x000287d8, - PA_CL_POINT_SIZE = 0x000287dc, - PA_CL_POINT_CULL_RAD = 0x000287e0, - VGT_DMA_BASE_HI = 0x000287e4, - VGT_DMA_BASE_HI__BASE_ADDR_mask = 0xff << 0, - VGT_DMA_BASE_HI__BASE_ADDR_shift = 0, - VGT_DMA_BASE = 0x000287e8, - VGT_DRAW_INITIATOR = 0x000287f0, - SOURCE_SELECT_mask = 0x03 << 0, - SOURCE_SELECT_shift = 0, - DI_SRC_SEL_DMA = 0x00, - DI_SRC_SEL_IMMEDIATE = 0x01, - DI_SRC_SEL_AUTO_INDEX = 0x02, - DI_SRC_SEL_RESERVED = 0x03, - MAJOR_MODE_mask = 0x03 << 2, - MAJOR_MODE_shift = 2, - DI_MAJOR_MODE_0 = 0x00, - DI_MAJOR_MODE_1 = 0x01, - NOT_EOP_bit = 1 << 5, - USE_OPAQUE_bit = 1 << 6, - VGT_IMMED_DATA = 0x000287f4, - VGT_EVENT_ADDRESS_REG = 0x000287f8, - ADDRESS_LOW_mask = 0xfffffff << 0, - ADDRESS_LOW_shift = 0, - DB_DEPTH_CONTROL = 0x00028800, - STENCIL_ENABLE_bit = 1 << 0, - Z_ENABLE_bit = 1 << 1, - Z_WRITE_ENABLE_bit = 1 << 2, - ZFUNC_mask = 0x07 << 4, - ZFUNC_shift = 4, - FRAG_NEVER = 0x00, - FRAG_LESS = 0x01, - FRAG_EQUAL = 0x02, - FRAG_LEQUAL = 0x03, - FRAG_GREATER = 0x04, - FRAG_NOTEQUAL = 0x05, - FRAG_GEQUAL = 0x06, - FRAG_ALWAYS = 0x07, - BACKFACE_ENABLE_bit = 1 << 7, - STENCILFUNC_mask = 0x07 << 8, - STENCILFUNC_shift = 8, -/* REF_NEVER = 0x00, */ -/* REF_LESS = 0x01, */ -/* REF_EQUAL = 0x02, */ -/* REF_LEQUAL = 0x03, */ -/* REF_GREATER = 0x04, */ -/* REF_NOTEQUAL = 0x05, */ -/* REF_GEQUAL = 0x06, */ -/* REF_ALWAYS = 0x07, */ - STENCILFAIL_mask = 0x07 << 11, - STENCILFAIL_shift = 11, - STENCIL_KEEP = 0x00, - STENCIL_ZERO = 0x01, - STENCIL_REPLACE = 0x02, - STENCIL_INCR_CLAMP = 0x03, - STENCIL_DECR_CLAMP = 0x04, - STENCIL_INVERT = 0x05, - STENCIL_INCR_WRAP = 0x06, - STENCIL_DECR_WRAP = 0x07, - STENCILZPASS_mask = 0x07 << 14, - STENCILZPASS_shift = 14, -/* STENCIL_KEEP = 0x00, */ -/* STENCIL_ZERO = 0x01, */ -/* STENCIL_REPLACE = 0x02, */ -/* STENCIL_INCR_CLAMP = 0x03, */ -/* STENCIL_DECR_CLAMP = 0x04, */ -/* STENCIL_INVERT = 0x05, */ -/* STENCIL_INCR_WRAP = 0x06, */ -/* STENCIL_DECR_WRAP = 0x07, */ - STENCILZFAIL_mask = 0x07 << 17, - STENCILZFAIL_shift = 17, -/* STENCIL_KEEP = 0x00, */ -/* STENCIL_ZERO = 0x01, */ -/* STENCIL_REPLACE = 0x02, */ -/* STENCIL_INCR_CLAMP = 0x03, */ -/* STENCIL_DECR_CLAMP = 0x04, */ -/* STENCIL_INVERT = 0x05, */ -/* STENCIL_INCR_WRAP = 0x06, */ -/* STENCIL_DECR_WRAP = 0x07, */ - STENCILFUNC_BF_mask = 0x07 << 20, - STENCILFUNC_BF_shift = 20, -/* REF_NEVER = 0x00, */ -/* REF_LESS = 0x01, */ -/* REF_EQUAL = 0x02, */ -/* REF_LEQUAL = 0x03, */ -/* REF_GREATER = 0x04, */ -/* REF_NOTEQUAL = 0x05, */ -/* REF_GEQUAL = 0x06, */ -/* REF_ALWAYS = 0x07, */ - STENCILFAIL_BF_mask = 0x07 << 23, - STENCILFAIL_BF_shift = 23, -/* STENCIL_KEEP = 0x00, */ -/* STENCIL_ZERO = 0x01, */ -/* STENCIL_REPLACE = 0x02, */ -/* STENCIL_INCR_CLAMP = 0x03, */ -/* STENCIL_DECR_CLAMP = 0x04, */ -/* STENCIL_INVERT = 0x05, */ -/* STENCIL_INCR_WRAP = 0x06, */ -/* STENCIL_DECR_WRAP = 0x07, */ - STENCILZPASS_BF_mask = 0x07 << 26, - STENCILZPASS_BF_shift = 26, -/* STENCIL_KEEP = 0x00, */ -/* STENCIL_ZERO = 0x01, */ -/* STENCIL_REPLACE = 0x02, */ -/* STENCIL_INCR_CLAMP = 0x03, */ -/* STENCIL_DECR_CLAMP = 0x04, */ -/* STENCIL_INVERT = 0x05, */ -/* STENCIL_INCR_WRAP = 0x06, */ -/* STENCIL_DECR_WRAP = 0x07, */ - STENCILZFAIL_BF_mask = 0x07 << 29, - STENCILZFAIL_BF_shift = 29, -/* STENCIL_KEEP = 0x00, */ -/* STENCIL_ZERO = 0x01, */ -/* STENCIL_REPLACE = 0x02, */ -/* STENCIL_INCR_CLAMP = 0x03, */ -/* STENCIL_DECR_CLAMP = 0x04, */ -/* STENCIL_INVERT = 0x05, */ -/* STENCIL_INCR_WRAP = 0x06, */ -/* STENCIL_DECR_WRAP = 0x07, */ - DB_EQAA = 0x00028804, - CB_COLOR_CONTROL = 0x00028808, - DEGAMMA_ENABLE_bit = 1 << 3, - CB_COLOR_CONTROL__MODE_mask = 0x07 << 4, - CB_COLOR_CONTROL__MODE_shift = 4, - CB_DISABLE = 0x00, - CB_NORMAL = 0x01, - CB_ELIMINATE_FAST_CLEAR = 0x02, - CB_RESOLVE = 0x03, - CB_DECOMPRESS = 0x04, - CB_FMASK_DECOMPRESS = 0x05, - ROP3_mask = 0xff << 16, - ROP3_shift = 16, - X_0X00 = 0x00, - X_0X05 = 0x05, - X_0X0A = 0x0a, - X_0X0F = 0x0f, - X_0X11 = 0x11, - X_0X22 = 0x22, - X_0X33 = 0x33, - X_0X44 = 0x44, - X_0X50 = 0x50, - X_0X55 = 0x55, - X_0X5A = 0x5a, - X_0X5F = 0x5f, - X_0X66 = 0x66, - X_0X77 = 0x77, - X_0X88 = 0x88, - X_0X99 = 0x99, - X_0XA0 = 0xa0, - X_0XA5 = 0xa5, - X_0XAA = 0xaa, - X_0XAF = 0xaf, - X_0XBB = 0xbb, - X_0XCC = 0xcc, - X_0XDD = 0xdd, - X_0XEE = 0xee, - X_0XF0 = 0xf0, - X_0XF5 = 0xf5, - X_0XFA = 0xfa, - X_0XFF = 0xff, - DB_SHADER_CONTROL = 0x0002880c, - Z_EXPORT_ENABLE_bit = 1 << 0, - STENCIL_REF_EXPORT_ENABLE_bit = 1 << 1, - Z_ORDER_mask = 0x03 << 4, - Z_ORDER_shift = 4, - LATE_Z = 0x00, - EARLY_Z_THEN_LATE_Z = 0x01, - RE_Z = 0x02, - EARLY_Z_THEN_RE_Z = 0x03, - KILL_ENABLE_bit = 1 << 6, - COVERAGE_TO_MASK_ENABLE_bit = 1 << 7, - MASK_EXPORT_ENABLE_bit = 1 << 8, - DUAL_EXPORT_ENABLE_bit = 1 << 9, - EXEC_ON_HIER_FAIL_bit = 1 << 10, - EXEC_ON_NOOP_bit = 1 << 11, - ALPHA_TO_MASK_DISABLE_bit = 1 << 12, - DB_SOURCE_FORMAT_mask = 0x03 << 13, - DB_SOURCE_FORMAT_shift = 13, - EXPORT_DB_FULL = 0x00, - EXPORT_DB_FOUR16 = 0x01, - EXPORT_DB_TWO = 0x02, - DEPTH_BEFORE_SHADER_bit = 1 << 15, - CONSERVATIVE_Z_EXPORT_mask = 0x03 << 16, - CONSERVATIVE_Z_EXPORT_shift = 16, - EXPORT_ANY_Z = 0x00, - EXPORT_LESS_THAN_Z = 0x01, - EXPORT_GREATER_THAN_Z = 0x02, - EXPORT_RESERVED = 0x03, - PA_CL_CLIP_CNTL = 0x00028810, - UCP_ENA_0_bit = 1 << 0, - UCP_ENA_1_bit = 1 << 1, - UCP_ENA_2_bit = 1 << 2, - UCP_ENA_3_bit = 1 << 3, - UCP_ENA_4_bit = 1 << 4, - UCP_ENA_5_bit = 1 << 5, - PS_UCP_Y_SCALE_NEG_bit = 1 << 13, - PS_UCP_MODE_mask = 0x03 << 14, - PS_UCP_MODE_shift = 14, - CLIP_DISABLE_bit = 1 << 16, - UCP_CULL_ONLY_ENA_bit = 1 << 17, - BOUNDARY_EDGE_FLAG_ENA_bit = 1 << 18, - DX_CLIP_SPACE_DEF_bit = 1 << 19, - DIS_CLIP_ERR_DETECT_bit = 1 << 20, - VTX_KILL_OR_bit = 1 << 21, - DX_RASTERIZATION_KILL_bit = 1 << 22, - DX_LINEAR_ATTR_CLIP_ENA_bit = 1 << 24, - VTE_VPORT_PROVOKE_DISABLE_bit = 1 << 25, - ZCLIP_NEAR_DISABLE_bit = 1 << 26, - ZCLIP_FAR_DISABLE_bit = 1 << 27, - PA_SU_SC_MODE_CNTL = 0x00028814, - CULL_FRONT_bit = 1 << 0, - CULL_BACK_bit = 1 << 1, - FACE_bit = 1 << 2, - POLY_MODE_mask = 0x03 << 3, - POLY_MODE_shift = 3, - X_DISABLE_POLY_MODE = 0x00, - X_DUAL_MODE = 0x01, - POLYMODE_FRONT_PTYPE_mask = 0x07 << 5, - POLYMODE_FRONT_PTYPE_shift = 5, - X_DRAW_POINTS = 0x00, - X_DRAW_LINES = 0x01, - X_DRAW_TRIANGLES = 0x02, - POLYMODE_BACK_PTYPE_mask = 0x07 << 8, - POLYMODE_BACK_PTYPE_shift = 8, -/* X_DRAW_POINTS = 0x00, */ -/* X_DRAW_LINES = 0x01, */ -/* X_DRAW_TRIANGLES = 0x02, */ - POLY_OFFSET_FRONT_ENABLE_bit = 1 << 11, - POLY_OFFSET_BACK_ENABLE_bit = 1 << 12, - POLY_OFFSET_PARA_ENABLE_bit = 1 << 13, - VTX_WINDOW_OFFSET_ENABLE_bit = 1 << 16, - PROVOKING_VTX_LAST_bit = 1 << 19, - PERSP_CORR_DIS_bit = 1 << 20, - MULTI_PRIM_IB_ENA_bit = 1 << 21, - PA_CL_VTE_CNTL = 0x00028818, - VPORT_X_SCALE_ENA_bit = 1 << 0, - VPORT_X_OFFSET_ENA_bit = 1 << 1, - VPORT_Y_SCALE_ENA_bit = 1 << 2, - VPORT_Y_OFFSET_ENA_bit = 1 << 3, - VPORT_Z_SCALE_ENA_bit = 1 << 4, - VPORT_Z_OFFSET_ENA_bit = 1 << 5, - VTX_XY_FMT_bit = 1 << 8, - VTX_Z_FMT_bit = 1 << 9, - VTX_W0_FMT_bit = 1 << 10, - PA_CL_VS_OUT_CNTL = 0x0002881c, - CLIP_DIST_ENA_0_bit = 1 << 0, - CLIP_DIST_ENA_1_bit = 1 << 1, - CLIP_DIST_ENA_2_bit = 1 << 2, - CLIP_DIST_ENA_3_bit = 1 << 3, - CLIP_DIST_ENA_4_bit = 1 << 4, - CLIP_DIST_ENA_5_bit = 1 << 5, - CLIP_DIST_ENA_6_bit = 1 << 6, - CLIP_DIST_ENA_7_bit = 1 << 7, - CULL_DIST_ENA_0_bit = 1 << 8, - CULL_DIST_ENA_1_bit = 1 << 9, - CULL_DIST_ENA_2_bit = 1 << 10, - CULL_DIST_ENA_3_bit = 1 << 11, - CULL_DIST_ENA_4_bit = 1 << 12, - CULL_DIST_ENA_5_bit = 1 << 13, - CULL_DIST_ENA_6_bit = 1 << 14, - CULL_DIST_ENA_7_bit = 1 << 15, - USE_VTX_POINT_SIZE_bit = 1 << 16, - USE_VTX_EDGE_FLAG_bit = 1 << 17, - USE_VTX_RENDER_TARGET_INDX_bit = 1 << 18, - USE_VTX_VIEWPORT_INDX_bit = 1 << 19, - USE_VTX_KILL_FLAG_bit = 1 << 20, - VS_OUT_MISC_VEC_ENA_bit = 1 << 21, - VS_OUT_CCDIST0_VEC_ENA_bit = 1 << 22, - VS_OUT_CCDIST1_VEC_ENA_bit = 1 << 23, - PA_CL_NANINF_CNTL = 0x00028820, - VTE_XY_INF_DISCARD_bit = 1 << 0, - VTE_Z_INF_DISCARD_bit = 1 << 1, - VTE_W_INF_DISCARD_bit = 1 << 2, - VTE_0XNANINF_IS_0_bit = 1 << 3, - VTE_XY_NAN_RETAIN_bit = 1 << 4, - VTE_Z_NAN_RETAIN_bit = 1 << 5, - VTE_W_NAN_RETAIN_bit = 1 << 6, - VTE_W_RECIP_NAN_IS_0_bit = 1 << 7, - VS_XY_NAN_TO_INF_bit = 1 << 8, - VS_XY_INF_RETAIN_bit = 1 << 9, - VS_Z_NAN_TO_INF_bit = 1 << 10, - VS_Z_INF_RETAIN_bit = 1 << 11, - VS_W_NAN_TO_INF_bit = 1 << 12, - VS_W_INF_RETAIN_bit = 1 << 13, - VS_CLIP_DIST_INF_DISCARD_bit = 1 << 14, - VTE_NO_OUTPUT_NEG_0_bit = 1 << 20, - PA_SU_LINE_STIPPLE_CNTL = 0x00028824, - LINE_STIPPLE_RESET_mask = 0x03 << 0, - LINE_STIPPLE_RESET_shift = 0, - EXPAND_FULL_LENGTH_bit = 1 << 2, - FRACTIONAL_ACCUM_bit = 1 << 3, - DIAMOND_ADJUST_bit = 1 << 4, - PA_SU_LINE_STIPPLE_SCALE = 0x00028828, - PA_SU_PRIM_FILTER_CNTL = 0x0002882c, - TRIANGLE_FILTER_DISABLE_bit = 1 << 0, - LINE_FILTER_DISABLE_bit = 1 << 1, - POINT_FILTER_DISABLE_bit = 1 << 2, - RECTANGLE_FILTER_DISABLE_bit = 1 << 3, - TRIANGLE_EXPAND_ENA_bit = 1 << 4, - LINE_EXPAND_ENA_bit = 1 << 5, - POINT_EXPAND_ENA_bit = 1 << 6, - RECTANGLE_EXPAND_ENA_bit = 1 << 7, - PRIM_EXPAND_CONSTANT_mask = 0xff << 8, - PRIM_EXPAND_CONSTANT_shift = 8, - SQ_LSTMP_RING_ITEMSIZE = 0x00028830, - ITEMSIZE_mask = 0x7fff << 0, - ITEMSIZE_shift = 0, - SQ_HSTMP_RING_ITEMSIZE = 0x00028834, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_PGM_START_PS = 0x00028840, - SQ_PGM_RESOURCES_PS = 0x00028844, - NUM_GPRS_mask = 0xff << 0, - NUM_GPRS_shift = 0, - STACK_SIZE_mask = 0xff << 8, - STACK_SIZE_shift = 8, - DX10_CLAMP_bit = 1 << 21, - UNCACHED_FIRST_INST_bit = 1 << 28, - CLAMP_CONSTS_bit = 1 << 31, - SQ_PGM_RESOURCES_2_PS = 0x00028848, - SINGLE_ROUND_mask = 0x03 << 0, - SINGLE_ROUND_shift = 0, - SQ_ROUND_NEAREST_EVEN = 0x00, - SQ_ROUND_PLUS_INFINITY = 0x01, - SQ_ROUND_MINUS_INFINITY = 0x02, - SQ_ROUND_TO_ZERO = 0x03, - DOUBLE_ROUND_mask = 0x03 << 2, - DOUBLE_ROUND_shift = 2, -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ - ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, - ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, - ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, - ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, - SINGLE_IEEE_MODE_bit = 1 << 8, - DOUBLE_IEEE_MODE_bit = 1 << 9, - SQ_PGM_EXPORTS_PS = 0x0002884c, - EXPORT_MODE_mask = 0x1f << 0, - EXPORT_MODE_shift = 0, - SQ_PGM_START_VS = 0x0002885c, - SQ_PGM_RESOURCES_VS = 0x00028860, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ - USE_LS_CONSTS_bit = 1 << 16, -/* DX10_CLAMP_bit = 1 << 21, */ -/* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_VS = 0x00028864, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ -/* SINGLE_IEEE_MODE_bit = 1 << 8, */ -/* DOUBLE_IEEE_MODE_bit = 1 << 9, */ - SQ_PGM_START_GS = 0x00028874, - SQ_PGM_RESOURCES_GS = 0x00028878, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ -/* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_GS = 0x0002887c, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ -/* SINGLE_IEEE_MODE_bit = 1 << 8, */ -/* DOUBLE_IEEE_MODE_bit = 1 << 9, */ - SQ_PGM_START_ES = 0x0002888c, - SQ_PGM_RESOURCES_ES = 0x00028890, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ -/* USE_LS_CONSTS_bit = 1 << 16, */ -/* DX10_CLAMP_bit = 1 << 21, */ -/* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_ES = 0x00028894, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ -/* SINGLE_IEEE_MODE_bit = 1 << 8, */ -/* DOUBLE_IEEE_MODE_bit = 1 << 9, */ - SQ_PGM_START_FS = 0x000288a4, - SQ_PGM_RESOURCES_FS = 0x000288a8, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ - SQ_PGM_START_HS = 0x000288b8, - SQ_PGM_RESOURCES_HS = 0x000288bc, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ -/* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_HS = 0x000288c0, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ -/* SINGLE_IEEE_MODE_bit = 1 << 8, */ -/* DOUBLE_IEEE_MODE_bit = 1 << 9, */ - SQ_PGM_START_LS = 0x000288d0, - SQ_PGM_RESOURCES_LS = 0x000288d4, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ - USE_VS_CONSTS_bit = 1 << 16, -/* DX10_CLAMP_bit = 1 << 21, */ -/* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_LS = 0x000288d8, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ -/* SINGLE_IEEE_MODE_bit = 1 << 8, */ -/* DOUBLE_IEEE_MODE_bit = 1 << 9, */ - SQ_VTX_SEMANTIC_CLEAR = 0x000288f0, - SQ_ESGS_RING_ITEMSIZE = 0x00028900, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GSVS_RING_ITEMSIZE = 0x00028904, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_ESTMP_RING_ITEMSIZE = 0x00028908, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GSTMP_RING_ITEMSIZE = 0x0002890c, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_VSTMP_RING_ITEMSIZE = 0x00028910, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_PSTMP_RING_ITEMSIZE = 0x00028914, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE = 0x0002891c, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE_1 = 0x00028920, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE_2 = 0x00028924, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE_3 = 0x00028928, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GSVS_RING_OFFSET_1 = 0x0002892c, - SQ_GSVS_RING_OFFSET_1__OFFSET_mask = 0x7fff << 0, - SQ_GSVS_RING_OFFSET_1__OFFSET_shift = 0, - SQ_GSVS_RING_OFFSET_2 = 0x00028930, - SQ_GSVS_RING_OFFSET_2__OFFSET_mask = 0x7fff << 0, - SQ_GSVS_RING_OFFSET_2__OFFSET_shift = 0, - SQ_GSVS_RING_OFFSET_3 = 0x00028934, - SQ_GSVS_RING_OFFSET_3__OFFSET_mask = 0x7fff << 0, - SQ_GSVS_RING_OFFSET_3__OFFSET_shift = 0, - SQ_ALU_CONST_CACHE_PS_0 = 0x00028940, - SQ_ALU_CONST_CACHE_PS_0_num = 16, - SQ_ALU_CONST_CACHE_VS_0 = 0x00028980, - SQ_ALU_CONST_CACHE_VS_0_num = 16, - SQ_ALU_CONST_CACHE_GS_0 = 0x000289c0, - SQ_ALU_CONST_CACHE_GS_0_num = 16, - PA_SU_POINT_SIZE = 0x00028a00, - HEIGHT_mask = 0xffff << 0, - HEIGHT_shift = 0, - PA_SU_POINT_SIZE__WIDTH_mask = 0xffff << 16, - PA_SU_POINT_SIZE__WIDTH_shift = 16, - PA_SU_POINT_MINMAX = 0x00028a04, - MIN_SIZE_mask = 0xffff << 0, - MIN_SIZE_shift = 0, - PA_SU_POINT_MINMAX__MAX_SIZE_mask = 0xffff << 16, - PA_SU_POINT_MINMAX__MAX_SIZE_shift = 16, - PA_SU_LINE_CNTL = 0x00028a08, - PA_SU_LINE_CNTL__WIDTH_mask = 0xffff << 0, - PA_SU_LINE_CNTL__WIDTH_shift = 0, - PA_SC_LINE_STIPPLE = 0x00028a0c, - LINE_PATTERN_mask = 0xffff << 0, - LINE_PATTERN_shift = 0, - REPEAT_COUNT_mask = 0xff << 16, - REPEAT_COUNT_shift = 16, - PATTERN_BIT_ORDER_bit = 1 << 28, - AUTO_RESET_CNTL_mask = 0x03 << 29, - AUTO_RESET_CNTL_shift = 29, - VGT_OUTPUT_PATH_CNTL = 0x00028a10, - PATH_SELECT_mask = 0x07 << 0, - PATH_SELECT_shift = 0, - VGT_OUTPATH_VTX_REUSE = 0x00, - VGT_OUTPATH_TESS_EN = 0x01, - VGT_OUTPATH_PASSTHRU = 0x02, - VGT_OUTPATH_GS_BLOCK = 0x03, - VGT_OUTPATH_HS_BLOCK = 0x04, - VGT_HOS_CNTL = 0x00028a14, - TESS_MODE_mask = 0x03 << 0, - TESS_MODE_shift = 0, - VGT_HOS_MAX_TESS_LEVEL = 0x00028a18, - VGT_HOS_MIN_TESS_LEVEL = 0x00028a1c, - VGT_HOS_REUSE_DEPTH = 0x00028a20, - REUSE_DEPTH_mask = 0xff << 0, - REUSE_DEPTH_shift = 0, - VGT_GROUP_PRIM_TYPE = 0x00028a24, - VGT_GROUP_PRIM_TYPE__PRIM_TYPE_mask = 0x1f << 0, - VGT_GROUP_PRIM_TYPE__PRIM_TYPE_shift = 0, - VGT_GRP_3D_POINT = 0x00, - VGT_GRP_3D_LINE = 0x01, - VGT_GRP_3D_TRI = 0x02, - VGT_GRP_3D_RECT = 0x03, - VGT_GRP_3D_QUAD = 0x04, - VGT_GRP_2D_COPY_RECT_V0 = 0x05, - VGT_GRP_2D_COPY_RECT_V1 = 0x06, - VGT_GRP_2D_COPY_RECT_V2 = 0x07, - VGT_GRP_2D_COPY_RECT_V3 = 0x08, - VGT_GRP_2D_FILL_RECT = 0x09, - VGT_GRP_2D_LINE = 0x0a, - VGT_GRP_2D_TRI = 0x0b, - VGT_GRP_PRIM_INDEX_LINE = 0x0c, - VGT_GRP_PRIM_INDEX_TRI = 0x0d, - VGT_GRP_PRIM_INDEX_QUAD = 0x0e, - VGT_GRP_3D_LINE_ADJ = 0x0f, - VGT_GRP_3D_TRI_ADJ = 0x10, - VGT_GRP_3D_PATCH = 0x11, - RETAIN_ORDER_bit = 1 << 14, - RETAIN_QUADS_bit = 1 << 15, - PRIM_ORDER_mask = 0x07 << 16, - PRIM_ORDER_shift = 16, - VGT_GRP_LIST = 0x00, - VGT_GRP_STRIP = 0x01, - VGT_GRP_FAN = 0x02, - VGT_GRP_LOOP = 0x03, - VGT_GRP_POLYGON = 0x04, - VGT_GROUP_FIRST_DECR = 0x00028a28, - FIRST_DECR_mask = 0x0f << 0, - FIRST_DECR_shift = 0, - VGT_GROUP_DECR = 0x00028a2c, - DECR_mask = 0x0f << 0, - DECR_shift = 0, - VGT_GROUP_VECT_0_CNTL = 0x00028a30, - COMP_X_EN_bit = 1 << 0, - COMP_Y_EN_bit = 1 << 1, - COMP_Z_EN_bit = 1 << 2, - COMP_W_EN_bit = 1 << 3, - VGT_GROUP_VECT_0_CNTL__STRIDE_mask = 0xff << 8, - VGT_GROUP_VECT_0_CNTL__STRIDE_shift = 8, - SHIFT_mask = 0xff << 16, - SHIFT_shift = 16, - VGT_GROUP_VECT_1_CNTL = 0x00028a34, -/* COMP_X_EN_bit = 1 << 0, */ -/* COMP_Y_EN_bit = 1 << 1, */ -/* COMP_Z_EN_bit = 1 << 2, */ -/* COMP_W_EN_bit = 1 << 3, */ - VGT_GROUP_VECT_1_CNTL__STRIDE_mask = 0xff << 8, - VGT_GROUP_VECT_1_CNTL__STRIDE_shift = 8, -/* SHIFT_mask = 0xff << 16, */ -/* SHIFT_shift = 16, */ - VGT_GROUP_VECT_0_FMT_CNTL = 0x00028a38, - X_CONV_mask = 0x0f << 0, - X_CONV_shift = 0, - VGT_GRP_INDEX_16 = 0x00, - VGT_GRP_INDEX_32 = 0x01, - VGT_GRP_UINT_16 = 0x02, - VGT_GRP_UINT_32 = 0x03, - VGT_GRP_SINT_16 = 0x04, - VGT_GRP_SINT_32 = 0x05, - VGT_GRP_FLOAT_32 = 0x06, - VGT_GRP_AUTO_PRIM = 0x07, - VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, - X_OFFSET_mask = 0x0f << 4, - X_OFFSET_shift = 4, - Y_CONV_mask = 0x0f << 8, - Y_CONV_shift = 8, -/* VGT_GRP_INDEX_16 = 0x00, */ -/* VGT_GRP_INDEX_32 = 0x01, */ -/* VGT_GRP_UINT_16 = 0x02, */ -/* VGT_GRP_UINT_32 = 0x03, */ -/* VGT_GRP_SINT_16 = 0x04, */ -/* VGT_GRP_SINT_32 = 0x05, */ -/* VGT_GRP_FLOAT_32 = 0x06, */ -/* VGT_GRP_AUTO_PRIM = 0x07, */ -/* VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, */ - Y_OFFSET_mask = 0x0f << 12, - Y_OFFSET_shift = 12, - Z_CONV_mask = 0x0f << 16, - Z_CONV_shift = 16, -/* VGT_GRP_INDEX_16 = 0x00, */ -/* VGT_GRP_INDEX_32 = 0x01, */ -/* VGT_GRP_UINT_16 = 0x02, */ -/* VGT_GRP_UINT_32 = 0x03, */ -/* VGT_GRP_SINT_16 = 0x04, */ -/* VGT_GRP_SINT_32 = 0x05, */ -/* VGT_GRP_FLOAT_32 = 0x06, */ -/* VGT_GRP_AUTO_PRIM = 0x07, */ -/* VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, */ - Z_OFFSET_mask = 0x0f << 20, - Z_OFFSET_shift = 20, - W_CONV_mask = 0x0f << 24, - W_CONV_shift = 24, -/* VGT_GRP_INDEX_16 = 0x00, */ -/* VGT_GRP_INDEX_32 = 0x01, */ -/* VGT_GRP_UINT_16 = 0x02, */ -/* VGT_GRP_UINT_32 = 0x03, */ -/* VGT_GRP_SINT_16 = 0x04, */ -/* VGT_GRP_SINT_32 = 0x05, */ -/* VGT_GRP_FLOAT_32 = 0x06, */ -/* VGT_GRP_AUTO_PRIM = 0x07, */ -/* VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, */ - W_OFFSET_mask = 0x0f << 28, - W_OFFSET_shift = 28, - VGT_GROUP_VECT_1_FMT_CNTL = 0x00028a3c, -/* X_CONV_mask = 0x0f << 0, */ -/* X_CONV_shift = 0, */ -/* VGT_GRP_INDEX_16 = 0x00, */ -/* VGT_GRP_INDEX_32 = 0x01, */ -/* VGT_GRP_UINT_16 = 0x02, */ -/* VGT_GRP_UINT_32 = 0x03, */ -/* VGT_GRP_SINT_16 = 0x04, */ -/* VGT_GRP_SINT_32 = 0x05, */ -/* VGT_GRP_FLOAT_32 = 0x06, */ -/* VGT_GRP_AUTO_PRIM = 0x07, */ -/* VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, */ -/* X_OFFSET_mask = 0x0f << 4, */ -/* X_OFFSET_shift = 4, */ -/* Y_CONV_mask = 0x0f << 8, */ -/* Y_CONV_shift = 8, */ -/* VGT_GRP_INDEX_16 = 0x00, */ -/* VGT_GRP_INDEX_32 = 0x01, */ -/* VGT_GRP_UINT_16 = 0x02, */ -/* VGT_GRP_UINT_32 = 0x03, */ -/* VGT_GRP_SINT_16 = 0x04, */ -/* VGT_GRP_SINT_32 = 0x05, */ -/* VGT_GRP_FLOAT_32 = 0x06, */ -/* VGT_GRP_AUTO_PRIM = 0x07, */ -/* VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, */ -/* Y_OFFSET_mask = 0x0f << 12, */ -/* Y_OFFSET_shift = 12, */ -/* Z_CONV_mask = 0x0f << 16, */ -/* Z_CONV_shift = 16, */ -/* VGT_GRP_INDEX_16 = 0x00, */ -/* VGT_GRP_INDEX_32 = 0x01, */ -/* VGT_GRP_UINT_16 = 0x02, */ -/* VGT_GRP_UINT_32 = 0x03, */ -/* VGT_GRP_SINT_16 = 0x04, */ -/* VGT_GRP_SINT_32 = 0x05, */ -/* VGT_GRP_FLOAT_32 = 0x06, */ -/* VGT_GRP_AUTO_PRIM = 0x07, */ -/* VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, */ -/* Z_OFFSET_mask = 0x0f << 20, */ -/* Z_OFFSET_shift = 20, */ -/* W_CONV_mask = 0x0f << 24, */ -/* W_CONV_shift = 24, */ -/* VGT_GRP_INDEX_16 = 0x00, */ -/* VGT_GRP_INDEX_32 = 0x01, */ -/* VGT_GRP_UINT_16 = 0x02, */ -/* VGT_GRP_UINT_32 = 0x03, */ -/* VGT_GRP_SINT_16 = 0x04, */ -/* VGT_GRP_SINT_32 = 0x05, */ -/* VGT_GRP_FLOAT_32 = 0x06, */ -/* VGT_GRP_AUTO_PRIM = 0x07, */ -/* VGT_GRP_FIX_1_23_TO_FLOAT = 0x08, */ -/* W_OFFSET_mask = 0x0f << 28, */ -/* W_OFFSET_shift = 28, */ - VGT_GS_MODE = 0x00028a40, - VGT_GS_MODE__MODE_mask = 0x03 << 0, - VGT_GS_MODE__MODE_shift = 0, - GS_OFF = 0x00, - GS_SCENARIO_A = 0x01, - GS_SCENARIO_B = 0x02, - GS_SCENARIO_G = 0x03, - GS_SCENARIO_C = 0x04, - SPRITE_EN = 0x05, - ES_PASSTHRU_bit = 1 << 2, - CUT_MODE_mask = 0x03 << 3, - CUT_MODE_shift = 3, - GS_CUT_1024 = 0x00, - GS_CUT_512 = 0x01, - GS_CUT_256 = 0x02, - GS_CUT_128 = 0x03, - MODE_HI_bit = 1 << 8, - PA_SC_MODE_CNTL_0 = 0x00028a48, - MSAA_ENABLE_bit = 1 << 0, - VPORT_SCISSOR_ENABLE_bit = 1 << 1, - LINE_STIPPLE_ENABLE_bit = 1 << 2, - VGT_ENHANCE = 0x00028a50, - VGT_GS_PER_ES = 0x00028a54, - GS_PER_ES_mask = 0x7ff << 0, - GS_PER_ES_shift = 0, - VGT_ES_PER_GS = 0x00028a58, - ES_PER_GS_mask = 0x7ff << 0, - ES_PER_GS_shift = 0, - VGT_GS_PER_VS = 0x00028a5c, - GS_PER_VS_mask = 0x0f << 0, - GS_PER_VS_shift = 0, - VGT_GS_OUT_PRIM_TYPE = 0x00028a6c, - OUTPRIM_TYPE_mask = 0x3f << 0, - OUTPRIM_TYPE_shift = 0, - POINTLIST = 0x00, - LINESTRIP = 0x01, - TRISTRIP = 0x02, - VGT_DMA_SIZE = 0x00028a74, - VGT_DMA_MAX_SIZE = 0x00028a78, - VGT_DMA_INDEX_TYPE = 0x00028a7c, -/* INDEX_TYPE_mask = 0x03 << 0, */ -/* INDEX_TYPE_shift = 0, */ - VGT_INDEX_16 = 0x00, - VGT_INDEX_32 = 0x01, - SWAP_MODE_mask = 0x03 << 2, - SWAP_MODE_shift = 2, - VGT_DMA_SWAP_NONE = 0x00, - VGT_DMA_SWAP_16_BIT = 0x01, - VGT_DMA_SWAP_32_BIT = 0x02, - VGT_DMA_SWAP_WORD = 0x03, - VGT_PRIMITIVEID_EN = 0x00028a84, - PRIMITIVEID_EN_bit = 1 << 0, - VGT_DMA_NUM_INSTANCES = 0x00028a88, - VGT_EVENT_INITIATOR = 0x00028a90, - EVENT_TYPE_mask = 0x3f << 0, - EVENT_TYPE_shift = 0, - SAMPLE_STREAMOUTSTATS1 = 0x01, - SAMPLE_STREAMOUTSTATS2 = 0x02, - SAMPLE_STREAMOUTSTATS3 = 0x03, - CACHE_FLUSH_TS = 0x04, - CONTEXT_DONE = 0x05, - CACHE_FLUSH = 0x06, - CS_PARTIAL_FLUSH = 0x07, - VGT_STREAMOUT_SYNC = 0x08, - RST_PIX_CNT = 0x0d, - VS_PARTIAL_FLUSH = 0x0f, - PS_PARTIAL_FLUSH = 0x10, - FLUSH_HS_OUTPUT = 0x11, - FLUSH_LS_OUTPUT = 0x12, - CACHE_FLUSH_AND_INV_TS_EVENT = 0x14, - ZPASS_DONE = 0x15, - CACHE_FLUSH_AND_INV_EVENT = 0x16, - PERFCOUNTER_START = 0x17, - PERFCOUNTER_STOP = 0x18, - PIPELINESTAT_START = 0x19, - PIPELINESTAT_STOP = 0x1a, - PERFCOUNTER_SAMPLE = 0x1b, - FLUSH_ES_OUTPUT = 0x1c, - FLUSH_GS_OUTPUT = 0x1d, - SAMPLE_PIPELINESTAT = 0x1e, - SO_VGTSTREAMOUT_FLUSH = 0x1f, - SAMPLE_STREAMOUTSTATS = 0x20, - RESET_VTX_CNT = 0x21, - BLOCK_CONTEXT_DONE = 0x22, - CS_CONTEXT_DONE = 0x23, - VGT_FLUSH = 0x24, - SQ_NON_EVENT = 0x26, - SC_SEND_DB_VPZ = 0x27, - BOTTOM_OF_PIPE_TS = 0x28, - FLUSH_SX_TS = 0x29, - DB_CACHE_FLUSH_AND_INV = 0x2a, - FLUSH_AND_INV_DB_DATA_TS = 0x2b, - FLUSH_AND_INV_DB_META = 0x2c, - FLUSH_AND_INV_CB_DATA_TS = 0x2d, - FLUSH_AND_INV_CB_META = 0x2e, - CS_DONE = 0x2f, - PS_DONE = 0x30, - FLUSH_AND_INV_CB_PIXEL_DATA = 0x31, - SX_CB_RAT_ACK_REQUEST = 0x32, - ADDRESS_HI_mask = 0x1ff << 18, - ADDRESS_HI_shift = 18, - EXTENDED_EVENT_bit = 1 << 27, - VGT_MULTI_PRIM_IB_RESET_EN = 0x00028a94, - RESET_EN_bit = 1 << 0, - VGT_INSTANCE_STEP_RATE_0 = 0x00028aa0, - VGT_INSTANCE_STEP_RATE_1 = 0x00028aa4, - VGT_REUSE_OFF = 0x00028ab4, - REUSE_OFF_bit = 1 << 0, - VGT_VTX_CNT_EN = 0x00028ab8, - VTX_CNT_EN_bit = 1 << 0, - DB_HTILE_SURFACE = 0x00028abc, - HTILE_WIDTH_bit = 1 << 0, - HTILE_HEIGHT_bit = 1 << 1, - LINEAR_bit = 1 << 2, - FULL_CACHE_bit = 1 << 3, - HTILE_USES_PRELOAD_WIN_bit = 1 << 4, - PRELOAD_bit = 1 << 5, - PREFETCH_WIDTH_mask = 0x3f << 6, - PREFETCH_WIDTH_shift = 6, - PREFETCH_HEIGHT_mask = 0x3f << 12, - PREFETCH_HEIGHT_shift = 12, - DB_SRESULTS_COMPARE_STATE0 = 0x00028ac0, - COMPAREFUNC0_mask = 0x07 << 0, - COMPAREFUNC0_shift = 0, -/* REF_NEVER = 0x00, */ -/* REF_LESS = 0x01, */ -/* REF_EQUAL = 0x02, */ -/* REF_LEQUAL = 0x03, */ -/* REF_GREATER = 0x04, */ -/* REF_NOTEQUAL = 0x05, */ -/* REF_GEQUAL = 0x06, */ -/* REF_ALWAYS = 0x07, */ - COMPAREVALUE0_mask = 0xff << 4, - COMPAREVALUE0_shift = 4, - COMPAREMASK0_mask = 0xff << 12, - COMPAREMASK0_shift = 12, - ENABLE0_bit = 1 << 24, - DB_SRESULTS_COMPARE_STATE1 = 0x00028ac4, - COMPAREFUNC1_mask = 0x07 << 0, - COMPAREFUNC1_shift = 0, -/* REF_NEVER = 0x00, */ -/* REF_LESS = 0x01, */ -/* REF_EQUAL = 0x02, */ -/* REF_LEQUAL = 0x03, */ -/* REF_GREATER = 0x04, */ -/* REF_NOTEQUAL = 0x05, */ -/* REF_GEQUAL = 0x06, */ -/* REF_ALWAYS = 0x07, */ - COMPAREVALUE1_mask = 0xff << 4, - COMPAREVALUE1_shift = 4, - COMPAREMASK1_mask = 0xff << 12, - COMPAREMASK1_shift = 12, - ENABLE1_bit = 1 << 24, - DB_PRELOAD_CONTROL = 0x00028ac8, - START_X_mask = 0xff << 0, - START_X_shift = 0, - START_Y_mask = 0xff << 8, - START_Y_shift = 8, - MAX_X_mask = 0xff << 16, - MAX_X_shift = 16, - MAX_Y_mask = 0xff << 24, - MAX_Y_shift = 24, - VGT_STRMOUT_BUFFER_SIZE_0 = 0x00028ad0, - VGT_STRMOUT_VTX_STRIDE_0 = 0x00028ad4, - VGT_STRMOUT_VTX_STRIDE_0__STRIDE_mask = 0x3ff << 0, - VGT_STRMOUT_VTX_STRIDE_0__STRIDE_shift = 0, - VGT_STRMOUT_BUFFER_BASE_0 = 0x00028ad8, - VGT_STRMOUT_BUFFER_OFFSET_0 = 0x00028adc, - VGT_STRMOUT_BUFFER_SIZE_1 = 0x00028ae0, - VGT_STRMOUT_VTX_STRIDE_1 = 0x00028ae4, - VGT_STRMOUT_VTX_STRIDE_1__STRIDE_mask = 0x3ff << 0, - VGT_STRMOUT_VTX_STRIDE_1__STRIDE_shift = 0, - VGT_STRMOUT_BUFFER_BASE_1 = 0x00028ae8, - VGT_STRMOUT_BUFFER_OFFSET_1 = 0x00028aec, - VGT_STRMOUT_BUFFER_SIZE_2 = 0x00028af0, - VGT_STRMOUT_VTX_STRIDE_2 = 0x00028af4, - VGT_STRMOUT_VTX_STRIDE_2__STRIDE_mask = 0x3ff << 0, - VGT_STRMOUT_VTX_STRIDE_2__STRIDE_shift = 0, - VGT_STRMOUT_BUFFER_BASE_2 = 0x00028af8, - VGT_STRMOUT_BUFFER_OFFSET_2 = 0x00028afc, - VGT_STRMOUT_BUFFER_SIZE_3 = 0x00028b00, - VGT_STRMOUT_VTX_STRIDE_3 = 0x00028b04, - VGT_STRMOUT_VTX_STRIDE_3__STRIDE_mask = 0x3ff << 0, - VGT_STRMOUT_VTX_STRIDE_3__STRIDE_shift = 0, - VGT_STRMOUT_BUFFER_BASE_3 = 0x00028b08, - VGT_STRMOUT_BUFFER_OFFSET_3 = 0x00028b0c, - VGT_STRMOUT_BASE_OFFSET_0 = 0x00028b10, - VGT_STRMOUT_BASE_OFFSET_1 = 0x00028b14, - VGT_STRMOUT_BASE_OFFSET_2 = 0x00028b18, - VGT_STRMOUT_BASE_OFFSET_3 = 0x00028b1c, - VGT_STRMOUT_DRAW_OPAQUE_OFFSET = 0x00028b28, - VGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE = 0x00028b2c, - VGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE = 0x00028b30, - VERTEX_STRIDE_mask = 0x1ff << 0, - VERTEX_STRIDE_shift = 0, - VGT_GS_MAX_VERT_OUT = 0x00028b38, - MAX_VERT_OUT_mask = 0x7ff << 0, - MAX_VERT_OUT_shift = 0, - VGT_STRMOUT_BASE_OFFSET_HI_0 = 0x00028b44, - VGT_STRMOUT_BASE_OFFSET_HI_0__BASE_OFFSET_mask = 0x3f << 0, - VGT_STRMOUT_BASE_OFFSET_HI_0__BASE_OFFSET_shift = 0, - VGT_STRMOUT_BASE_OFFSET_HI_1 = 0x00028b48, - VGT_STRMOUT_BASE_OFFSET_HI_1__BASE_OFFSET_mask = 0x3f << 0, - VGT_STRMOUT_BASE_OFFSET_HI_1__BASE_OFFSET_shift = 0, - VGT_STRMOUT_BASE_OFFSET_HI_2 = 0x00028b4c, - VGT_STRMOUT_BASE_OFFSET_HI_2__BASE_OFFSET_mask = 0x3f << 0, - VGT_STRMOUT_BASE_OFFSET_HI_2__BASE_OFFSET_shift = 0, - VGT_STRMOUT_BASE_OFFSET_HI_3 = 0x00028b50, - VGT_STRMOUT_BASE_OFFSET_HI_3__BASE_OFFSET_mask = 0x3f << 0, - VGT_STRMOUT_BASE_OFFSET_HI_3__BASE_OFFSET_shift = 0, - VGT_SHADER_STAGES_EN = 0x00028b54, - LS_EN_mask = 0x03 << 0, - LS_EN_shift = 0, - LS_STAGE_OFF = 0x00, - LS_STAGE_ON = 0x01, - CS_STAGE_ON = 0x02, - HS_EN_bit = 1 << 2, - ES_EN_mask = 0x03 << 3, - ES_EN_shift = 3, - ES_STAGE_OFF = 0x00, - ES_STAGE_DS = 0x01, - ES_STAGE_REAL = 0x02, - GS_EN_bit = 1 << 5, - VS_EN_mask = 0x03 << 6, - VS_EN_shift = 6, - VS_STAGE_REAL = 0x00, - VS_STAGE_DS = 0x01, - VS_STAGE_COPY_SHADER = 0x02, - DYNAMIC_HS_bit = 1 << 8, - VGT_LS_HS_CONFIG = 0x00028b58, - NUM_PATCHES_mask = 0xff << 0, - NUM_PATCHES_shift = 0, - HS_NUM_INPUT_CP_mask = 0x3f << 8, - HS_NUM_INPUT_CP_shift = 8, - HS_NUM_OUTPUT_CP_mask = 0x3f << 14, - HS_NUM_OUTPUT_CP_shift = 14, - DB_ALPHA_TO_MASK = 0x00028b70, - ALPHA_TO_MASK_ENABLE_bit = 1 << 0, - ALPHA_TO_MASK_OFFSET0_mask = 0x03 << 8, - ALPHA_TO_MASK_OFFSET0_shift = 8, - ALPHA_TO_MASK_OFFSET1_mask = 0x03 << 10, - ALPHA_TO_MASK_OFFSET1_shift = 10, - ALPHA_TO_MASK_OFFSET2_mask = 0x03 << 12, - ALPHA_TO_MASK_OFFSET2_shift = 12, - ALPHA_TO_MASK_OFFSET3_mask = 0x03 << 14, - ALPHA_TO_MASK_OFFSET3_shift = 14, - OFFSET_ROUND_bit = 1 << 16, - PA_SU_POLY_OFFSET_DB_FMT_CNTL = 0x00028b78, - POLY_OFFSET_NEG_NUM_DB_BITS_mask = 0xff << 0, - POLY_OFFSET_NEG_NUM_DB_BITS_shift = 0, - POLY_OFFSET_DB_IS_FLOAT_FMT_bit = 1 << 8, - PA_SU_POLY_OFFSET_CLAMP = 0x00028b7c, - PA_SU_POLY_OFFSET_FRONT_SCALE = 0x00028b80, - PA_SU_POLY_OFFSET_FRONT_OFFSET = 0x00028b84, - PA_SU_POLY_OFFSET_BACK_SCALE = 0x00028b88, - PA_SU_POLY_OFFSET_BACK_OFFSET = 0x00028b8c, - VGT_GS_INSTANCE_CNT = 0x00028b90, - VGT_GS_INSTANCE_CNT__ENABLE_bit = 1 << 0, - CNT_mask = 0x7f << 2, - CNT_shift = 2, - VGT_STRMOUT_CONFIG = 0x00028b94, - STREAMOUT_0_EN_bit = 1 << 0, - STREAMOUT_1_EN_bit = 1 << 1, - STREAMOUT_2_EN_bit = 1 << 2, - STREAMOUT_3_EN_bit = 1 << 3, - RAST_STREAM_mask = 0x07 << 4, - RAST_STREAM_shift = 4, - VGT_STRMOUT_BUFFER_CONFIG = 0x00028b98, - STREAM_0_BUFFER_EN_mask = 0x0f << 0, - STREAM_0_BUFFER_EN_shift = 0, - STREAM_1_BUFFER_EN_mask = 0x0f << 4, - STREAM_1_BUFFER_EN_shift = 4, - STREAM_2_BUFFER_EN_mask = 0x0f << 8, - STREAM_2_BUFFER_EN_shift = 8, - STREAM_3_BUFFER_EN_mask = 0x0f << 12, - STREAM_3_BUFFER_EN_shift = 12, - CB_IMMED0_BASE = 0x00028b9c, - CB_IMMED0_BASE_num = 12, - PA_SC_CENTROID_PRIORITY_0 = 0x00028bd4, - DISTANCE_0_mask = 0x0f << 0, - DISTANCE_0_shift = 0, - DISTANCE_1_mask = 0x0f << 4, - DISTANCE_1_shift = 4, - DISTANCE_2_mask = 0x0f << 8, - DISTANCE_2_shift = 8, - DISTANCE_3_mask = 0x0f << 12, - DISTANCE_3_shift = 12, - DISTANCE_4_mask = 0x0f << 16, - DISTANCE_4_shift = 16, - DISTANCE_5_mask = 0x0f << 20, - DISTANCE_5_shift = 20, - DISTANCE_6_mask = 0x0f << 24, - DISTANCE_6_shift = 24, - DISTANCE_7_mask = 0x0f << 28, - DISTANCE_7_shift = 28, - PA_SC_CENTROID_PRIORITY_1 = 0x00028bd8, - DISTANCE_8_mask = 0x0f << 0, - DISTANCE_8_shift = 0, - DISTANCE_9_mask = 0x0f << 4, - DISTANCE_9_shift = 4, - DISTANCE_10_mask = 0x0f << 8, - DISTANCE_10_shift = 8, - DISTANCE_11_mask = 0x0f << 12, - DISTANCE_11_shift = 12, - DISTANCE_12_mask = 0x0f << 16, - DISTANCE_12_shift = 16, - DISTANCE_13_mask = 0x0f << 20, - DISTANCE_13_shift = 20, - DISTANCE_14_mask = 0x0f << 24, - DISTANCE_14_shift = 24, - DISTANCE_15_mask = 0x0f << 28, - DISTANCE_15_shift = 28, - PA_SC_LINE_CNTL = 0x00028bdc, - EXPAND_LINE_WIDTH_bit = 1 << 9, - LAST_PIXEL_bit = 1 << 10, - PERPENDICULAR_ENDCAP_ENA_bit = 1 << 11, - DX10_DIAMOND_TEST_ENA_bit = 1 << 12, - PA_SC_AA_CONFIG = 0x00028be0, - MSAA_NUM_SAMPLES_mask = 0x07 << 0, - MSAA_NUM_SAMPLES_shift = 0, - AA_MASK_CENTROID_DTMN_bit = 1 << 4, - MAX_SAMPLE_DIST_mask = 0x0f << 13, - MAX_SAMPLE_DIST_shift = 13, - MSAA_EXPOSED_SAMPLES_mask = 0x07 << 20, - MSAA_EXPOSED_SAMPLES_shift = 20, - DETAIL_TO_EXPOSED_MODE_mask = 0x03 << 24, - DETAIL_TO_EXPOSED_MODE_shift = 24, - PA_SU_VTX_CNTL = 0x00028be4, - PIX_CENTER_bit = 1 << 0, - PA_SU_VTX_CNTL__ROUND_MODE_mask = 0x03 << 1, - PA_SU_VTX_CNTL__ROUND_MODE_shift = 1, - X_TRUNCATE = 0x00, - X_ROUND = 0x01, - X_ROUND_TO_EVEN = 0x02, - X_ROUND_TO_ODD = 0x03, - QUANT_MODE_mask = 0x07 << 3, - QUANT_MODE_shift = 3, - X_1_16TH = 0x00, - X_1_8TH = 0x01, - X_1_4TH = 0x02, - X_1_2 = 0x03, - QUANT_MODE__X_1 = 0x04, - X_1_256TH = 0x05, - X_1_1024TH = 0x06, - X_1_4096TH = 0x07, - PA_CL_GB_VERT_CLIP_ADJ = 0x00028be8, - PA_CL_GB_HORZ_CLIP_ADJ = 0x00028bf0, - PA_CL_GB_HORZ_DISC_ADJ = 0x00028bf4, - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_0 = 0x00028bf8, - S0_X_mask = 0x0f << 0, - S0_X_shift = 0, - S0_Y_mask = 0x0f << 4, - S0_Y_shift = 4, - S1_X_mask = 0x0f << 8, - S1_X_shift = 8, - S1_Y_mask = 0x0f << 12, - S1_Y_shift = 12, - S2_X_mask = 0x0f << 16, - S2_X_shift = 16, - S2_Y_mask = 0x0f << 20, - S2_Y_shift = 20, - S3_X_mask = 0x0f << 24, - S3_X_shift = 24, - S3_Y_mask = 0x0f << 28, - S3_Y_shift = 28, - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_1 = 0x00028bfc, - S4_X_mask = 0x0f << 0, - S4_X_shift = 0, - S4_Y_mask = 0x0f << 4, - S4_Y_shift = 4, - S5_X_mask = 0x0f << 8, - S5_X_shift = 8, - S5_Y_mask = 0x0f << 12, - S5_Y_shift = 12, - S6_X_mask = 0x0f << 16, - S6_X_shift = 16, - S6_Y_mask = 0x0f << 20, - S6_Y_shift = 20, - S7_X_mask = 0x0f << 24, - S7_X_shift = 24, - S7_Y_mask = 0x0f << 28, - S7_Y_shift = 28, - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_2 = 0x00028c00, - S8_X_mask = 0x0f << 0, - S8_X_shift = 0, - S8_Y_mask = 0x0f << 4, - S8_Y_shift = 4, - S9_X_mask = 0x0f << 8, - S9_X_shift = 8, - S9_Y_mask = 0x0f << 12, - S9_Y_shift = 12, - S10_X_mask = 0x0f << 16, - S10_X_shift = 16, - S10_Y_mask = 0x0f << 20, - S10_Y_shift = 20, - S11_X_mask = 0x0f << 24, - S11_X_shift = 24, - S11_Y_mask = 0x0f << 28, - S11_Y_shift = 28, - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y0_3 = 0x00028c04, - S12_X_mask = 0x0f << 0, - S12_X_shift = 0, - S12_Y_mask = 0x0f << 4, - S12_Y_shift = 4, - S13_X_mask = 0x0f << 8, - S13_X_shift = 8, - S13_Y_mask = 0x0f << 12, - S13_Y_shift = 12, - S14_X_mask = 0x0f << 16, - S14_X_shift = 16, - S14_Y_mask = 0x0f << 20, - S14_Y_shift = 20, - S15_X_mask = 0x0f << 24, - S15_X_shift = 24, - S15_Y_mask = 0x0f << 28, - S15_Y_shift = 28, - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_0 = 0x00028c08, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_1 = 0x00028c0c, -/* S4_X_mask = 0x0f << 0, */ -/* S4_X_shift = 0, */ -/* S4_Y_mask = 0x0f << 4, */ -/* S4_Y_shift = 4, */ -/* S5_X_mask = 0x0f << 8, */ -/* S5_X_shift = 8, */ -/* S5_Y_mask = 0x0f << 12, */ -/* S5_Y_shift = 12, */ -/* S6_X_mask = 0x0f << 16, */ -/* S6_X_shift = 16, */ -/* S6_Y_mask = 0x0f << 20, */ -/* S6_Y_shift = 20, */ -/* S7_X_mask = 0x0f << 24, */ -/* S7_X_shift = 24, */ -/* S7_Y_mask = 0x0f << 28, */ -/* S7_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_2 = 0x00028c10, -/* S8_X_mask = 0x0f << 0, */ -/* S8_X_shift = 0, */ -/* S8_Y_mask = 0x0f << 4, */ -/* S8_Y_shift = 4, */ -/* S9_X_mask = 0x0f << 8, */ -/* S9_X_shift = 8, */ -/* S9_Y_mask = 0x0f << 12, */ -/* S9_Y_shift = 12, */ -/* S10_X_mask = 0x0f << 16, */ -/* S10_X_shift = 16, */ -/* S10_Y_mask = 0x0f << 20, */ -/* S10_Y_shift = 20, */ -/* S11_X_mask = 0x0f << 24, */ -/* S11_X_shift = 24, */ -/* S11_Y_mask = 0x0f << 28, */ -/* S11_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y0_3 = 0x00028c14, -/* S12_X_mask = 0x0f << 0, */ -/* S12_X_shift = 0, */ -/* S12_Y_mask = 0x0f << 4, */ -/* S12_Y_shift = 4, */ -/* S13_X_mask = 0x0f << 8, */ -/* S13_X_shift = 8, */ -/* S13_Y_mask = 0x0f << 12, */ -/* S13_Y_shift = 12, */ -/* S14_X_mask = 0x0f << 16, */ -/* S14_X_shift = 16, */ -/* S14_Y_mask = 0x0f << 20, */ -/* S14_Y_shift = 20, */ -/* S15_X_mask = 0x0f << 24, */ -/* S15_X_shift = 24, */ -/* S15_Y_mask = 0x0f << 28, */ -/* S15_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_0 = 0x00028c18, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_1 = 0x00028c1c, -/* S4_X_mask = 0x0f << 0, */ -/* S4_X_shift = 0, */ -/* S4_Y_mask = 0x0f << 4, */ -/* S4_Y_shift = 4, */ -/* S5_X_mask = 0x0f << 8, */ -/* S5_X_shift = 8, */ -/* S5_Y_mask = 0x0f << 12, */ -/* S5_Y_shift = 12, */ -/* S6_X_mask = 0x0f << 16, */ -/* S6_X_shift = 16, */ -/* S6_Y_mask = 0x0f << 20, */ -/* S6_Y_shift = 20, */ -/* S7_X_mask = 0x0f << 24, */ -/* S7_X_shift = 24, */ -/* S7_Y_mask = 0x0f << 28, */ -/* S7_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_2 = 0x00028c20, -/* S8_X_mask = 0x0f << 0, */ -/* S8_X_shift = 0, */ -/* S8_Y_mask = 0x0f << 4, */ -/* S8_Y_shift = 4, */ -/* S9_X_mask = 0x0f << 8, */ -/* S9_X_shift = 8, */ -/* S9_Y_mask = 0x0f << 12, */ -/* S9_Y_shift = 12, */ -/* S10_X_mask = 0x0f << 16, */ -/* S10_X_shift = 16, */ -/* S10_Y_mask = 0x0f << 20, */ -/* S10_Y_shift = 20, */ -/* S11_X_mask = 0x0f << 24, */ -/* S11_X_shift = 24, */ -/* S11_Y_mask = 0x0f << 28, */ -/* S11_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X0Y1_3 = 0x00028c24, -/* S12_X_mask = 0x0f << 0, */ -/* S12_X_shift = 0, */ -/* S12_Y_mask = 0x0f << 4, */ -/* S12_Y_shift = 4, */ -/* S13_X_mask = 0x0f << 8, */ -/* S13_X_shift = 8, */ -/* S13_Y_mask = 0x0f << 12, */ -/* S13_Y_shift = 12, */ -/* S14_X_mask = 0x0f << 16, */ -/* S14_X_shift = 16, */ -/* S14_Y_mask = 0x0f << 20, */ -/* S14_Y_shift = 20, */ -/* S15_X_mask = 0x0f << 24, */ -/* S15_X_shift = 24, */ -/* S15_Y_mask = 0x0f << 28, */ -/* S15_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_0 = 0x00028c28, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_1 = 0x00028c2c, -/* S4_X_mask = 0x0f << 0, */ -/* S4_X_shift = 0, */ -/* S4_Y_mask = 0x0f << 4, */ -/* S4_Y_shift = 4, */ -/* S5_X_mask = 0x0f << 8, */ -/* S5_X_shift = 8, */ -/* S5_Y_mask = 0x0f << 12, */ -/* S5_Y_shift = 12, */ -/* S6_X_mask = 0x0f << 16, */ -/* S6_X_shift = 16, */ -/* S6_Y_mask = 0x0f << 20, */ -/* S6_Y_shift = 20, */ -/* S7_X_mask = 0x0f << 24, */ -/* S7_X_shift = 24, */ -/* S7_Y_mask = 0x0f << 28, */ -/* S7_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_2 = 0x00028c30, -/* S8_X_mask = 0x0f << 0, */ -/* S8_X_shift = 0, */ -/* S8_Y_mask = 0x0f << 4, */ -/* S8_Y_shift = 4, */ -/* S9_X_mask = 0x0f << 8, */ -/* S9_X_shift = 8, */ -/* S9_Y_mask = 0x0f << 12, */ -/* S9_Y_shift = 12, */ -/* S10_X_mask = 0x0f << 16, */ -/* S10_X_shift = 16, */ -/* S10_Y_mask = 0x0f << 20, */ -/* S10_Y_shift = 20, */ -/* S11_X_mask = 0x0f << 24, */ -/* S11_X_shift = 24, */ -/* S11_Y_mask = 0x0f << 28, */ -/* S11_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_PIXEL_X1Y1_3 = 0x00028c34, -/* S12_X_mask = 0x0f << 0, */ -/* S12_X_shift = 0, */ -/* S12_Y_mask = 0x0f << 4, */ -/* S12_Y_shift = 4, */ -/* S13_X_mask = 0x0f << 8, */ -/* S13_X_shift = 8, */ -/* S13_Y_mask = 0x0f << 12, */ -/* S13_Y_shift = 12, */ -/* S14_X_mask = 0x0f << 16, */ -/* S14_X_shift = 16, */ -/* S14_Y_mask = 0x0f << 20, */ -/* S14_Y_shift = 20, */ -/* S15_X_mask = 0x0f << 24, */ -/* S15_X_shift = 24, */ -/* S15_Y_mask = 0x0f << 28, */ -/* S15_Y_shift = 28, */ - PA_SC_AA_MASK_X0Y0_X1Y0 = 0x00028c38, - AA_MASK_X0Y0_mask = 0xffff << 0, - AA_MASK_X0Y0_shift = 0, - AA_MASK_X1Y0_mask = 0xffff << 16, - AA_MASK_X1Y0_shift = 16, - PA_SC_AA_MASK_X0Y1_X1Y1 = 0x00028c3c, - AA_MASK_X0Y1_mask = 0xffff << 0, - AA_MASK_X0Y1_shift = 0, - AA_MASK_X1Y1_mask = 0xffff << 16, - AA_MASK_X1Y1_shift = 16, - VGT_VERTEX_REUSE_BLOCK_CNTL = 0x00028c58, - VTX_REUSE_DEPTH_mask = 0xff << 0, - VTX_REUSE_DEPTH_shift = 0, - VGT_OUT_DEALLOC_CNTL = 0x00028c5c, - DEALLOC_DIST_mask = 0x7f << 0, - DEALLOC_DIST_shift = 0, - CB_COLOR0_BASE = 0x00028c60, - CB_COLOR0_BASE_num = 12, - CB_COLOR0_BASE_offset = 51, - CB_COLOR0_PITCH = 0x00028c64, - CB_COLOR0_PITCH_num = 12, - CB_COLOR0_PITCH_offset = 51, - CB_COLOR0_PITCH__TILE_MAX_mask = 0x7ff << 0, - CB_COLOR0_PITCH__TILE_MAX_shift = 0, - CB_COLOR0_SLICE = 0x00028c68, - CB_COLOR0_SLICE_num = 12, - CB_COLOR0_SLICE_offset = 51, - CB_COLOR0_SLICE__TILE_MAX_mask = 0x3fffff << 0, - CB_COLOR0_SLICE__TILE_MAX_shift = 0, - CB_COLOR0_VIEW = 0x00028c6c, - CB_COLOR0_VIEW_num = 12, - CB_COLOR0_VIEW_offset = 51, -/* SLICE_START_mask = 0x7ff << 0, */ -/* SLICE_START_shift = 0, */ -/* SLICE_MAX_mask = 0x7ff << 13, */ -/* SLICE_MAX_shift = 13, */ - CB_COLOR0_INFO = 0x00028c70, - CB_COLOR0_INFO_num = 12, - CB_COLOR0_INFO_offset = 51, - ENDIAN_mask = 0x03 << 0, - ENDIAN_shift = 0, - ENDIAN_NONE = 0x00, - ENDIAN_8IN16 = 0x01, - ENDIAN_8IN32 = 0x02, - ENDIAN_8IN64 = 0x03, - CB_COLOR0_INFO__FORMAT_mask = 0x3f << 2, - CB_COLOR0_INFO__FORMAT_shift = 2, - COLOR_INVALID = 0x00, - COLOR_8 = 0x01, - COLOR_16 = 0x05, - COLOR_16_FLOAT = 0x06, - COLOR_8_8 = 0x07, - COLOR_5_6_5 = 0x08, - COLOR_1_5_5_5 = 0x0a, - COLOR_4_4_4_4 = 0x0b, - COLOR_5_5_5_1 = 0x0c, - COLOR_32 = 0x0d, - COLOR_32_FLOAT = 0x0e, - COLOR_16_16 = 0x0f, - COLOR_16_16_FLOAT = 0x10, - COLOR_8_24 = 0x11, - COLOR_24_8 = 0x13, - COLOR_10_11_11 = 0x15, - COLOR_10_11_11_FLOAT = 0x16, - COLOR_2_10_10_10 = 0x19, - COLOR_8_8_8_8 = 0x1a, - COLOR_10_10_10_2 = 0x1b, - COLOR_X24_8_32_FLOAT = 0x1c, - COLOR_32_32 = 0x1d, - COLOR_32_32_FLOAT = 0x1e, - COLOR_16_16_16_16 = 0x1f, - COLOR_16_16_16_16_FLOAT = 0x20, - COLOR_32_32_32_32 = 0x22, - COLOR_32_32_32_32_FLOAT = 0x23, - CB_COLOR0_INFO__ARRAY_MODE_mask = 0x0f << 8, - CB_COLOR0_INFO__ARRAY_MODE_shift = 8, - ARRAY_LINEAR_GENERAL = 0x00, - ARRAY_LINEAR_ALIGNED = 0x01, -/* ARRAY_1D_TILED_THIN1 = 0x02, */ -/* ARRAY_2D_TILED_THIN1 = 0x04, */ - NUMBER_TYPE_mask = 0x07 << 12, - NUMBER_TYPE_shift = 12, - NUMBER_UNORM = 0x00, - NUMBER_SNORM = 0x01, - NUMBER_UINT = 0x04, - NUMBER_SINT = 0x05, - NUMBER_SRGB = 0x06, - NUMBER_FLOAT = 0x07, - COMP_SWAP_mask = 0x03 << 15, - COMP_SWAP_shift = 15, - SWAP_STD = 0x00, - SWAP_ALT = 0x01, - SWAP_STD_REV = 0x02, - SWAP_ALT_REV = 0x03, - FAST_CLEAR_bit = 1 << 17, - COMPRESSION_bit = 1 << 18, - BLEND_CLAMP_bit = 1 << 19, - BLEND_BYPASS_bit = 1 << 20, - SIMPLE_FLOAT_bit = 1 << 21, - CB_COLOR0_INFO__ROUND_MODE_bit = 1 << 22, - TILE_COMPACT_bit = 1 << 23, - SOURCE_FORMAT_mask = 0x03 << 24, - SOURCE_FORMAT_shift = 24, - EXPORT_4C_32BPC = 0x00, - EXPORT_4C_16BPC = 0x01, - EXPORT_2C_32BPC_GR = 0x02, - EXPORT_2C_32BPC_AR = 0x03, - RAT_bit = 1 << 26, - RESOURCE_TYPE_mask = 0x07 << 27, - RESOURCE_TYPE_shift = 27, - BUFFER = 0x00, - TEXTURE1D = 0x01, - TEXTURE1DARRAY = 0x02, - TEXTURE2D = 0x03, - TEXTURE2DARRAY = 0x04, - TEXTURE3D = 0x05, - STRUCTUREDBUFFER = 0x06, - SOURCE_NUMBER_TYPE_mask = 0x03 << 30, - SOURCE_NUMBER_TYPE_shift = 30, - EXPORT_FLOAT = 0x00, - EXPORT_INT = 0x01, - EXPORT_UNORM = 0x02, - EXPORT_SNORM = 0x03, - CB_COLOR0_ATTRIB = 0x00028c74, - CB_COLOR0_ATTRIB_num = 12, - CB_COLOR0_ATTRIB_offset = 51, - IGNORE_SHADER_ENGINE_TILING_bit = 1 << 3, - CB_COLOR0_ATTRIB__NON_DISP_TILING_ORDER_bit = 1 << 4, - CB_COLOR0_ATTRIB__TILE_SPLIT_mask = 0x0f << 5, - CB_COLOR0_ATTRIB__TILE_SPLIT_shift = 5, -/* ADDR_SURF_TILE_SPLIT_64B = 0x00, */ -/* ADDR_SURF_TILE_SPLIT_128B = 0x01, */ -/* ADDR_SURF_TILE_SPLIT_256B = 0x02, */ -/* ADDR_SURF_TILE_SPLIT_512B = 0x03, */ -/* ADDR_SURF_TILE_SPLIT_1KB = 0x04, */ -/* ADDR_SURF_TILE_SPLIT_2KB = 0x05, */ -/* ADDR_SURF_TILE_SPLIT_4KB = 0x06, */ - CB_COLOR0_ATTRIB__NUM_BANKS_mask = 0x03 << 10, - CB_COLOR0_ATTRIB__NUM_BANKS_shift = 10, -/* ADDR_SURF_2_BANK = 0x00, */ -/* ADDR_SURF_4_BANK = 0x01, */ -/* ADDR_SURF_8_BANK = 0x02, */ -/* ADDR_SURF_16_BANK = 0x03, */ - CB_COLOR0_ATTRIB__BANK_WIDTH_mask = 0x03 << 13, - CB_COLOR0_ATTRIB__BANK_WIDTH_shift = 13, -/* ADDR_SURF_BANK_WIDTH_1 = 0x00, */ -/* ADDR_SURF_BANK_WIDTH_2 = 0x01, */ -/* ADDR_SURF_BANK_WIDTH_4 = 0x02, */ -/* ADDR_SURF_BANK_WIDTH_8 = 0x03, */ - CB_COLOR0_ATTRIB__BANK_HEIGHT_mask = 0x03 << 16, - CB_COLOR0_ATTRIB__BANK_HEIGHT_shift = 16, -/* ADDR_SURF_BANK_HEIGHT_1 = 0x00, */ -/* ADDR_SURF_BANK_HEIGHT_2 = 0x01, */ -/* ADDR_SURF_BANK_HEIGHT_4 = 0x02, */ -/* ADDR_SURF_BANK_HEIGHT_8 = 0x03, */ - CB_COLOR0_ATTRIB__MACRO_TILE_ASPECT_mask = 0x03 << 19, - CB_COLOR0_ATTRIB__MACRO_TILE_ASPECT_shift = 19, -/* ADDR_SURF_MACRO_ASPECT_1 = 0x00, */ -/* ADDR_SURF_MACRO_ASPECT_2 = 0x01, */ -/* ADDR_SURF_MACRO_ASPECT_4 = 0x02, */ -/* ADDR_SURF_MACRO_ASPECT_8 = 0x03, */ - FMASK_BANK_HEIGHT_mask = 0x03 << 22, - FMASK_BANK_HEIGHT_shift = 22, -/* ADDR_SURF_BANK_HEIGHT_1 = 0x00, */ -/* ADDR_SURF_BANK_HEIGHT_2 = 0x01, */ -/* ADDR_SURF_BANK_HEIGHT_4 = 0x02, */ -/* ADDR_SURF_BANK_HEIGHT_8 = 0x03, */ - CB_COLOR0_ATTRIB__NUM_SAMPLES_mask = 0x07 << 24, - CB_COLOR0_ATTRIB__NUM_SAMPLES_shift = 24, - NUM_FRAGMENTS_mask = 0x03 << 27, - NUM_FRAGMENTS_shift = 27, - FORCE_DST_ALPHA_1_bit = 1 << 31, - CB_COLOR0_DIM = 0x00028c78, - CB_COLOR0_DIM_num = 12, - CB_COLOR0_DIM_offset = 51, - WIDTH_MAX_mask = 0xffff << 0, - WIDTH_MAX_shift = 0, - HEIGHT_MAX_mask = 0xffff << 16, - HEIGHT_MAX_shift = 16, - CB_COLOR0_CMASK = 0x00028c7c, - CB_COLOR0_CMASK_num = 8, - CB_COLOR0_CMASK_offset = 60, - CB_COLOR0_CMASK_SLICE = 0x00028c80, - CB_COLOR0_CMASK_SLICE_num = 8, - CB_COLOR0_CMASK_SLICE_offset = 60, - CB_COLOR0_CMASK_SLICE__TILE_MAX_mask = 0x3fff << 0, - CB_COLOR0_CMASK_SLICE__TILE_MAX_shift = 0, - CB_COLOR0_FMASK = 0x00028c84, - CB_COLOR0_FMASK_num = 8, - CB_COLOR0_FMASK_offset = 60, - CB_COLOR0_FMASK_SLICE = 0x00028c88, - CB_COLOR0_FMASK_SLICE_num = 8, - CB_COLOR0_FMASK_SLICE_offset = 60, - CB_COLOR0_FMASK_SLICE__TILE_MAX_mask = 0x3fffff << 0, - CB_COLOR0_FMASK_SLICE__TILE_MAX_shift = 0, - CB_COLOR0_CLEAR_WORD0 = 0x00028c8c, - CB_COLOR0_CLEAR_WORD0_num = 8, - CB_COLOR0_CLEAR_WORD0_offset = 60, - CB_COLOR0_CLEAR_WORD1 = 0x00028c90, - CB_COLOR0_CLEAR_WORD1_num = 8, - CB_COLOR0_CLEAR_WORD1_offset = 60, - CB_COLOR0_CLEAR_WORD2 = 0x00028c94, - CB_COLOR0_CLEAR_WORD2_num = 8, - CB_COLOR0_CLEAR_WORD2_offset = 60, - CB_COLOR0_CLEAR_WORD3 = 0x00028c98, - CB_COLOR0_CLEAR_WORD3_num = 8, - CB_COLOR0_CLEAR_WORD3_offset = 60, - SQ_ALU_CONST_CACHE_HS_0 = 0x00028f00, - SQ_ALU_CONST_CACHE_HS_0_num = 16, - SQ_ALU_CONST_CACHE_LS_0 = 0x00028f40, - SQ_ALU_CONST_CACHE_LS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_HS_0 = 0x00028f80, - SQ_ALU_CONST_BUFFER_SIZE_HS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_HS_0__DATA_mask = 0x1ff << 0, - SQ_ALU_CONST_BUFFER_SIZE_HS_0__DATA_shift = 0, - SQ_ALU_CONST_BUFFER_SIZE_LS_0 = 0x00028fc0, - SQ_ALU_CONST_BUFFER_SIZE_LS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_LS_0__DATA_mask = 0x1ff << 0, - SQ_ALU_CONST_BUFFER_SIZE_LS_0__DATA_shift = 0, - SQ_VTX_CONSTANT_WORD0_0 = 0x00030000, - SQ_TEX_RESOURCE_WORD0_0 = 0x00030000, - DIM_mask = 0x07 << 0, - DIM_shift = 0, - SQ_TEX_DIM_1D = 0x00, - SQ_TEX_DIM_2D = 0x01, - SQ_TEX_DIM_3D = 0x02, - SQ_TEX_DIM_CUBEMAP = 0x03, - SQ_TEX_DIM_1D_ARRAY = 0x04, - SQ_TEX_DIM_2D_ARRAY = 0x05, - SQ_TEX_DIM_2D_MSAA = 0x06, - SQ_TEX_DIM_2D_ARRAY_MSAA = 0x07, -/* IGNORE_SHADER_ENGINE_TILING_bit = 1 << 3, */ - SQ_TEX_RESOURCE_WORD0_0__NON_DISP_TILING_ORDER_mask= 0x03 << 4, - SQ_TEX_RESOURCE_WORD0_0__NON_DISP_TILING_ORDER_shift= 4, - PITCH_mask = 0xfff << 6, - PITCH_shift = 6, - TEX_WIDTH_mask = 0x3fff << 18, - TEX_WIDTH_shift = 18, - SQ_VTX_CONSTANT_WORD1_0 = 0x00030004, - SQ_TEX_RESOURCE_WORD1_0 = 0x00030004, - TEX_HEIGHT_mask = 0x3fff << 0, - TEX_HEIGHT_shift = 0, - TEX_DEPTH_mask = 0x1fff << 14, - TEX_DEPTH_shift = 14, - SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask = 0x0f << 28, - SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift = 28, - SQ_VTX_CONSTANT_WORD2_0 = 0x00030008, - BASE_ADDRESS_HI_mask = 0xff << 0, - BASE_ADDRESS_HI_shift = 0, - SQ_VTX_CONSTANT_WORD2_0__STRIDE_mask = 0xfff << 8, - SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift = 8, - SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask = 0x3f << 20, - SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift = 20, - SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_mask = 0x03 << 26, - SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift = 26, -/* SQ_NUM_FORMAT_NORM = 0x00, */ -/* SQ_NUM_FORMAT_INT = 0x01, */ -/* SQ_NUM_FORMAT_SCALED = 0x02, */ - SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit = 1 << 28, - SQ_VTX_CONSTANT_WORD2_0__SRF_MODE_ALL_bit = 1 << 29, - SQ_VTX_CONSTANT_WORD2_0__ENDIAN_SWAP_mask = 0x03 << 30, - SQ_VTX_CONSTANT_WORD2_0__ENDIAN_SWAP_shift = 30, -/* SQ_ENDIAN_NONE = 0x00, */ -/* SQ_ENDIAN_8IN16 = 0x01, */ -/* SQ_ENDIAN_8IN32 = 0x02, */ - SQ_TEX_RESOURCE_WORD2_0 = 0x00030008, - SQ_VTX_CONSTANT_WORD3_0 = 0x0003000c, - CACHE_SWIZZLE_bit = 1 << 0, - SQ_VTX_CONSTANT_WORD3_0__UNCACHED_bit = 1 << 2, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_mask = 0x07 << 3, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_shift = 3, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_mask = 0x07 << 6, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_shift = 6, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_mask = 0x07 << 9, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_mask = 0x07 << 12, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_shift = 12, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_TEX_RESOURCE_WORD3_0 = 0x0003000c, - SQ_TEX_RESOURCE_WORD4_0 = 0x00030010, - FORMAT_COMP_X_mask = 0x03 << 0, - FORMAT_COMP_X_shift = 0, - SQ_FORMAT_COMP_UNSIGNED = 0x00, - SQ_FORMAT_COMP_SIGNED = 0x01, - SQ_FORMAT_COMP_UNSIGNED_BIASED = 0x02, - FORMAT_COMP_Y_mask = 0x03 << 2, - FORMAT_COMP_Y_shift = 2, -/* SQ_FORMAT_COMP_UNSIGNED = 0x00, */ -/* SQ_FORMAT_COMP_SIGNED = 0x01, */ -/* SQ_FORMAT_COMP_UNSIGNED_BIASED = 0x02, */ - FORMAT_COMP_Z_mask = 0x03 << 4, - FORMAT_COMP_Z_shift = 4, -/* SQ_FORMAT_COMP_UNSIGNED = 0x00, */ -/* SQ_FORMAT_COMP_SIGNED = 0x01, */ -/* SQ_FORMAT_COMP_UNSIGNED_BIASED = 0x02, */ - FORMAT_COMP_W_mask = 0x03 << 6, - FORMAT_COMP_W_shift = 6, -/* SQ_FORMAT_COMP_UNSIGNED = 0x00, */ -/* SQ_FORMAT_COMP_SIGNED = 0x01, */ -/* SQ_FORMAT_COMP_UNSIGNED_BIASED = 0x02, */ - SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_mask = 0x03 << 8, - SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift = 8, -/* SQ_NUM_FORMAT_NORM = 0x00, */ -/* SQ_NUM_FORMAT_INT = 0x01, */ -/* SQ_NUM_FORMAT_SCALED = 0x02, */ - SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit = 1 << 10, - SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit = 1 << 11, - SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_mask = 0x03 << 12, - SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift = 12, -/* SQ_ENDIAN_NONE = 0x00, */ -/* SQ_ENDIAN_8IN16 = 0x01, */ -/* SQ_ENDIAN_8IN32 = 0x02, */ - LOG2_NUM_FRAGMENTS_mask = 0x03 << 14, - LOG2_NUM_FRAGMENTS_shift = 14, - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask = 0x07 << 16, - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift = 16, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_mask = 0x07 << 19, - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift = 19, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_mask = 0x07 << 22, - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift = 22, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_mask = 0x07 << 25, - SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift = 25, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - BASE_LEVEL_mask = 0x0f << 28, - BASE_LEVEL_shift = 28, - SQ_VTX_CONSTANT_WORD4_0 = 0x00030010, - SQ_TEX_RESOURCE_WORD5_0 = 0x00030014, - LAST_LEVEL_mask = 0x0f << 0, - LAST_LEVEL_shift = 0, - BASE_ARRAY_mask = 0x1fff << 4, - BASE_ARRAY_shift = 4, - LAST_ARRAY_mask = 0x1fff << 17, - LAST_ARRAY_shift = 17, - SQ_TEX_RESOURCE_WORD6_0 = 0x00030018, - PERF_MODULATION_mask = 0x07 << 3, - PERF_MODULATION_shift = 3, - INTERLACED_bit = 1 << 6, - SQ_TEX_RESOURCE_WORD6_0__MIN_LOD_mask = 0xfff << 8, - SQ_TEX_RESOURCE_WORD6_0__MIN_LOD_shift = 8, - SQ_TEX_RESOURCE_WORD6_0__TILE_SPLIT_mask = 0x07 << 29, - SQ_TEX_RESOURCE_WORD6_0__TILE_SPLIT_shift = 29, - SQ_ADDR_SURF_TILE_SPLIT_64B = 0x00, - SQ_ADDR_SURF_TILE_SPLIT_128B = 0x01, - SQ_ADDR_SURF_TILE_SPLIT_256B = 0x02, - SQ_ADDR_SURF_TILE_SPLIT_512B = 0x03, - SQ_ADDR_SURF_TILE_SPLIT_1KB = 0x04, - SQ_ADDR_SURF_TILE_SPLIT_2KB = 0x05, - SQ_ADDR_SURF_TILE_SPLIT_4KB = 0x06, - SQ_VTX_CONSTANT_WORD7_0 = 0x0003001c, - SQ_VTX_CONSTANT_WORD7_0__TYPE_mask = 0x03 << 30, - SQ_VTX_CONSTANT_WORD7_0__TYPE_shift = 30, - SQ_TEX_VTX_INVALID_TEXTURE = 0x00, - SQ_TEX_VTX_INVALID_BUFFER = 0x01, - SQ_TEX_VTX_VALID_TEXTURE = 0x02, - SQ_TEX_VTX_VALID_BUFFER = 0x03, - SQ_TEX_RESOURCE_WORD7_0 = 0x0003001c, - SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask = 0x3f << 0, - SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift = 0, - SQ_TEX_RESOURCE_WORD7_0__MACRO_TILE_ASPECT_mask = 0x03 << 6, - SQ_TEX_RESOURCE_WORD7_0__MACRO_TILE_ASPECT_shift = 6, - SQ_ADDR_SURF_MACRO_ASPECT_1 = 0x00, - SQ_ADDR_SURF_MACRO_ASPECT_2 = 0x01, - SQ_ADDR_SURF_MACRO_ASPECT_4 = 0x02, - SQ_ADDR_SURF_MACRO_ASPECT_8 = 0x03, - SQ_TEX_RESOURCE_WORD7_0__BANK_WIDTH_mask = 0x03 << 8, - SQ_TEX_RESOURCE_WORD7_0__BANK_WIDTH_shift = 8, - SQ_ADDR_SURF_BANK_WH_1 = 0x00, - SQ_ADDR_SURF_BANK_WH_2 = 0x01, - SQ_ADDR_SURF_BANK_WH_4 = 0x02, - SQ_ADDR_SURF_BANK_WH_8 = 0x03, - SQ_TEX_RESOURCE_WORD7_0__BANK_HEIGHT_mask = 0x03 << 10, - SQ_TEX_RESOURCE_WORD7_0__BANK_HEIGHT_shift = 10, -/* SQ_ADDR_SURF_BANK_WH_1 = 0x00, */ -/* SQ_ADDR_SURF_BANK_WH_2 = 0x01, */ -/* SQ_ADDR_SURF_BANK_WH_4 = 0x02, */ -/* SQ_ADDR_SURF_BANK_WH_8 = 0x03, */ - DEPTH_SAMPLE_ORDER_bit = 1 << 15, - SQ_TEX_RESOURCE_WORD7_0__NUM_BANKS_mask = 0x03 << 16, - SQ_TEX_RESOURCE_WORD7_0__NUM_BANKS_shift = 16, - SQ_ADDR_SURF_2_BANK = 0x00, - SQ_ADDR_SURF_4_BANK = 0x01, - SQ_ADDR_SURF_8_BANK = 0x02, - SQ_ADDR_SURF_16_BANK = 0x03, - SQ_TEX_RESOURCE_WORD7_0__TYPE_mask = 0x03 << 30, - SQ_TEX_RESOURCE_WORD7_0__TYPE_shift = 30, -/* SQ_TEX_VTX_INVALID_TEXTURE = 0x00, */ -/* SQ_TEX_VTX_INVALID_BUFFER = 0x01, */ -/* SQ_TEX_VTX_VALID_TEXTURE = 0x02, */ -/* SQ_TEX_VTX_VALID_BUFFER = 0x03, */ - SQ_LOOP_CONST_DX10_0 = 0x0003a200, - SQ_LOOP_CONST_0 = 0x0003a200, - SQ_LOOP_CONST_0__COUNT_mask = 0xfff << 0, - SQ_LOOP_CONST_0__COUNT_shift = 0, - INIT_mask = 0xfff << 12, - INIT_shift = 12, - INC_mask = 0xff << 24, - INC_shift = 24, - SQ_JUMPTABLE_CONST_0 = 0x0003a200, - CONST_A_mask = 0xff << 0, - CONST_A_shift = 0, - CONST_B_mask = 0xff << 8, - CONST_B_shift = 8, - CONST_C_mask = 0xff << 16, - CONST_C_shift = 16, - CONST_D_mask = 0xff << 24, - CONST_D_shift = 24, - SQ_BOOL_CONST_0 = 0x0003a500, - SQ_BOOL_CONST_0_num = 6, - SQ_TEX_SAMPLER_WORD0_0 = 0x0003c000, - CLAMP_X_mask = 0x07 << 0, - CLAMP_X_shift = 0, - SQ_TEX_WRAP = 0x00, - SQ_TEX_MIRROR = 0x01, - SQ_TEX_CLAMP_LAST_TEXEL = 0x02, - SQ_TEX_MIRROR_ONCE_LAST_TEXEL = 0x03, - SQ_TEX_CLAMP_HALF_BORDER = 0x04, - SQ_TEX_MIRROR_ONCE_HALF_BORDER = 0x05, - SQ_TEX_CLAMP_BORDER = 0x06, - SQ_TEX_MIRROR_ONCE_BORDER = 0x07, - CLAMP_Y_mask = 0x07 << 3, - CLAMP_Y_shift = 3, -/* SQ_TEX_WRAP = 0x00, */ -/* SQ_TEX_MIRROR = 0x01, */ -/* SQ_TEX_CLAMP_LAST_TEXEL = 0x02, */ -/* SQ_TEX_MIRROR_ONCE_LAST_TEXEL = 0x03, */ -/* SQ_TEX_CLAMP_HALF_BORDER = 0x04, */ -/* SQ_TEX_MIRROR_ONCE_HALF_BORDER = 0x05, */ -/* SQ_TEX_CLAMP_BORDER = 0x06, */ -/* SQ_TEX_MIRROR_ONCE_BORDER = 0x07, */ - CLAMP_Z_mask = 0x07 << 6, - CLAMP_Z_shift = 6, -/* SQ_TEX_WRAP = 0x00, */ -/* SQ_TEX_MIRROR = 0x01, */ -/* SQ_TEX_CLAMP_LAST_TEXEL = 0x02, */ -/* SQ_TEX_MIRROR_ONCE_LAST_TEXEL = 0x03, */ -/* SQ_TEX_CLAMP_HALF_BORDER = 0x04, */ -/* SQ_TEX_MIRROR_ONCE_HALF_BORDER = 0x05, */ -/* SQ_TEX_CLAMP_BORDER = 0x06, */ -/* SQ_TEX_MIRROR_ONCE_BORDER = 0x07, */ - XY_MAG_FILTER_mask = 0x03 << 9, - XY_MAG_FILTER_shift = 9, - SQ_TEX_XY_FILTER_POINT = 0x00, - SQ_TEX_XY_FILTER_BILINEAR = 0x01, - XY_MIN_FILTER_mask = 0x03 << 11, - XY_MIN_FILTER_shift = 11, -/* SQ_TEX_XY_FILTER_POINT = 0x00, */ -/* SQ_TEX_XY_FILTER_BILINEAR = 0x01, */ - Z_FILTER_mask = 0x03 << 13, - Z_FILTER_shift = 13, - SQ_TEX_Z_FILTER_NONE = 0x00, - SQ_TEX_Z_FILTER_POINT = 0x01, - SQ_TEX_Z_FILTER_LINEAR = 0x02, - MIP_FILTER_mask = 0x03 << 15, - MIP_FILTER_shift = 15, -/* SQ_TEX_Z_FILTER_NONE = 0x00, */ -/* SQ_TEX_Z_FILTER_POINT = 0x01, */ -/* SQ_TEX_Z_FILTER_LINEAR = 0x02, */ - BORDER_COLOR_TYPE_mask = 0x03 << 20, - BORDER_COLOR_TYPE_shift = 20, - SQ_TEX_BORDER_COLOR_TRANS_BLACK = 0x00, - SQ_TEX_BORDER_COLOR_OPAQUE_BLACK = 0x01, - SQ_TEX_BORDER_COLOR_OPAQUE_WHITE = 0x02, - SQ_TEX_BORDER_COLOR_REGISTER = 0x03, - DEPTH_COMPARE_FUNCTION_mask = 0x07 << 22, - DEPTH_COMPARE_FUNCTION_shift = 22, - SQ_TEX_DEPTH_COMPARE_NEVER = 0x00, - SQ_TEX_DEPTH_COMPARE_LESS = 0x01, - SQ_TEX_DEPTH_COMPARE_EQUAL = 0x02, - SQ_TEX_DEPTH_COMPARE_LESSEQUAL = 0x03, - SQ_TEX_DEPTH_COMPARE_GREATER = 0x04, - SQ_TEX_DEPTH_COMPARE_NOTEQUAL = 0x05, - SQ_TEX_DEPTH_COMPARE_GREATEREQUAL = 0x06, - SQ_TEX_DEPTH_COMPARE_ALWAYS = 0x07, - FORCE_UNNORMALIZED_bit = 1 << 25, - SQ_TEX_SAMPLER_WORD1_0 = 0x0003c004, - SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_mask = 0xfff << 0, - SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_shift = 0, - MAX_LOD_mask = 0xfff << 12, - MAX_LOD_shift = 12, - PERF_MIP_mask = 0x0f << 24, - PERF_MIP_shift = 24, - PERF_Z_mask = 0x0f << 28, - PERF_Z_shift = 28, - SQ_TEX_SAMPLER_WORD2_0 = 0x0003c008, - SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_mask = 0x3fff << 0, - SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_shift = 0, - LOD_BIAS_SEC_mask = 0x3f << 14, - LOD_BIAS_SEC_shift = 14, - MC_COORD_TRUNCATE_bit = 1 << 20, - SQ_TEX_SAMPLER_WORD2_0__FORCE_DEGAMMA_bit = 1 << 21, - TRUNCATE_COORD_bit = 1 << 28, - SQ_TEX_SAMPLER_WORD2_0__DISABLE_CUBE_WRAP_bit = 1 << 29, - SQ_TEX_SAMPLER_WORD2_0__TYPE_bit = 1 << 31, - SQ_VTX_BASE_VTX_LOC = 0x0003cff0, - SQ_VTX_START_INST_LOC = 0x0003cff4, - SQ_TEX_SAMPLER_CLEAR = 0x0003ff00, - SQ_TEX_RESOURCE_CLEAR = 0x0003ff04, - SQ_LOOP_BOOL_CLEAR = 0x0003ff08, - PA_CL_GB_VERT_DISC_ADJ = 0x0028be8c, - -} ; - -#endif /* _CAYMAN_REG_AUTO */ - diff --git a/driver/xf86-video-ati/src/cayman_shader.c b/driver/xf86-video-ati/src/cayman_shader.c deleted file mode 100644 index 01b612ad3..000000000 --- a/driver/xf86-video-ati/src/cayman_shader.c +++ /dev/null @@ -1,3165 +0,0 @@ -/* - * Copyright 2011 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 (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 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. - * - * Author: Alex Deucher - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef XF86DRM_MODE - -#include "xf86.h" - -#include "cayman_shader.h" -#include "cayman_reg.h" - -/* solid vs --------------------------------------- */ -int cayman_solid_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(4), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 2 - always export a param whether it's used or not */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 3 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 4/5 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -/* solid ps --------------------------------------- */ -int cayman_solid_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_ALU_DWORD0(ADDR(3), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - - /* 2 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 3 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(1)); - /* 4 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(1)); - /* 5 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(1)); - /* 6 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(1)); - - return i; -} - -/* copy vs --------------------------------------- */ -int cayman_copy_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(4), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 2 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 3 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 4/5 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 6/7 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -/* copy ps --------------------------------------- */ -int cayman_copy_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* CF INST 0 */ - shader[i++] = CF_ALU_DWORD0(ADDR(4), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* CF INST 1 */ - shader[i++] = CF_DWORD0(ADDR(8), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - /* CF INST 2 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* CF INST 3 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 4 interpolate tex coords */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 5 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 6 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 7 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 8/9 TEX INST 0 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), /* R */ - DST_SEL_Y(SQ_SEL_Y), /* G */ - DST_SEL_Z(SQ_SEL_Z), /* B */ - DST_SEL_W(SQ_SEL_W), /* A */ - LOD_BIAS(0), - COORD_TYPE_X(TEX_UNNORMALIZED), - COORD_TYPE_Y(TEX_UNNORMALIZED), - COORD_TYPE_Z(TEX_UNNORMALIZED), - COORD_TYPE_W(TEX_UNNORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - return i; -} - -int cayman_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(8), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - - /* 1 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(5), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(2), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 2 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(3)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 3 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(3)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 4 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 5 texX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 6 texY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 7 - padding */ - shader[i++] = 0x00000000; - shader[i++] = 0x00000000; - /* 8/9 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 10/11 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -int cayman_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_ALU_DWORD0(ADDR(6), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(22), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - BARRIER(0)); - /* 2 */ - shader[i++] = CF_DWORD0(ADDR(30), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - BARRIER(0)); - /* 3 */ - shader[i++] = CF_ALU_DWORD0(ADDR(10), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(12), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 4 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(2), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(3)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 5 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 6 interpolate tex coords */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 7 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 8 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 9 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 10,11,12,13 */ - /* r2.x = MAD(c0.w, r1.x, c0.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* r2.y = MAD(c0.w, r1.x, c0.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* r2.z = MAD(c0.w, r1.x, c0.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 14,15,16,17 */ - /* r2.x = MAD(c1.x, r1.y, pv.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* r2.y = MAD(c1.y, r1.y, pv.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* r2.z = MAD(c1.z, r1.y, pv.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_W), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - /* 18,19,20,21 */ - /* r2.x = MAD(c2.x, r1.z, pv.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(1)); - /* r2.y = MAD(c2.y, r1.z, pv.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(1)); - /* r2.z = MAD(c2.z, r1.z, pv.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(1)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(1)); - - /* 22 */ - shader[i++] = CF_DWORD0(ADDR(24), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(3), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - /* 23 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - BARRIER(1)); - /* 24/25 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_MASK), - DST_SEL_Z(SQ_SEL_MASK), - DST_SEL_W(SQ_SEL_1), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 26/27 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(1), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_MASK), - DST_SEL_Y(SQ_SEL_MASK), - DST_SEL_Z(SQ_SEL_X), - DST_SEL_W(SQ_SEL_MASK), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(1), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 28/29 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(2), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_MASK), - DST_SEL_Y(SQ_SEL_X), - DST_SEL_Z(SQ_SEL_MASK), - DST_SEL_W(SQ_SEL_MASK), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(2), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 30 */ - shader[i++] = CF_DWORD0(ADDR(32), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - /* 31 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - BARRIER(1)); - /* 32/33 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_MASK), - DST_SEL_Z(SQ_SEL_MASK), - DST_SEL_W(SQ_SEL_1), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 34/35 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(1), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_MASK), - DST_SEL_Y(SQ_SEL_X), - DST_SEL_Z(SQ_SEL_Y), - DST_SEL_W(SQ_SEL_MASK), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(1), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - return i; -} - -/* comp vs --------------------------------------- */ -int cayman_comp_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(3), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - BARRIER(0)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(9), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - BARRIER(0)); - /* 2 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 3 - mask sub */ - shader[i++] = CF_DWORD0(ADDR(44), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(3), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - - /* 4 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(14), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(20), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 5 - dst */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(2), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 6 - src */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT), - MARK(0), - BARRIER(0)); - /* 7 - mask */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(1), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 8 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - BARRIER(1)); - /* 9 - non-mask sub */ - shader[i++] = CF_DWORD0(ADDR(50), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - - /* 10 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(34), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(10), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 11 - dst */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 12 - src */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 13 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - BARRIER(1)); - - /* 14 srcX.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 15 srcX.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 16 srcX.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 17 srcX.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 18 srcY.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 19 srcY.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 20 srcY.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 21 srcY.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 22 maskX.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 23 maskX.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 24 maskX.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 25 maskX.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 26 maskY.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 27 maskY.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 28 maskY.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 29 maskY.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 30 srcX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 3), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 31 srcY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 3), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 32 maskX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 4), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 33 maskY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 4), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 34 srcX.x DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 35 srcX.y DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 36 srcX.z DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 37 srcX.w DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 38 srcY.x DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 39 srcY.y DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 40 srcY.z DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 41 srcY.w DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 42 srcX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 43 srcY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* mask vfetch - 44/45 - dst */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(2), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 46/47 - src */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 48/49 - mask */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(16), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - /* no mask vfetch - 50/51 - dst */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 52/53 - src */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - STRUCTURED_READ(SQ_VTX_STRU_READ_OFF), - LDS_REQ(0), - COALESCED_READ(0)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -/* comp ps --------------------------------------- */ -int cayman_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(3), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - BARRIER(0)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(8), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - BARRIER(0)); - /* 2 - end */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_END), - BARRIER(1)); - /* 3 - mask sub */ - shader[i++] = CF_ALU_DWORD0(ADDR(12), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(8), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 4 */ - shader[i++] = CF_DWORD0(ADDR(28), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - - /* 5 */ - shader[i++] = CF_ALU_DWORD0(ADDR(20), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 6 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(2), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 7 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - BARRIER(1)); - - /* 8 - non-mask sub */ - shader[i++] = CF_ALU_DWORD0(ADDR(24), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 9 */ - shader[i++] = CF_DWORD0(ADDR(32), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TC), - BARRIER(1)); - - /* 10 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - - /* 11 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - BARRIER(1)); - - /* 12 interpolate src tex coords - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 13 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 14 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 15 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 16 interpolate mask tex coords */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 17 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 18 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 19 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 20 - alu 0 */ - /* MUL gpr[2].x gpr[0].x gpr[1].x */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(1)); - /* 21 - alu 1 */ - /* MUL gpr[2].y gpr[0].y gpr[1].y */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(1)); - /* 22 - alu 2 */ - /* MUL gpr[2].z gpr[0].z gpr[1].z */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(1)); - /* 23 - alu 3 */ - /* MUL gpr[2].w gpr[0].w gpr[1].w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(1)); - - /* 24 - interpolate tex coords - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 25 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 26 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 27 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 28/29 - src - mask */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(1), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_Z), - DST_SEL_W(SQ_SEL_W), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 30/31 - mask */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(1), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_Z), - DST_SEL_W(SQ_SEL_W), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(1), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - /* 32/33 - src - non-mask */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_Z), - DST_SEL_W(SQ_SEL_W), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - return i; -} - -#endif diff --git a/driver/xf86-video-ati/src/cayman_shader.h b/driver/xf86-video-ati/src/cayman_shader.h deleted file mode 100644 index c4cdc688f..000000000 --- a/driver/xf86-video-ati/src/cayman_shader.h +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Cayman shaders - * - * Copyright (C) 2011 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 - * BRIAN PAUL 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. - */ - -/* - * Shader macros - */ - -#ifndef __SHADER_H__ -#define __SHADER_H__ - -#include "radeon.h" - -/* Oder of instructions: All CF, All ALU, All Tex/Vtx fetches */ - - -// CF insts -// addr -#define ADDR(x) (x) -// jumptable -#define JUMPTABLE_SEL(x) (x) -// pc -#define POP_COUNT(x) (x) -// const -#define CF_CONST(x) (x) -// cond -#define COND(x) (x) // SQ_COND_* -// count -#define I_COUNT(x) ((x) ? ((x) - 1) : 0) -// vpm -#define VALID_PIXEL_MODE(x) (x) -// cf inst -#define CF_INST(x) (x) // SQ_CF_INST_* -// wqm -#define WHOLE_QUAD_MODE(x) (x) -// barrier -#define BARRIER(x) (x) -//kb0 -#define KCACHE_BANK0(x) (x) -//kb1 -#define KCACHE_BANK1(x) (x) -// km0/1 -#define KCACHE_MODE0(x) (x) -#define KCACHE_MODE1(x) (x) // SQ_CF_KCACHE_* -// -#define KCACHE_ADDR0(x) (x) -#define KCACHE_ADDR1(x) (x) - -#define ALT_CONST(x) (x) - -#define ARRAY_BASE(x) (x) -// export pixel -#define CF_PIXEL_MRT0 0 -#define CF_PIXEL_MRT1 1 -#define CF_PIXEL_MRT2 2 -#define CF_PIXEL_MRT3 3 -#define CF_PIXEL_MRT4 4 -#define CF_PIXEL_MRT5 5 -#define CF_PIXEL_MRT6 6 -#define CF_PIXEL_MRT7 7 -// computed Z -#define CF_COMPUTED_Z 61 -// export pos -#define CF_POS0 60 -#define CF_POS1 61 -#define CF_POS2 62 -#define CF_POS3 63 -// export param -// 0...31 -#define TYPE(x) (x) // SQ_EXPORT_* -#define RW_GPR(x) (x) -#define RW_REL(x) (x) -#define ABSOLUTE 0 -#define RELATIVE 1 -#define INDEX_GPR(x) (x) -#define ELEM_SIZE(x) (x ? (x - 1) : 0) -#define BURST_COUNT(x) (x ? (x - 1) : 0) -#define MARK(x) (x) - -// swiz -#define SRC_SEL_X(x) (x) // SQ_SEL_* each -#define SRC_SEL_Y(x) (x) -#define SRC_SEL_Z(x) (x) -#define SRC_SEL_W(x) (x) - -#define CF_DWORD0(addr, jmptbl) cpu_to_le32(((addr) | ((jmptbl) << 24))) -#define CF_DWORD1(pc, cf_const, cond, count, vpm, cf_inst, b) \ - cpu_to_le32((((pc) << 0) | ((cf_const) << 3) | ((cond) << 8) | ((count) << 10) | \ - ((vpm) << 20) | ((cf_inst) << 22) | ((b) << 31))) - -#define CF_ALU_DWORD0(addr, kb0, kb1, km0) cpu_to_le32((((addr) << 0) | ((kb0) << 22) | ((kb1) << 26) | ((km0) << 30))) -#define CF_ALU_DWORD1(km1, kcache_addr0, kcache_addr1, count, alt_const, cf_inst, wqm, b) \ - cpu_to_le32((((km1) << 0) | ((kcache_addr0) << 2) | ((kcache_addr1) << 10) | \ - ((count) << 18) | ((alt_const) << 25) | ((cf_inst) << 26) | ((wqm) << 30) | ((b) << 31))) - -#define CF_ALLOC_IMP_EXP_DWORD0(array_base, type, rw_gpr, rr, index_gpr, es) \ - cpu_to_le32((((array_base) << 0) | ((type) << 13) | ((rw_gpr) << 15) | ((rr) << 22) | \ - ((index_gpr) << 23) | ((es) << 30))) -#define CF_ALLOC_IMP_EXP_DWORD1_SWIZ(sel_x, sel_y, sel_z, sel_w, bc, vpm, cf_inst, m, b) \ - cpu_to_le32((((sel_x) << 0) | ((sel_y) << 3) | ((sel_z) << 6) | ((sel_w) << 9) | \ - ((bc) << 16) | ((vpm) << 20) | ((cf_inst) << 22) | ((m) << 30) | ((b) << 31))) - -// ALU clause insts -#define SRC0_SEL(x) (x) -#define SRC1_SEL(x) (x) -#define SRC2_SEL(x) (x) -// src[0-2]_sel -// 0-127 GPR -// 128-159 kcache constants bank 0 -// 160-191 kcache constants bank 1 -// 192-255 inline const values -// 256-287 kcache constants bank 2 -// 288-319 kcache constants bank 3 -// 219-255 special SQ_ALU_SRC_* (0, 1, etc.) -// 488-520 src param space -#define ALU_SRC_GPR_BASE 0 -#define ALU_SRC_KCACHE0_BASE 128 -#define ALU_SRC_KCACHE1_BASE 160 -#define ALU_SRC_INLINE_K_BASE 192 -#define ALU_SRC_KCACHE2_BASE 256 -#define ALU_SRC_KCACHE3_BASE 288 -#define ALU_SRC_PARAM_BASE 448 - -#define SRC0_REL(x) (x) -#define SRC1_REL(x) (x) -#define SRC2_REL(x) (x) -// elem -#define SRC0_ELEM(x) (x) -#define SRC1_ELEM(x) (x) -#define SRC2_ELEM(x) (x) -#define ELEM_X 0 -#define ELEM_Y 1 -#define ELEM_Z 2 -#define ELEM_W 3 -// neg -#define SRC0_NEG(x) (x) -#define SRC1_NEG(x) (x) -#define SRC2_NEG(x) (x) -// im -#define INDEX_MODE(x) (x) // SQ_INDEX_* -// ps -#define PRED_SEL(x) (x) // SQ_PRED_SEL_* -// last -#define LAST(x) (x) -// abs -#define SRC0_ABS(x) (x) -#define SRC1_ABS(x) (x) -// uem -#define UPDATE_EXECUTE_MASK(x) (x) -// up -#define UPDATE_PRED(x) (x) -// wm -#define WRITE_MASK(x) (x) -// omod -#define OMOD(x) (x) // SQ_ALU_OMOD_* -// alu inst -#define ALU_INST(x) (x) // SQ_ALU_INST_* -//bs -#define BANK_SWIZZLE(x) (x) // SQ_ALU_VEC_* -#define DST_GPR(x) (x) -#define DST_REL(x) (x) -#define DST_ELEM(x) (x) -#define CLAMP(x) (x) - -#define ALU_DWORD0(src0_sel, s0r, s0e, s0n, src1_sel, s1r, s1e, s1n, im, ps, last) \ - cpu_to_le32((((src0_sel) << 0) | ((s0r) << 9) | ((s0e) << 10) | ((s0n) << 12) | \ - ((src1_sel) << 13) | ((s1r) << 22) | ((s1e) << 23) | ((s1n) << 25) | \ - ((im) << 26) | ((ps) << 29) | ((last) << 31))) - -#define ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ - cpu_to_le32((((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ - ((omod) << 5) | ((alu_inst) << 7) | ((bs) << 18) | ((dst_gpr) << 21) | \ - ((dr) << 28) | ((de) << 29) | ((clamp) << 31))) - -#define ALU_DWORD1_OP3(src2_sel, s2r, s2e, s2n, alu_inst, bs, dst_gpr, dr, de, clamp) \ - cpu_to_le32((((src2_sel) << 0) | ((s2r) << 9) | ((s2e) << 10) | ((s2n) << 12) | \ - ((alu_inst) << 13) | ((bs) << 18) | ((dst_gpr) << 21) | ((dr) << 28) | \ - ((de) << 29) | ((clamp) << 31))) - -// VTX clause insts -// vxt insts -#define VTX_INST(x) (x) // SQ_VTX_INST_* - -// fetch type -#define FETCH_TYPE(x) (x) // SQ_VTX_FETCH_* - -#define FETCH_WHOLE_QUAD(x) (x) -#define BUFFER_ID(x) (x) -#define SRC_GPR(x) (x) -#define SRC_REL(x) (x) - -#define STRUCTURED_READ(x) (x) -#define LDS_REQ(x) (x) -#define COALESCED_READ(x) (x) - -#define DST_SEL_X(x) (x) -#define DST_SEL_Y(x) (x) -#define DST_SEL_Z(x) (x) -#define DST_SEL_W(x) (x) -#define USE_CONST_FIELDS(x) (x) -#define DATA_FORMAT(x) (x) -// num format -#define NUM_FORMAT_ALL(x) (x) // SQ_NUM_FORMAT_* -// format comp -#define FORMAT_COMP_ALL(x) (x) // SQ_FORMAT_COMP_* -// sma -#define SRF_MODE_ALL(x) (x) -#define SRF_MODE_ZERO_CLAMP_MINUS_ONE 0 -#define SRF_MODE_NO_ZERO 1 -#define OFFSET(x) (x) -// endian swap -#define ENDIAN_SWAP(x) (x) // SQ_ENDIAN_* -#define CONST_BUF_NO_STRIDE(x) (x) -#define BUFFER_INDEX_MODE(x) (x) - -#define VTX_DWORD0(vtx_inst, ft, fwq, buffer_id, src_gpr, sr, ssx, ssy, str, ldsr, cr) \ - cpu_to_le32((((vtx_inst) << 0) | ((ft) << 5) | ((fwq) << 7) | ((buffer_id) << 8) | \ - ((src_gpr) << 16) | ((sr) << 23) | ((ssx) << 24) | ((ssy) << 26) | \ - ((str) << 28) | ((ldsr) << 30) | ((cr) << 31))) -#define VTX_DWORD1_GPR(dst_gpr, dr, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ - cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ - ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31))) -#define VTX_DWORD2(offset, es, cbns, alt_const, bim) \ - cpu_to_le32((((offset) << 0) | ((es) << 16) | ((cbns) << 18) | ((alt_const) << 20) | ((bim) << 21))) -#define VTX_DWORD_PAD cpu_to_le32(0x00000000) - -// TEX clause insts -// tex insts -#define TEX_INST(x) (x) // SQ_TEX_INST_* -#define INST_MOD(x) (x) -#define FETCH_WHOLE_QUAD(x) (x) -#define RESOURCE_ID(x) (x) -#define RESOURCE_INDEX_MODE(x) (x) -#define SAMPLER_INDEX_MODE(x) (x) - -#define LOD_BIAS(x) (x) -//ct -#define COORD_TYPE_X(x) (x) -#define COORD_TYPE_Y(x) (x) -#define COORD_TYPE_Z(x) (x) -#define COORD_TYPE_W(x) (x) -#define TEX_UNNORMALIZED 0 -#define TEX_NORMALIZED 1 -#define OFFSET_X(x) (((int)(x) * 2) & 0x1f) /* 4:1-bits 2's-complement fixed-point: [-8.0..7.5] */ -#define OFFSET_Y(x) (((int)(x) * 2) & 0x1f) -#define OFFSET_Z(x) (((int)(x) * 2) & 0x1f) -#define SAMPLER_ID(x) (x) - -#define TEX_DWORD0(tex_inst, im, fwq, resource_id, src_gpr, sr, ac, rim, sim) \ - cpu_to_le32((((tex_inst) << 0) | ((im) << 5) | ((fwq) << 7) | ((resource_id) << 8) | \ - ((src_gpr) << 16) | ((sr) << 23) | ((ac) << 24) | ((rim) << 25) | ((sim) << 27))) -#define TEX_DWORD1(dst_gpr, dr, dsx, dsy, dsz, dsw, lod_bias, ctx, cty, ctz, ctw) \ - cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ - ((lod_bias) << 21) | ((ctx) << 28) | ((cty) << 29) | ((ctz) << 30) | ((ctw) << 31))) -#define TEX_DWORD2(offset_x, offset_y, offset_z, sampler_id, ssx, ssy, ssz, ssw) \ - cpu_to_le32((((offset_x) << 0) | ((offset_y) << 5) | ((offset_z) << 10) | ((sampler_id) << 15) | \ - ((ssx) << 20) | ((ssy) << 23) | ((ssz) << 26) | ((ssw) << 29))) -#define TEX_DWORD_PAD cpu_to_le32(0x00000000) - -#endif diff --git a/driver/xf86-video-ati/src/drmmode_display.c b/driver/xf86-video-ati/src/drmmode_display.c deleted file mode 100644 index 05f764374..000000000 --- a/driver/xf86-video-ati/src/drmmode_display.c +++ /dev/null @@ -1,1751 +0,0 @@ -/* - * Copyright © 2007 Red Hat, 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 (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 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. - * - * Authors: - * Dave Airlie - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#ifdef XF86DRM_MODE -#include -#include "micmap.h" -#include "xf86cmap.h" -#include "radeon.h" -#include "radeon_reg.h" -#include "radeon_drm.h" -#include "sarea.h" - -#include "drmmode_display.h" - -/* DPMS */ -#ifdef HAVE_XEXTPROTO_71 -#include -#else -#define DPMS_SERVER -#include -#endif - -static PixmapPtr drmmode_create_bo_pixmap(ScreenPtr pScreen, - int width, int height, - int depth, int bpp, - int pitch, struct radeon_bo *bo) -{ - PixmapPtr pixmap; - - pixmap = (*pScreen->CreatePixmap)(pScreen, 0, 0, depth, 0); - if (!pixmap) - return NULL; - - if (!(*pScreen->ModifyPixmapHeader)(pixmap, width, height, - depth, bpp, pitch, NULL)) { - return NULL; - } - - exaMoveInPixmap(pixmap); - radeon_set_pixmap_bo(pixmap, bo); - - return pixmap; -} - -static void drmmode_destroy_bo_pixmap(PixmapPtr pixmap) -{ - ScreenPtr pScreen = pixmap->drawable.pScreen; - - (*pScreen->DestroyPixmap)(pixmap); -} - -static void -drmmode_ConvertFromKMode(ScrnInfoPtr scrn, - drmModeModeInfo *kmode, - DisplayModePtr mode) -{ - memset(mode, 0, sizeof(DisplayModeRec)); - mode->status = MODE_OK; - - mode->Clock = kmode->clock; - - mode->HDisplay = kmode->hdisplay; - mode->HSyncStart = kmode->hsync_start; - mode->HSyncEnd = kmode->hsync_end; - mode->HTotal = kmode->htotal; - mode->HSkew = kmode->hskew; - - mode->VDisplay = kmode->vdisplay; - mode->VSyncStart = kmode->vsync_start; - mode->VSyncEnd = kmode->vsync_end; - mode->VTotal = kmode->vtotal; - mode->VScan = kmode->vscan; - - mode->Flags = kmode->flags; //& FLAG_BITS; - mode->name = strdup(kmode->name); - - if (kmode->type & DRM_MODE_TYPE_DRIVER) - mode->type = M_T_DRIVER; - if (kmode->type & DRM_MODE_TYPE_PREFERRED) - mode->type |= M_T_PREFERRED; - xf86SetModeCrtc (mode, scrn->adjustFlags); -} - -static void -drmmode_ConvertToKMode(ScrnInfoPtr scrn, - drmModeModeInfo *kmode, - DisplayModePtr mode) -{ - memset(kmode, 0, sizeof(*kmode)); - - kmode->clock = mode->Clock; - kmode->hdisplay = mode->HDisplay; - kmode->hsync_start = mode->HSyncStart; - kmode->hsync_end = mode->HSyncEnd; - kmode->htotal = mode->HTotal; - kmode->hskew = mode->HSkew; - - kmode->vdisplay = mode->VDisplay; - kmode->vsync_start = mode->VSyncStart; - kmode->vsync_end = mode->VSyncEnd; - kmode->vtotal = mode->VTotal; - kmode->vscan = mode->VScan; - - kmode->flags = mode->Flags; //& FLAG_BITS; - if (mode->name) - strncpy(kmode->name, mode->name, DRM_DISPLAY_MODE_LEN); - kmode->name[DRM_DISPLAY_MODE_LEN-1] = 0; - -} - -static void -drmmode_crtc_dpms(xf86CrtcPtr crtc, int mode) -{ -#if 0 - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); -// drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; -// drmmode_ptr drmmode = drmmode_crtc->drmmode; - - /* bonghits in the randr 1.2 - uses dpms to disable crtc - bad buzz */ - if (mode == DPMSModeOff) { -// drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, -// 0, 0, 0, NULL, 0, NULL); - } -#endif -} - -static PixmapPtr -create_pixmap_for_fbcon(drmmode_ptr drmmode, - ScrnInfoPtr pScrn, int crtc_id) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - drmmode_crtc_private_ptr drmmode_crtc; - ScreenPtr pScreen = pScrn->pScreen; - PixmapPtr pixmap; - struct radeon_bo *bo; - drmModeFBPtr fbcon; - struct drm_gem_flink flink; - - drmmode_crtc = xf86_config->crtc[crtc_id]->driver_private; - - fbcon = drmModeGetFB(drmmode->fd, drmmode_crtc->mode_crtc->buffer_id); - if (fbcon == NULL) - return NULL; - - flink.handle = fbcon->handle; - if (ioctl(drmmode->fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Couldn't flink fbcon handle\n"); - return NULL; - } - - bo = radeon_bo_open(drmmode->bufmgr, flink.name, 0, 0, 0, 0); - if (bo == NULL) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Couldn't allocate bo for fbcon handle\n"); - return NULL; - } - - pixmap = drmmode_create_bo_pixmap(pScreen, fbcon->width, fbcon->height, - fbcon->depth, fbcon->bpp, - fbcon->pitch, bo); - if (!pixmap) - return NULL; - - radeon_bo_unref(bo); - drmModeFreeFB(fbcon); - return pixmap; -} - -void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr src, dst; - ScreenPtr pScreen = pScrn->pScreen; - int crtc_id = 0; - int i; - int pitch; - uint32_t tiling_flags = 0; - Bool ret; - - if (info->accelOn == FALSE) - return; - - for (i = 0; i < xf86_config->num_crtc; i++) { - xf86CrtcPtr crtc = xf86_config->crtc[i]; - drmmode_crtc_private_ptr drmmode_crtc; - - drmmode_crtc = crtc->driver_private; - if (drmmode_crtc->mode_crtc->buffer_id) - crtc_id = i; - } - - src = create_pixmap_for_fbcon(drmmode, pScrn, crtc_id); - if (!src) - return; - - if (info->allowColorTiling) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - tiling_flags |= RADEON_TILING_MICRO; - else - tiling_flags |= RADEON_TILING_MACRO; - } - - pitch = RADEON_ALIGN(pScrn->displayWidth, - drmmode_get_pitch_align(pScrn, info->CurrentLayout.pixel_bytes, tiling_flags)) * - info->CurrentLayout.pixel_bytes; - - dst = drmmode_create_bo_pixmap(pScreen, pScrn->virtualX, - pScrn->virtualY, pScrn->depth, - pScrn->bitsPerPixel, pitch, - info->front_bo); - if (!dst) - goto out_free_src; - - ret = info->accel_state->exa->PrepareCopy (src, dst, - -1, -1, GXcopy, FB_ALLONES); - if (!ret) - goto out_free_src; - info->accel_state->exa->Copy (dst, 0, 0, 0, 0, - pScrn->virtualX, pScrn->virtualY); - info->accel_state->exa->DoneCopy (dst); - radeon_cs_flush_indirect(pScrn); - - drmmode_destroy_bo_pixmap(dst); - out_free_src: - drmmode_destroy_bo_pixmap(src); - -} - -static Bool -drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, - Rotation rotation, int x, int y) -{ - ScrnInfoPtr pScrn = crtc->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - int saved_x, saved_y; - Rotation saved_rotation; - DisplayModeRec saved_mode; - uint32_t *output_ids; - int output_count = 0; - Bool ret = TRUE; - int i; - int fb_id; - drmModeModeInfo kmode; - int pitch; - uint32_t tiling_flags = 0; - int height; - - if (info->allowColorTiling) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - tiling_flags |= RADEON_TILING_MICRO; - else - tiling_flags |= RADEON_TILING_MACRO; - } - - pitch = RADEON_ALIGN(pScrn->displayWidth, drmmode_get_pitch_align(pScrn, info->CurrentLayout.pixel_bytes, tiling_flags)) * - info->CurrentLayout.pixel_bytes; - height = RADEON_ALIGN(pScrn->virtualY, drmmode_get_height_align(pScrn, tiling_flags)); - - if (drmmode->fb_id == 0) { - ret = drmModeAddFB(drmmode->fd, - pScrn->virtualX, height, - pScrn->depth, pScrn->bitsPerPixel, - pitch, - info->front_bo->handle, - &drmmode->fb_id); - if (ret < 0) { - ErrorF("failed to add fb\n"); - return FALSE; - } - } - - saved_mode = crtc->mode; - saved_x = crtc->x; - saved_y = crtc->y; - saved_rotation = crtc->rotation; - - if (mode) { - crtc->mode = *mode; - crtc->x = x; - crtc->y = y; - crtc->rotation = rotation; -#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,5,99,0,0) - crtc->transformPresent = FALSE; -#endif - } - - output_ids = calloc(sizeof(uint32_t), xf86_config->num_output); - if (!output_ids) { - ret = FALSE; - goto done; - } - - if (mode) { - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - drmmode_output_private_ptr drmmode_output; - - if (output->crtc != crtc) - continue; - - drmmode_output = output->driver_private; - output_ids[output_count] = drmmode_output->mode_output->connector_id; - output_count++; - } - - if (!xf86CrtcRotate(crtc)) { - goto done; - } -#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,7,0,0,0) - crtc->funcs->gamma_set(crtc, crtc->gamma_red, crtc->gamma_green, - crtc->gamma_blue, crtc->gamma_size); -#endif - - drmmode_ConvertToKMode(crtc->scrn, &kmode, mode); - - fb_id = drmmode->fb_id; - if (drmmode_crtc->rotate_fb_id) { - fb_id = drmmode_crtc->rotate_fb_id; - x = y = 0; - } - ret = drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, - fb_id, x, y, output_ids, output_count, &kmode); - if (ret) - xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, - "failed to set mode: %s", strerror(-ret)); - else - ret = TRUE; - - if (crtc->scrn->pScreen) - xf86CrtcSetScreenSubpixelOrder(crtc->scrn->pScreen); - /* go through all the outputs and force DPMS them back on? */ - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - - if (output->crtc != crtc) - continue; - - output->funcs->dpms(output, DPMSModeOn); - } - } - - if (pScrn->pScreen && - !xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) - xf86_reload_cursors(pScrn->pScreen); - -done: - if (!ret) { - crtc->x = saved_x; - crtc->y = saved_y; - crtc->rotation = saved_rotation; - crtc->mode = saved_mode; - } -#if defined(XF86_CRTC_VERSION) && XF86_CRTC_VERSION >= 3 - else - crtc->active = TRUE; -#endif - - return ret; -} - -static void -drmmode_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg) -{ - -} - -static void -drmmode_set_cursor_position (xf86CrtcPtr crtc, int x, int y) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - - drmModeMoveCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, x, y); -} - -static void -drmmode_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - int i; - uint32_t *ptr; - - /* cursor should be mapped already */ - ptr = (uint32_t *)(drmmode_crtc->cursor_bo->ptr); - - for (i = 0; i < 64 * 64; i++) - ptr[i] = cpu_to_le32(image[i]); -} - - -static void -drmmode_hide_cursor (xf86CrtcPtr crtc) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - - drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, 0, 64, 64); - -} - -static void -drmmode_show_cursor (xf86CrtcPtr crtc) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - uint32_t handle = drmmode_crtc->cursor_bo->handle; - - drmModeSetCursor(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, handle, 64, 64); -} - -static void * -drmmode_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) -{ - ScrnInfoPtr pScrn = crtc->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - int size; - struct radeon_bo *rotate_bo; - int ret; - unsigned long rotate_pitch; - int base_align; - - /* rotation requires acceleration */ - if (info->r600_shadow_fb) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Rotation requires acceleration!\n"); - return NULL; - } - - rotate_pitch = - RADEON_ALIGN(width, drmmode_get_pitch_align(crtc->scrn, drmmode->cpp, 0)) * drmmode->cpp; - height = RADEON_ALIGN(height, drmmode_get_height_align(crtc->scrn, 0)); - base_align = drmmode_get_base_align(crtc->scrn, drmmode->cpp, 0); - size = RADEON_ALIGN(rotate_pitch * height, RADEON_GPU_PAGE_SIZE); - - rotate_bo = radeon_bo_open(drmmode->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_VRAM, 0); - if (rotate_bo == NULL) - return NULL; - - radeon_bo_map(rotate_bo, 1); - - ret = drmModeAddFB(drmmode->fd, width, height, crtc->scrn->depth, - crtc->scrn->bitsPerPixel, rotate_pitch, - rotate_bo->handle, - &drmmode_crtc->rotate_fb_id); - if (ret) { - ErrorF("failed to add rotate fb\n"); - } - - drmmode_crtc->rotate_bo = rotate_bo; - return drmmode_crtc->rotate_bo->ptr; -} - -static PixmapPtr -drmmode_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) -{ - ScrnInfoPtr pScrn = crtc->scrn; - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - unsigned long rotate_pitch; - PixmapPtr rotate_pixmap; - - if (!data) - data = drmmode_crtc_shadow_allocate (crtc, width, height); - - rotate_pitch = RADEON_ALIGN(width, drmmode_get_pitch_align(pScrn, drmmode->cpp, 0)) * drmmode->cpp; - - rotate_pixmap = drmmode_create_bo_pixmap(pScrn->pScreen, - width, height, - pScrn->depth, - pScrn->bitsPerPixel, - rotate_pitch, - drmmode_crtc->rotate_bo); - if (rotate_pixmap == NULL) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Couldn't allocate shadow pixmap for rotated CRTC\n"); - } - return rotate_pixmap; - -} - -static void -drmmode_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - - if (rotate_pixmap) - drmmode_destroy_bo_pixmap(rotate_pixmap); - - if (data) { - drmModeRmFB(drmmode->fd, drmmode_crtc->rotate_fb_id); - drmmode_crtc->rotate_fb_id = 0; - radeon_bo_unmap(drmmode_crtc->rotate_bo); - radeon_bo_unref(drmmode_crtc->rotate_bo); - drmmode_crtc->rotate_bo = NULL; - } - -} - -static void -drmmode_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t *green, - uint16_t *blue, int size) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - - drmModeCrtcSetGamma(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, - size, red, green, blue); -} - -static const xf86CrtcFuncsRec drmmode_crtc_funcs = { - .dpms = drmmode_crtc_dpms, - .set_mode_major = drmmode_set_mode_major, - .set_cursor_colors = drmmode_set_cursor_colors, - .set_cursor_position = drmmode_set_cursor_position, - .show_cursor = drmmode_show_cursor, - .hide_cursor = drmmode_hide_cursor, - .load_cursor_argb = drmmode_load_cursor_argb, - - .gamma_set = drmmode_crtc_gamma_set, - .shadow_create = drmmode_crtc_shadow_create, - .shadow_allocate = drmmode_crtc_shadow_allocate, - .shadow_destroy = drmmode_crtc_shadow_destroy, - .destroy = NULL, /* XXX */ -}; - -int drmmode_get_crtc_id(xf86CrtcPtr crtc) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - return drmmode_crtc->hw_id; -} - -void drmmode_crtc_hw_id(xf86CrtcPtr crtc) -{ - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - ScrnInfoPtr pScrn = crtc->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct drm_radeon_info ginfo; - int r; - uint32_t tmp; - - memset(&ginfo, 0, sizeof(ginfo)); - ginfo.request = 0x4; - tmp = drmmode_crtc->mode_crtc->crtc_id; - ginfo.value = (uintptr_t)&tmp; - r = drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_INFO, &ginfo, sizeof(ginfo)); - if (r) { - drmmode_crtc->hw_id = -1; - return; - } - drmmode_crtc->hw_id = tmp; -} - -static void -drmmode_crtc_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num) -{ - xf86CrtcPtr crtc; - drmmode_crtc_private_ptr drmmode_crtc; - - crtc = xf86CrtcCreate(pScrn, &drmmode_crtc_funcs); - if (crtc == NULL) - return; - - drmmode_crtc = xnfcalloc(sizeof(drmmode_crtc_private_rec), 1); - drmmode_crtc->mode_crtc = drmModeGetCrtc(drmmode->fd, drmmode->mode_res->crtcs[num]); - drmmode_crtc->drmmode = drmmode; - crtc->driver_private = drmmode_crtc; - drmmode_crtc_hw_id(crtc); - - return; -} - -static xf86OutputStatus -drmmode_output_detect(xf86OutputPtr output) -{ - /* go to the hw and retrieve a new output struct */ - drmmode_output_private_ptr drmmode_output = output->driver_private; - drmmode_ptr drmmode = drmmode_output->drmmode; - xf86OutputStatus status; - drmModeFreeConnector(drmmode_output->mode_output); - - drmmode_output->mode_output = drmModeGetConnector(drmmode->fd, drmmode_output->output_id); - - switch (drmmode_output->mode_output->connection) { - case DRM_MODE_CONNECTED: - status = XF86OutputStatusConnected; - break; - case DRM_MODE_DISCONNECTED: - status = XF86OutputStatusDisconnected; - break; - default: - case DRM_MODE_UNKNOWNCONNECTION: - status = XF86OutputStatusUnknown; - break; - } - return status; -} - -static Bool -drmmode_output_mode_valid(xf86OutputPtr output, DisplayModePtr pModes) -{ - return MODE_OK; -} - -static DisplayModePtr -drmmode_output_get_modes(xf86OutputPtr output) -{ - drmmode_output_private_ptr drmmode_output = output->driver_private; - drmModeConnectorPtr koutput = drmmode_output->mode_output; - drmmode_ptr drmmode = drmmode_output->drmmode; - int i; - DisplayModePtr Modes = NULL, Mode; - drmModePropertyPtr props; - xf86MonPtr mon = NULL; - - /* look for an EDID property */ - for (i = 0; i < koutput->count_props; i++) { - props = drmModeGetProperty(drmmode->fd, koutput->props[i]); - if (props && (props->flags & DRM_MODE_PROP_BLOB)) { - if (!strcmp(props->name, "EDID")) { - if (drmmode_output->edid_blob) - drmModeFreePropertyBlob(drmmode_output->edid_blob); - drmmode_output->edid_blob = drmModeGetPropertyBlob(drmmode->fd, koutput->prop_values[i]); - } - drmModeFreeProperty(props); - } - } - - if (drmmode_output->edid_blob) { - mon = xf86InterpretEDID(output->scrn->scrnIndex, - drmmode_output->edid_blob->data); - if (mon && drmmode_output->edid_blob->length > 128) - mon->flags |= MONITOR_EDID_COMPLETE_RAWDATA; - } - xf86OutputSetEDID(output, mon); - - /* modes should already be available */ - for (i = 0; i < koutput->count_modes; i++) { - Mode = xnfalloc(sizeof(DisplayModeRec)); - - drmmode_ConvertFromKMode(output->scrn, &koutput->modes[i], Mode); - Modes = xf86ModesAdd(Modes, Mode); - - } - return Modes; -} - -static void -drmmode_output_destroy(xf86OutputPtr output) -{ - drmmode_output_private_ptr drmmode_output = output->driver_private; - int i; - - if (drmmode_output->edid_blob) - drmModeFreePropertyBlob(drmmode_output->edid_blob); - for (i = 0; i < drmmode_output->num_props; i++) { - drmModeFreeProperty(drmmode_output->props[i].mode_prop); - free(drmmode_output->props[i].atoms); - } - for (i = 0; i < drmmode_output->mode_output->count_encoders; i++) { - drmModeFreeEncoder(drmmode_output->mode_encoders[i]); - free(drmmode_output->mode_encoders); - } - free(drmmode_output->props); - drmModeFreeConnector(drmmode_output->mode_output); - free(drmmode_output); - output->driver_private = NULL; -} - -static void -drmmode_output_dpms(xf86OutputPtr output, int mode) -{ - drmmode_output_private_ptr drmmode_output = output->driver_private; - drmModeConnectorPtr koutput = drmmode_output->mode_output; - drmmode_ptr drmmode = drmmode_output->drmmode; - - drmModeConnectorSetProperty(drmmode->fd, koutput->connector_id, - drmmode_output->dpms_enum_id, mode); - return; -} - - -static Bool -drmmode_property_ignore(drmModePropertyPtr prop) -{ - if (!prop) - return TRUE; - /* ignore blob prop */ - if (prop->flags & DRM_MODE_PROP_BLOB) - return TRUE; - /* ignore standard property */ - if (!strcmp(prop->name, "EDID") || - !strcmp(prop->name, "DPMS")) - return TRUE; - - return FALSE; -} - -static void -drmmode_output_create_resources(xf86OutputPtr output) -{ - drmmode_output_private_ptr drmmode_output = output->driver_private; - drmModeConnectorPtr mode_output = drmmode_output->mode_output; - drmmode_ptr drmmode = drmmode_output->drmmode; - drmModePropertyPtr drmmode_prop; - int i, j, err; - - drmmode_output->props = calloc(mode_output->count_props, sizeof(drmmode_prop_rec)); - if (!drmmode_output->props) - return; - - drmmode_output->num_props = 0; - for (i = 0, j = 0; i < mode_output->count_props; i++) { - drmmode_prop = drmModeGetProperty(drmmode->fd, mode_output->props[i]); - if (drmmode_property_ignore(drmmode_prop)) { - drmModeFreeProperty(drmmode_prop); - continue; - } - drmmode_output->props[j].mode_prop = drmmode_prop; - drmmode_output->props[j].value = mode_output->prop_values[i]; - drmmode_output->num_props++; - j++; - } - - for (i = 0; i < drmmode_output->num_props; i++) { - drmmode_prop_ptr p = &drmmode_output->props[i]; - drmmode_prop = p->mode_prop; - - if (drmmode_prop->flags & DRM_MODE_PROP_RANGE) { - INT32 range[2]; - INT32 value = p->value; - - p->num_atoms = 1; - p->atoms = calloc(p->num_atoms, sizeof(Atom)); - if (!p->atoms) - continue; - p->atoms[0] = MakeAtom(drmmode_prop->name, strlen(drmmode_prop->name), TRUE); - range[0] = drmmode_prop->values[0]; - range[1] = drmmode_prop->values[1]; - err = RRConfigureOutputProperty(output->randr_output, p->atoms[0], - FALSE, TRUE, - drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE, - 2, range); - if (err != 0) { - xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, - "RRConfigureOutputProperty error, %d\n", err); - } - err = RRChangeOutputProperty(output->randr_output, p->atoms[0], - XA_INTEGER, 32, PropModeReplace, 1, &value, FALSE, TRUE); - if (err != 0) { - xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, - "RRChangeOutputProperty error, %d\n", err); - } - } else if (drmmode_prop->flags & DRM_MODE_PROP_ENUM) { - p->num_atoms = drmmode_prop->count_enums + 1; - p->atoms = calloc(p->num_atoms, sizeof(Atom)); - if (!p->atoms) - continue; - p->atoms[0] = MakeAtom(drmmode_prop->name, strlen(drmmode_prop->name), TRUE); - for (j = 1; j <= drmmode_prop->count_enums; j++) { - struct drm_mode_property_enum *e = &drmmode_prop->enums[j-1]; - p->atoms[j] = MakeAtom(e->name, strlen(e->name), TRUE); - } - err = RRConfigureOutputProperty(output->randr_output, p->atoms[0], - FALSE, FALSE, - drmmode_prop->flags & DRM_MODE_PROP_IMMUTABLE ? TRUE : FALSE, - p->num_atoms - 1, (INT32 *)&p->atoms[1]); - if (err != 0) { - xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, - "RRConfigureOutputProperty error, %d\n", err); - } - for (j = 0; j < drmmode_prop->count_enums; j++) - if (drmmode_prop->enums[j].value == p->value) - break; - /* there's always a matching value */ - err = RRChangeOutputProperty(output->randr_output, p->atoms[0], - XA_ATOM, 32, PropModeReplace, 1, &p->atoms[j+1], FALSE, TRUE); - if (err != 0) { - xf86DrvMsg(output->scrn->scrnIndex, X_ERROR, - "RRChangeOutputProperty error, %d\n", err); - } - } - } -} - -static Bool -drmmode_output_set_property(xf86OutputPtr output, Atom property, - RRPropertyValuePtr value) -{ - drmmode_output_private_ptr drmmode_output = output->driver_private; - drmmode_ptr drmmode = drmmode_output->drmmode; - int i; - - for (i = 0; i < drmmode_output->num_props; i++) { - drmmode_prop_ptr p = &drmmode_output->props[i]; - - if (p->atoms[0] != property) - continue; - - if (p->mode_prop->flags & DRM_MODE_PROP_RANGE) { - uint32_t val; - - if (value->type != XA_INTEGER || value->format != 32 || - value->size != 1) - return FALSE; - val = *(uint32_t *)value->data; - - drmModeConnectorSetProperty(drmmode->fd, drmmode_output->output_id, - p->mode_prop->prop_id, (uint64_t)val); - return TRUE; - } else if (p->mode_prop->flags & DRM_MODE_PROP_ENUM) { - Atom atom; - const char *name; - int j; - - if (value->type != XA_ATOM || value->format != 32 || value->size != 1) - return FALSE; - memcpy(&atom, value->data, 4); - name = NameForAtom(atom); - - /* search for matching name string, then set its value down */ - for (j = 0; j < p->mode_prop->count_enums; j++) { - if (!strcmp(p->mode_prop->enums[j].name, name)) { - drmModeConnectorSetProperty(drmmode->fd, drmmode_output->output_id, - p->mode_prop->prop_id, p->mode_prop->enums[j].value); - return TRUE; - } - } - } - } - - return TRUE; -} - -static Bool -drmmode_output_get_property(xf86OutputPtr output, Atom property) -{ - return TRUE; -} - -static const xf86OutputFuncsRec drmmode_output_funcs = { - .dpms = drmmode_output_dpms, - .create_resources = drmmode_output_create_resources, -#ifdef RANDR_12_INTERFACE - .set_property = drmmode_output_set_property, - .get_property = drmmode_output_get_property, -#endif -#if 0 - - .save = drmmode_crt_save, - .restore = drmmode_crt_restore, - .mode_fixup = drmmode_crt_mode_fixup, - .prepare = drmmode_output_prepare, - .mode_set = drmmode_crt_mode_set, - .commit = drmmode_output_commit, -#endif - .detect = drmmode_output_detect, - .mode_valid = drmmode_output_mode_valid, - - .get_modes = drmmode_output_get_modes, - .destroy = drmmode_output_destroy -}; - -static int subpixel_conv_table[7] = { 0, SubPixelUnknown, - SubPixelHorizontalRGB, - SubPixelHorizontalBGR, - SubPixelVerticalRGB, - SubPixelVerticalBGR, - SubPixelNone }; - -const char *output_names[] = { "None", - "VGA", - "DVI", - "DVI", - "DVI", - "Composite", - "S-video", - "LVDS", - "CTV", - "DIN", - "DisplayPort", - "HDMI", - "HDMI", - "TV", - "eDP" -}; - -static void -drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int num, int *num_dvi, int *num_hdmi) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - xf86OutputPtr output; - drmModeConnectorPtr koutput; - drmModeEncoderPtr *kencoders = NULL; - drmmode_output_private_ptr drmmode_output; - drmModePropertyPtr props; - char name[32]; - int i; - const char *s; - - koutput = drmModeGetConnector(drmmode->fd, drmmode->mode_res->connectors[num]); - if (!koutput) - return; - - kencoders = calloc(sizeof(drmModeEncoderPtr), koutput->count_encoders); - if (!kencoders) { - goto out_free_encoders; - } - - for (i = 0; i < koutput->count_encoders; i++) { - kencoders[i] = drmModeGetEncoder(drmmode->fd, koutput->encoders[i]); - if (!kencoders[i]) { - goto out_free_encoders; - } - } - - /* need to do smart conversion here for compat with non-kms ATI driver */ - if (koutput->connector_type_id == 1) { - switch(koutput->connector_type) { - case DRM_MODE_CONNECTOR_DVII: - case DRM_MODE_CONNECTOR_DVID: - case DRM_MODE_CONNECTOR_DVIA: - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_dvi); - (*num_dvi)++; - break; - case DRM_MODE_CONNECTOR_HDMIA: - case DRM_MODE_CONNECTOR_HDMIB: - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], *num_hdmi); - (*num_hdmi)++; - break; - case DRM_MODE_CONNECTOR_VGA: - case DRM_MODE_CONNECTOR_DisplayPort: - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], koutput->connector_type_id - 1); - break; - default: - snprintf(name, 32, "%s", output_names[koutput->connector_type]); - break; - } - } else { - snprintf(name, 32, "%s-%d", output_names[koutput->connector_type], koutput->connector_type_id - 1); - } - - if (xf86IsEntityShared(pScrn->entityList[0])) { - if ((s = xf86GetOptValString(info->Options, OPTION_ZAPHOD_HEADS))) { - if (!RADEONZaphodStringMatches(pScrn, s, name)) - goto out_free_encoders; - } else { - if (info->IsPrimary && (num != 0)) - goto out_free_encoders; - else if (info->IsSecondary && (num != 1)) - goto out_free_encoders; - } - } - - output = xf86OutputCreate (pScrn, &drmmode_output_funcs, name); - if (!output) { - goto out_free_encoders; - } - - drmmode_output = calloc(sizeof(drmmode_output_private_rec), 1); - if (!drmmode_output) { - xf86OutputDestroy(output); - goto out_free_encoders; - } - - drmmode_output->output_id = drmmode->mode_res->connectors[num]; - drmmode_output->mode_output = koutput; - drmmode_output->mode_encoders = kencoders; - drmmode_output->drmmode = drmmode; - output->mm_width = koutput->mmWidth; - output->mm_height = koutput->mmHeight; - - output->subpixel_order = subpixel_conv_table[koutput->subpixel]; - output->interlaceAllowed = TRUE; - output->doubleScanAllowed = TRUE; - output->driver_private = drmmode_output; - - output->possible_crtcs = 0x7f; - for (i = 0; i < koutput->count_encoders; i++) { - output->possible_crtcs &= kencoders[i]->possible_crtcs; - } - /* work out the possible clones later */ - output->possible_clones = 0; - - for (i = 0; i < koutput->count_props; i++) { - props = drmModeGetProperty(drmmode->fd, koutput->props[i]); - if (props && (props->flags & DRM_MODE_PROP_ENUM)) { - if (!strcmp(props->name, "DPMS")) { - drmmode_output->dpms_enum_id = koutput->props[i]; - drmModeFreeProperty(props); - break; - } - drmModeFreeProperty(props); - } - } - - return; -out_free_encoders: - if (kencoders){ - for (i = 0; i < koutput->count_encoders; i++) - drmModeFreeEncoder(kencoders[i]); - free(kencoders); - } - drmModeFreeConnector(koutput); - -} - -uint32_t find_clones(ScrnInfoPtr scrn, xf86OutputPtr output) -{ - drmmode_output_private_ptr drmmode_output = output->driver_private, clone_drmout; - int i; - xf86OutputPtr clone_output; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); - int index_mask = 0; - - if (drmmode_output->enc_clone_mask == 0) - return index_mask; - - for (i = 0; i < xf86_config->num_output; i++) { - clone_output = xf86_config->output[i]; - clone_drmout = clone_output->driver_private; - if (output == clone_output) - continue; - - if (clone_drmout->enc_mask == 0) - continue; - if (drmmode_output->enc_clone_mask == clone_drmout->enc_mask) - index_mask |= (1 << i); - } - return index_mask; -} - - -static void -drmmode_clones_init(ScrnInfoPtr scrn, drmmode_ptr drmmode) -{ - int i, j; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); - - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - drmmode_output_private_ptr drmmode_output; - - drmmode_output = output->driver_private; - drmmode_output->enc_clone_mask = 0xff; - /* and all the possible encoder clones for this output together */ - for (j = 0; j < drmmode_output->mode_output->count_encoders; j++) - { - int k; - for (k = 0; k < drmmode->mode_res->count_encoders; k++) { - if (drmmode->mode_res->encoders[k] == drmmode_output->mode_encoders[j]->encoder_id) - drmmode_output->enc_mask |= (1 << k); - } - - drmmode_output->enc_clone_mask &= drmmode_output->mode_encoders[j]->possible_clones; - } - } - - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - output->possible_clones = find_clones(scrn, output); - } -} - -/* returns height alignment in pixels */ -int drmmode_get_height_align(ScrnInfoPtr scrn, uint32_t tiling) -{ - RADEONInfoPtr info = RADEONPTR(scrn); - int height_align = 1; - - if (info->ChipFamily >= CHIP_FAMILY_R600) { - if (tiling & RADEON_TILING_MACRO) - height_align = info->num_channels * 8; - else if (tiling & RADEON_TILING_MICRO) - height_align = 8; - else - height_align = 8; - } else { - if (tiling) - height_align = 16; - else - height_align = 1; - } - return height_align; -} - -/* returns pitch alignment in pixels */ -int drmmode_get_pitch_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling) -{ - RADEONInfoPtr info = RADEONPTR(scrn); - int pitch_align = 1; - - if (info->ChipFamily >= CHIP_FAMILY_R600) { - if (tiling & RADEON_TILING_MACRO) { - /* general surface requirements */ - pitch_align = MAX(info->num_banks, - (((info->group_bytes / 8) / bpe) * info->num_banks)) * 8; - /* further restrictions for scanout */ - pitch_align = MAX(info->num_banks * 8, pitch_align); - } else if (tiling & RADEON_TILING_MICRO) { - /* general surface requirements */ - pitch_align = MAX(8, (info->group_bytes / (8 * bpe))); - /* further restrictions for scanout */ - pitch_align = MAX(info->group_bytes / bpe, pitch_align); - } else { - if (info->have_tiling_info) - /* linear aligned requirements */ - pitch_align = MAX(64, info->group_bytes / bpe); - else - /* default to 512 elements if we don't know the real - * group size otherwise the kernel may reject the CS - * if the group sizes don't match as the pitch won't - * be aligned properly. - */ - pitch_align = 512; - } - } else { - /* general surface requirements */ - if (tiling) - pitch_align = 256 / bpe; - else - pitch_align = 64; - } - return pitch_align; -} - -/* returns base alignment in bytes */ -int drmmode_get_base_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling) -{ - RADEONInfoPtr info = RADEONPTR(scrn); - int pixel_align = drmmode_get_pitch_align(scrn, bpe, tiling); - int height_align = drmmode_get_height_align(scrn, tiling); - int base_align = RADEON_GPU_PAGE_SIZE; - - if (info->ChipFamily >= CHIP_FAMILY_R600) { - if (tiling & RADEON_TILING_MACRO) - base_align = MAX(info->num_banks * info->num_channels * 8 * 8 * bpe, - pixel_align * bpe * height_align); - else { - if (info->have_tiling_info) - base_align = info->group_bytes; - else - /* default to 512 if we don't know the real - * group size otherwise the kernel may reject the CS - * if the group sizes don't match as the base won't - * be aligned properly. - */ - base_align = 512; - } - } - return base_align; -} - -static Bool -drmmode_xf86crtc_resize (ScrnInfoPtr scrn, int width, int height) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); - drmmode_crtc_private_ptr - drmmode_crtc = xf86_config->crtc[0]->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - RADEONInfoPtr info = RADEONPTR(scrn); - struct radeon_bo *old_front = NULL; - Bool ret; - ScreenPtr screen = screenInfo.screens[scrn->scrnIndex]; - uint32_t old_fb_id; - int i, pitch, old_width, old_height, old_pitch; - int screen_size; - int cpp = info->CurrentLayout.pixel_bytes; - struct radeon_bo *front_bo; - uint32_t tiling_flags = 0; - PixmapPtr ppix = screen->GetScreenPixmap(screen); - void *fb_shadow; - - if (scrn->virtualX == width && scrn->virtualY == height) - return TRUE; - - front_bo = info->front_bo; - radeon_cs_flush_indirect(scrn); - - if (front_bo) - radeon_bo_wait(front_bo); - - if (info->allowColorTiling) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - tiling_flags |= RADEON_TILING_MICRO; - else - tiling_flags |= RADEON_TILING_MACRO; - } - - pitch = RADEON_ALIGN(width, drmmode_get_pitch_align(scrn, cpp, tiling_flags)) * cpp; - height = RADEON_ALIGN(height, drmmode_get_height_align(scrn, tiling_flags)); - screen_size = RADEON_ALIGN(pitch * height, RADEON_GPU_PAGE_SIZE); - - xf86DrvMsg(scrn->scrnIndex, X_INFO, - "Allocate new frame buffer %dx%d stride %d\n", - width, height, pitch / cpp); - - old_width = scrn->virtualX; - old_height = scrn->virtualY; - old_pitch = scrn->displayWidth; - old_fb_id = drmmode->fb_id; - old_front = info->front_bo; - - scrn->virtualX = width; - scrn->virtualY = height; - scrn->displayWidth = pitch / cpp; - - info->front_bo = radeon_bo_open(info->bufmgr, 0, screen_size, 0, RADEON_GEM_DOMAIN_VRAM, 0); - if (!info->front_bo) - goto fail; - -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (cpp) { - case 4: - tiling_flags |= RADEON_TILING_SWAP_32BIT; - break; - case 2: - tiling_flags |= RADEON_TILING_SWAP_16BIT; - break; - } -#endif - if (tiling_flags) - radeon_bo_set_tiling(info->front_bo, tiling_flags, pitch); - - ret = drmModeAddFB(drmmode->fd, width, height, scrn->depth, - scrn->bitsPerPixel, pitch, - info->front_bo->handle, - &drmmode->fb_id); - if (ret) - goto fail; - - if (!info->r600_shadow_fb) { - radeon_set_pixmap_bo(ppix, info->front_bo); - screen->ModifyPixmapHeader(ppix, - width, height, -1, -1, pitch, NULL); - } else { - if (radeon_bo_map(info->front_bo, 1)) - goto fail; - fb_shadow = calloc(1, screen_size); - if (fb_shadow == NULL) - goto fail; - free(info->fb_shadow); - info->fb_shadow = fb_shadow; - screen->ModifyPixmapHeader(ppix, - width, height, -1, -1, pitch, - info->fb_shadow); - } -#if XORG_VERSION_CURRENT < XORG_VERSION_NUMERIC(1,9,99,1,0) - scrn->pixmapPrivate.ptr = ppix->devPrivate.ptr; -#endif - - for (i = 0; i < xf86_config->num_crtc; i++) { - xf86CrtcPtr crtc = xf86_config->crtc[i]; - - if (!crtc->enabled) - continue; - - drmmode_set_mode_major(crtc, &crtc->mode, - crtc->rotation, crtc->x, crtc->y); - } - - if (old_fb_id) - drmModeRmFB(drmmode->fd, old_fb_id); - if (old_front) - radeon_bo_unref(old_front); - - radeon_kms_update_vram_limit(scrn, screen_size); - return TRUE; - - fail: - if (info->front_bo) - radeon_bo_unref(info->front_bo); - info->front_bo = old_front; - scrn->virtualX = old_width; - scrn->virtualY = old_height; - scrn->displayWidth = old_pitch; - drmmode->fb_id = old_fb_id; - - return FALSE; -} - -static const xf86CrtcConfigFuncsRec drmmode_xf86crtc_config_funcs = { - drmmode_xf86crtc_resize -}; - -static void -drmmode_vblank_handler(int fd, unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, void *event_data) -{ - radeon_dri2_frame_event_handler(frame, tv_sec, tv_usec, event_data); -} - -#ifdef __linux__ -static void -drmmode_flip_handler(int fd, unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, void *event_data) -{ - drmmode_flipevtcarrier_ptr flipcarrier = event_data; - drmmode_flipdata_ptr flipdata = flipcarrier->flipdata; - drmmode_ptr drmmode = flipdata->drmmode; - - /* Is this the event whose info shall be delivered to higher level? */ - if (flipcarrier->dispatch_me) { - /* Yes: Cache msc, ust for later delivery. */ - flipdata->fe_frame = frame; - flipdata->fe_tv_sec = tv_sec; - flipdata->fe_tv_usec = tv_usec; - } - free(flipcarrier); - - /* Last crtc completed flip? */ - flipdata->flip_count--; - if (flipdata->flip_count > 0) - return; - - /* Release framebuffer */ - drmModeRmFB(drmmode->fd, flipdata->old_fb_id); - - if (flipdata->event_data == NULL) - return; - - /* Deliver cached msc, ust from reference crtc to flip event handler */ - radeon_dri2_flip_event_handler(flipdata->fe_frame, flipdata->fe_tv_sec, - flipdata->fe_tv_usec, flipdata->event_data); - - free(flipdata); -} -#endif - -static void -drm_wakeup_handler(pointer data, int err, pointer p) -{ - drmmode_ptr drmmode = data; - fd_set *read_mask = p; - - if (err >= 0 && FD_ISSET(drmmode->fd, read_mask)) { - drmHandleEvent(drmmode->fd, &drmmode->event_context); - } -} - -Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp) -{ - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - xf86CrtcConfigPtr xf86_config; - RADEONInfoPtr info = RADEONPTR(pScrn); - int i, num_dvi = 0, num_hdmi = 0; - - xf86CrtcConfigInit(pScrn, &drmmode_xf86crtc_config_funcs); - xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - - drmmode->scrn = pScrn; - drmmode->cpp = cpp; - drmmode->mode_res = drmModeGetResources(drmmode->fd); - if (!drmmode->mode_res) - return FALSE; - - xf86CrtcSetSizeRange(pScrn, 320, 200, drmmode->mode_res->max_width, drmmode->mode_res->max_height); - for (i = 0; i < drmmode->mode_res->count_crtcs; i++) - if (!xf86IsEntityShared(pScrn->entityList[0]) || pScrn->confScreen->device->screen == i) - drmmode_crtc_init(pScrn, drmmode, i); - - for (i = 0; i < drmmode->mode_res->count_connectors; i++) - drmmode_output_init(pScrn, drmmode, i, &num_dvi, &num_hdmi); - - /* workout clones */ - drmmode_clones_init(pScrn, drmmode); - - xf86InitialConfiguration(pScrn, TRUE); - - drmmode->event_context.version = DRM_EVENT_CONTEXT_VERSION; - drmmode->event_context.vblank_handler = drmmode_vblank_handler; -#ifdef __linux__ - drmmode->event_context.page_flip_handler = drmmode_flip_handler; -#endif - if (!pRADEONEnt->fd_wakeup_registered && info->dri->pKernelDRMVersion->version_minor >= 4) { - AddGeneralSocket(drmmode->fd); - RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA, - drm_wakeup_handler, drmmode); - pRADEONEnt->fd_wakeup_registered = TRUE; - } - - return TRUE; -} - -Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode, struct radeon_bo_manager *bufmgr) -{ - drmmode->bufmgr = bufmgr; - return TRUE; -} - - - -void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id, struct radeon_bo *bo) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); - xf86CrtcPtr crtc = xf86_config->crtc[id]; - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - - drmmode_crtc->cursor_bo = bo; -} - -void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y, int flags) -{ - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); - xf86OutputPtr output = config->output[config->compat_output]; - xf86CrtcPtr crtc = output->crtc; - - if (crtc && crtc->enabled) { - drmmode_set_mode_major(crtc, &crtc->mode, crtc->rotation, - x, y); - } -} - -Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode) -{ - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); - int c; - - drmmode_copy_fb(pScrn, drmmode); - - for (c = 0; c < config->num_crtc; c++) { - xf86CrtcPtr crtc = config->crtc[c]; - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - xf86OutputPtr output = NULL; - int o; - - /* Skip disabled CRTCs */ - if (!crtc->enabled) { - drmModeSetCrtc(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, - 0, 0, 0, NULL, 0, NULL); - continue; - } - - if (config->output[config->compat_output]->crtc == crtc) - output = config->output[config->compat_output]; - else - { - for (o = 0; o < config->num_output; o++) - if (config->output[o]->crtc == crtc) - { - output = config->output[o]; - break; - } - } - /* paranoia */ - if (!output) - continue; - - /* Mark that we'll need to re-set the mode for sure */ - memset(&crtc->mode, 0, sizeof(crtc->mode)); - if (!crtc->desiredMode.CrtcHDisplay) - { - DisplayModePtr mode = xf86OutputFindClosestMode (output, pScrn->currentMode); - - if (!mode) - return FALSE; - crtc->desiredMode = *mode; - crtc->desiredRotation = RR_Rotate_0; - crtc->desiredX = 0; - crtc->desiredY = 0; - } - - if (!crtc->funcs->set_mode_major(crtc, &crtc->desiredMode, crtc->desiredRotation, - crtc->desiredX, crtc->desiredY)) - return FALSE; - } - return TRUE; -} - -static void drmmode_load_palette(ScrnInfoPtr pScrn, int numColors, - int *indices, LOCO *colors, VisualPtr pVisual) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - uint16_t lut_r[256], lut_g[256], lut_b[256]; - int index, j, i; - int c; - - for (c = 0; c < xf86_config->num_crtc; c++) { - xf86CrtcPtr crtc = xf86_config->crtc[c]; - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - - for (i = 0 ; i < 256; i++) { - lut_r[i] = drmmode_crtc->lut_r[i] << 6; - lut_g[i] = drmmode_crtc->lut_g[i] << 6; - lut_b[i] = drmmode_crtc->lut_b[i] << 6; - } - - switch(pScrn->depth) { - case 15: - for (i = 0; i < numColors; i++) { - index = indices[i]; - for (j = 0; j < 8; j++) { - lut_r[index * 8 + j] = colors[index].red << 6; - lut_g[index * 8 + j] = colors[index].green << 6; - lut_b[index * 8 + j] = colors[index].blue << 6; - } - } - break; - case 16: - for (i = 0; i < numColors; i++) { - index = indices[i]; - - if (i <= 31) { - for (j = 0; j < 8; j++) { - lut_r[index * 8 + j] = colors[index].red << 6; - lut_b[index * 8 + j] = colors[index].blue << 6; - } - } - - for (j = 0; j < 4; j++) { - lut_g[index * 4 + j] = colors[index].green << 6; - } - } - break; - default: - for (i = 0; i < numColors; i++) { - index = indices[i]; - lut_r[index] = colors[index].red << 6; - lut_g[index] = colors[index].green << 6; - lut_b[index] = colors[index].blue << 6; - } - break; - } - - /* Make the change through RandR */ -#ifdef RANDR_12_INTERFACE - if (crtc->randr_crtc) - RRCrtcGammaSet(crtc->randr_crtc, lut_r, lut_g, lut_b); - else -#endif - crtc->funcs->gamma_set(crtc, lut_r, lut_g, lut_b, 256); - } -} - -Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn) -{ - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "Initializing kms color map\n"); - if (!miCreateDefColormap(pScreen)) - return FALSE; - /* all radeons support 10 bit CLUTs */ - if (!xf86HandleColormaps(pScreen, 256, 10, - drmmode_load_palette, NULL, - CMAP_PALETTED_TRUECOLOR -#if 0 /* This option messes up text mode! (eich@suse.de) */ - | CMAP_LOAD_EVEN_IF_OFFSCREEN -#endif - | CMAP_RELOAD_ON_MODE_SWITCH)) - return FALSE; - return TRUE; -} - -#ifdef HAVE_LIBUDEV -static void -drmmode_handle_uevents(int fd, void *closure) -{ - drmmode_ptr drmmode = closure; - ScrnInfoPtr scrn = drmmode->scrn; - struct udev_device *dev; - dev = udev_monitor_receive_device(drmmode->uevent_monitor); - if (!dev) - return; - - RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE); - udev_device_unref(dev); -} -#endif - -void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode) -{ -#ifdef HAVE_LIBUDEV - struct udev *u; - struct udev_monitor *mon; - - u = udev_new(); - if (!u) - return; - mon = udev_monitor_new_from_netlink(u, "udev"); - if (!mon) { - udev_unref(u); - return; - } - - if (udev_monitor_filter_add_match_subsystem_devtype(mon, - "drm", - "drm_minor") < 0 || - udev_monitor_enable_receiving(mon) < 0) { - udev_monitor_unref(mon); - udev_unref(u); - return; - } - - drmmode->uevent_handler = - xf86AddGeneralHandler(udev_monitor_get_fd(mon), - drmmode_handle_uevents, - drmmode); - - drmmode->uevent_monitor = mon; -#endif -} - -void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode) -{ -#ifdef HAVE_LIBUDEV - if (drmmode->uevent_handler) { - struct udev *u = udev_monitor_get_udev(drmmode->uevent_monitor); - xf86RemoveGeneralHandler(drmmode->uevent_handler); - - udev_monitor_unref(drmmode->uevent_monitor); - udev_unref(u); - } -#endif -} - -#ifdef __linux__ -Bool radeon_do_pageflip(ScrnInfoPtr scrn, struct radeon_bo *new_front, void *data, int ref_crtc_hw_id) -{ - RADEONInfoPtr info = RADEONPTR(scrn); - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); - drmmode_crtc_private_ptr drmmode_crtc = config->crtc[0]->driver_private; - drmmode_ptr drmmode = drmmode_crtc->drmmode; - unsigned int pitch; - int i, old_fb_id; - uint32_t tiling_flags = 0; - int height, emitted = 0; - drmmode_flipdata_ptr flipdata; - drmmode_flipevtcarrier_ptr flipcarrier; - - if (info->allowColorTiling) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - tiling_flags |= RADEON_TILING_MICRO; - else - tiling_flags |= RADEON_TILING_MACRO; - } - - pitch = RADEON_ALIGN(scrn->displayWidth, drmmode_get_pitch_align(scrn, info->CurrentLayout.pixel_bytes, tiling_flags)) * - info->CurrentLayout.pixel_bytes; - height = RADEON_ALIGN(scrn->virtualY, drmmode_get_height_align(scrn, tiling_flags)); - - /* - * Create a new handle for the back buffer - */ - old_fb_id = drmmode->fb_id; - if (drmModeAddFB(drmmode->fd, scrn->virtualX, height, - scrn->depth, scrn->bitsPerPixel, pitch, - new_front->handle, &drmmode->fb_id)) - goto error_out; - - flipdata = calloc(1, sizeof(drmmode_flipdata_rec)); - if (!flipdata) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "flip queue: data alloc failed.\n"); - goto error_undo; - } - /* - * Queue flips on all enabled CRTCs - * Note that if/when we get per-CRTC buffers, we'll have to update this. - * Right now it assumes a single shared fb across all CRTCs, with the - * kernel fixing up the offset of each CRTC as necessary. - * - * Also, flips queued on disabled or incorrectly configured displays - * may never complete; this is a configuration error. - */ - - flipdata->event_data = data; - flipdata->drmmode = drmmode; - - for (i = 0; i < config->num_crtc; i++) { - if (!config->crtc[i]->enabled) - continue; - - flipdata->flip_count++; - drmmode_crtc = config->crtc[i]->driver_private; - - flipcarrier = calloc(1, sizeof(drmmode_flipevtcarrier_rec)); - if (!flipcarrier) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "flip queue: carrier alloc failed.\n"); - if (emitted == 0) - free(flipdata); - goto error_undo; - } - - /* Only the reference crtc will finally deliver its page flip - * completion event. All other crtc's events will be discarded. - */ - flipcarrier->dispatch_me = (drmmode_crtc->hw_id == ref_crtc_hw_id); - flipcarrier->flipdata = flipdata; - - if (drmModePageFlip(drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, - drmmode->fb_id, DRM_MODE_PAGE_FLIP_EVENT, flipcarrier)) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "flip queue failed: %s\n", strerror(errno)); - free(flipcarrier); - if (emitted == 0) - free(flipdata); - goto error_undo; - } - emitted++; - } - - flipdata->old_fb_id = old_fb_id; - return TRUE; - -error_undo: - drmModeRmFB(drmmode->fd, drmmode->fb_id); - drmmode->fb_id = old_fb_id; - -error_out: - xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Page flip failed: %s\n", - strerror(errno)); - return FALSE; -} -#endif -#endif diff --git a/driver/xf86-video-ati/src/drmmode_display.h b/driver/xf86-video-ati/src/drmmode_display.h deleted file mode 100644 index eb271f5f5..000000000 --- a/driver/xf86-video-ati/src/drmmode_display.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright © 2007 Red Hat, 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 (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 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. - * - * Authors: - * Dave Airlie - * - */ -#ifndef DRMMODE_DISPLAY_H -#define DRMMODE_DISPLAY_H - -#ifdef XF86DRM_MODE - -#include "xf86drmMode.h" -#ifdef HAVE_LIBUDEV -#include "libudev.h" -#endif - -#include "radeon_probe.h" - -typedef struct { - int fd; - unsigned fb_id; - drmModeResPtr mode_res; - drmModeFBPtr mode_fb; - int cpp; - struct radeon_bo_manager *bufmgr; - ScrnInfoPtr scrn; -#ifdef HAVE_LIBUDEV - struct udev_monitor *uevent_monitor; - InputHandlerProc uevent_handler; -#endif - drmEventContext event_context; -} drmmode_rec, *drmmode_ptr; - -typedef struct { - drmmode_ptr drmmode; - unsigned old_fb_id; - int flip_count; - void *event_data; - unsigned int fe_frame; - unsigned int fe_tv_sec; - unsigned int fe_tv_usec; -} drmmode_flipdata_rec, *drmmode_flipdata_ptr; - -typedef struct { - drmmode_flipdata_ptr flipdata; - Bool dispatch_me; -} drmmode_flipevtcarrier_rec, *drmmode_flipevtcarrier_ptr; - -typedef struct { - drmmode_ptr drmmode; - drmModeCrtcPtr mode_crtc; - int hw_id; - struct radeon_bo *cursor_bo; - struct radeon_bo *rotate_bo; - unsigned rotate_fb_id; - uint16_t lut_r[256], lut_g[256], lut_b[256]; -} drmmode_crtc_private_rec, *drmmode_crtc_private_ptr; - -typedef struct { - drmModePropertyPtr mode_prop; - uint64_t value; - int num_atoms; /* if range prop, num_atoms == 1; if enum prop, num_atoms == num_enums + 1 */ - Atom *atoms; -} drmmode_prop_rec, *drmmode_prop_ptr; - - -typedef struct { - drmmode_ptr drmmode; - int output_id; - drmModeConnectorPtr mode_output; - drmModeEncoderPtr *mode_encoders; - drmModePropertyBlobPtr edid_blob; - int dpms_enum_id; - int num_props; - drmmode_prop_ptr props; - int enc_mask; - int enc_clone_mask; -} drmmode_output_private_rec, *drmmode_output_private_ptr; - - -extern Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp); -extern Bool drmmode_set_bufmgr(ScrnInfoPtr pScrn, drmmode_ptr drmmode, struct radeon_bo_manager *bufmgr); -extern void drmmode_set_cursor(ScrnInfoPtr scrn, drmmode_ptr drmmode, int id, struct radeon_bo *bo); -void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y, int flags); -extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode); -extern void drmmode_copy_fb(ScrnInfoPtr pScrn, drmmode_ptr drmmode); -extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn); - -extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode); -extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode); - -extern int drmmode_get_height_align(ScrnInfoPtr scrn, uint32_t tiling); -extern int drmmode_get_pitch_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling); -extern int drmmode_get_base_align(ScrnInfoPtr scrn, int bpe, uint32_t tiling); - -Bool radeon_do_pageflip(ScrnInfoPtr scrn, struct radeon_bo *new_front, void *data, int ref_crtc_hw_id); - -#endif - -#endif diff --git a/driver/xf86-video-ati/src/evergreen_accel.c b/driver/xf86-video-ati/src/evergreen_accel.c deleted file mode 100644 index 5c95e201f..000000000 --- a/driver/xf86-video-ati/src/evergreen_accel.c +++ /dev/null @@ -1,1366 +0,0 @@ -/* - * Copyright 2010 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 (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 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. - * - * Authors: Alex Deucher - * - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef XF86DRM_MODE - -#include "xf86.h" - -#include - -#include "radeon.h" -#include "evergreen_shader.h" -#include "radeon_reg.h" -#include "evergreen_reg.h" -#include "evergreen_state.h" - -#include "radeon_drm.h" -#include "radeon_vbo.h" -#include "radeon_exa_shared.h" - -static const uint32_t EVERGREEN_ROP[16] = { - RADEON_ROP3_ZERO, /* GXclear */ - RADEON_ROP3_DSa, /* Gxand */ - RADEON_ROP3_SDna, /* GXandReverse */ - RADEON_ROP3_S, /* GXcopy */ - RADEON_ROP3_DSna, /* GXandInverted */ - RADEON_ROP3_D, /* GXnoop */ - RADEON_ROP3_DSx, /* GXxor */ - RADEON_ROP3_DSo, /* GXor */ - RADEON_ROP3_DSon, /* GXnor */ - RADEON_ROP3_DSxn, /* GXequiv */ - RADEON_ROP3_Dn, /* GXinvert */ - RADEON_ROP3_SDno, /* GXorReverse */ - RADEON_ROP3_Sn, /* GXcopyInverted */ - RADEON_ROP3_DSno, /* GXorInverted */ - RADEON_ROP3_DSan, /* GXnand */ - RADEON_ROP3_ONE, /* GXset */ -}; - -void -evergreen_start_3d(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - BEGIN_BATCH(3); - PACK3(IT_CONTEXT_CONTROL, 2); - E32(0x80000000); - E32(0x80000000); - END_BATCH(); - -} - -/* - * Setup of functional groups - */ - -// asic stack/thread/gpr limits - need to query the drm -static void -evergreen_sq_setup(ScrnInfoPtr pScrn, sq_config_t *sq_conf) -{ - uint32_t sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2, sq_gpr_resource_mgmt_3; - uint32_t sq_thread_resource_mgmt, sq_thread_resource_mgmt_2; - uint32_t sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2, sq_stack_resource_mgmt_3; - RADEONInfoPtr info = RADEONPTR(pScrn); - - if ((info->ChipFamily == CHIP_FAMILY_CEDAR) || - (info->ChipFamily == CHIP_FAMILY_PALM) || - (info->ChipFamily == CHIP_FAMILY_SUMO) || - (info->ChipFamily == CHIP_FAMILY_SUMO2) || - (info->ChipFamily == CHIP_FAMILY_CAICOS)) - sq_config = 0; - else - sq_config = VC_ENABLE_bit; - - sq_config |= (EXPORT_SRC_C_bit | - (sq_conf->cs_prio << CS_PRIO_shift) | - (sq_conf->ls_prio << LS_PRIO_shift) | - (sq_conf->hs_prio << HS_PRIO_shift) | - (sq_conf->ps_prio << PS_PRIO_shift) | - (sq_conf->vs_prio << VS_PRIO_shift) | - (sq_conf->gs_prio << GS_PRIO_shift) | - (sq_conf->es_prio << ES_PRIO_shift)); - - sq_gpr_resource_mgmt_1 = ((sq_conf->num_ps_gprs << NUM_PS_GPRS_shift) | - (sq_conf->num_vs_gprs << NUM_VS_GPRS_shift) | - (sq_conf->num_temp_gprs << NUM_CLAUSE_TEMP_GPRS_shift)); - sq_gpr_resource_mgmt_2 = ((sq_conf->num_gs_gprs << NUM_GS_GPRS_shift) | - (sq_conf->num_es_gprs << NUM_ES_GPRS_shift)); - sq_gpr_resource_mgmt_3 = ((sq_conf->num_hs_gprs << NUM_HS_GPRS_shift) | - (sq_conf->num_ls_gprs << NUM_LS_GPRS_shift)); - - sq_thread_resource_mgmt = ((sq_conf->num_ps_threads << NUM_PS_THREADS_shift) | - (sq_conf->num_vs_threads << NUM_VS_THREADS_shift) | - (sq_conf->num_gs_threads << NUM_GS_THREADS_shift) | - (sq_conf->num_es_threads << NUM_ES_THREADS_shift)); - sq_thread_resource_mgmt_2 = ((sq_conf->num_hs_threads << NUM_HS_THREADS_shift) | - (sq_conf->num_ls_threads << NUM_LS_THREADS_shift)); - - sq_stack_resource_mgmt_1 = ((sq_conf->num_ps_stack_entries << NUM_PS_STACK_ENTRIES_shift) | - (sq_conf->num_vs_stack_entries << NUM_VS_STACK_ENTRIES_shift)); - - sq_stack_resource_mgmt_2 = ((sq_conf->num_gs_stack_entries << NUM_GS_STACK_ENTRIES_shift) | - (sq_conf->num_es_stack_entries << NUM_ES_STACK_ENTRIES_shift)); - - sq_stack_resource_mgmt_3 = ((sq_conf->num_hs_stack_entries << NUM_HS_STACK_ENTRIES_shift) | - (sq_conf->num_ls_stack_entries << NUM_LS_STACK_ENTRIES_shift)); - - BEGIN_BATCH(16); - /* disable dyn gprs */ - EREG(SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); - PACK0(SQ_CONFIG, 4); - E32(sq_config); - E32(sq_gpr_resource_mgmt_1); - E32(sq_gpr_resource_mgmt_2); - E32(sq_gpr_resource_mgmt_3); - PACK0(SQ_THREAD_RESOURCE_MGMT, 5); - E32(sq_thread_resource_mgmt); - E32(sq_thread_resource_mgmt_2); - E32(sq_stack_resource_mgmt_1); - E32(sq_stack_resource_mgmt_2); - E32(sq_stack_resource_mgmt_3); - END_BATCH(); -} - -/* cayman has some minor differences in CB_COLOR*_INFO and _ATTRIB, but none that - * we use here. - */ -void -evergreen_set_render_target(ScrnInfoPtr pScrn, cb_config_t *cb_conf, uint32_t domain) -{ - uint32_t cb_color_info, cb_color_attrib = 0, cb_color_dim; - int pitch, slice, h; - RADEONInfoPtr info = RADEONPTR(pScrn); - - cb_color_info = ((cb_conf->endian << ENDIAN_shift) | - (cb_conf->format << CB_COLOR0_INFO__FORMAT_shift) | - (cb_conf->array_mode << CB_COLOR0_INFO__ARRAY_MODE_shift) | - (cb_conf->number_type << NUMBER_TYPE_shift) | - (cb_conf->comp_swap << COMP_SWAP_shift) | - (cb_conf->source_format << SOURCE_FORMAT_shift) | - (cb_conf->resource_type << RESOURCE_TYPE_shift)); - if (cb_conf->blend_clamp) - cb_color_info |= BLEND_CLAMP_bit; - if (cb_conf->fast_clear) - cb_color_info |= FAST_CLEAR_bit; - if (cb_conf->compression) - cb_color_info |= COMPRESSION_bit; - if (cb_conf->blend_bypass) - cb_color_info |= BLEND_BYPASS_bit; - if (cb_conf->simple_float) - cb_color_info |= SIMPLE_FLOAT_bit; - if (cb_conf->round_mode) - cb_color_info |= CB_COLOR0_INFO__ROUND_MODE_bit; - if (cb_conf->tile_compact) - cb_color_info |= CB_COLOR0_INFO__TILE_COMPACT_bit; - if (cb_conf->rat) - cb_color_info |= RAT_bit; - - /* bit 4 needs to be set for linear and depth/stencil surfaces */ - if (cb_conf->non_disp_tiling) - cb_color_attrib |= CB_COLOR0_ATTRIB__NON_DISP_TILING_ORDER_bit; - - pitch = (cb_conf->w / 8) - 1; - h = RADEON_ALIGN(cb_conf->h, 8); - slice = ((cb_conf->w * h) / 64) - 1; - - switch (cb_conf->resource_type) { - case BUFFER: - /* number of elements in the surface */ - cb_color_dim = pitch * slice; - break; - default: - /* w/h of the surface */ - cb_color_dim = (((cb_conf->w - 1) << WIDTH_MAX_shift) | - ((cb_conf->h - 1) << HEIGHT_MAX_shift)); - break; - } - - BEGIN_BATCH(3 + 2); - EREG(CB_COLOR0_BASE + (0x3c * cb_conf->id), (cb_conf->base >> 8)); - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - - /* Set CMASK & FMASK buffer to the offset of color buffer as - * we don't use those this shouldn't cause any issue and we - * then have a valid cmd stream - */ - BEGIN_BATCH(3 + 2); - EREG(CB_COLOR0_CMASK + (0x3c * cb_conf->id), (0 >> 8)); - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - BEGIN_BATCH(3 + 2); - EREG(CB_COLOR0_FMASK + (0x3c * cb_conf->id), (0 >> 8)); - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - - /* tiling config */ - BEGIN_BATCH(3 + 2); - EREG(CB_COLOR0_ATTRIB + (0x3c * cb_conf->id), cb_color_attrib); - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - BEGIN_BATCH(3 + 2); - EREG(CB_COLOR0_INFO + (0x3c * cb_conf->id), cb_color_info); - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - - BEGIN_BATCH(33); - EREG(CB_COLOR0_PITCH + (0x3c * cb_conf->id), pitch); - EREG(CB_COLOR0_SLICE + (0x3c * cb_conf->id), slice); - EREG(CB_COLOR0_VIEW + (0x3c * cb_conf->id), 0); - EREG(CB_COLOR0_DIM + (0x3c * cb_conf->id), cb_color_dim); - EREG(CB_COLOR0_CMASK_SLICE + (0x3c * cb_conf->id), 0); - EREG(CB_COLOR0_FMASK_SLICE + (0x3c * cb_conf->id), 0); - PACK0(CB_COLOR0_CLEAR_WORD0 + (0x3c * cb_conf->id), 4); - E32(0); - E32(0); - E32(0); - E32(0); - EREG(CB_TARGET_MASK, (cb_conf->pmask << TARGET0_ENABLE_shift)); - EREG(CB_COLOR_CONTROL, (EVERGREEN_ROP[cb_conf->rop] | - (CB_NORMAL << CB_COLOR_CONTROL__MODE_shift))); - EREG(CB_BLEND0_CONTROL, cb_conf->blendcntl); - END_BATCH(); - -} - -static void -evergreen_cp_set_surface_sync(ScrnInfoPtr pScrn, uint32_t sync_type, - uint32_t size, uint64_t mc_addr, - struct radeon_bo *bo, uint32_t rdomains, uint32_t wdomain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t cp_coher_size; - if (size == 0xffffffff) - cp_coher_size = 0xffffffff; - else - cp_coher_size = ((size + 255) >> 8); - - BEGIN_BATCH(5 + 2); - PACK3(IT_SURFACE_SYNC, 4); - E32(sync_type); - E32(cp_coher_size); - E32((mc_addr >> 8)); - E32(10); /* poll interval */ - RELOC_BATCH(bo, rdomains, wdomain); - END_BATCH(); -} - -/* inserts a wait for vline in the command stream */ -void evergreen_cp_wait_vline_sync(ScrnInfoPtr pScrn, PixmapPtr pPix, - xf86CrtcPtr crtc, int start, int stop) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - drmmode_crtc_private_ptr drmmode_crtc; - uint32_t offset; - - if (!crtc) - return; - - drmmode_crtc = crtc->driver_private; - - if (stop < start) - return; - - if (!crtc->enabled) - return; - - if (info->cs) { - if (pPix != pScrn->pScreen->GetScreenPixmap(pScrn->pScreen)) - return; - } else { -#ifdef USE_EXA - if (info->useEXA) - offset = exaGetPixmapOffset(pPix); - else -#endif - offset = pPix->devPrivate.ptr - info->FB; - - /* if drawing to front buffer */ - if (offset != 0) - return; - } - - start = max(start, 0); - stop = min(stop, crtc->mode.VDisplay); - - if (start > crtc->mode.VDisplay) - return; - - /* on r5xx+ vline starts at viewport_y */ - start += crtc->y; - stop += crtc->y; - - BEGIN_BATCH(11); - /* set the VLINE range */ - EREG(EVERGREEN_VLINE_START_END, /* this is just a marker */ - (start << EVERGREEN_VLINE_START_SHIFT) | - (stop << EVERGREEN_VLINE_END_SHIFT)); - - /* tell the CP to poll the VLINE state register */ - PACK3(IT_WAIT_REG_MEM, 6); - E32(IT_WAIT_REG | IT_WAIT_EQ); - E32(IT_WAIT_ADDR(EVERGREEN_VLINE_STATUS)); - E32(0); - E32(0); // Ref value - E32(EVERGREEN_VLINE_STAT); // Mask - E32(10); // Wait interval - /* add crtc reloc */ - PACK3(IT_NOP, 1); - E32(drmmode_crtc->mode_crtc->crtc_id); - END_BATCH(); -} - -void -evergreen_set_spi(ScrnInfoPtr pScrn, int vs_export_count, int num_interp) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - BEGIN_BATCH(8); - /* Interpolator setup */ - EREG(SPI_VS_OUT_CONFIG, (vs_export_count << VS_EXPORT_COUNT_shift)); - PACK0(SPI_PS_IN_CONTROL_0, 3); - E32(((num_interp << NUM_INTERP_shift) | - LINEAR_GRADIENT_ENA_bit)); // SPI_PS_IN_CONTROL_0 - E32(0); // SPI_PS_IN_CONTROL_1 - E32(0); // SPI_INTERP_CONTROL_0 - END_BATCH(); -} - -void -evergreen_fs_setup(ScrnInfoPtr pScrn, shader_config_t *fs_conf, uint32_t domain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t sq_pgm_resources; - - sq_pgm_resources = ((fs_conf->num_gprs << NUM_GPRS_shift) | - (fs_conf->stack_size << STACK_SIZE_shift)); - - if (fs_conf->dx10_clamp) - sq_pgm_resources |= DX10_CLAMP_bit; - - BEGIN_BATCH(3 + 2); - EREG(SQ_PGM_START_FS, fs_conf->shader_addr >> 8); - RELOC_BATCH(fs_conf->bo, domain, 0); - END_BATCH(); - - BEGIN_BATCH(3); - EREG(SQ_PGM_RESOURCES_FS, sq_pgm_resources); - END_BATCH(); -} - -/* cayman has some minor differences in SQ_PGM_RESOUCES_VS and _RESOURCES_2_VS, - * but none that we use here. - */ -void -evergreen_vs_setup(ScrnInfoPtr pScrn, shader_config_t *vs_conf, uint32_t domain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t sq_pgm_resources, sq_pgm_resources_2; - - sq_pgm_resources = ((vs_conf->num_gprs << NUM_GPRS_shift) | - (vs_conf->stack_size << STACK_SIZE_shift)); - - if (vs_conf->dx10_clamp) - sq_pgm_resources |= DX10_CLAMP_bit; - if (vs_conf->uncached_first_inst) - sq_pgm_resources |= UNCACHED_FIRST_INST_bit; - - sq_pgm_resources_2 = ((vs_conf->single_round << SINGLE_ROUND_shift) | - (vs_conf->double_round << DOUBLE_ROUND_shift)); - - if (vs_conf->allow_sdi) - sq_pgm_resources_2 |= ALLOW_SINGLE_DENORM_IN_bit; - if (vs_conf->allow_sd0) - sq_pgm_resources_2 |= ALLOW_SINGLE_DENORM_OUT_bit; - if (vs_conf->allow_ddi) - sq_pgm_resources_2 |= ALLOW_DOUBLE_DENORM_IN_bit; - if (vs_conf->allow_ddo) - sq_pgm_resources_2 |= ALLOW_DOUBLE_DENORM_OUT_bit; - - /* flush SQ cache */ - evergreen_cp_set_surface_sync(pScrn, SH_ACTION_ENA_bit, - vs_conf->shader_size, vs_conf->shader_addr, - vs_conf->bo, domain, 0); - - BEGIN_BATCH(3 + 2); - EREG(SQ_PGM_START_VS, vs_conf->shader_addr >> 8); - RELOC_BATCH(vs_conf->bo, domain, 0); - END_BATCH(); - - BEGIN_BATCH(4); - PACK0(SQ_PGM_RESOURCES_VS, 2); - E32(sq_pgm_resources); - E32(sq_pgm_resources_2); - END_BATCH(); -} - -/* cayman has some minor differences in SQ_PGM_RESOUCES_PS and _RESOURCES_2_PS, - * but none that we use here. - */ -void -evergreen_ps_setup(ScrnInfoPtr pScrn, shader_config_t *ps_conf, uint32_t domain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t sq_pgm_resources, sq_pgm_resources_2; - - sq_pgm_resources = ((ps_conf->num_gprs << NUM_GPRS_shift) | - (ps_conf->stack_size << STACK_SIZE_shift)); - - if (ps_conf->dx10_clamp) - sq_pgm_resources |= DX10_CLAMP_bit; - if (ps_conf->uncached_first_inst) - sq_pgm_resources |= UNCACHED_FIRST_INST_bit; - if (ps_conf->clamp_consts) - sq_pgm_resources |= CLAMP_CONSTS_bit; - - sq_pgm_resources_2 = ((ps_conf->single_round << SINGLE_ROUND_shift) | - (ps_conf->double_round << DOUBLE_ROUND_shift)); - - if (ps_conf->allow_sdi) - sq_pgm_resources_2 |= ALLOW_SINGLE_DENORM_IN_bit; - if (ps_conf->allow_sd0) - sq_pgm_resources_2 |= ALLOW_SINGLE_DENORM_OUT_bit; - if (ps_conf->allow_ddi) - sq_pgm_resources_2 |= ALLOW_DOUBLE_DENORM_IN_bit; - if (ps_conf->allow_ddo) - sq_pgm_resources_2 |= ALLOW_DOUBLE_DENORM_OUT_bit; - - /* flush SQ cache */ - evergreen_cp_set_surface_sync(pScrn, SH_ACTION_ENA_bit, - ps_conf->shader_size, ps_conf->shader_addr, - ps_conf->bo, domain, 0); - - BEGIN_BATCH(3 + 2); - EREG(SQ_PGM_START_PS, ps_conf->shader_addr >> 8); - RELOC_BATCH(ps_conf->bo, domain, 0); - END_BATCH(); - - BEGIN_BATCH(5); - PACK0(SQ_PGM_RESOURCES_PS, 3); - E32(sq_pgm_resources); - E32(sq_pgm_resources_2); - E32(ps_conf->export_mode); - END_BATCH(); -} - -void -evergreen_set_alu_consts(ScrnInfoPtr pScrn, const_config_t *const_conf, uint32_t domain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - /* size reg is units of 16 consts (4 dwords each) */ - uint32_t size = const_conf->size_bytes >> 8; - - if (size == 0) - size = 1; - - /* flush SQ cache */ - evergreen_cp_set_surface_sync(pScrn, SH_ACTION_ENA_bit, - const_conf->size_bytes, const_conf->const_addr, - const_conf->bo, domain, 0); - - switch (const_conf->type) { - case SHADER_TYPE_VS: - BEGIN_BATCH(3); - EREG(SQ_ALU_CONST_BUFFER_SIZE_VS_0, size); - END_BATCH(); - BEGIN_BATCH(3 + 2); - EREG(SQ_ALU_CONST_CACHE_VS_0, const_conf->const_addr >> 8); - RELOC_BATCH(const_conf->bo, domain, 0); - END_BATCH(); - break; - case SHADER_TYPE_PS: - BEGIN_BATCH(3); - EREG(SQ_ALU_CONST_BUFFER_SIZE_PS_0, size); - END_BATCH(); - BEGIN_BATCH(3 + 2); - EREG(SQ_ALU_CONST_CACHE_PS_0, const_conf->const_addr >> 8); - RELOC_BATCH(const_conf->bo, domain, 0); - END_BATCH(); - break; - default: - ErrorF("Unsupported const type %d\n", const_conf->type); - break; - } - -} - -void -evergreen_set_bool_consts(ScrnInfoPtr pScrn, int offset, uint32_t val) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - /* bool register order is: ps, vs/es, gs, hs, ls, cs; one register each - * 1 bits per bool; 32 bools each for ps, vs/es, gs, hs, ls, cs. - */ - BEGIN_BATCH(3); - EREG(SQ_BOOL_CONST + offset * SQ_BOOL_CONST_offset, val); - END_BATCH(); -} - -/* cayman has some minor differences in SQ_VTX_CONSTANT_WORD2_0 and _WORD3_0, - * but none that we use here. - */ -static void -evergreen_set_vtx_resource(ScrnInfoPtr pScrn, vtx_resource_t *res, uint32_t domain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - uint32_t sq_vtx_constant_word2, sq_vtx_constant_word3, sq_vtx_constant_word4; - - sq_vtx_constant_word2 = ((((res->vb_addr) >> 32) & BASE_ADDRESS_HI_mask) | - ((res->vtx_size_dw << 2) << SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift) | - (res->format << SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift) | - (res->num_format_all << SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift) | - (res->endian << SQ_VTX_CONSTANT_WORD2_0__ENDIAN_SWAP_shift)); - if (res->clamp_x) - sq_vtx_constant_word2 |= SQ_VTX_CONSTANT_WORD2_0__CLAMP_X_bit; - - if (res->format_comp_all) - sq_vtx_constant_word2 |= SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit; - - if (res->srf_mode_all) - sq_vtx_constant_word2 |= SQ_VTX_CONSTANT_WORD2_0__SRF_MODE_ALL_bit; - - sq_vtx_constant_word3 = ((res->dst_sel_x << SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_shift) | - (res->dst_sel_y << SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_shift) | - (res->dst_sel_z << SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_shift) | - (res->dst_sel_w << SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_shift)); - - if (res->uncached) - sq_vtx_constant_word3 |= SQ_VTX_CONSTANT_WORD3_0__UNCACHED_bit; - - /* XXX ??? */ - sq_vtx_constant_word4 = 0; - - /* flush vertex cache */ - if ((info->ChipFamily == CHIP_FAMILY_CEDAR) || - (info->ChipFamily == CHIP_FAMILY_PALM) || - (info->ChipFamily == CHIP_FAMILY_SUMO) || - (info->ChipFamily == CHIP_FAMILY_SUMO2) || - (info->ChipFamily == CHIP_FAMILY_CAICOS) || - (info->ChipFamily == CHIP_FAMILY_CAYMAN)) - evergreen_cp_set_surface_sync(pScrn, TC_ACTION_ENA_bit, - accel_state->vbo.vb_offset, accel_state->vbo.vb_mc_addr, - res->bo, - domain, 0); - else - evergreen_cp_set_surface_sync(pScrn, VC_ACTION_ENA_bit, - accel_state->vbo.vb_offset, accel_state->vbo.vb_mc_addr, - res->bo, - domain, 0); - - BEGIN_BATCH(10 + 2); - PACK0(SQ_FETCH_RESOURCE + res->id * SQ_FETCH_RESOURCE_offset, 8); - E32(res->vb_addr & 0xffffffff); // 0: BASE_ADDRESS - E32((res->vtx_num_entries << 2) - 1); // 1: SIZE - E32(sq_vtx_constant_word2); // 2: BASE_HI, STRIDE, CLAMP, FORMAT, ENDIAN - E32(sq_vtx_constant_word3); // 3: swizzles - E32(sq_vtx_constant_word4); // 4: num elements - E32(0); // 5: n/a - E32(0); // 6: n/a - E32(SQ_TEX_VTX_VALID_BUFFER << SQ_VTX_CONSTANT_WORD7_0__TYPE_shift); // 7: TYPE - RELOC_BATCH(res->bo, domain, 0); - END_BATCH(); -} - -/* cayman has some minor differences in SQ_TEX_CONSTANT_WORD0_0 and _WORD4_0, - * but none that we use here. - */ -void -evergreen_set_tex_resource(ScrnInfoPtr pScrn, tex_resource_t *tex_res, uint32_t domain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t sq_tex_resource_word0, sq_tex_resource_word1, sq_tex_resource_word4; - uint32_t sq_tex_resource_word5, sq_tex_resource_word6, sq_tex_resource_word7; - - sq_tex_resource_word0 = (tex_res->dim << DIM_shift); - - if (tex_res->w) - sq_tex_resource_word0 |= (((((tex_res->pitch + 7) >> 3) - 1) << PITCH_shift) | - ((tex_res->w - 1) << TEX_WIDTH_shift)); - - if (tex_res->tile_type) - sq_tex_resource_word0 |= SQ_TEX_RESOURCE_WORD0_0__NON_DISP_TILING_ORDER_bit; - - sq_tex_resource_word1 = (tex_res->array_mode << SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift); - - if (tex_res->h) - sq_tex_resource_word1 |= ((tex_res->h - 1) << TEX_HEIGHT_shift); - if (tex_res->depth) - sq_tex_resource_word1 |= ((tex_res->depth - 1) << TEX_DEPTH_shift); - - sq_tex_resource_word4 = ((tex_res->format_comp_x << FORMAT_COMP_X_shift) | - (tex_res->format_comp_y << FORMAT_COMP_Y_shift) | - (tex_res->format_comp_z << FORMAT_COMP_Z_shift) | - (tex_res->format_comp_w << FORMAT_COMP_W_shift) | - (tex_res->num_format_all << SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift) | - (tex_res->endian << SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift) | - (tex_res->dst_sel_x << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift) | - (tex_res->dst_sel_y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift) | - (tex_res->dst_sel_z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift) | - (tex_res->dst_sel_w << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift) | - (tex_res->base_level << BASE_LEVEL_shift)); - - if (tex_res->srf_mode_all) - sq_tex_resource_word4 |= SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit; - if (tex_res->force_degamma) - sq_tex_resource_word4 |= SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit; - - sq_tex_resource_word5 = ((tex_res->last_level << LAST_LEVEL_shift) | - (tex_res->base_array << BASE_ARRAY_shift) | - (tex_res->last_array << LAST_ARRAY_shift)); - - sq_tex_resource_word6 = ((tex_res->min_lod << SQ_TEX_RESOURCE_WORD6_0__MIN_LOD_shift) | - (tex_res->perf_modulation << PERF_MODULATION_shift)); - - if (tex_res->interlaced) - sq_tex_resource_word6 |= INTERLACED_bit; - - sq_tex_resource_word7 = ((tex_res->format << SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift) | - (SQ_TEX_VTX_VALID_TEXTURE << SQ_TEX_RESOURCE_WORD7_0__TYPE_shift)); - - /* flush texture cache */ - evergreen_cp_set_surface_sync(pScrn, TC_ACTION_ENA_bit, - tex_res->size, tex_res->base, - tex_res->bo, domain, 0); - - BEGIN_BATCH(10 + 4); - PACK0(SQ_FETCH_RESOURCE + tex_res->id * SQ_FETCH_RESOURCE_offset, 8); - E32(sq_tex_resource_word0); - E32(sq_tex_resource_word1); - E32(((tex_res->base) >> 8)); - E32(((tex_res->mip_base) >> 8)); - E32(sq_tex_resource_word4); - E32(sq_tex_resource_word5); - E32(sq_tex_resource_word6); - E32(sq_tex_resource_word7); - RELOC_BATCH(tex_res->bo, domain, 0); - RELOC_BATCH(tex_res->mip_bo, domain, 0); - END_BATCH(); -} - -/* cayman has some minor differences in SQ_TEX_SAMPLER_WORD0_0, - * but none that we use here. - */ -void -evergreen_set_tex_sampler (ScrnInfoPtr pScrn, tex_sampler_t *s) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t sq_tex_sampler_word0, sq_tex_sampler_word1, sq_tex_sampler_word2; - - sq_tex_sampler_word0 = ((s->clamp_x << SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift) | - (s->clamp_y << CLAMP_Y_shift) | - (s->clamp_z << CLAMP_Z_shift) | - (s->xy_mag_filter << XY_MAG_FILTER_shift) | - (s->xy_min_filter << XY_MIN_FILTER_shift) | - (s->z_filter << Z_FILTER_shift) | - (s->mip_filter << MIP_FILTER_shift) | - (s->border_color << BORDER_COLOR_TYPE_shift) | - (s->depth_compare << DEPTH_COMPARE_FUNCTION_shift) | - (s->chroma_key << CHROMA_KEY_shift)); - - sq_tex_sampler_word1 = ((s->min_lod << SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_shift) | - (s->max_lod << MAX_LOD_shift) | - (s->perf_mip << PERF_MIP_shift) | - (s->perf_z << PERF_Z_shift)); - - - sq_tex_sampler_word2 = ((s->lod_bias << SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_shift) | - (s->lod_bias2 << LOD_BIAS_SEC_shift)); - - if (s->mc_coord_truncate) - sq_tex_sampler_word2 |= MC_COORD_TRUNCATE_bit; - if (s->force_degamma) - sq_tex_sampler_word2 |= SQ_TEX_SAMPLER_WORD2_0__FORCE_DEGAMMA_bit; - if (s->truncate_coord) - sq_tex_sampler_word2 |= TRUNCATE_COORD_bit; - if (s->disable_cube_wrap) - sq_tex_sampler_word2 |= SQ_TEX_SAMPLER_WORD2_0__DISABLE_CUBE_WRAP_bit; - if (s->type) - sq_tex_sampler_word2 |= SQ_TEX_SAMPLER_WORD2_0__TYPE_bit; - - BEGIN_BATCH(5); - PACK0(SQ_TEX_SAMPLER_WORD + s->id * SQ_TEX_SAMPLER_WORD_offset, 3); - E32(sq_tex_sampler_word0); - E32(sq_tex_sampler_word1); - E32(sq_tex_sampler_word2); - END_BATCH(); -} - -/* workarounds for hw bugs in eg+ */ -/* only affects screen/window/generic/vport. cliprects are not affected */ -static void -evergreen_fix_scissor_coordinates(ScrnInfoPtr pScrn, int *x1, int *y1, int *x2, int *y2) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - /* all eg+ asics */ - if (*x2 == 0) - *x1 = 1; - if (*y2 == 0) - *y1 = 1; - - /* cayman only */ - if (info->ChipFamily == CHIP_FAMILY_CAYMAN) { - /* cliprects aren't affected so we can use them to clip if we need - * a true 1x1 clip region - */ - if ((*x2 == 1) && (*y2 == 1)) - *x2 = 2; - } -} - -//XXX deal with clip offsets in clip setup -void -evergreen_set_screen_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - evergreen_fix_scissor_coordinates(pScrn, &x1, &y1, &x2, &y2); - - BEGIN_BATCH(4); - PACK0(PA_SC_SCREEN_SCISSOR_TL, 2); - E32(((x1 << PA_SC_SCREEN_SCISSOR_TL__TL_X_shift) | - (y1 << PA_SC_SCREEN_SCISSOR_TL__TL_Y_shift))); - E32(((x2 << PA_SC_SCREEN_SCISSOR_BR__BR_X_shift) | - (y2 << PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift))); - END_BATCH(); -} - -void -evergreen_set_vport_scissor(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - evergreen_fix_scissor_coordinates(pScrn, &x1, &y1, &x2, &y2); - - BEGIN_BATCH(4); - PACK0(PA_SC_VPORT_SCISSOR_0_TL + id * PA_SC_VPORT_SCISSOR_0_TL_offset, 2); - E32(((x1 << PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift) | - (y1 << PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift) | - WINDOW_OFFSET_DISABLE_bit)); - E32(((x2 << PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift) | - (y2 << PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift))); - END_BATCH(); -} - -void -evergreen_set_generic_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - evergreen_fix_scissor_coordinates(pScrn, &x1, &y1, &x2, &y2); - - BEGIN_BATCH(4); - PACK0(PA_SC_GENERIC_SCISSOR_TL, 2); - E32(((x1 << PA_SC_GENERIC_SCISSOR_TL__TL_X_shift) | - (y1 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift) | - WINDOW_OFFSET_DISABLE_bit)); - E32(((x2 << PA_SC_GENERIC_SCISSOR_BR__BR_X_shift) | - (y2 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift))); - END_BATCH(); -} - -void -evergreen_set_window_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - evergreen_fix_scissor_coordinates(pScrn, &x1, &y1, &x2, &y2); - - BEGIN_BATCH(4); - PACK0(PA_SC_WINDOW_SCISSOR_TL, 2); - E32(((x1 << PA_SC_WINDOW_SCISSOR_TL__TL_X_shift) | - (y1 << PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift) | - WINDOW_OFFSET_DISABLE_bit)); - E32(((x2 << PA_SC_WINDOW_SCISSOR_BR__BR_X_shift) | - (y2 << PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift))); - END_BATCH(); -} - -void -evergreen_set_clip_rect(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - BEGIN_BATCH(4); - PACK0(PA_SC_CLIPRECT_0_TL + id * PA_SC_CLIPRECT_0_TL_offset, 2); - E32(((x1 << PA_SC_CLIPRECT_0_TL__TL_X_shift) | - (y1 << PA_SC_CLIPRECT_0_TL__TL_Y_shift))); - E32(((x2 << PA_SC_CLIPRECT_0_BR__BR_X_shift) | - (y2 << PA_SC_CLIPRECT_0_BR__BR_Y_shift))); - END_BATCH(); -} - -/* - * Setup of default state - */ - -void -evergreen_set_default_state(ScrnInfoPtr pScrn) -{ - tex_resource_t tex_res; - shader_config_t fs_conf; - sq_config_t sq_conf; - int i; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - if (info->ChipFamily == CHIP_FAMILY_CAYMAN) { - cayman_set_default_state(pScrn); - return; - } - - if (accel_state->XInited3D) - return; - - memset(&tex_res, 0, sizeof(tex_resource_t)); - memset(&fs_conf, 0, sizeof(shader_config_t)); - - accel_state->XInited3D = TRUE; - - evergreen_start_3d(pScrn); - - /* SQ */ - sq_conf.ps_prio = 0; - sq_conf.vs_prio = 1; - sq_conf.gs_prio = 2; - sq_conf.es_prio = 3; - sq_conf.hs_prio = 0; - sq_conf.ls_prio = 0; - sq_conf.cs_prio = 0; - - switch (info->ChipFamily) { - case CHIP_FAMILY_CEDAR: - default: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 96; - sq_conf.num_vs_threads = 16; - sq_conf.num_gs_threads = 16; - sq_conf.num_es_threads = 16; - sq_conf.num_hs_threads = 16; - sq_conf.num_ls_threads = 16; - sq_conf.num_ps_stack_entries = 42; - sq_conf.num_vs_stack_entries = 42; - sq_conf.num_gs_stack_entries = 42; - sq_conf.num_es_stack_entries = 42; - sq_conf.num_hs_stack_entries = 42; - sq_conf.num_ls_stack_entries = 42; - break; - case CHIP_FAMILY_REDWOOD: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 128; - sq_conf.num_vs_threads = 20; - sq_conf.num_gs_threads = 20; - sq_conf.num_es_threads = 20; - sq_conf.num_hs_threads = 20; - sq_conf.num_ls_threads = 20; - sq_conf.num_ps_stack_entries = 42; - sq_conf.num_vs_stack_entries = 42; - sq_conf.num_gs_stack_entries = 42; - sq_conf.num_es_stack_entries = 42; - sq_conf.num_hs_stack_entries = 42; - sq_conf.num_ls_stack_entries = 42; - break; - case CHIP_FAMILY_JUNIPER: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 128; - sq_conf.num_vs_threads = 20; - sq_conf.num_gs_threads = 20; - sq_conf.num_es_threads = 20; - sq_conf.num_hs_threads = 20; - sq_conf.num_ls_threads = 20; - sq_conf.num_ps_stack_entries = 85; - sq_conf.num_vs_stack_entries = 85; - sq_conf.num_gs_stack_entries = 85; - sq_conf.num_es_stack_entries = 85; - sq_conf.num_hs_stack_entries = 85; - sq_conf.num_ls_stack_entries = 85; - break; - case CHIP_FAMILY_CYPRESS: - case CHIP_FAMILY_HEMLOCK: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 128; - sq_conf.num_vs_threads = 20; - sq_conf.num_gs_threads = 20; - sq_conf.num_es_threads = 20; - sq_conf.num_hs_threads = 20; - sq_conf.num_ls_threads = 20; - sq_conf.num_ps_stack_entries = 85; - sq_conf.num_vs_stack_entries = 85; - sq_conf.num_gs_stack_entries = 85; - sq_conf.num_es_stack_entries = 85; - sq_conf.num_hs_stack_entries = 85; - sq_conf.num_ls_stack_entries = 85; - break; - case CHIP_FAMILY_PALM: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 96; - sq_conf.num_vs_threads = 16; - sq_conf.num_gs_threads = 16; - sq_conf.num_es_threads = 16; - sq_conf.num_hs_threads = 16; - sq_conf.num_ls_threads = 16; - sq_conf.num_ps_stack_entries = 42; - sq_conf.num_vs_stack_entries = 42; - sq_conf.num_gs_stack_entries = 42; - sq_conf.num_es_stack_entries = 42; - sq_conf.num_hs_stack_entries = 42; - sq_conf.num_ls_stack_entries = 42; - break; - case CHIP_FAMILY_SUMO: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 96; - sq_conf.num_vs_threads = 25; - sq_conf.num_gs_threads = 25; - sq_conf.num_es_threads = 25; - sq_conf.num_hs_threads = 25; - sq_conf.num_ls_threads = 25; - sq_conf.num_ps_stack_entries = 42; - sq_conf.num_vs_stack_entries = 42; - sq_conf.num_gs_stack_entries = 42; - sq_conf.num_es_stack_entries = 42; - sq_conf.num_hs_stack_entries = 42; - sq_conf.num_ls_stack_entries = 42; - break; - case CHIP_FAMILY_SUMO2: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 96; - sq_conf.num_vs_threads = 25; - sq_conf.num_gs_threads = 25; - sq_conf.num_es_threads = 25; - sq_conf.num_hs_threads = 25; - sq_conf.num_ls_threads = 25; - sq_conf.num_ps_stack_entries = 85; - sq_conf.num_vs_stack_entries = 85; - sq_conf.num_gs_stack_entries = 85; - sq_conf.num_es_stack_entries = 85; - sq_conf.num_hs_stack_entries = 85; - sq_conf.num_ls_stack_entries = 85; - break; - case CHIP_FAMILY_BARTS: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 128; - sq_conf.num_vs_threads = 20; - sq_conf.num_gs_threads = 20; - sq_conf.num_es_threads = 20; - sq_conf.num_hs_threads = 20; - sq_conf.num_ls_threads = 20; - sq_conf.num_ps_stack_entries = 85; - sq_conf.num_vs_stack_entries = 85; - sq_conf.num_gs_stack_entries = 85; - sq_conf.num_es_stack_entries = 85; - sq_conf.num_hs_stack_entries = 85; - sq_conf.num_ls_stack_entries = 85; - break; - case CHIP_FAMILY_TURKS: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 128; - sq_conf.num_vs_threads = 20; - sq_conf.num_gs_threads = 20; - sq_conf.num_es_threads = 20; - sq_conf.num_hs_threads = 20; - sq_conf.num_ls_threads = 20; - sq_conf.num_ps_stack_entries = 42; - sq_conf.num_vs_stack_entries = 42; - sq_conf.num_gs_stack_entries = 42; - sq_conf.num_es_stack_entries = 42; - sq_conf.num_hs_stack_entries = 42; - sq_conf.num_ls_stack_entries = 42; - break; - case CHIP_FAMILY_CAICOS: - sq_conf.num_ps_gprs = 93; - sq_conf.num_vs_gprs = 46; - sq_conf.num_temp_gprs = 4; - sq_conf.num_gs_gprs = 31; - sq_conf.num_es_gprs = 31; - sq_conf.num_hs_gprs = 23; - sq_conf.num_ls_gprs = 23; - sq_conf.num_ps_threads = 128; - sq_conf.num_vs_threads = 10; - sq_conf.num_gs_threads = 10; - sq_conf.num_es_threads = 10; - sq_conf.num_hs_threads = 10; - sq_conf.num_ls_threads = 10; - sq_conf.num_ps_stack_entries = 42; - sq_conf.num_vs_stack_entries = 42; - sq_conf.num_gs_stack_entries = 42; - sq_conf.num_es_stack_entries = 42; - sq_conf.num_hs_stack_entries = 42; - sq_conf.num_ls_stack_entries = 42; - break; - } - - evergreen_sq_setup(pScrn, &sq_conf); - - BEGIN_BATCH(27); - EREG(SQ_LDS_ALLOC_PS, 0); - EREG(SQ_LDS_RESOURCE_MGMT, 0x10001000); - EREG(SQ_DYN_GPR_RESOURCE_LIMIT_1, 0); - - PACK0(SQ_ESGS_RING_ITEMSIZE, 6); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - - PACK0(SQ_GS_VERT_ITEMSIZE, 4); - E32(0); - E32(0); - E32(0); - E32(0); - - PACK0(SQ_VTX_BASE_VTX_LOC, 2); - E32(0); - E32(0); - END_BATCH(); - - /* DB */ - BEGIN_BATCH(3 + 2); - EREG(DB_Z_INFO, 0); - RELOC_BATCH(accel_state->shaders_bo, RADEON_GEM_DOMAIN_VRAM, 0); - END_BATCH(); - - BEGIN_BATCH(3 + 2); - EREG(DB_STENCIL_INFO, 0); - RELOC_BATCH(accel_state->shaders_bo, RADEON_GEM_DOMAIN_VRAM, 0); - END_BATCH(); - - BEGIN_BATCH(3 + 2); - EREG(DB_HTILE_DATA_BASE, 0); - RELOC_BATCH(accel_state->shaders_bo, RADEON_GEM_DOMAIN_VRAM, 0); - END_BATCH(); - - BEGIN_BATCH(49); - EREG(DB_DEPTH_CONTROL, 0); - - PACK0(PA_SC_VPORT_ZMIN_0, 2); - EFLOAT(0.0); // PA_SC_VPORT_ZMIN_0 - EFLOAT(1.0); // PA_SC_VPORT_ZMAX_0 - - PACK0(DB_RENDER_CONTROL, 5); - E32(STENCIL_COMPRESS_DISABLE_bit | DEPTH_COMPRESS_DISABLE_bit); // DB_RENDER_CONTROL - E32(0); // DB_COUNT_CONTROL - E32(0); // DB_DEPTH_VIEW - E32(0x2a); // DB_RENDER_OVERRIDE - E32(0); // DB_RENDER_OVERRIDE2 - - PACK0(DB_STENCIL_CLEAR, 2); - E32(0); // DB_STENCIL_CLEAR - E32(0); // DB_DEPTH_CLEAR - - EREG(DB_ALPHA_TO_MASK, ((2 << ALPHA_TO_MASK_OFFSET0_shift) | - (2 << ALPHA_TO_MASK_OFFSET1_shift) | - (2 << ALPHA_TO_MASK_OFFSET2_shift) | - (2 << ALPHA_TO_MASK_OFFSET3_shift))); - - EREG(DB_SHADER_CONTROL, ((EARLY_Z_THEN_LATE_Z << Z_ORDER_shift) | - DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ - - // SX - EREG(SX_MISC, 0); - - // CB - PACK0(SX_ALPHA_TEST_CONTROL, 5); - E32(0); // SX_ALPHA_TEST_CONTROL - E32(0x00000000); //CB_BLEND_RED - E32(0x00000000); //CB_BLEND_GREEN - E32(0x00000000); //CB_BLEND_BLUE - E32(0x00000000); //CB_BLEND_ALPHA - - EREG(CB_SHADER_MASK, OUTPUT0_ENABLE_mask); - - // SC - EREG(PA_SC_WINDOW_OFFSET, ((0 << WINDOW_X_OFFSET_shift) | - (0 << WINDOW_Y_OFFSET_shift))); - EREG(PA_SC_CLIPRECT_RULE, CLIP_RULE_mask); - EREG(PA_SC_EDGERULE, 0xAAAAAAAA); - EREG(PA_SU_HARDWARE_SCREEN_OFFSET, 0); - END_BATCH(); - - /* clip boolean is set to always visible -> doesn't matter */ - for (i = 0; i < PA_SC_CLIPRECT_0_TL_num; i++) - evergreen_set_clip_rect (pScrn, i, 0, 0, 8192, 8192); - - for (i = 0; i < PA_SC_VPORT_SCISSOR_0_TL_num; i++) - evergreen_set_vport_scissor (pScrn, i, 0, 0, 8192, 8192); - - BEGIN_BATCH(57); - PACK0(PA_SC_MODE_CNTL_0, 2); - E32(0); // PA_SC_MODE_CNTL_0 - E32(0); // PA_SC_MODE_CNTL_1 - - PACK0(PA_SC_LINE_CNTL, 16); - E32(0); // PA_SC_LINE_CNTL - E32(0); // PA_SC_AA_CONFIG - E32(((X_ROUND_TO_EVEN << PA_SU_VTX_CNTL__ROUND_MODE_shift) | - PIX_CENTER_bit)); // PA_SU_VTX_CNTL - EFLOAT(1.0); // PA_CL_GB_VERT_CLIP_ADJ - EFLOAT(1.0); // PA_CL_GB_VERT_DISC_ADJ - EFLOAT(1.0); // PA_CL_GB_HORZ_CLIP_ADJ - EFLOAT(1.0); // PA_CL_GB_HORZ_DISC_ADJ - E32(0); // PA_SC_AA_SAMPLE_LOCS_0 - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); // PA_SC_AA_SAMPLE_LOCS_7 - E32(0xFFFFFFFF); // PA_SC_AA_MASK - - // CL - PACK0(PA_CL_CLIP_CNTL, 8); - E32(CLIP_DISABLE_bit); // PA_CL_CLIP_CNTL - E32(FACE_bit); // PA_SU_SC_MODE_CNTL - E32(VTX_XY_FMT_bit); // PA_CL_VTE_CNTL - E32(0); // PA_CL_VS_OUT_CNTL - E32(0); // PA_CL_NANINF_CNTL - E32(0); // PA_SU_LINE_STIPPLE_CNTL - E32(0); // PA_SU_LINE_STIPPLE_SCALE - E32(0); // PA_SU_PRIM_FILTER_CNTL - - // SU - PACK0(PA_SU_POLY_OFFSET_DB_FMT_CNTL, 6); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - - /* src = semantic id 0; mask = semantic id 1 */ - EREG(SPI_VS_OUT_ID_0, ((0 << SEMANTIC_0_shift) | - (1 << SEMANTIC_1_shift))); - PACK0(SPI_PS_INPUT_CNTL_0 + (0 << 2), 2); - /* SPI_PS_INPUT_CNTL_0 maps to GPR[0] - load with semantic id 0 */ - E32(((0 << SEMANTIC_shift) | - (0x01 << DEFAULT_VAL_shift))); - /* SPI_PS_INPUT_CNTL_1 maps to GPR[1] - load with semantic id 1 */ - E32(((1 << SEMANTIC_shift) | - (0x01 << DEFAULT_VAL_shift))); - - PACK0(SPI_INPUT_Z, 8); - E32(0); // SPI_INPUT_Z - E32(0); // SPI_FOG_CNTL - E32(LINEAR_CENTROID_ENA__X_ON_AT_CENTROID << LINEAR_CENTROID_ENA_shift); // SPI_BARYC_CNTL - E32(0); // SPI_PS_IN_CONTROL_2 - E32(0); - E32(0); - E32(0); - E32(0); - END_BATCH(); - - // clear FS - fs_conf.bo = accel_state->shaders_bo; - evergreen_fs_setup(pScrn, &fs_conf, RADEON_GEM_DOMAIN_VRAM); - - // VGT - BEGIN_BATCH(46); - - PACK0(VGT_MAX_VTX_INDX, 4); - E32(0xffffff); - E32(0); - E32(0); - E32(0); - - PACK0(VGT_INSTANCE_STEP_RATE_0, 2); - E32(0); - E32(0); - - PACK0(VGT_REUSE_OFF, 2); - E32(0); - E32(0); - - PACK0(PA_SU_POINT_SIZE, 17); - E32(0); // PA_SU_POINT_SIZE - E32(0); // PA_SU_POINT_MINMAX - E32((8 << PA_SU_LINE_CNTL__WIDTH_shift)); /* Line width 1 pixel */ // PA_SU_LINE_CNTL - E32(0); // PA_SC_LINE_STIPPLE - E32(0); // VGT_OUTPUT_PATH_CNTL - E32(0); // VGT_HOS_CNTL - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); - E32(0); // VGT_GS_MODE - - EREG(VGT_PRIMITIVEID_EN, 0); - EREG(VGT_MULTI_PRIM_IB_RESET_EN, 0); - EREG(VGT_SHADER_STAGES_EN, 0); - - PACK0(VGT_STRMOUT_CONFIG, 2); - E32(0); - E32(0); - END_BATCH(); -} - - -/* - * Commands - */ - -void -evergreen_draw_auto(ScrnInfoPtr pScrn, draw_config_t *draw_conf) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - BEGIN_BATCH(10); - EREG(VGT_PRIMITIVE_TYPE, draw_conf->prim_type); - PACK3(IT_INDEX_TYPE, 1); -#if X_BYTE_ORDER == X_BIG_ENDIAN - E32(IT_INDEX_TYPE_SWAP_MODE(ENDIAN_8IN32) | draw_conf->index_type); -#else - E32(draw_conf->index_type); -#endif - PACK3(IT_NUM_INSTANCES, 1); - E32(draw_conf->num_instances); - PACK3(IT_DRAW_INDEX_AUTO, 2); - E32(draw_conf->num_indices); - E32(draw_conf->vgt_draw_initiator); - END_BATCH(); -} - -void evergreen_finish_op(ScrnInfoPtr pScrn, int vtx_size) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - draw_config_t draw_conf; - vtx_resource_t vtx_res; - - if (accel_state->vbo.vb_start_op == -1) - return; - - CLEAR (draw_conf); - CLEAR (vtx_res); - - if (accel_state->vbo.vb_offset == accel_state->vbo.vb_start_op) { - radeon_ib_discard(pScrn); - radeon_cs_flush_indirect(pScrn); - return; - } - - /* Vertex buffer setup */ - accel_state->vbo.vb_size = accel_state->vbo.vb_offset - accel_state->vbo.vb_start_op; - vtx_res.id = SQ_FETCH_RESOURCE_vs; - vtx_res.vtx_size_dw = vtx_size / 4; - vtx_res.vtx_num_entries = accel_state->vbo.vb_size / 4; - vtx_res.vb_addr = accel_state->vbo.vb_mc_addr + accel_state->vbo.vb_start_op; - vtx_res.bo = accel_state->vbo.vb_bo; - vtx_res.dst_sel_x = SQ_SEL_X; - vtx_res.dst_sel_y = SQ_SEL_Y; - vtx_res.dst_sel_z = SQ_SEL_Z; - vtx_res.dst_sel_w = SQ_SEL_W; -#if X_BYTE_ORDER == X_BIG_ENDIAN - vtx_res.endian = SQ_ENDIAN_8IN32; -#endif - evergreen_set_vtx_resource(pScrn, &vtx_res, RADEON_GEM_DOMAIN_GTT); - - /* Draw */ - draw_conf.prim_type = DI_PT_RECTLIST; - draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; - draw_conf.num_instances = 1; - draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; - draw_conf.index_type = DI_INDEX_SIZE_16_BIT; - - evergreen_draw_auto(pScrn, &draw_conf); - - /* sync dst surface */ - evergreen_cp_set_surface_sync(pScrn, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), - accel_state->dst_size, accel_state->dst_obj.offset, - accel_state->dst_obj.bo, 0, accel_state->dst_obj.domain); - - accel_state->vbo.vb_start_op = -1; - accel_state->cbuf.vb_start_op = -1; - accel_state->ib_reset_op = 0; - -} - -#endif diff --git a/driver/xf86-video-ati/src/evergreen_exa.c b/driver/xf86-video-ati/src/evergreen_exa.c deleted file mode 100644 index 6becbb328..000000000 --- a/driver/xf86-video-ati/src/evergreen_exa.c +++ /dev/null @@ -1,1948 +0,0 @@ -/* - * Copyright 2010 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 (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 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. - * - * Author: Alex Deucher - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef XF86DRM_MODE - -#include "xf86.h" - -#include "exa.h" - -#include "radeon.h" -#include "radeon_macros.h" -#include "radeon_reg.h" -#include "evergreen_shader.h" -#include "evergreen_reg.h" -#include "evergreen_state.h" -#include "radeon_exa_shared.h" -#include "radeon_vbo.h" - -extern int cayman_solid_vs(RADEONChipFamily ChipSet, uint32_t* vs); -extern int cayman_solid_ps(RADEONChipFamily ChipSet, uint32_t* ps); - -extern int cayman_copy_vs(RADEONChipFamily ChipSet, uint32_t* vs); -extern int cayman_copy_ps(RADEONChipFamily ChipSet, uint32_t* ps); - -extern int cayman_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader); -extern int cayman_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader); - -extern int cayman_comp_vs(RADEONChipFamily ChipSet, uint32_t* vs); -extern int cayman_comp_ps(RADEONChipFamily ChipSet, uint32_t* ps); - -static Bool -EVERGREENPrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - cb_config_t cb_conf; - shader_config_t vs_conf, ps_conf; - uint32_t a, r, g, b; - float *ps_alu_consts; - const_config_t ps_const_conf; - struct r600_accel_object dst; - - - if (!RADEONCheckBPP(pPix->drawable.bitsPerPixel)) - RADEON_FALLBACK(("EVERGREENCheckDatatype failed\n")); - if (!RADEONValidPM(pm, pPix->drawable.bitsPerPixel)) - RADEON_FALLBACK(("invalid planemask\n")); - - dst.offset = 0; - dst.bo = radeon_get_pixmap_bo(pPix); - dst.tiling_flags = radeon_get_pixmap_tiling(pPix); - - dst.pitch = exaGetPixmapPitch(pPix) / (pPix->drawable.bitsPerPixel / 8); - dst.width = pPix->drawable.width; - dst.height = pPix->drawable.height; - dst.bpp = pPix->drawable.bitsPerPixel; - dst.domain = RADEON_GEM_DOMAIN_VRAM; - - if (!R600SetAccelState(pScrn, - NULL, - NULL, - &dst, - accel_state->solid_vs_offset, accel_state->solid_ps_offset, - alu, pm)) - return FALSE; - - CLEAR (cb_conf); - CLEAR (vs_conf); - CLEAR (ps_conf); - CLEAR (ps_const_conf); - - radeon_vbo_check(pScrn, &accel_state->vbo, 16); - radeon_vbo_check(pScrn, &accel_state->cbuf, 256); - radeon_cp_start(pScrn); - - evergreen_set_default_state(pScrn); - - evergreen_set_generic_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_screen_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_window_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - - /* Shader */ - vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; - vs_conf.num_gprs = 2; - vs_conf.stack_size = 0; - vs_conf.bo = accel_state->shaders_bo; - evergreen_vs_setup(pScrn, &vs_conf, RADEON_GEM_DOMAIN_VRAM); - - ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; - ps_conf.num_gprs = 1; - ps_conf.stack_size = 0; - ps_conf.clamp_consts = 0; - ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - evergreen_ps_setup(pScrn, &ps_conf, RADEON_GEM_DOMAIN_VRAM); - - cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; - cb_conf.bo = accel_state->dst_obj.bo; - - if (accel_state->dst_obj.bpp == 8) { - cb_conf.format = COLOR_8; - cb_conf.comp_swap = 3; /* A */ - } else if (accel_state->dst_obj.bpp == 16) { - cb_conf.format = COLOR_5_6_5; - cb_conf.comp_swap = 2; /* RGB */ -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN16; -#endif - } else { - cb_conf.format = COLOR_8_8_8_8; - cb_conf.comp_swap = 1; /* ARGB */ -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN32; -#endif - } - cb_conf.source_format = EXPORT_4C_16BPC; - cb_conf.blend_clamp = 1; - /* Render setup */ - if (accel_state->planemask & 0x000000ff) - cb_conf.pmask |= 4; /* B */ - if (accel_state->planemask & 0x0000ff00) - cb_conf.pmask |= 2; /* G */ - if (accel_state->planemask & 0x00ff0000) - cb_conf.pmask |= 1; /* R */ - if (accel_state->planemask & 0xff000000) - cb_conf.pmask |= 8; /* A */ - cb_conf.rop = accel_state->rop; - if (accel_state->dst_obj.tiling_flags == 0) { - cb_conf.array_mode = 1; - cb_conf.non_disp_tiling = 1; - } - evergreen_set_render_target(pScrn, &cb_conf, accel_state->dst_obj.domain); - - evergreen_set_spi(pScrn, 0, 0); - - /* PS alu constants */ - ps_const_conf.size_bytes = 256; - ps_const_conf.type = SHADER_TYPE_PS; - ps_alu_consts = radeon_vbo_space(pScrn, &accel_state->cbuf, 256); - ps_const_conf.bo = accel_state->cbuf.vb_bo; - ps_const_conf.const_addr = accel_state->cbuf.vb_mc_addr + accel_state->cbuf.vb_offset; - if (accel_state->dst_obj.bpp == 16) { - r = (fg >> 11) & 0x1f; - g = (fg >> 5) & 0x3f; - b = (fg >> 0) & 0x1f; - ps_alu_consts[0] = (float)r / 31; /* R */ - ps_alu_consts[1] = (float)g / 63; /* G */ - ps_alu_consts[2] = (float)b / 31; /* B */ - ps_alu_consts[3] = 1.0; /* A */ - } else if (accel_state->dst_obj.bpp == 8) { - a = (fg >> 0) & 0xff; - ps_alu_consts[0] = 0.0; /* R */ - ps_alu_consts[1] = 0.0; /* G */ - ps_alu_consts[2] = 0.0; /* B */ - ps_alu_consts[3] = (float)a / 255; /* A */ - } else { - a = (fg >> 24) & 0xff; - r = (fg >> 16) & 0xff; - g = (fg >> 8) & 0xff; - b = (fg >> 0) & 0xff; - ps_alu_consts[0] = (float)r / 255; /* R */ - ps_alu_consts[1] = (float)g / 255; /* G */ - ps_alu_consts[2] = (float)b / 255; /* B */ - ps_alu_consts[3] = (float)a / 255; /* A */ - } - radeon_vbo_commit(pScrn, &accel_state->cbuf); - evergreen_set_alu_consts(pScrn, &ps_const_conf, RADEON_GEM_DOMAIN_GTT); - - if (accel_state->vsync) - RADEONVlineHelperClear(pScrn); - - accel_state->dst_pix = pPix; - accel_state->fg = fg; - - return TRUE; -} - -static void -EVERGREENDoneSolid(PixmapPtr pPix) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - if (accel_state->vsync) - evergreen_cp_wait_vline_sync(pScrn, pPix, - accel_state->vline_crtc, - accel_state->vline_y1, - accel_state->vline_y2); - - evergreen_finish_op(pScrn, 8); -} - -static void -EVERGREENSolid(PixmapPtr pPix, int x1, int y1, int x2, int y2) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - float *vb; - - if (CS_FULL(info->cs)) { - EVERGREENDoneSolid(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - EVERGREENPrepareSolid(accel_state->dst_pix, - accel_state->rop, - accel_state->planemask, - accel_state->fg); - } - - if (accel_state->vsync) - RADEONVlineHelperSet(pScrn, x1, y1, x2, y2); - - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 8); - - vb[0] = (float)x1; - vb[1] = (float)y1; - - vb[2] = (float)x1; - vb[3] = (float)y2; - - vb[4] = (float)x2; - vb[5] = (float)y2; - - radeon_vbo_commit(pScrn, &accel_state->vbo); -} - -static void -EVERGREENDoPrepareCopy(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - cb_config_t cb_conf; - tex_resource_t tex_res; - tex_sampler_t tex_samp; - shader_config_t vs_conf, ps_conf; - - CLEAR (cb_conf); - CLEAR (tex_res); - CLEAR (tex_samp); - CLEAR (vs_conf); - CLEAR (ps_conf); - - radeon_vbo_check(pScrn, &accel_state->vbo, 16); - radeon_cp_start(pScrn); - - evergreen_set_default_state(pScrn); - - evergreen_set_generic_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_screen_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_window_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - - /* Shader */ - vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; - vs_conf.num_gprs = 2; - vs_conf.stack_size = 0; - vs_conf.bo = accel_state->shaders_bo; - evergreen_vs_setup(pScrn, &vs_conf, RADEON_GEM_DOMAIN_VRAM); - - ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; - ps_conf.num_gprs = 1; - ps_conf.stack_size = 0; - ps_conf.clamp_consts = 0; - ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - evergreen_ps_setup(pScrn, &ps_conf, RADEON_GEM_DOMAIN_VRAM); - - /* Texture */ - tex_res.id = 0; - tex_res.w = accel_state->src_obj[0].width; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch; - tex_res.depth = 0; - tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - tex_res.bo = accel_state->src_obj[0].bo; - tex_res.mip_bo = accel_state->src_obj[0].bo; - if (accel_state->src_obj[0].bpp == 8) { - tex_res.format = FMT_8; - tex_res.dst_sel_x = SQ_SEL_1; /* R */ - tex_res.dst_sel_y = SQ_SEL_1; /* G */ - tex_res.dst_sel_z = SQ_SEL_1; /* B */ - tex_res.dst_sel_w = SQ_SEL_X; /* A */ - } else if (accel_state->src_obj[0].bpp == 16) { - tex_res.format = FMT_5_6_5; - tex_res.dst_sel_x = SQ_SEL_Z; /* R */ - tex_res.dst_sel_y = SQ_SEL_Y; /* G */ - tex_res.dst_sel_z = SQ_SEL_X; /* B */ - tex_res.dst_sel_w = SQ_SEL_1; /* A */ - } else { - tex_res.format = FMT_8_8_8_8; - tex_res.dst_sel_x = SQ_SEL_Z; /* R */ - tex_res.dst_sel_y = SQ_SEL_Y; /* G */ - tex_res.dst_sel_z = SQ_SEL_X; /* B */ - tex_res.dst_sel_w = SQ_SEL_W; /* A */ - } - - tex_res.base_level = 0; - tex_res.last_level = 0; - tex_res.perf_modulation = 0; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.array_mode = 1; - evergreen_set_tex_resource(pScrn, &tex_res, accel_state->src_obj[0].domain); - - tex_samp.id = 0; - tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_z = SQ_TEX_WRAP; - tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_POINT; - tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_POINT; - tex_samp.mc_coord_truncate = 1; - tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; - tex_samp.mip_filter = 0; /* no mipmap */ - evergreen_set_tex_sampler (pScrn, &tex_samp); - - cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; - cb_conf.bo = accel_state->dst_obj.bo; - if (accel_state->dst_obj.bpp == 8) { - cb_conf.format = COLOR_8; - cb_conf.comp_swap = 3; /* A */ - } else if (accel_state->dst_obj.bpp == 16) { - cb_conf.format = COLOR_5_6_5; - cb_conf.comp_swap = 2; /* RGB */ - } else { - cb_conf.format = COLOR_8_8_8_8; - cb_conf.comp_swap = 1; /* ARGB */ - } - cb_conf.source_format = EXPORT_4C_16BPC; - cb_conf.blend_clamp = 1; - /* Render setup */ - if (accel_state->planemask & 0x000000ff) - cb_conf.pmask |= 4; /* B */ - if (accel_state->planemask & 0x0000ff00) - cb_conf.pmask |= 2; /* G */ - if (accel_state->planemask & 0x00ff0000) - cb_conf.pmask |= 1; /* R */ - if (accel_state->planemask & 0xff000000) - cb_conf.pmask |= 8; /* A */ - cb_conf.rop = accel_state->rop; - if (accel_state->dst_obj.tiling_flags == 0) { - cb_conf.array_mode = 1; - cb_conf.non_disp_tiling = 1; - } - evergreen_set_render_target(pScrn, &cb_conf, accel_state->dst_obj.domain); - - evergreen_set_spi(pScrn, (1 - 1), 1); - -} - -static void -EVERGREENDoCopy(ScrnInfoPtr pScrn) -{ - evergreen_finish_op(pScrn, 16); -} - -static void -EVERGREENDoCopyVline(PixmapPtr pPix) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - if (accel_state->vsync) - evergreen_cp_wait_vline_sync(pScrn, pPix, - accel_state->vline_crtc, - accel_state->vline_y1, - accel_state->vline_y2); - - evergreen_finish_op(pScrn, 16); -} - -static void -EVERGREENAppendCopyVertex(ScrnInfoPtr pScrn, - int srcX, int srcY, - int dstX, int dstY, - int w, int h) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - float *vb; - - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 16); - - vb[0] = (float)dstX; - vb[1] = (float)dstY; - vb[2] = (float)srcX; - vb[3] = (float)srcY; - - vb[4] = (float)dstX; - vb[5] = (float)(dstY + h); - vb[6] = (float)srcX; - vb[7] = (float)(srcY + h); - - vb[8] = (float)(dstX + w); - vb[9] = (float)(dstY + h); - vb[10] = (float)(srcX + w); - vb[11] = (float)(srcY + h); - - radeon_vbo_commit(pScrn, &accel_state->vbo); -} - -static Bool -EVERGREENPrepareCopy(PixmapPtr pSrc, PixmapPtr pDst, - int xdir, int ydir, - int rop, - Pixel planemask) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct r600_accel_object src_obj, dst_obj; - - if (!RADEONCheckBPP(pSrc->drawable.bitsPerPixel)) - RADEON_FALLBACK(("EVERGREENCheckDatatype src failed\n")); - if (!RADEONCheckBPP(pDst->drawable.bitsPerPixel)) - RADEON_FALLBACK(("EVERGREENCheckDatatype dst failed\n")); - if (!RADEONValidPM(planemask, pDst->drawable.bitsPerPixel)) - RADEON_FALLBACK(("Invalid planemask\n")); - - dst_obj.pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); - src_obj.pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); - - accel_state->same_surface = FALSE; - - src_obj.offset = 0; - dst_obj.offset = 0; - src_obj.bo = radeon_get_pixmap_bo(pSrc); - dst_obj.bo = radeon_get_pixmap_bo(pDst); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst); - src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc); - if (radeon_get_pixmap_bo(pSrc) == radeon_get_pixmap_bo(pDst)) - accel_state->same_surface = TRUE; - - src_obj.width = pSrc->drawable.width; - src_obj.height = pSrc->drawable.height; - src_obj.bpp = pSrc->drawable.bitsPerPixel; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - - dst_obj.width = pDst->drawable.width; - dst_obj.height = pDst->drawable.height; - dst_obj.bpp = pDst->drawable.bitsPerPixel; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - rop, planemask)) - return FALSE; - - if (accel_state->same_surface == TRUE) { - unsigned height = RADEON_ALIGN(pDst->drawable.height, - drmmode_get_height_align(pScrn, accel_state->dst_obj.tiling_flags)); - unsigned long size = height * accel_state->dst_obj.pitch * pDst->drawable.bitsPerPixel/8; - - if (accel_state->copy_area_bo) { - radeon_bo_unref(accel_state->copy_area_bo); - accel_state->copy_area_bo = NULL; - } - accel_state->copy_area_bo = radeon_bo_open(info->bufmgr, 0, size, 0, - RADEON_GEM_DOMAIN_VRAM, - 0); - if (accel_state->copy_area_bo == NULL) - RADEON_FALLBACK(("temp copy surface alloc failed\n")); - - radeon_cs_space_add_persistent_bo(info->cs, accel_state->copy_area_bo, - RADEON_GEM_DOMAIN_VRAM, RADEON_GEM_DOMAIN_VRAM); - if (radeon_cs_space_check(info->cs)) { - radeon_bo_unref(accel_state->copy_area_bo); - accel_state->copy_area_bo = NULL; - return FALSE; - } - accel_state->copy_area = (void*)accel_state->copy_area_bo; - } else - EVERGREENDoPrepareCopy(pScrn); - - if (accel_state->vsync) - RADEONVlineHelperClear(pScrn); - - accel_state->dst_pix = pDst; - accel_state->src_pix = pSrc; - accel_state->xdir = xdir; - accel_state->ydir = ydir; - - return TRUE; -} - -static void -EVERGREENDoneCopy(PixmapPtr pDst) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - if (!accel_state->same_surface) - EVERGREENDoCopyVline(pDst); - - if (accel_state->copy_area) - accel_state->copy_area = NULL; - -} - -static void -EVERGREENCopy(PixmapPtr pDst, - int srcX, int srcY, - int dstX, int dstY, - int w, int h) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - if (accel_state->same_surface && (srcX == dstX) && (srcY == dstY)) - return; - - if (CS_FULL(info->cs)) { - EVERGREENDoneCopy(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - EVERGREENPrepareCopy(accel_state->src_pix, - accel_state->dst_pix, - accel_state->xdir, - accel_state->ydir, - accel_state->rop, - accel_state->planemask); - } - - if (accel_state->vsync) - RADEONVlineHelperSet(pScrn, dstX, dstY, dstX + w, dstY + h); - - if (accel_state->same_surface && accel_state->copy_area) { - uint32_t orig_dst_domain = accel_state->dst_obj.domain; - uint32_t orig_src_domain = accel_state->src_obj[0].domain; - uint32_t orig_src_tiling_flags = accel_state->src_obj[0].tiling_flags; - uint32_t orig_dst_tiling_flags = accel_state->dst_obj.tiling_flags; - struct radeon_bo *orig_bo = accel_state->dst_obj.bo; - - /* src to tmp */ - accel_state->dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - accel_state->dst_obj.bo = accel_state->copy_area_bo; - accel_state->dst_obj.offset = 0; - accel_state->dst_obj.tiling_flags = 0; - EVERGREENDoPrepareCopy(pScrn); - EVERGREENAppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); - EVERGREENDoCopy(pScrn); - - /* tmp to dst */ - accel_state->src_obj[0].domain = RADEON_GEM_DOMAIN_VRAM; - accel_state->src_obj[0].bo = accel_state->copy_area_bo; - accel_state->src_obj[0].offset = 0; - accel_state->src_obj[0].tiling_flags = 0; - accel_state->dst_obj.domain = orig_dst_domain; - accel_state->dst_obj.bo = orig_bo; - accel_state->dst_obj.offset = 0; - accel_state->dst_obj.tiling_flags = orig_dst_tiling_flags; - EVERGREENDoPrepareCopy(pScrn); - EVERGREENAppendCopyVertex(pScrn, dstX, dstY, dstX, dstY, w, h); - EVERGREENDoCopyVline(pDst); - - /* restore state */ - accel_state->src_obj[0].domain = orig_src_domain; - accel_state->src_obj[0].bo = orig_bo; - accel_state->src_obj[0].offset = 0; - accel_state->src_obj[0].tiling_flags = orig_src_tiling_flags; - } else - EVERGREENAppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); - -} - -struct blendinfo { - Bool dst_alpha; - Bool src_alpha; - uint32_t blend_cntl; -}; - -static struct blendinfo EVERGREENBlendOp[] = { - /* Clear */ - {0, 0, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, - /* Src */ - {0, 0, (BLEND_ONE << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, - /* Dst */ - {0, 0, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_ONE << COLOR_DESTBLEND_shift)}, - /* Over */ - {0, 1, (BLEND_ONE << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, - /* OverReverse */ - {1, 0, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ONE << COLOR_DESTBLEND_shift)}, - /* In */ - {1, 0, (BLEND_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, - /* InReverse */ - {0, 1, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_SRC_ALPHA << COLOR_DESTBLEND_shift)}, - /* Out */ - {1, 0, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, - /* OutReverse */ - {0, 1, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, - /* Atop */ - {1, 1, (BLEND_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, - /* AtopReverse */ - {1, 1, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_SRC_ALPHA << COLOR_DESTBLEND_shift)}, - /* Xor */ - {1, 1, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, - /* Add */ - {0, 0, (BLEND_ONE << COLOR_SRCBLEND_shift) | (BLEND_ONE << COLOR_DESTBLEND_shift)}, -}; - -struct formatinfo { - unsigned int fmt; - uint32_t card_fmt; -}; - -static struct formatinfo EVERGREENTexFormats[] = { - {PICT_a8r8g8b8, FMT_8_8_8_8}, - {PICT_x8r8g8b8, FMT_8_8_8_8}, - {PICT_a8b8g8r8, FMT_8_8_8_8}, - {PICT_x8b8g8r8, FMT_8_8_8_8}, -#ifdef PICT_TYPE_BGRA - {PICT_b8g8r8a8, FMT_8_8_8_8}, - {PICT_b8g8r8x8, FMT_8_8_8_8}, -#endif - {PICT_r5g6b5, FMT_5_6_5}, - {PICT_a1r5g5b5, FMT_1_5_5_5}, - {PICT_x1r5g5b5, FMT_1_5_5_5}, - {PICT_a8, FMT_8}, -}; - -static uint32_t EVERGREENGetBlendCntl(int op, PicturePtr pMask, uint32_t dst_format) -{ - uint32_t sblend, dblend; - - sblend = EVERGREENBlendOp[op].blend_cntl & COLOR_SRCBLEND_mask; - dblend = EVERGREENBlendOp[op].blend_cntl & COLOR_DESTBLEND_mask; - - /* If there's no dst alpha channel, adjust the blend op so that we'll treat - * it as always 1. - */ - if (PICT_FORMAT_A(dst_format) == 0 && EVERGREENBlendOp[op].dst_alpha) { - if (sblend == (BLEND_DST_ALPHA << COLOR_SRCBLEND_shift)) - sblend = (BLEND_ONE << COLOR_SRCBLEND_shift); - else if (sblend == (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift)) - sblend = (BLEND_ZERO << COLOR_SRCBLEND_shift); - } - - /* If the source alpha is being used, then we should only be in a case where - * the source blend factor is 0, and the source blend value is the mask - * channels multiplied by the source picture's alpha. - */ - if (pMask && pMask->componentAlpha && EVERGREENBlendOp[op].src_alpha) { - if (dblend == (BLEND_SRC_ALPHA << COLOR_DESTBLEND_shift)) { - dblend = (BLEND_SRC_COLOR << COLOR_DESTBLEND_shift); - } else if (dblend == (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)) { - dblend = (BLEND_ONE_MINUS_SRC_COLOR << COLOR_DESTBLEND_shift); - } - } - - return sblend | dblend; -} - -static Bool EVERGREENGetDestFormat(PicturePtr pDstPicture, uint32_t *dst_format) -{ - switch (pDstPicture->format) { - case PICT_a8r8g8b8: - case PICT_x8r8g8b8: - case PICT_a8b8g8r8: - case PICT_x8b8g8r8: -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - case PICT_b8g8r8x8: -#endif - *dst_format = COLOR_8_8_8_8; - break; - case PICT_r5g6b5: - *dst_format = COLOR_5_6_5; - break; - case PICT_a1r5g5b5: - case PICT_x1r5g5b5: - *dst_format = COLOR_1_5_5_5; - break; - case PICT_a8: - *dst_format = COLOR_8; - break; - default: - RADEON_FALLBACK(("Unsupported dest format 0x%x\n", - (int)pDstPicture->format)); - } - return TRUE; -} - -static Bool EVERGREENCheckCompositeTexture(PicturePtr pPict, - PicturePtr pDstPict, - int op, - int unit) -{ - int w = pPict->pDrawable->width; - int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; - unsigned int i; - int max_tex_w, max_tex_h; - - max_tex_w = 16384; - max_tex_h = 16384; - - if ((w > max_tex_w) || (h > max_tex_h)) - RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h)); - - for (i = 0; i < sizeof(EVERGREENTexFormats) / sizeof(EVERGREENTexFormats[0]); i++) { - if (EVERGREENTexFormats[i].fmt == pPict->format) - break; - } - if (i == sizeof(EVERGREENTexFormats) / sizeof(EVERGREENTexFormats[0])) - RADEON_FALLBACK(("Unsupported picture format 0x%x\n", - (int)pPict->format)); - - if (pPict->filter != PictFilterNearest && - pPict->filter != PictFilterBilinear) - RADEON_FALLBACK(("Unsupported filter 0x%x\n", pPict->filter)); - - /* for REPEAT_NONE, Render semantics are that sampling outside the source - * picture results in alpha=0 pixels. We can implement this with a border color - * *if* our source texture has an alpha channel, otherwise we need to fall - * back. If we're not transformed then we hope that upper layers have clipped - * rendering to the bounds of the source drawable, in which case it doesn't - * matter. I have not, however, verified that the X server always does such - * clipping. - */ - /* FIXME evergreen */ - if (pPict->transform != 0 && repeatType == RepeatNone && PICT_FORMAT_A(pPict->format) == 0) { - if (!(((op == PictOpSrc) || (op == PictOpClear)) && (PICT_FORMAT_A(pDstPict->format) == 0))) - RADEON_FALLBACK(("REPEAT_NONE unsupported for transformed xRGB source\n")); - } - - if (!radeon_transform_is_affine_or_scaled(pPict->transform)) - RADEON_FALLBACK(("non-affine transforms not supported\n")); - - return TRUE; -} - -static void EVERGREENXFormSetup(PicturePtr pPict, PixmapPtr pPix, - int unit, float *vs_alu_consts) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - int w = pPict->pDrawable->width; - int h = pPict->pDrawable->height; - int const_offset = unit * 8; - - if (pPict->transform != 0) { - accel_state->is_transform[unit] = TRUE; - accel_state->transform[unit] = pPict->transform; - - vs_alu_consts[0 + const_offset] = xFixedToFloat(pPict->transform->matrix[0][0]); - vs_alu_consts[1 + const_offset] = xFixedToFloat(pPict->transform->matrix[0][1]); - vs_alu_consts[2 + const_offset] = xFixedToFloat(pPict->transform->matrix[0][2]); - vs_alu_consts[3 + const_offset] = 1.0 / w; - - vs_alu_consts[4 + const_offset] = xFixedToFloat(pPict->transform->matrix[1][0]); - vs_alu_consts[5 + const_offset] = xFixedToFloat(pPict->transform->matrix[1][1]); - vs_alu_consts[6 + const_offset] = xFixedToFloat(pPict->transform->matrix[1][2]); - vs_alu_consts[7 + const_offset] = 1.0 / h; - } else { - accel_state->is_transform[unit] = FALSE; - - vs_alu_consts[0 + const_offset] = 1.0; - vs_alu_consts[1 + const_offset] = 0.0; - vs_alu_consts[2 + const_offset] = 0.0; - vs_alu_consts[3 + const_offset] = 1.0 / w; - - vs_alu_consts[4 + const_offset] = 0.0; - vs_alu_consts[5 + const_offset] = 1.0; - vs_alu_consts[6 + const_offset] = 0.0; - vs_alu_consts[7 + const_offset] = 1.0 / h; - } - -} - -static Bool EVERGREENTextureSetup(PicturePtr pPict, PixmapPtr pPix, - int unit) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - int w = pPict->pDrawable->width; - int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; - unsigned int i; - tex_resource_t tex_res; - tex_sampler_t tex_samp; - int pix_r, pix_g, pix_b, pix_a; - - CLEAR (tex_res); - CLEAR (tex_samp); - - for (i = 0; i < sizeof(EVERGREENTexFormats) / sizeof(EVERGREENTexFormats[0]); i++) { - if (EVERGREENTexFormats[i].fmt == pPict->format) - break; - } - - /* Texture */ - tex_res.id = unit; - tex_res.w = w; - tex_res.h = h; - tex_res.pitch = accel_state->src_obj[unit].pitch; - tex_res.depth = 0; - tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[unit].offset; - tex_res.mip_base = accel_state->src_obj[unit].offset; - tex_res.size = accel_state->src_size[unit]; - tex_res.format = EVERGREENTexFormats[i].card_fmt; - tex_res.bo = accel_state->src_obj[unit].bo; - tex_res.mip_bo = accel_state->src_obj[unit].bo; - -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (accel_state->src_obj[unit].bpp) { - case 16: - tex_res.endian = SQ_ENDIAN_8IN16; - break; - case 32: - tex_res.endian = SQ_ENDIAN_8IN32; - break; - default : - break; - } -#endif - - /* component swizzles */ - switch (pPict->format) { - case PICT_a1r5g5b5: - case PICT_a8r8g8b8: - pix_r = SQ_SEL_Z; /* R */ - pix_g = SQ_SEL_Y; /* G */ - pix_b = SQ_SEL_X; /* B */ - pix_a = SQ_SEL_W; /* A */ - break; - case PICT_a8b8g8r8: - pix_r = SQ_SEL_X; /* R */ - pix_g = SQ_SEL_Y; /* G */ - pix_b = SQ_SEL_Z; /* B */ - pix_a = SQ_SEL_W; /* A */ - break; - case PICT_x8b8g8r8: - pix_r = SQ_SEL_X; /* R */ - pix_g = SQ_SEL_Y; /* G */ - pix_b = SQ_SEL_Z; /* B */ - pix_a = SQ_SEL_1; /* A */ - break; -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - pix_r = SQ_SEL_Y; /* R */ - pix_g = SQ_SEL_Z; /* G */ - pix_b = SQ_SEL_W; /* B */ - pix_a = SQ_SEL_X; /* A */ - break; - case PICT_b8g8r8x8: - pix_r = SQ_SEL_Y; /* R */ - pix_g = SQ_SEL_Z; /* G */ - pix_b = SQ_SEL_W; /* B */ - pix_a = SQ_SEL_1; /* A */ - break; -#endif - case PICT_x1r5g5b5: - case PICT_x8r8g8b8: - case PICT_r5g6b5: - pix_r = SQ_SEL_Z; /* R */ - pix_g = SQ_SEL_Y; /* G */ - pix_b = SQ_SEL_X; /* B */ - pix_a = SQ_SEL_1; /* A */ - break; - case PICT_a8: - pix_r = SQ_SEL_0; /* R */ - pix_g = SQ_SEL_0; /* G */ - pix_b = SQ_SEL_0; /* B */ - pix_a = SQ_SEL_X; /* A */ - break; - default: - RADEON_FALLBACK(("Bad format 0x%x\n", pPict->format)); - } - - if (unit == 0) { - if (!accel_state->msk_pic) { - if (PICT_FORMAT_RGB(pPict->format) == 0) { - pix_r = SQ_SEL_0; - pix_g = SQ_SEL_0; - pix_b = SQ_SEL_0; - } - - if (PICT_FORMAT_A(pPict->format) == 0) - pix_a = SQ_SEL_1; - } else { - if (accel_state->component_alpha) { - if (accel_state->src_alpha) { - if (PICT_FORMAT_A(pPict->format) == 0) { - pix_r = SQ_SEL_1; - pix_g = SQ_SEL_1; - pix_b = SQ_SEL_1; - pix_a = SQ_SEL_1; - } else { - pix_r = pix_a; - pix_g = pix_a; - pix_b = pix_a; - } - } else { - if (PICT_FORMAT_A(pPict->format) == 0) - pix_a = SQ_SEL_1; - } - } else { - if (PICT_FORMAT_RGB(pPict->format) == 0) { - pix_r = SQ_SEL_0; - pix_g = SQ_SEL_0; - pix_b = SQ_SEL_0; - } - - if (PICT_FORMAT_A(pPict->format) == 0) - pix_a = SQ_SEL_1; - } - } - } else { - if (accel_state->component_alpha) { - if (PICT_FORMAT_A(pPict->format) == 0) - pix_a = SQ_SEL_1; - } else { - if (PICT_FORMAT_A(pPict->format) == 0) { - pix_r = SQ_SEL_1; - pix_g = SQ_SEL_1; - pix_b = SQ_SEL_1; - pix_a = SQ_SEL_1; - } else { - pix_r = pix_a; - pix_g = pix_a; - pix_b = pix_a; - } - } - } - - tex_res.dst_sel_x = pix_r; /* R */ - tex_res.dst_sel_y = pix_g; /* G */ - tex_res.dst_sel_z = pix_b; /* B */ - tex_res.dst_sel_w = pix_a; /* A */ - - tex_res.base_level = 0; - tex_res.last_level = 0; - tex_res.perf_modulation = 0; - if (accel_state->src_obj[unit].tiling_flags == 0) - tex_res.array_mode = 1; - evergreen_set_tex_resource (pScrn, &tex_res, accel_state->src_obj[unit].domain); - - tex_samp.id = unit; - tex_samp.border_color = SQ_TEX_BORDER_COLOR_TRANS_BLACK; - - switch (repeatType) { - case RepeatNormal: - tex_samp.clamp_x = SQ_TEX_WRAP; - tex_samp.clamp_y = SQ_TEX_WRAP; - break; - case RepeatPad: - tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; - break; - case RepeatReflect: - tex_samp.clamp_x = SQ_TEX_MIRROR; - tex_samp.clamp_y = SQ_TEX_MIRROR; - break; - case RepeatNone: - tex_samp.clamp_x = SQ_TEX_CLAMP_BORDER; - tex_samp.clamp_y = SQ_TEX_CLAMP_BORDER; - break; - default: - RADEON_FALLBACK(("Bad repeat 0x%x\n", repeatType)); - } - - switch (pPict->filter) { - case PictFilterNearest: - tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_POINT; - tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_POINT; - tex_samp.mc_coord_truncate = 1; - break; - case PictFilterBilinear: - tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; - tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_BILINEAR; - break; - default: - RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); - } - - tex_samp.clamp_z = SQ_TEX_WRAP; - tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; - tex_samp.mip_filter = 0; /* no mipmap */ - evergreen_set_tex_sampler (pScrn, &tex_samp); - - return TRUE; -} - -static Bool EVERGREENCheckComposite(int op, PicturePtr pSrcPicture, - PicturePtr pMaskPicture, - PicturePtr pDstPicture) -{ - uint32_t tmp1; - PixmapPtr pSrcPixmap, pDstPixmap; - int max_tex_w, max_tex_h, max_dst_w, max_dst_h; - - /* Check for unsupported compositing operations. */ - if (op >= (int) (sizeof(EVERGREENBlendOp) / sizeof(EVERGREENBlendOp[0]))) - RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op)); - - if (!pSrcPicture->pDrawable) - RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); - - pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); - - max_tex_w = 8192; - max_tex_h = 8192; - max_dst_w = 8192; - max_dst_h = 8192; - - if (pSrcPixmap->drawable.width >= max_tex_w || - pSrcPixmap->drawable.height >= max_tex_h) { - RADEON_FALLBACK(("Source w/h too large (%d,%d).\n", - pSrcPixmap->drawable.width, - pSrcPixmap->drawable.height)); - } - - pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable); - - if (pDstPixmap->drawable.width >= max_dst_w || - pDstPixmap->drawable.height >= max_dst_h) { - RADEON_FALLBACK(("Dest w/h too large (%d,%d).\n", - pDstPixmap->drawable.width, - pDstPixmap->drawable.height)); - } - - if (pMaskPicture) { - PixmapPtr pMaskPixmap; - - if (!pMaskPicture->pDrawable) - RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); - - pMaskPixmap = RADEONGetDrawablePixmap(pMaskPicture->pDrawable); - - if (pMaskPixmap->drawable.width >= max_tex_w || - pMaskPixmap->drawable.height >= max_tex_h) { - RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n", - pMaskPixmap->drawable.width, - pMaskPixmap->drawable.height)); - } - - if (pMaskPicture->componentAlpha) { - /* Check if it's component alpha that relies on a source alpha and - * on the source value. We can only get one of those into the - * single source value that we get to blend with. - */ - if (EVERGREENBlendOp[op].src_alpha && - (EVERGREENBlendOp[op].blend_cntl & COLOR_SRCBLEND_mask) != - (BLEND_ZERO << COLOR_SRCBLEND_shift)) { - RADEON_FALLBACK(("Component alpha not supported with source " - "alpha and source value blending.\n")); - } - } - - if (!EVERGREENCheckCompositeTexture(pMaskPicture, pDstPicture, op, 1)) - return FALSE; - } - - if (!EVERGREENCheckCompositeTexture(pSrcPicture, pDstPicture, op, 0)) - return FALSE; - - if (!EVERGREENGetDestFormat(pDstPicture, &tmp1)) - return FALSE; - - return TRUE; - -} - -static Bool EVERGREENPrepareComposite(int op, PicturePtr pSrcPicture, - PicturePtr pMaskPicture, PicturePtr pDstPicture, - PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) -{ - ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - uint32_t dst_format; - cb_config_t cb_conf; - shader_config_t vs_conf, ps_conf; - const_config_t vs_const_conf; - struct r600_accel_object src_obj, mask_obj, dst_obj; - float *cbuf; - - if (pDst->drawable.bitsPerPixel < 8 || pSrc->drawable.bitsPerPixel < 8) - return FALSE; - - src_obj.offset = 0; - dst_obj.offset = 0; - src_obj.bo = radeon_get_pixmap_bo(pSrc); - dst_obj.bo = radeon_get_pixmap_bo(pDst); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst); - src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc); - - src_obj.pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); - dst_obj.pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); - - src_obj.width = pSrc->drawable.width; - src_obj.height = pSrc->drawable.height; - src_obj.bpp = pSrc->drawable.bitsPerPixel; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - - dst_obj.width = pDst->drawable.width; - dst_obj.height = pDst->drawable.height; - dst_obj.bpp = pDst->drawable.bitsPerPixel; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - - if (pMask) { - mask_obj.offset = 0; - mask_obj.bo = radeon_get_pixmap_bo(pMask); - mask_obj.tiling_flags = radeon_get_pixmap_tiling(pMask); - mask_obj.pitch = exaGetPixmapPitch(pMask) / (pMask->drawable.bitsPerPixel / 8); - - mask_obj.width = pMask->drawable.width; - mask_obj.height = pMask->drawable.height; - mask_obj.bpp = pMask->drawable.bitsPerPixel; - mask_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - - if (!R600SetAccelState(pScrn, - &src_obj, - &mask_obj, - &dst_obj, - accel_state->comp_vs_offset, accel_state->comp_ps_offset, - 3, 0xffffffff)) - return FALSE; - - accel_state->msk_pic = pMaskPicture; - if (pMaskPicture->componentAlpha) { - accel_state->component_alpha = TRUE; - if (EVERGREENBlendOp[op].src_alpha) - accel_state->src_alpha = TRUE; - else - accel_state->src_alpha = FALSE; - } else { - accel_state->component_alpha = FALSE; - accel_state->src_alpha = FALSE; - } - } else { - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->comp_vs_offset, accel_state->comp_ps_offset, - 3, 0xffffffff)) - return FALSE; - - accel_state->msk_pic = NULL; - accel_state->component_alpha = FALSE; - accel_state->src_alpha = FALSE; - } - - if (!EVERGREENGetDestFormat(pDstPicture, &dst_format)) - return FALSE; - - CLEAR (cb_conf); - CLEAR (vs_conf); - CLEAR (ps_conf); - CLEAR (vs_const_conf); - - if (pMask) - radeon_vbo_check(pScrn, &accel_state->vbo, 24); - else - radeon_vbo_check(pScrn, &accel_state->vbo, 16); - - radeon_vbo_check(pScrn, &accel_state->cbuf, 256); - - radeon_cp_start(pScrn); - - evergreen_set_default_state(pScrn); - - evergreen_set_generic_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_screen_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_window_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - - if (!EVERGREENTextureSetup(pSrcPicture, pSrc, 0)) { - radeon_ib_discard(pScrn); - radeon_cs_flush_indirect(pScrn); - return FALSE; - } - - if (pMask) { - if (!EVERGREENTextureSetup(pMaskPicture, pMask, 1)) { - radeon_ib_discard(pScrn); - radeon_cs_flush_indirect(pScrn); - return FALSE; - } - } else - accel_state->is_transform[1] = FALSE; - - if (pMask) { - evergreen_set_bool_consts(pScrn, SQ_BOOL_CONST_vs, (1 << 0)); - evergreen_set_bool_consts(pScrn, SQ_BOOL_CONST_ps, (1 << 0)); - } else { - evergreen_set_bool_consts(pScrn, SQ_BOOL_CONST_vs, (0 << 0)); - evergreen_set_bool_consts(pScrn, SQ_BOOL_CONST_ps, (0 << 0)); - } - - /* Shader */ - vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; - vs_conf.num_gprs = 5; - vs_conf.stack_size = 1; - vs_conf.bo = accel_state->shaders_bo; - evergreen_vs_setup(pScrn, &vs_conf, RADEON_GEM_DOMAIN_VRAM); - - ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; - ps_conf.num_gprs = 3; - ps_conf.stack_size = 1; - ps_conf.clamp_consts = 0; - ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - evergreen_ps_setup(pScrn, &ps_conf, RADEON_GEM_DOMAIN_VRAM); - - cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; - cb_conf.format = dst_format; - cb_conf.bo = accel_state->dst_obj.bo; - - switch (pDstPicture->format) { - case PICT_a8r8g8b8: - case PICT_x8r8g8b8: - case PICT_a1r5g5b5: - case PICT_x1r5g5b5: - default: - cb_conf.comp_swap = 1; /* ARGB */ - break; - case PICT_a8b8g8r8: - case PICT_x8b8g8r8: - cb_conf.comp_swap = 0; /* ABGR */ - break; -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - case PICT_b8g8r8x8: - cb_conf.comp_swap = 3; /* BGRA */ - break; -#endif - case PICT_r5g6b5: - cb_conf.comp_swap = 2; /* RGB */ - break; - case PICT_a8: - cb_conf.comp_swap = 3; /* A */ - break; - } - cb_conf.source_format = EXPORT_4C_16BPC; - cb_conf.blend_clamp = 1; - cb_conf.blendcntl = EVERGREENGetBlendCntl(op, pMaskPicture, pDstPicture->format); - cb_conf.blendcntl |= CB_BLEND0_CONTROL__ENABLE_bit; - cb_conf.rop = 3; - cb_conf.pmask = 0xf; - if (accel_state->dst_obj.tiling_flags == 0) { - cb_conf.array_mode = 1; - cb_conf.non_disp_tiling = 1; - } -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (dst_obj.bpp) { - case 16: - cb_conf.endian = ENDIAN_8IN16; - break; - case 32: - cb_conf.endian = ENDIAN_8IN32; - break; - default: - break; - } -#endif - evergreen_set_render_target(pScrn, &cb_conf, accel_state->dst_obj.domain); - - if (pMask) - evergreen_set_spi(pScrn, (2 - 1), 2); - else - evergreen_set_spi(pScrn, (1 - 1), 1); - - /* VS alu constants */ - vs_const_conf.size_bytes = 256; - vs_const_conf.type = SHADER_TYPE_VS; - cbuf = radeon_vbo_space(pScrn, &accel_state->cbuf, 256); - vs_const_conf.bo = accel_state->cbuf.vb_bo; - vs_const_conf.const_addr = accel_state->cbuf.vb_mc_addr + accel_state->cbuf.vb_offset; - - EVERGREENXFormSetup(pSrcPicture, pSrc, 0, cbuf); - if (pMask) - EVERGREENXFormSetup(pMaskPicture, pMask, 1, cbuf); - - radeon_vbo_commit(pScrn, &accel_state->cbuf); - evergreen_set_alu_consts(pScrn, &vs_const_conf, RADEON_GEM_DOMAIN_GTT); - - if (accel_state->vsync) - RADEONVlineHelperClear(pScrn); - - accel_state->composite_op = op; - accel_state->dst_pic = pDstPicture; - accel_state->src_pic = pSrcPicture; - accel_state->dst_pix = pDst; - accel_state->msk_pix = pMask; - accel_state->src_pix = pSrc; - - return TRUE; -} - -static void EVERGREENDoneComposite(PixmapPtr pDst) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - int vtx_size; - - if (accel_state->vsync) - evergreen_cp_wait_vline_sync(pScrn, pDst, - accel_state->vline_crtc, - accel_state->vline_y1, - accel_state->vline_y2); - - vtx_size = accel_state->msk_pic ? 24 : 16; - - evergreen_finish_op(pScrn, vtx_size); -} - -static void EVERGREENComposite(PixmapPtr pDst, - int srcX, int srcY, - int maskX, int maskY, - int dstX, int dstY, - int w, int h) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - float *vb; - - if (CS_FULL(info->cs)) { - EVERGREENDoneComposite(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - EVERGREENPrepareComposite(info->accel_state->composite_op, - info->accel_state->src_pic, - info->accel_state->msk_pic, - info->accel_state->dst_pic, - info->accel_state->src_pix, - info->accel_state->msk_pix, - info->accel_state->dst_pix); - } - - if (accel_state->vsync) - RADEONVlineHelperSet(pScrn, dstX, dstY, dstX + w, dstY + h); - - if (accel_state->msk_pic) { - - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 24); - - vb[0] = (float)dstX; - vb[1] = (float)dstY; - vb[2] = (float)srcX; - vb[3] = (float)srcY; - vb[4] = (float)maskX; - vb[5] = (float)maskY; - - vb[6] = (float)dstX; - vb[7] = (float)(dstY + h); - vb[8] = (float)srcX; - vb[9] = (float)(srcY + h); - vb[10] = (float)maskX; - vb[11] = (float)(maskY + h); - - vb[12] = (float)(dstX + w); - vb[13] = (float)(dstY + h); - vb[14] = (float)(srcX + w); - vb[15] = (float)(srcY + h); - vb[16] = (float)(maskX + w); - vb[17] = (float)(maskY + h); - - radeon_vbo_commit(pScrn, &accel_state->vbo); - - } else { - - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 16); - - vb[0] = (float)dstX; - vb[1] = (float)dstY; - vb[2] = (float)srcX; - vb[3] = (float)srcY; - - vb[4] = (float)dstX; - vb[5] = (float)(dstY + h); - vb[6] = (float)srcX; - vb[7] = (float)(srcY + h); - - vb[8] = (float)(dstX + w); - vb[9] = (float)(dstY + h); - vb[10] = (float)(srcX + w); - vb[11] = (float)(srcY + h); - - radeon_vbo_commit(pScrn, &accel_state->vbo); - } - - -} - -static Bool -EVERGREENUploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, - char *src, int src_pitch) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *scratch = NULL; - struct radeon_bo *copy_dst; - unsigned char *dst; - unsigned size; - uint32_t dst_domain; - int bpp = pDst->drawable.bitsPerPixel; - uint32_t scratch_pitch; - uint32_t copy_pitch; - uint32_t dst_pitch_hw = exaGetPixmapPitch(pDst) / (bpp / 8); - int ret; - Bool flush = TRUE; - Bool r; - int i; - struct r600_accel_object src_obj, dst_obj; - uint32_t height, base_align; - - if (bpp < 8) - return FALSE; - - driver_priv = exaGetPixmapDriverPrivate(pDst); - if (!driver_priv || !driver_priv->bo) - return FALSE; - - /* If we know the BO won't be busy, don't bother with a scratch */ - copy_dst = driver_priv->bo; - copy_pitch = pDst->devKind; - if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) { - if (!radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) { - flush = FALSE; - if (!radeon_bo_is_busy(driver_priv->bo, &dst_domain)) - goto copy; - } - } - - scratch_pitch = RADEON_ALIGN(w, drmmode_get_pitch_align(pScrn, (bpp / 8), 0)); - height = RADEON_ALIGN(h, drmmode_get_height_align(pScrn, 0)); - base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0); - size = scratch_pitch * height * (bpp / 8); - scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0); - if (scratch == NULL) { - goto copy; - } - - src_obj.pitch = scratch_pitch; - src_obj.width = w; - src_obj.height = h; - src_obj.offset = 0; - src_obj.bpp = bpp; - src_obj.domain = RADEON_GEM_DOMAIN_GTT; - src_obj.bo = scratch; - src_obj.tiling_flags = 0; - - dst_obj.pitch = dst_pitch_hw; - dst_obj.width = pDst->drawable.width; - dst_obj.height = pDst->drawable.height; - dst_obj.offset = 0; - dst_obj.bpp = bpp; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - dst_obj.bo = radeon_get_pixmap_bo(pDst); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst); - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - 3, 0xffffffff)) { - goto copy; - } - copy_dst = scratch; - copy_pitch = scratch_pitch * (bpp / 8); - flush = FALSE; - -copy: - if (flush) - radeon_cs_flush_indirect(pScrn); - - ret = radeon_bo_map(copy_dst, 0); - if (ret) { - r = FALSE; - goto out; - } - r = TRUE; - size = w * bpp / 8; - dst = copy_dst->ptr; - if (copy_dst == driver_priv->bo) - dst += y * copy_pitch + x * bpp / 8; - for (i = 0; i < h; i++) { - memcpy(dst + i * copy_pitch, src, size); - src += src_pitch; - } - radeon_bo_unmap(copy_dst); - - if (copy_dst == scratch) { - if (info->accel_state->vsync) - RADEONVlineHelperSet(pScrn, x, y, x + w, y + h); - - /* blit from gart to vram */ - EVERGREENDoPrepareCopy(pScrn); - EVERGREENAppendCopyVertex(pScrn, 0, 0, x, y, w, h); - EVERGREENDoCopyVline(pDst); - } - -out: - if (scratch) - radeon_bo_unref(scratch); - return r; -} - -static Bool -EVERGREENDownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, - int h, char *dst, int dst_pitch) -{ - ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *scratch = NULL; - struct radeon_bo *copy_src; - unsigned size; - uint32_t src_domain = 0; - int bpp = pSrc->drawable.bitsPerPixel; - uint32_t scratch_pitch; - uint32_t copy_pitch; - uint32_t src_pitch_hw = exaGetPixmapPitch(pSrc) / (bpp / 8); - int ret; - Bool flush = FALSE; - Bool r; - struct r600_accel_object src_obj, dst_obj; - uint32_t height, base_align; - - if (bpp < 8) - return FALSE; - - driver_priv = exaGetPixmapDriverPrivate(pSrc); - if (!driver_priv || !driver_priv->bo) - return FALSE; - - /* If we know the BO won't end up in VRAM anyway, don't bother with a scratch */ - copy_src = driver_priv->bo; - copy_pitch = pSrc->devKind; - if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) { - if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) { - src_domain = radeon_bo_get_src_domain(driver_priv->bo); - if ((src_domain & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) == - (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) - src_domain = 0; - else /* A write may be scheduled */ - flush = TRUE; - } - - if (!src_domain) - radeon_bo_is_busy(driver_priv->bo, &src_domain); - - if (src_domain & ~(uint32_t)RADEON_GEM_DOMAIN_VRAM) - goto copy; - - } - - if (!accel_state->allowHWDFS) - goto copy; - - scratch_pitch = RADEON_ALIGN(w, drmmode_get_pitch_align(pScrn, (bpp / 8), 0)); - height = RADEON_ALIGN(h, drmmode_get_height_align(pScrn, 0)); - base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0); - size = scratch_pitch * height * (bpp / 8); - scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0); - if (scratch == NULL) { - goto copy; - } - radeon_cs_space_reset_bos(info->cs); - radeon_cs_space_add_persistent_bo(info->cs, info->accel_state->shaders_bo, - RADEON_GEM_DOMAIN_VRAM, 0); - accel_state->src_obj[0].domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM; - radeon_add_pixmap(info->cs, pSrc, info->accel_state->src_obj[0].domain, 0); - accel_state->dst_obj.domain = RADEON_GEM_DOMAIN_GTT; - radeon_cs_space_add_persistent_bo(info->cs, scratch, 0, accel_state->dst_obj.domain); - ret = radeon_cs_space_check(info->cs); - if (ret) { - goto copy; - } - - src_obj.pitch = src_pitch_hw; - src_obj.width = pSrc->drawable.width; - src_obj.height = pSrc->drawable.height; - src_obj.offset = 0; - src_obj.bpp = bpp; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - src_obj.bo = radeon_get_pixmap_bo(pSrc); - src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc); - - dst_obj.pitch = scratch_pitch; - dst_obj.width = w; - dst_obj.height = h; - dst_obj.offset = 0; - dst_obj.bo = scratch; - dst_obj.bpp = bpp; - dst_obj.domain = RADEON_GEM_DOMAIN_GTT; - dst_obj.tiling_flags = 0; - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - 3, 0xffffffff)) { - goto copy; - } - - /* blit from vram to gart */ - EVERGREENDoPrepareCopy(pScrn); - EVERGREENAppendCopyVertex(pScrn, x, y, 0, 0, w, h); - EVERGREENDoCopy(pScrn); - copy_src = scratch; - copy_pitch = scratch_pitch * (bpp / 8); - flush = TRUE; - -copy: - if (flush) - radeon_cs_flush_indirect(pScrn); - - ret = radeon_bo_map(copy_src, 0); - if (ret) { - ErrorF("failed to map pixmap: %d\n", ret); - r = FALSE; - goto out; - } - r = TRUE; - w *= bpp / 8; - if (copy_src == driver_priv->bo) - size = y * copy_pitch + x * bpp / 8; - else - size = 0; - while (h--) { - memcpy(dst, copy_src->ptr + size, w); - size += copy_pitch; - dst += dst_pitch; - } - radeon_bo_unmap(copy_src); -out: - if (scratch) - radeon_bo_unref(scratch); - return r; -} - -static int -EVERGREENMarkSync(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - return ++accel_state->exaSyncMarker; - -} - -static void -EVERGREENSync(ScreenPtr pScreen, int marker) -{ - return; -} - -static Bool -EVERGREENAllocShaders(ScrnInfoPtr pScrn, ScreenPtr pScreen) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - /* 512 bytes per shader for now */ - int size = 512 * 9; - - accel_state->shaders = NULL; - - accel_state->shaders_bo = radeon_bo_open(info->bufmgr, 0, size, 0, - RADEON_GEM_DOMAIN_VRAM, 0); - if (accel_state->shaders_bo == NULL) { - ErrorF("Allocating shader failed\n"); - return FALSE; - } - return TRUE; -} - -static Bool -EVERGREENLoadShaders(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - RADEONChipFamily ChipSet = info->ChipFamily; - uint32_t *shader; - int ret; - - ret = radeon_bo_map(accel_state->shaders_bo, 1); - if (ret) { - FatalError("failed to map shader %d\n", ret); - return FALSE; - } - shader = accel_state->shaders_bo->ptr; - - /* solid vs --------------------------------------- */ - accel_state->solid_vs_offset = 0; - evergreen_solid_vs(ChipSet, shader + accel_state->solid_vs_offset / 4); - - /* solid ps --------------------------------------- */ - accel_state->solid_ps_offset = 512; - evergreen_solid_ps(ChipSet, shader + accel_state->solid_ps_offset / 4); - - /* copy vs --------------------------------------- */ - accel_state->copy_vs_offset = 1024; - evergreen_copy_vs(ChipSet, shader + accel_state->copy_vs_offset / 4); - - /* copy ps --------------------------------------- */ - accel_state->copy_ps_offset = 1536; - evergreen_copy_ps(ChipSet, shader + accel_state->copy_ps_offset / 4); - - /* comp vs --------------------------------------- */ - accel_state->comp_vs_offset = 2048; - evergreen_comp_vs(ChipSet, shader + accel_state->comp_vs_offset / 4); - - /* comp ps --------------------------------------- */ - accel_state->comp_ps_offset = 2560; - evergreen_comp_ps(ChipSet, shader + accel_state->comp_ps_offset / 4); - - /* xv vs --------------------------------------- */ - accel_state->xv_vs_offset = 3072; - evergreen_xv_vs(ChipSet, shader + accel_state->xv_vs_offset / 4); - - /* xv ps --------------------------------------- */ - accel_state->xv_ps_offset = 3584; - evergreen_xv_ps(ChipSet, shader + accel_state->xv_ps_offset / 4); - - radeon_bo_unmap(accel_state->shaders_bo); - - return TRUE; -} - -static Bool -CAYMANLoadShaders(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - RADEONChipFamily ChipSet = info->ChipFamily; - uint32_t *shader; - int ret; - - ret = radeon_bo_map(accel_state->shaders_bo, 1); - if (ret) { - FatalError("failed to map shader %d\n", ret); - return FALSE; - } - shader = accel_state->shaders_bo->ptr; - - /* solid vs --------------------------------------- */ - accel_state->solid_vs_offset = 0; - cayman_solid_vs(ChipSet, shader + accel_state->solid_vs_offset / 4); - - /* solid ps --------------------------------------- */ - accel_state->solid_ps_offset = 512; - cayman_solid_ps(ChipSet, shader + accel_state->solid_ps_offset / 4); - - /* copy vs --------------------------------------- */ - accel_state->copy_vs_offset = 1024; - cayman_copy_vs(ChipSet, shader + accel_state->copy_vs_offset / 4); - - /* copy ps --------------------------------------- */ - accel_state->copy_ps_offset = 1536; - cayman_copy_ps(ChipSet, shader + accel_state->copy_ps_offset / 4); - - /* comp vs --------------------------------------- */ - accel_state->comp_vs_offset = 2048; - cayman_comp_vs(ChipSet, shader + accel_state->comp_vs_offset / 4); - - /* comp ps --------------------------------------- */ - accel_state->comp_ps_offset = 2560; - cayman_comp_ps(ChipSet, shader + accel_state->comp_ps_offset / 4); - - /* xv vs --------------------------------------- */ - accel_state->xv_vs_offset = 3072; - cayman_xv_vs(ChipSet, shader + accel_state->xv_vs_offset / 4); - - /* xv ps --------------------------------------- */ - accel_state->xv_ps_offset = 3584; - cayman_xv_ps(ChipSet, shader + accel_state->xv_ps_offset / 4); - - radeon_bo_unmap(accel_state->shaders_bo); - - return TRUE; -} - -Bool -EVERGREENDrawInit(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (info->accel_state->exa == NULL) { - xf86DrvMsg(pScreen->myNum, X_ERROR, "Memory map not set up\n"); - return FALSE; - } - - /* accel requires kms */ - if (!info->cs) - return FALSE; - - info->accel_state->exa->exa_major = EXA_VERSION_MAJOR; - info->accel_state->exa->exa_minor = EXA_VERSION_MINOR; - - info->accel_state->exa->PrepareSolid = EVERGREENPrepareSolid; - info->accel_state->exa->Solid = EVERGREENSolid; - info->accel_state->exa->DoneSolid = EVERGREENDoneSolid; - - info->accel_state->exa->PrepareCopy = EVERGREENPrepareCopy; - info->accel_state->exa->Copy = EVERGREENCopy; - info->accel_state->exa->DoneCopy = EVERGREENDoneCopy; - - info->accel_state->exa->MarkSync = EVERGREENMarkSync; - info->accel_state->exa->WaitMarker = EVERGREENSync; - - info->accel_state->exa->CreatePixmap = RADEONEXACreatePixmap; - info->accel_state->exa->DestroyPixmap = RADEONEXADestroyPixmap; - info->accel_state->exa->PixmapIsOffscreen = RADEONEXAPixmapIsOffscreen; - info->accel_state->exa->PrepareAccess = RADEONPrepareAccess_CS; - info->accel_state->exa->FinishAccess = RADEONFinishAccess_CS; - info->accel_state->exa->UploadToScreen = EVERGREENUploadToScreen; - info->accel_state->exa->DownloadFromScreen = EVERGREENDownloadFromScreen; -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 5) - info->accel_state->exa->CreatePixmap2 = RADEONEXACreatePixmap2; -#endif - - info->accel_state->exa->flags = EXA_OFFSCREEN_PIXMAPS; -#ifdef EXA_SUPPORTS_PREPARE_AUX - info->accel_state->exa->flags |= EXA_SUPPORTS_PREPARE_AUX; -#endif - -#ifdef EXA_HANDLES_PIXMAPS - info->accel_state->exa->flags |= EXA_HANDLES_PIXMAPS; -#ifdef EXA_MIXED_PIXMAPS - info->accel_state->exa->flags |= EXA_MIXED_PIXMAPS; -#endif -#endif - info->accel_state->exa->pixmapOffsetAlign = 256; - info->accel_state->exa->pixmapPitchAlign = 256; - - info->accel_state->exa->CheckComposite = EVERGREENCheckComposite; - info->accel_state->exa->PrepareComposite = EVERGREENPrepareComposite; - info->accel_state->exa->Composite = EVERGREENComposite; - info->accel_state->exa->DoneComposite = EVERGREENDoneComposite; - -#if EXA_VERSION_MAJOR > 2 || (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 3) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting EXA maxPitchBytes\n"); - - info->accel_state->exa->maxPitchBytes = 32768; - info->accel_state->exa->maxX = 8192; -#else - info->accel_state->exa->maxX = 8192; -#endif - info->accel_state->exa->maxY = 8192; - - /* not supported yet */ - if (xf86ReturnOptValBool(info->Options, OPTION_EXA_VSYNC, FALSE)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EXA VSync enabled\n"); - info->accel_state->vsync = TRUE; - } else - info->accel_state->vsync = FALSE; - - if (!exaDriverInit(pScreen, info->accel_state->exa)) { - free(info->accel_state->exa); - return FALSE; - } - - info->accel_state->XInited3D = FALSE; - info->accel_state->copy_area = NULL; - info->accel_state->src_obj[0].bo = NULL; - info->accel_state->src_obj[1].bo = NULL; - info->accel_state->dst_obj.bo = NULL; - info->accel_state->copy_area_bo = NULL; - info->accel_state->vbo.vb_start_op = -1; - info->accel_state->cbuf.vb_start_op = -1; - info->accel_state->finish_op = evergreen_finish_op; - info->accel_state->vbo.verts_per_op = 3; - info->accel_state->cbuf.verts_per_op = 1; - RADEONVlineHelperClear(pScrn); - - radeon_vbo_init_lists(pScrn); - - if (!EVERGREENAllocShaders(pScrn, pScreen)) - return FALSE; - - if (info->ChipFamily == CHIP_FAMILY_CAYMAN) { - if (!CAYMANLoadShaders(pScrn)) - return FALSE; - } else { - if (!EVERGREENLoadShaders(pScrn)) - return FALSE; - } - - exaMarkSync(pScreen); - - return TRUE; - -} - -#endif diff --git a/driver/xf86-video-ati/src/evergreen_reg.h b/driver/xf86-video-ati/src/evergreen_reg.h deleted file mode 100644 index 23d6c74ce..000000000 --- a/driver/xf86-video-ati/src/evergreen_reg.h +++ /dev/null @@ -1,250 +0,0 @@ -/* - * Evergeen Register documentation - * - * Copyright (C) 2010 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 COPYRIGHT HOLDER(S) 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. - */ - -#ifndef _EVERGREEN_REG_H_ -#define _EVERGREEN_REG_H_ - -/* - * Register definitions - */ - -#include "evergreen_reg_auto.h" - -enum { - SHADER_TYPE_PS, - SHADER_TYPE_VS, - SHADER_TYPE_GS, - SHADER_TYPE_HS, - SHADER_TYPE_LS, - SHADER_TYPE_CS, - SHADER_TYPE_FS, -}; - - -/* SET_*_REG offsets + ends */ -#define SET_CONFIG_REG_offset 0x00008000 -#define SET_CONFIG_REG_end 0x0000ac00 -#define SET_CONTEXT_REG_offset 0x00028000 -#define SET_CONTEXT_REG_end 0x00029000 -#define SET_RESOURCE_offset 0x00030000 -#define SET_RESOURCE_end 0x00038000 -#define SET_SAMPLER_offset 0x0003c000 -#define SET_SAMPLER_end 0x0003c600 -#define SET_CTL_CONST_offset 0x0003cff0 -#define SET_CTL_CONST_end 0x0003ff0c -#define SET_LOOP_CONST_offset 0x0003a200 -#define SET_LOOP_CONST_end 0x0003a500 -#define SET_BOOL_CONST_offset 0x0003a500 -#define SET_BOOL_CONST_end 0x0003a518 - - -/* Packet3 commands */ -enum { - IT_NOP = 0x10, - IT_INDIRECT_BUFFER_END = 0x17, - IT_SET_PREDICATION = 0x20, - IT_COND_EXEC = 0x22, - IT_PRED_EXEC = 0x23, - IT_DRAW_INDEX_2 = 0x27, - IT_CONTEXT_CONTROL = 0x28, - IT_DRAW_INDEX_OFFSET = 0x29, - IT_INDEX_TYPE = 0x2A, - IT_DRAW_INDEX = 0x2B, - IT_DRAW_INDEX_AUTO = 0x2D, - IT_DRAW_INDEX_IMMD = 0x2E, - IT_NUM_INSTANCES = 0x2F, - IT_INDIRECT_BUFFER = 0x32, - IT_STRMOUT_BUFFER_UPDATE = 0x34, - IT_MEM_SEMAPHORE = 0x39, - IT_MPEG_INDEX = 0x3A, - IT_WAIT_REG_MEM = 0x3C, - IT_MEM_WRITE = 0x3D, - IT_SURFACE_SYNC = 0x43, - IT_ME_INITIALIZE = 0x44, - IT_COND_WRITE = 0x45, - IT_EVENT_WRITE = 0x46, - IT_EVENT_WRITE_EOP = 0x47, - IT_EVENT_WRITE_EOS = 0x48, - IT_SET_CONFIG_REG = 0x68, - IT_SET_CONTEXT_REG = 0x69, - IT_SET_ALU_CONST = 0x6A, - IT_SET_BOOL_CONST = 0x6B, - IT_SET_LOOP_CONST = 0x6C, - IT_SET_RESOURCE = 0x6D, - IT_SET_SAMPLER = 0x6E, - IT_SET_CTL_CONST = 0x6F, -}; - -/* IT_WAIT_REG_MEM operation encoding */ - -#define IT_WAIT_ALWAYS (0 << 0) -#define IT_WAIT_LT (1 << 0) -#define IT_WAIT_LE (2 << 0) -#define IT_WAIT_EQ (3 << 0) -#define IT_WAIT_NE (4 << 0) -#define IT_WAIT_GE (5 << 0) -#define IT_WAIT_GT (6 << 0) -#define IT_WAIT_REG (0 << 4) -#define IT_WAIT_MEM (1 << 4) - -#define IT_WAIT_ADDR(x) ((x) >> 2) - -/* IT_INDEX_TYPE */ -#define IT_INDEX_TYPE_SWAP_MODE(x) ((x) << 2) - -enum { - - SQ_LDS_ALLOC_PS = 0x288ec, - SQ_DYN_GPR_RESOURCE_LIMIT_1 = 0x28838, - SQ_DYN_GPR_CNTL_PS_FLUSH_REQ = 0x8d8c, - SQ_LDS_RESOURCE_MGMT = 0x8e2c, - - WAIT_UNTIL = 0x8040, - WAIT_CP_DMA_IDLE_bit = 1 << 8, - WAIT_CMDFIFO_bit = 1 << 10, - WAIT_3D_IDLE_bit = 1 << 15, - WAIT_3D_IDLECLEAN_bit = 1 << 17, - WAIT_EXTERN_SIG_bit = 1 << 19, - CMDFIFO_ENTRIES_mask = 0xf << 20, - CMDFIFO_ENTRIES_shift = 20, - - CP_COHER_CNTL = 0x85f0, - DEST_BASE_0_ENA_bit = 1 << 0, - DEST_BASE_1_ENA_bit = 1 << 1, - SO0_DEST_BASE_ENA_bit = 1 << 2, - SO1_DEST_BASE_ENA_bit = 1 << 3, - SO2_DEST_BASE_ENA_bit = 1 << 4, - SO3_DEST_BASE_ENA_bit = 1 << 5, - CB0_DEST_BASE_ENA_bit = 1 << 6, - CB1_DEST_BASE_ENA_bit = 1 << 7, - CB2_DEST_BASE_ENA_bit = 1 << 8, - CB3_DEST_BASE_ENA_bit = 1 << 9, - CB4_DEST_BASE_ENA_bit = 1 << 10, - CB5_DEST_BASE_ENA_bit = 1 << 11, - CB6_DEST_BASE_ENA_bit = 1 << 12, - CB7_DEST_BASE_ENA_bit = 1 << 13, - DB_DEST_BASE_ENA_bit = 1 << 14, - CB8_DEST_BASE_ENA_bit = 1 << 15, - CB9_DEST_BASE_ENA_bit = 1 << 16, - CB10_DEST_BASE_ENA_bit = 1 << 17, - CB11_DEST_BASE_ENA_bit = 1 << 18, - FULL_CACHE_ENA_bit = 1 << 20, - TC_ACTION_ENA_bit = 1 << 23, - VC_ACTION_ENA_bit = 1 << 24, - CB_ACTION_ENA_bit = 1 << 25, - DB_ACTION_ENA_bit = 1 << 26, - SH_ACTION_ENA_bit = 1 << 27, - SX_ACTION_ENA_bit = 1 << 28, - CP_COHER_SIZE = 0x85f4, - CP_COHER_BASE = 0x85f8, - CP_COHER_STATUS = 0x85fc, - MATCHING_GFX_CNTX_mask = 0xff << 0, - MATCHING_GFX_CNTX_shift = 0, - STATUS_bit = 1 << 31, - -// SQ_VTX_CONSTANT_WORD2_0 = 0x00030008, -// SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask = 0x3f << 20, - FMT_INVALID=0, FMT_8, FMT_4_4, FMT_3_3_2, - FMT_16=5, FMT_16_FLOAT, FMT_8_8, - FMT_5_6_5, FMT_6_5_5, FMT_1_5_5_5, FMT_4_4_4_4, - FMT_5_5_5_1, FMT_32, FMT_32_FLOAT, FMT_16_16, - FMT_16_16_FLOAT=16, FMT_8_24, FMT_8_24_FLOAT, FMT_24_8, - FMT_24_8_FLOAT, FMT_10_11_11, FMT_10_11_11_FLOAT, FMT_11_11_10, - FMT_11_11_10_FLOAT, FMT_2_10_10_10, FMT_8_8_8_8, FMT_10_10_10_2, - FMT_X24_8_32_FLOAT, FMT_32_32, FMT_32_32_FLOAT, FMT_16_16_16_16, - FMT_16_16_16_16_FLOAT=32, FMT_32_32_32_32=34, FMT_32_32_32_32_FLOAT, - FMT_1 = 37, FMT_GB_GR=39, - FMT_BG_RG, FMT_32_AS_8, FMT_32_AS_8_8, FMT_5_9_9_9_SHAREDEXP, - FMT_8_8_8, FMT_16_16_16, FMT_16_16_16_FLOAT, FMT_32_32_32, - FMT_32_32_32_FLOAT=48, - -// High level register file lengths - SQ_FETCH_RESOURCE = SQ_TEX_RESOURCE_WORD0_0, - SQ_FETCH_RESOURCE_ps_num = 176, - SQ_FETCH_RESOURCE_vs_num = 160, - SQ_FETCH_RESOURCE_gs_num = 160, - SQ_FETCH_RESOURCE_hs_num = 160, - SQ_FETCH_RESOURCE_ls_num = 160, - SQ_FETCH_RESOURCE_cs_num = 176, - SQ_FETCH_RESOURCE_fs_num = 32, - SQ_FETCH_RESOURCE_all_num = 1024, - SQ_FETCH_RESOURCE_offset = 32, - SQ_FETCH_RESOURCE_ps = 0, // 0...175 - SQ_FETCH_RESOURCE_vs = SQ_FETCH_RESOURCE_ps + SQ_FETCH_RESOURCE_ps_num, // 176...335 - SQ_FETCH_RESOURCE_gs = SQ_FETCH_RESOURCE_vs + SQ_FETCH_RESOURCE_vs_num, // 336...495 - SQ_FETCH_RESOURCE_hs = SQ_FETCH_RESOURCE_gs + SQ_FETCH_RESOURCE_gs_num, // 496...655 - SQ_FETCH_RESOURCE_ls = SQ_FETCH_RESOURCE_hs + SQ_FETCH_RESOURCE_hs_num, // 656...815 - SQ_FETCH_RESOURCE_cs = SQ_FETCH_RESOURCE_ls + SQ_FETCH_RESOURCE_ls_num, // 816...991 - SQ_FETCH_RESOURCE_fs = SQ_FETCH_RESOURCE_cs + SQ_FETCH_RESOURCE_cs_num, // 992...1023 - - SQ_TEX_SAMPLER_WORD = SQ_TEX_SAMPLER_WORD0_0, - SQ_TEX_SAMPLER_WORD_ps_num = 18, - SQ_TEX_SAMPLER_WORD_vs_num = 18, - SQ_TEX_SAMPLER_WORD_gs_num = 18, - SQ_TEX_SAMPLER_WORD_hs_num = 18, - SQ_TEX_SAMPLER_WORD_ls_num = 18, - SQ_TEX_SAMPLER_WORD_cs_num = 18, - SQ_TEX_SAMPLER_WORD_all_num = 108, - SQ_TEX_SAMPLER_WORD_offset = 12, - SQ_TEX_SAMPLER_WORD_ps = 0, // 0...17 - SQ_TEX_SAMPLER_WORD_vs = SQ_TEX_SAMPLER_WORD_ps + SQ_TEX_SAMPLER_WORD_ps_num, // 18...35 - SQ_TEX_SAMPLER_WORD_gs = SQ_TEX_SAMPLER_WORD_vs + SQ_TEX_SAMPLER_WORD_vs_num, // 36...53 - SQ_TEX_SAMPLER_WORD_hs = SQ_TEX_SAMPLER_WORD_gs + SQ_TEX_SAMPLER_WORD_gs_num, // 54...71 - SQ_TEX_SAMPLER_WORD_ls = SQ_TEX_SAMPLER_WORD_hs + SQ_TEX_SAMPLER_WORD_hs_num, // 72...89 - SQ_TEX_SAMPLER_WORD_cs = SQ_TEX_SAMPLER_WORD_ls + SQ_TEX_SAMPLER_WORD_ls_num, // 90...107 - - SQ_LOOP_CONST = SQ_LOOP_CONST_0, - SQ_LOOP_CONST_ps_num = 32, - SQ_LOOP_CONST_vs_num = 32, - SQ_LOOP_CONST_gs_num = 32, - SQ_LOOP_CONST_hs_num = 32, - SQ_LOOP_CONST_ls_num = 32, - SQ_LOOP_CONST_cs_num = 32, - SQ_LOOP_CONST_all_num = 192, - SQ_LOOP_CONST_offset = 4, - SQ_LOOP_CONST_ps = 0, // 0...31 - SQ_LOOP_CONST_vs = SQ_LOOP_CONST_ps + SQ_LOOP_CONST_ps_num, // 32...63 - SQ_LOOP_CONST_gs = SQ_LOOP_CONST_vs + SQ_LOOP_CONST_vs_num, // 64...95 - SQ_LOOP_CONST_hs = SQ_LOOP_CONST_gs + SQ_LOOP_CONST_gs_num, // 96...127 - SQ_LOOP_CONST_ls = SQ_LOOP_CONST_hs + SQ_LOOP_CONST_hs_num, // 128...159 - SQ_LOOP_CONST_cs = SQ_LOOP_CONST_ls + SQ_LOOP_CONST_ls_num, // 160...191 - - SQ_BOOL_CONST = SQ_BOOL_CONST_0, /* 32 bits each */ - SQ_BOOL_CONST_ps_num = 1, - SQ_BOOL_CONST_vs_num = 1, - SQ_BOOL_CONST_gs_num = 1, - SQ_BOOL_CONST_hs_num = 1, - SQ_BOOL_CONST_ls_num = 1, - SQ_BOOL_CONST_cs_num = 1, - SQ_BOOL_CONST_all_num = 6, - SQ_BOOL_CONST_offset = 4, - SQ_BOOL_CONST_ps = 0, - SQ_BOOL_CONST_vs = SQ_BOOL_CONST_ps + SQ_BOOL_CONST_ps_num, - SQ_BOOL_CONST_gs = SQ_BOOL_CONST_vs + SQ_BOOL_CONST_vs_num, - SQ_BOOL_CONST_hs = SQ_BOOL_CONST_gs + SQ_BOOL_CONST_gs_num, - SQ_BOOL_CONST_ls = SQ_BOOL_CONST_hs + SQ_BOOL_CONST_hs_num, - SQ_BOOL_CONST_cs = SQ_BOOL_CONST_ls + SQ_BOOL_CONST_ls_num, - -}; - -#endif diff --git a/driver/xf86-video-ati/src/evergreen_shader.c b/driver/xf86-video-ati/src/evergreen_shader.c deleted file mode 100644 index bbdd7a76c..000000000 --- a/driver/xf86-video-ati/src/evergreen_shader.c +++ /dev/null @@ -1,3164 +0,0 @@ -/* - * Copyright 2010 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 (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 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. - * - * Author: Alex Deucher - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef XF86DRM_MODE - -#include "xf86.h" - -#include "evergreen_shader.h" -#include "evergreen_reg.h" - -/* solid vs --------------------------------------- */ -int evergreen_solid_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(4), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_VC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 2 - always export a param whether it's used or not */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 3 - padding */ - shader[i++] = 0x00000000; - shader[i++] = 0x00000000; - /* 4/5 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(1), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -/* solid ps --------------------------------------- */ -int evergreen_solid_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_ALU_DWORD0(ADDR(2), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - - /* 2 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(1)); - /* 3 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(1)); - /* 4 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(1)); - /* 5 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MOV), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(1)); - - return i; -} - -/* copy vs --------------------------------------- */ -int evergreen_copy_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(4), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_VC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 2 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 3 */ - shader[i++] = 0x00000000; - shader[i++] = 0x00000000; - /* 4/5 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(16)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(1), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 6/7 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -/* copy ps --------------------------------------- */ -int evergreen_copy_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* CF INST 0 */ - shader[i++] = CF_ALU_DWORD0(ADDR(3), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* CF INST 1 */ - shader[i++] = CF_DWORD0(ADDR(8), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_TC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* CF INST 2 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - - /* 3 interpolate tex coords */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 4 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 5 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 6 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 7 */ - shader[i++] = 0x00000000; - shader[i++] = 0x00000000; - - /* 8/9 TEX INST 0 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), /* R */ - DST_SEL_Y(SQ_SEL_Y), /* G */ - DST_SEL_Z(SQ_SEL_Z), /* B */ - DST_SEL_W(SQ_SEL_W), /* A */ - LOD_BIAS(0), - COORD_TYPE_X(TEX_UNNORMALIZED), - COORD_TYPE_Y(TEX_UNNORMALIZED), - COORD_TYPE_Z(TEX_UNNORMALIZED), - COORD_TYPE_W(TEX_UNNORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - return i; -} - -int evergreen_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(6), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_VC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 1 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(4), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(2), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 2 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(3)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 3 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(3)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - - - /* 4 texX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 5 texY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 6/7 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(16)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(1), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 8/9 */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -int evergreen_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_ALU_DWORD0(ADDR(5), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(21), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 2 */ - shader[i++] = CF_DWORD0(ADDR(30), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 3 */ - shader[i++] = CF_ALU_DWORD0(ADDR(9), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(12), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 4 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(2), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(3)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 5 interpolate tex coords */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 6 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 7 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 8 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 9,10,11,12 */ - /* r2.x = MAD(c0.w, r1.x, c0.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* r2.y = MAD(c0.w, r1.x, c0.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* r2.z = MAD(c0.w, r1.x, c0.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 13,14,15,16 */ - /* r2.x = MAD(c1.x, r1.y, pv.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* r2.y = MAD(c1.y, r1.y, pv.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* r2.z = MAD(c1.z, r1.y, pv.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_W), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - /* 17,18,19,20 */ - /* r2.x = MAD(c2.x, r1.z, pv.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(1)); - /* r2.y = MAD(c2.y, r1.z, pv.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(1)); - /* r2.z = MAD(c2.z, r1.z, pv.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(1)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(1)); - - /* 21 */ - shader[i++] = CF_DWORD0(ADDR(24), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(3), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_TC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 22 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 23 */ - shader[i++] = 0x00000000; - shader[i++] = 0x00000000; - /* 24/25 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_MASK), - DST_SEL_Z(SQ_SEL_MASK), - DST_SEL_W(SQ_SEL_1), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 26/27 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(1), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_MASK), - DST_SEL_Y(SQ_SEL_MASK), - DST_SEL_Z(SQ_SEL_X), - DST_SEL_W(SQ_SEL_MASK), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(1), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 28/29 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(2), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_MASK), - DST_SEL_Y(SQ_SEL_X), - DST_SEL_Z(SQ_SEL_MASK), - DST_SEL_W(SQ_SEL_MASK), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(2), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 30 */ - shader[i++] = CF_DWORD0(ADDR(32), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_TC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 31 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 32/33 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_MASK), - DST_SEL_Z(SQ_SEL_MASK), - DST_SEL_W(SQ_SEL_1), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 34/35 */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(1), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_MASK), - DST_SEL_Y(SQ_SEL_X), - DST_SEL_Z(SQ_SEL_Y), - DST_SEL_W(SQ_SEL_MASK), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(1), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - return i; -} - -/* comp vs --------------------------------------- */ -int evergreen_comp_vs(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(3), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(9), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 2 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_NOP), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 3 - mask sub */ - shader[i++] = CF_DWORD0(ADDR(44), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(3), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_VC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 4 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(14), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(20), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 5 - dst */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(2), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 6 - src */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT), - MARK(0), - BARRIER(0)); - /* 7 - mask */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(1), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 8 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 9 - non-mask sub */ - shader[i++] = CF_DWORD0(ADDR(50), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_VC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 10 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(34), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(10), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 11 - dst */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 12 - src */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - BURST_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(0)); - /* 13 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 14 srcX.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 15 srcX.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 16 srcX.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 17 srcX.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 18 srcY.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 19 srcY.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 20 srcY.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 21 srcY.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 22 maskX.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 23 maskX.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 24 maskX.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 25 maskX.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 26 maskY.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 27 maskY.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 28 maskY.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 29 maskY.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 30 srcX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 3), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 31 srcY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 3), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 32 maskX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 4), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 33 maskY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 4), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 34 srcX.x DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 35 srcX.y DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 36 srcX.z DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 37 srcX.w DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 38 srcY.x DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 39 srcY.y DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 40 srcY.z DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 41 srcY.w DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 42 srcX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 43 srcY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_KCACHE0_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* mask vfetch - 44/45 - dst */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(24)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(2), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(1), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 46/47 - src */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 48/49 - mask */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(16), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - /* no mask vfetch - 50/51 - dst */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(16)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(1), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - /* 52/53 - src */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0), - ALT_CONST(0), - BUFFER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -/* comp ps --------------------------------------- */ -int evergreen_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(3), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(8), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 2 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(1), - CF_INST(SQ_CF_INST_NOP), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 3 - mask sub */ - shader[i++] = CF_ALU_DWORD0(ADDR(12), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(8), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 4 */ - shader[i++] = CF_DWORD0(ADDR(28), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_TC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 5 */ - shader[i++] = CF_ALU_DWORD0(ADDR(20), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_LOCK_1)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 6 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(2), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - /* 7 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 8 - non-mask sub */ - shader[i++] = CF_ALU_DWORD0(ADDR(24), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(4), - ALT_CONST(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 9 */ - shader[i++] = CF_DWORD0(ADDR(32), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_TC), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 10 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - BURST_COUNT(1), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - MARK(0), - BARRIER(1)); - - /* 11 */ - shader[i++] = CF_DWORD0(ADDR(0), - JUMPTABLE_SEL(SQ_CF_JUMPTABLE_SEL_CONST_A)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - VALID_PIXEL_MODE(0), - END_OF_PROGRAM(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 12 interpolate src tex coords - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 13 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 14 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 15 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 16 interpolate mask tex coords */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 17 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 18 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 19 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 20 - alu 0 */ - /* MUL gpr[2].x gpr[0].x gpr[1].x */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(1)); - /* 21 - alu 1 */ - /* MUL gpr[2].y gpr[0].y gpr[1].y */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(1)); - /* 22 - alu 2 */ - /* MUL gpr[2].z gpr[0].z gpr[1].z */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(1)); - /* 23 - alu 3 */ - /* MUL gpr[2].w gpr[0].w gpr[1].w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(1)); - - /* 24 - interpolate tex coords - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* 25 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* 26 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* 27 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_PARAM_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_INTERP_XY), - BANK_SWIZZLE(SQ_ALU_VEC_210), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 28/29 - src - mask */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(1), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(1), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_Z), - DST_SEL_W(SQ_SEL_W), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - /* 30/31 - mask */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(1), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_Z), - DST_SEL_W(SQ_SEL_W), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(1), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - /* 32/33 - src - non-mask */ - shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), - INST_MOD(0), - FETCH_WHOLE_QUAD(0), - RESOURCE_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - ALT_CONST(0), - RESOURCE_INDEX_MODE(SQ_CF_INDEX_NONE), - SAMPLER_INDEX_MODE(SQ_CF_INDEX_NONE)); - shader[i++] = TEX_DWORD1(DST_GPR(0), - DST_REL(ABSOLUTE), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_Z), - DST_SEL_W(SQ_SEL_W), - LOD_BIAS(0), - COORD_TYPE_X(TEX_NORMALIZED), - COORD_TYPE_Y(TEX_NORMALIZED), - COORD_TYPE_Z(TEX_NORMALIZED), - COORD_TYPE_W(TEX_NORMALIZED)); - shader[i++] = TEX_DWORD2(OFFSET_X(0), - OFFSET_Y(0), - OFFSET_Z(0), - SAMPLER_ID(0), - SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1)); - shader[i++] = TEX_DWORD_PAD; - - return i; -} - -#endif diff --git a/driver/xf86-video-ati/src/evergreen_shader.h b/driver/xf86-video-ati/src/evergreen_shader.h deleted file mode 100644 index 8c7136b71..000000000 --- a/driver/xf86-video-ati/src/evergreen_shader.h +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Evergreen shaders - * - * Copyright (C) 2010 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 - * BRIAN PAUL 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. - */ - -/* - * Shader macros - */ - -#ifndef __SHADER_H__ -#define __SHADER_H__ - -#include "radeon.h" - -/* Oder of instructions: All CF, All ALU, All Tex/Vtx fetches */ - - -// CF insts -// addr -#define ADDR(x) (x) -// jumptable -#define JUMPTABLE_SEL(x) (x) -// pc -#define POP_COUNT(x) (x) -// const -#define CF_CONST(x) (x) -// cond -#define COND(x) (x) // SQ_COND_* -// count -#define I_COUNT(x) ((x) ? ((x) - 1) : 0) -// vpm -#define VALID_PIXEL_MODE(x) (x) -// eop -#define END_OF_PROGRAM(x) (x) -// cf inst -#define CF_INST(x) (x) // SQ_CF_INST_* -// wqm -#define WHOLE_QUAD_MODE(x) (x) -// barrier -#define BARRIER(x) (x) -//kb0 -#define KCACHE_BANK0(x) (x) -//kb1 -#define KCACHE_BANK1(x) (x) -// km0/1 -#define KCACHE_MODE0(x) (x) -#define KCACHE_MODE1(x) (x) // SQ_CF_KCACHE_* -// -#define KCACHE_ADDR0(x) (x) -#define KCACHE_ADDR1(x) (x) - -#define ALT_CONST(x) (x) - -#define ARRAY_BASE(x) (x) -// export pixel -#define CF_PIXEL_MRT0 0 -#define CF_PIXEL_MRT1 1 -#define CF_PIXEL_MRT2 2 -#define CF_PIXEL_MRT3 3 -#define CF_PIXEL_MRT4 4 -#define CF_PIXEL_MRT5 5 -#define CF_PIXEL_MRT6 6 -#define CF_PIXEL_MRT7 7 -// computed Z -#define CF_COMPUTED_Z 61 -// export pos -#define CF_POS0 60 -#define CF_POS1 61 -#define CF_POS2 62 -#define CF_POS3 63 -// export param -// 0...31 -#define TYPE(x) (x) // SQ_EXPORT_* -#define RW_GPR(x) (x) -#define RW_REL(x) (x) -#define ABSOLUTE 0 -#define RELATIVE 1 -#define INDEX_GPR(x) (x) -#define ELEM_SIZE(x) (x ? (x - 1) : 0) -#define BURST_COUNT(x) (x ? (x - 1) : 0) -#define MARK(x) (x) - -// swiz -#define SRC_SEL_X(x) (x) // SQ_SEL_* each -#define SRC_SEL_Y(x) (x) -#define SRC_SEL_Z(x) (x) -#define SRC_SEL_W(x) (x) - -#define CF_DWORD0(addr, jmptbl) cpu_to_le32(((addr) | ((jmptbl) << 24))) -#define CF_DWORD1(pc, cf_const, cond, count, vpm, eop, cf_inst, wqm, b) \ - cpu_to_le32((((pc) << 0) | ((cf_const) << 3) | ((cond) << 8) | ((count) << 10) | \ - ((vpm) << 20) | ((eop) << 21) | ((cf_inst) << 22) | ((wqm) << 30) | ((b) << 31))) - -#define CF_ALU_DWORD0(addr, kb0, kb1, km0) cpu_to_le32((((addr) << 0) | ((kb0) << 22) | ((kb1) << 26) | ((km0) << 30))) -#define CF_ALU_DWORD1(km1, kcache_addr0, kcache_addr1, count, alt_const, cf_inst, wqm, b) \ - cpu_to_le32((((km1) << 0) | ((kcache_addr0) << 2) | ((kcache_addr1) << 10) | \ - ((count) << 18) | ((alt_const) << 25) | ((cf_inst) << 26) | ((wqm) << 30) | ((b) << 31))) - -#define CF_ALLOC_IMP_EXP_DWORD0(array_base, type, rw_gpr, rr, index_gpr, es) \ - cpu_to_le32((((array_base) << 0) | ((type) << 13) | ((rw_gpr) << 15) | ((rr) << 22) | \ - ((index_gpr) << 23) | ((es) << 30))) -#define CF_ALLOC_IMP_EXP_DWORD1_SWIZ(sel_x, sel_y, sel_z, sel_w, bc, vpm, eop, cf_inst, m, b) \ - cpu_to_le32((((sel_x) << 0) | ((sel_y) << 3) | ((sel_z) << 6) | ((sel_w) << 9) | \ - ((bc) << 16) | ((vpm) << 20) | ((eop) << 21) | ((cf_inst) << 22) | \ - ((m) << 30) | ((b) << 31))) - -// ALU clause insts -#define SRC0_SEL(x) (x) -#define SRC1_SEL(x) (x) -#define SRC2_SEL(x) (x) -// src[0-2]_sel -// 0-127 GPR -// 128-159 kcache constants bank 0 -// 160-191 kcache constants bank 1 -// 192-255 inline const values -// 256-287 kcache constants bank 2 -// 288-319 kcache constants bank 3 -// 219-255 special SQ_ALU_SRC_* (0, 1, etc.) -// 488-520 src param space -#define ALU_SRC_GPR_BASE 0 -#define ALU_SRC_KCACHE0_BASE 128 -#define ALU_SRC_KCACHE1_BASE 160 -#define ALU_SRC_INLINE_K_BASE 192 -#define ALU_SRC_KCACHE2_BASE 256 -#define ALU_SRC_KCACHE3_BASE 288 -#define ALU_SRC_PARAM_BASE 448 - -#define SRC0_REL(x) (x) -#define SRC1_REL(x) (x) -#define SRC2_REL(x) (x) -// elem -#define SRC0_ELEM(x) (x) -#define SRC1_ELEM(x) (x) -#define SRC2_ELEM(x) (x) -#define ELEM_X 0 -#define ELEM_Y 1 -#define ELEM_Z 2 -#define ELEM_W 3 -// neg -#define SRC0_NEG(x) (x) -#define SRC1_NEG(x) (x) -#define SRC2_NEG(x) (x) -// im -#define INDEX_MODE(x) (x) // SQ_INDEX_* -// ps -#define PRED_SEL(x) (x) // SQ_PRED_SEL_* -// last -#define LAST(x) (x) -// abs -#define SRC0_ABS(x) (x) -#define SRC1_ABS(x) (x) -// uem -#define UPDATE_EXECUTE_MASK(x) (x) -// up -#define UPDATE_PRED(x) (x) -// wm -#define WRITE_MASK(x) (x) -// omod -#define OMOD(x) (x) // SQ_ALU_OMOD_* -// alu inst -#define ALU_INST(x) (x) // SQ_ALU_INST_* -//bs -#define BANK_SWIZZLE(x) (x) // SQ_ALU_VEC_* -#define DST_GPR(x) (x) -#define DST_REL(x) (x) -#define DST_ELEM(x) (x) -#define CLAMP(x) (x) - -#define ALU_DWORD0(src0_sel, s0r, s0e, s0n, src1_sel, s1r, s1e, s1n, im, ps, last) \ - cpu_to_le32((((src0_sel) << 0) | ((s0r) << 9) | ((s0e) << 10) | ((s0n) << 12) | \ - ((src1_sel) << 13) | ((s1r) << 22) | ((s1e) << 23) | ((s1n) << 25) | \ - ((im) << 26) | ((ps) << 29) | ((last) << 31))) - -#define ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ - cpu_to_le32((((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ - ((omod) << 5) | ((alu_inst) << 7) | ((bs) << 18) | ((dst_gpr) << 21) | \ - ((dr) << 28) | ((de) << 29) | ((clamp) << 31))) - -#define ALU_DWORD1_OP3(src2_sel, s2r, s2e, s2n, alu_inst, bs, dst_gpr, dr, de, clamp) \ - cpu_to_le32((((src2_sel) << 0) | ((s2r) << 9) | ((s2e) << 10) | ((s2n) << 12) | \ - ((alu_inst) << 13) | ((bs) << 18) | ((dst_gpr) << 21) | ((dr) << 28) | \ - ((de) << 29) | ((clamp) << 31))) - -// VTX clause insts -// vxt insts -#define VTX_INST(x) (x) // SQ_VTX_INST_* - -// fetch type -#define FETCH_TYPE(x) (x) // SQ_VTX_FETCH_* - -#define FETCH_WHOLE_QUAD(x) (x) -#define BUFFER_ID(x) (x) -#define SRC_GPR(x) (x) -#define SRC_REL(x) (x) -#define MEGA_FETCH_COUNT(x) ((x) ? ((x) - 1) : 0) - -#define DST_SEL_X(x) (x) -#define DST_SEL_Y(x) (x) -#define DST_SEL_Z(x) (x) -#define DST_SEL_W(x) (x) -#define USE_CONST_FIELDS(x) (x) -#define DATA_FORMAT(x) (x) -// num format -#define NUM_FORMAT_ALL(x) (x) // SQ_NUM_FORMAT_* -// format comp -#define FORMAT_COMP_ALL(x) (x) // SQ_FORMAT_COMP_* -// sma -#define SRF_MODE_ALL(x) (x) -#define SRF_MODE_ZERO_CLAMP_MINUS_ONE 0 -#define SRF_MODE_NO_ZERO 1 -#define OFFSET(x) (x) -// endian swap -#define ENDIAN_SWAP(x) (x) // SQ_ENDIAN_* -#define CONST_BUF_NO_STRIDE(x) (x) -// mf -#define MEGA_FETCH(x) (x) -#define BUFFER_INDEX_MODE(x) (x) - -#define VTX_DWORD0(vtx_inst, ft, fwq, buffer_id, src_gpr, sr, ssx, mfc) \ - cpu_to_le32((((vtx_inst) << 0) | ((ft) << 5) | ((fwq) << 7) | ((buffer_id) << 8) | \ - ((src_gpr) << 16) | ((sr) << 23) | ((ssx) << 24) | ((mfc) << 26))) -#define VTX_DWORD1_GPR(dst_gpr, dr, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ - cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ - ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31))) -#define VTX_DWORD2(offset, es, cbns, mf, alt_const, bim) \ - cpu_to_le32((((offset) << 0) | ((es) << 16) | ((cbns) << 18) | ((mf) << 19) | ((alt_const) << 20) | ((bim) << 21))) -#define VTX_DWORD_PAD cpu_to_le32(0x00000000) - -// TEX clause insts -// tex insts -#define TEX_INST(x) (x) // SQ_TEX_INST_* -#define INST_MOD(x) (x) -#define FETCH_WHOLE_QUAD(x) (x) -#define RESOURCE_ID(x) (x) -#define RESOURCE_INDEX_MODE(x) (x) -#define SAMPLER_INDEX_MODE(x) (x) - -#define LOD_BIAS(x) (x) -//ct -#define COORD_TYPE_X(x) (x) -#define COORD_TYPE_Y(x) (x) -#define COORD_TYPE_Z(x) (x) -#define COORD_TYPE_W(x) (x) -#define TEX_UNNORMALIZED 0 -#define TEX_NORMALIZED 1 -#define OFFSET_X(x) (((int)(x) * 2) & 0x1f) /* 4:1-bits 2's-complement fixed-point: [-8.0..7.5] */ -#define OFFSET_Y(x) (((int)(x) * 2) & 0x1f) -#define OFFSET_Z(x) (((int)(x) * 2) & 0x1f) -#define SAMPLER_ID(x) (x) - -#define TEX_DWORD0(tex_inst, im, fwq, resource_id, src_gpr, sr, ac, rim, sim) \ - cpu_to_le32((((tex_inst) << 0) | ((im) << 5) | ((fwq) << 7) | ((resource_id) << 8) | \ - ((src_gpr) << 16) | ((sr) << 23) | ((ac) << 24) | ((rim) << 25) | ((sim) << 27))) -#define TEX_DWORD1(dst_gpr, dr, dsx, dsy, dsz, dsw, lod_bias, ctx, cty, ctz, ctw) \ - cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ - ((lod_bias) << 21) | ((ctx) << 28) | ((cty) << 29) | ((ctz) << 30) | ((ctw) << 31))) -#define TEX_DWORD2(offset_x, offset_y, offset_z, sampler_id, ssx, ssy, ssz, ssw) \ - cpu_to_le32((((offset_x) << 0) | ((offset_y) << 5) | ((offset_z) << 10) | ((sampler_id) << 15) | \ - ((ssx) << 20) | ((ssy) << 23) | ((ssz) << 26) | ((ssw) << 29))) -#define TEX_DWORD_PAD cpu_to_le32(0x00000000) - -extern int evergreen_solid_vs(RADEONChipFamily ChipSet, uint32_t* vs); -extern int evergreen_solid_ps(RADEONChipFamily ChipSet, uint32_t* ps); - -extern int evergreen_copy_vs(RADEONChipFamily ChipSet, uint32_t* vs); -extern int evergreen_copy_ps(RADEONChipFamily ChipSet, uint32_t* ps); - -extern int evergreen_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader); -extern int evergreen_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader); - -extern int evergreen_comp_vs(RADEONChipFamily ChipSet, uint32_t* vs); -extern int evergreen_comp_ps(RADEONChipFamily ChipSet, uint32_t* ps); - -#endif diff --git a/driver/xf86-video-ati/src/evergreen_state.h b/driver/xf86-video-ati/src/evergreen_state.h deleted file mode 100644 index 40fec229f..000000000 --- a/driver/xf86-video-ati/src/evergreen_state.h +++ /dev/null @@ -1,351 +0,0 @@ -/* - * Copyright 2010 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 (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 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. - * - * Authors: Alex Deucher - * - */ - -#ifndef __EVERGREEN_STATE_H__ -#define __EVERGREEN_STATE_H__ - -typedef int bool_t; - -#define CLEAR(x) memset (&x, 0, sizeof(x)) - -/* Sequencer / thread handling */ -typedef struct { - int ps_prio; - int vs_prio; - int gs_prio; - int es_prio; - int hs_prio; - int ls_prio; - int cs_prio; - int num_ps_gprs; - int num_vs_gprs; - int num_gs_gprs; - int num_es_gprs; - int num_hs_gprs; - int num_ls_gprs; - int num_cs_gprs; - int num_temp_gprs; - int num_ps_threads; - int num_vs_threads; - int num_gs_threads; - int num_es_threads; - int num_hs_threads; - int num_ls_threads; - int num_ps_stack_entries; - int num_vs_stack_entries; - int num_gs_stack_entries; - int num_es_stack_entries; - int num_hs_stack_entries; - int num_ls_stack_entries; -} sq_config_t; - -/* Color buffer / render target */ -typedef struct { - int id; - int w; - int h; - uint64_t base; - int format; - int endian; - int array_mode; // tiling - int non_disp_tiling; - int number_type; - int read_size; - int comp_swap; - int tile_mode; - int blend_clamp; - int clear_color; - int blend_bypass; - int simple_float; - int round_mode; - int tile_compact; - int source_format; - int resource_type; - int fast_clear; - int compression; - int rat; - /* 2D related CB state */ - uint32_t pmask; - int rop; - int blend_enable; - uint32_t blendcntl; - struct radeon_bo *bo; -} cb_config_t; - -/* Shader */ -typedef struct { - uint64_t shader_addr; - uint32_t shader_size; - int num_gprs; - int stack_size; - int dx10_clamp; - int clamp_consts; - int export_mode; - int uncached_first_inst; - int single_round; - int double_round; - int allow_sdi; - int allow_sd0; - int allow_ddi; - int allow_ddo; - struct radeon_bo *bo; -} shader_config_t; - -/* Shader consts */ -typedef struct { - int type; - int size_bytes; - uint64_t const_addr; - struct radeon_bo *bo; -} const_config_t; - -/* Vertex buffer / vtx resource */ -typedef struct { - int id; - uint64_t vb_addr; - uint32_t vtx_num_entries; - uint32_t vtx_size_dw; - int clamp_x; - int format; - int num_format_all; - int format_comp_all; - int srf_mode_all; - int endian; - int mem_req_size; - int dst_sel_x; - int dst_sel_y; - int dst_sel_z; - int dst_sel_w; - int uncached; - struct radeon_bo *bo; -} vtx_resource_t; - -/* Texture resource */ -typedef struct { - int id; - int w; - int h; - int pitch; - int depth; - int dim; - int array_mode; - int tile_type; - int format; - uint64_t base; - uint64_t mip_base; - uint32_t size; - int format_comp_x; - int format_comp_y; - int format_comp_z; - int format_comp_w; - int num_format_all; - int srf_mode_all; - int force_degamma; - int endian; - int dst_sel_x; - int dst_sel_y; - int dst_sel_z; - int dst_sel_w; - int base_level; - int last_level; - int base_array; - int last_array; - int perf_modulation; - int interlaced; - int min_lod; - struct radeon_bo *bo; - struct radeon_bo *mip_bo; -} tex_resource_t; - -/* Texture sampler */ -typedef struct { - int id; - /* Clamping */ - int clamp_x, clamp_y, clamp_z; - int border_color; - /* Filtering */ - int xy_mag_filter, xy_min_filter; - int z_filter; - int mip_filter; - bool_t high_precision_filter; /* ? */ - int perf_mip; /* ? 0-7 */ - int perf_z; /* ? 3 */ - /* LoD selection */ - int min_lod, max_lod; /* 0-0x3ff */ - int lod_bias; /* 0-0xfff (signed?) */ - int lod_bias2; /* ? 0-0xfff (signed?) */ - bool_t lod_uses_minor_axis; /* ? */ - /* Other stuff */ - bool_t point_sampling_clamp; /* ? */ - bool_t tex_array_override; /* ? */ - bool_t mc_coord_truncate; /* ? */ - bool_t force_degamma; /* ? */ - bool_t fetch_4; /* ? */ - bool_t sample_is_pcf; /* ? */ - bool_t type; /* ? */ - int depth_compare; /* only depth textures? */ - int chroma_key; - int truncate_coord; - bool_t disable_cube_wrap; -} tex_sampler_t; - -/* Draw command */ -typedef struct { - uint32_t prim_type; - uint32_t vgt_draw_initiator; - uint32_t index_type; - uint32_t num_instances; - uint32_t num_indices; -} draw_config_t; - -#define BEGIN_BATCH(n) \ -do { \ - radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__); \ -} while(0) -#define END_BATCH() \ -do { \ - radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \ -} while(0) -#define RELOC_BATCH(bo, rd, wd) \ -do { \ - int _ret; \ - _ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0); \ - if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \ -} while(0) -#define E32(dword) \ -do { \ - radeon_cs_write_dword(info->cs, (dword)); \ -} while (0) - -#define EFLOAT(val) \ -do { \ - union { float f; uint32_t d; } a; \ - a.f = (val); \ - E32(a.d); \ -} while (0) - -#define PACK3(cmd, num) \ -do { \ - E32(RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \ -} while (0) - -/* write num registers, start at reg */ -/* If register falls in a special area, special commands are issued */ -#define PACK0(reg, num) \ -do { \ - if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) { \ - PACK3(IT_SET_CONFIG_REG, (num) + 1); \ - E32(((reg) - SET_CONFIG_REG_offset) >> 2); \ - } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \ - PACK3(IT_SET_CONTEXT_REG, (num) + 1); \ - E32(((reg) - SET_CONTEXT_REG_offset) >> 2); \ - } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \ - PACK3(IT_SET_RESOURCE, num + 1); \ - E32(((reg) - SET_RESOURCE_offset) >> 2); \ - } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \ - PACK3(IT_SET_SAMPLER, (num) + 1); \ - E32((reg - SET_SAMPLER_offset) >> 2); \ - } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \ - PACK3(IT_SET_CTL_CONST, (num) + 1); \ - E32(((reg) - SET_CTL_CONST_offset) >> 2); \ - } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \ - PACK3(IT_SET_LOOP_CONST, (num) + 1); \ - E32(((reg) - SET_LOOP_CONST_offset) >> 2); \ - } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \ - PACK3(IT_SET_BOOL_CONST, (num) + 1); \ - E32(((reg) - SET_BOOL_CONST_offset) >> 2); \ - } else { \ - E32(CP_PACKET0 ((reg), (num) - 1)); \ - } \ -} while (0) - -/* write a single register */ -#define EREG(reg, val) \ -do { \ - PACK0((reg), 1); \ - E32((val)); \ -} while (0) - -void -evergreen_start_3d(ScrnInfoPtr pScrn); -void -evergreen_set_render_target(ScrnInfoPtr pScrn, cb_config_t *cb_conf, uint32_t domain); -void -evergreen_cp_wait_vline_sync(ScrnInfoPtr pScrn, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop); -void -evergreen_set_spi(ScrnInfoPtr pScrn, int vs_export_count, int num_interp); -void -evergreen_fs_setup(ScrnInfoPtr pScrn, shader_config_t *fs_conf, uint32_t domain); -void -evergreen_vs_setup(ScrnInfoPtr pScrn, shader_config_t *vs_conf, uint32_t domain); -void -evergreen_ps_setup(ScrnInfoPtr pScrn, shader_config_t *ps_conf, uint32_t domain); -void -evergreen_set_alu_consts(ScrnInfoPtr pScrn, const_config_t *const_conf, uint32_t domain); -void -evergreen_set_bool_consts(ScrnInfoPtr pScrn, int offset, uint32_t val); -void -evergreen_set_tex_resource(ScrnInfoPtr pScrn, tex_resource_t *tex_res, uint32_t domain); -void -evergreen_set_tex_sampler(ScrnInfoPtr pScrn, tex_sampler_t *s); -void -evergreen_set_screen_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2); -void -evergreen_set_vport_scissor(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2); -void -evergreen_set_generic_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2); -void -evergreen_set_window_scissor(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2); -void -evergreen_set_clip_rect(ScrnInfoPtr pScrn, int id, int x1, int y1, int x2, int y2); -void -evergreen_set_default_state(ScrnInfoPtr pScrn); -void -cayman_set_default_state(ScrnInfoPtr pScrn); -void -evergreen_draw_auto(ScrnInfoPtr pScrn, draw_config_t *draw_conf); - -void evergreen_finish_op(ScrnInfoPtr pScrn, int vtx_size); - -extern Bool -R600SetAccelState(ScrnInfoPtr pScrn, - struct r600_accel_object *src0, - struct r600_accel_object *src1, - struct r600_accel_object *dst, - uint32_t vs_offset, uint32_t ps_offset, - int rop, Pixel planemask); - -extern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index); -extern void RADEONFinishAccess_CS(PixmapPtr pPix, int index); -extern void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align); -extern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height, - int depth, int usage_hint, int bitsPerPixel, - int *new_pitch); -extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); -extern struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix); -extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); - -#endif diff --git a/driver/xf86-video-ati/src/evergreen_textured_videofuncs.c b/driver/xf86-video-ati/src/evergreen_textured_videofuncs.c deleted file mode 100644 index 6200cdc27..000000000 --- a/driver/xf86-video-ati/src/evergreen_textured_videofuncs.c +++ /dev/null @@ -1,551 +0,0 @@ -/* - * Copyright 2010 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 (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 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. - * - * Author: Alex Deucher - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#ifdef XF86DRM_MODE - -#include "xf86.h" - -#include "exa.h" - -#include "radeon.h" -#include "radeon_reg.h" -#include "evergreen_shader.h" -#include "evergreen_reg.h" -#include "evergreen_state.h" - -#include "radeon_video.h" - -#include -#include "fourcc.h" - -#include "damage.h" - -#include "radeon_exa_shared.h" -#include "radeon_vbo.h" - -/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces - note the difference to the parameters used in overlay are due - to 10bit vs. float calcs */ -static REF_TRANSFORM trans[2] = -{ - {1.1643, 0.0, 1.5960, -0.3918, -0.8129, 2.0172, 0.0}, /* BT.601 */ - {1.1643, 0.0, 1.7927, -0.2132, -0.5329, 2.1124, 0.0} /* BT.709 */ -}; - -void -EVERGREENDisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - PixmapPtr pPixmap = pPriv->pPixmap; - BoxPtr pBox = REGION_RECTS(&pPriv->clip); - int nBox = REGION_NUM_RECTS(&pPriv->clip); - int dstxoff, dstyoff; - struct r600_accel_object src_obj, dst_obj; - cb_config_t cb_conf; - tex_resource_t tex_res; - tex_sampler_t tex_samp; - shader_config_t vs_conf, ps_conf; - /* - * y' = y - .0625 - * u' = u - .5 - * v' = v - .5; - * - * r = 1.1643 * y' + 0.0 * u' + 1.5958 * v' - * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v' - * b = 1.1643 * y' + 2.017 * u' + 0.0 * v' - * - * DP3 might look like the straightforward solution - * but we'd need to move the texture yuv values in - * the same reg for this to work. Therefore use MADs. - * Brightness just adds to the off constant. - * Contrast is multiplication of luminance. - * Saturation and hue change the u and v coeffs. - * Default values (before adjustments - depend on colorspace): - * yco = 1.1643 - * uco = 0, -0.39173, 2.017 - * vco = 1.5958, -0.8129, 0 - * off = -0.0625 * yco + -0.5 * uco[r] + -0.5 * vco[r], - * -0.0625 * yco + -0.5 * uco[g] + -0.5 * vco[g], - * -0.0625 * yco + -0.5 * uco[b] + -0.5 * vco[b], - * - * temp = MAD(yco, yuv.yyyy, off) - * temp = MAD(uco, yuv.uuuu, temp) - * result = MAD(vco, yuv.vvvv, temp) - */ - /* TODO: calc consts in the shader */ - const float Loff = -0.0627; - const float Coff = -0.502; - float uvcosf, uvsinf; - float yco; - float uco[3], vco[3], off[3]; - float bright, cont, gamma; - int ref = pPriv->transform_index; - Bool needgamma = FALSE; - float *ps_alu_consts; - const_config_t ps_const_conf; - float *vs_alu_consts; - const_config_t vs_const_conf; - - cont = RTFContrast(pPriv->contrast); - bright = RTFBrightness(pPriv->brightness); - gamma = (float)pPriv->gamma / 1000.0; - uvcosf = RTFSaturation(pPriv->saturation) * cos(RTFHue(pPriv->hue)); - uvsinf = RTFSaturation(pPriv->saturation) * sin(RTFHue(pPriv->hue)); - /* overlay video also does pre-gamma contrast/sat adjust, should we? */ - - yco = trans[ref].RefLuma * cont; - uco[0] = -trans[ref].RefRCr * uvsinf; - uco[1] = trans[ref].RefGCb * uvcosf - trans[ref].RefGCr * uvsinf; - uco[2] = trans[ref].RefBCb * uvcosf; - vco[0] = trans[ref].RefRCr * uvcosf; - vco[1] = trans[ref].RefGCb * uvsinf + trans[ref].RefGCr * uvcosf; - vco[2] = trans[ref].RefBCb * uvsinf; - off[0] = Loff * yco + Coff * (uco[0] + vco[0]) + bright; - off[1] = Loff * yco + Coff * (uco[1] + vco[1]) + bright; - off[2] = Loff * yco + Coff * (uco[2] + vco[2]) + bright; - - // XXX - gamma = 1.0; - - if (gamma != 1.0) { - needgamma = TRUE; - /* note: gamma correction is out = in ^ gamma; - gpu can only do LG2/EX2 therefore we transform into - in ^ gamma = 2 ^ (log2(in) * gamma). - Lots of scalar ops, unfortunately (better solution?) - - without gamma that's 3 inst, with gamma it's 10... - could use different gamma factors per channel, - if that's of any use. */ - } - - CLEAR (cb_conf); - CLEAR (tex_res); - CLEAR (tex_samp); - CLEAR (vs_conf); - CLEAR (ps_conf); - CLEAR (vs_const_conf); - CLEAR (ps_const_conf); - - dst_obj.offset = 0; - src_obj.offset = 0; - dst_obj.bo = radeon_get_pixmap_bo(pPixmap); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pPixmap); - - dst_obj.pitch = exaGetPixmapPitch(pPixmap) / (pPixmap->drawable.bitsPerPixel / 8); - - src_obj.pitch = pPriv->src_pitch; - src_obj.width = pPriv->w; - src_obj.height = pPriv->h; - src_obj.bpp = 16; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - src_obj.bo = pPriv->src_bo[pPriv->currentBuffer]; - src_obj.tiling_flags = 0; - - dst_obj.width = pPixmap->drawable.width; - dst_obj.height = pPixmap->drawable.height; - dst_obj.bpp = pPixmap->drawable.bitsPerPixel; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->xv_vs_offset, accel_state->xv_ps_offset, - 3, 0xffffffff)) - return; - -#ifdef COMPOSITE - dstxoff = -pPixmap->screen_x + pPixmap->drawable.x; - dstyoff = -pPixmap->screen_y + pPixmap->drawable.y; -#else - dstxoff = 0; - dstyoff = 0; -#endif - - radeon_vbo_check(pScrn, &accel_state->vbo, 16); - radeon_vbo_check(pScrn, &accel_state->cbuf, 512); - radeon_cp_start(pScrn); - - evergreen_set_default_state(pScrn); - - evergreen_set_generic_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_screen_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - evergreen_set_window_scissor(pScrn, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - - /* PS bool constant */ - switch(pPriv->id) { - case FOURCC_YV12: - case FOURCC_I420: - evergreen_set_bool_consts(pScrn, SQ_BOOL_CONST_ps, (1 << 0)); - break; - case FOURCC_UYVY: - case FOURCC_YUY2: - default: - evergreen_set_bool_consts(pScrn, SQ_BOOL_CONST_ps, (0 << 0)); - break; - } - - /* Shader */ - vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; - vs_conf.num_gprs = 2; - vs_conf.stack_size = 0; - vs_conf.bo = accel_state->shaders_bo; - evergreen_vs_setup(pScrn, &vs_conf, RADEON_GEM_DOMAIN_VRAM); - - ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; - ps_conf.num_gprs = 3; - ps_conf.stack_size = 1; - ps_conf.clamp_consts = 0; - ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - evergreen_ps_setup(pScrn, &ps_conf, RADEON_GEM_DOMAIN_VRAM); - - /* Texture */ - switch(pPriv->id) { - case FOURCC_YV12: - case FOURCC_I420: - accel_state->src_size[0] = accel_state->src_obj[0].pitch * pPriv->h; - - /* Y texture */ - tex_res.id = 0; - tex_res.w = accel_state->src_obj[0].width; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch; - tex_res.depth = 0; - tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - tex_res.bo = accel_state->src_obj[0].bo; - tex_res.mip_bo = accel_state->src_obj[0].bo; - - tex_res.format = FMT_8; - tex_res.dst_sel_x = SQ_SEL_X; /* Y */ - tex_res.dst_sel_y = SQ_SEL_1; - tex_res.dst_sel_z = SQ_SEL_1; - tex_res.dst_sel_w = SQ_SEL_1; - - tex_res.base_level = 0; - tex_res.last_level = 0; - tex_res.perf_modulation = 0; - tex_res.interlaced = 0; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.array_mode = 1; - evergreen_set_tex_resource(pScrn, &tex_res, accel_state->src_obj[0].domain); - - /* Y sampler */ - tex_samp.id = 0; - tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_z = SQ_TEX_WRAP; - - /* xxx: switch to bicubic */ - tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; - tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_BILINEAR; - - tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; - tex_samp.mip_filter = 0; /* no mipmap */ - evergreen_set_tex_sampler(pScrn, &tex_samp); - - /* U or V texture */ - tex_res.id = 1; - tex_res.format = FMT_8; - tex_res.w = accel_state->src_obj[0].width >> 1; - tex_res.h = accel_state->src_obj[0].height >> 1; - tex_res.pitch = RADEON_ALIGN(accel_state->src_obj[0].pitch >> 1, pPriv->hw_align); - tex_res.dst_sel_x = SQ_SEL_X; /* V or U */ - tex_res.dst_sel_y = SQ_SEL_1; - tex_res.dst_sel_z = SQ_SEL_1; - tex_res.dst_sel_w = SQ_SEL_1; - tex_res.interlaced = 0; - - tex_res.base = accel_state->src_obj[0].offset + pPriv->planev_offset; - tex_res.mip_base = accel_state->src_obj[0].offset + pPriv->planev_offset; - tex_res.size = tex_res.pitch * (pPriv->h >> 1); - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.array_mode = 1; - evergreen_set_tex_resource(pScrn, &tex_res, accel_state->src_obj[0].domain); - - /* U or V sampler */ - tex_samp.id = 1; - evergreen_set_tex_sampler(pScrn, &tex_samp); - - /* U or V texture */ - tex_res.id = 2; - tex_res.format = FMT_8; - tex_res.w = accel_state->src_obj[0].width >> 1; - tex_res.h = accel_state->src_obj[0].height >> 1; - tex_res.pitch = RADEON_ALIGN(accel_state->src_obj[0].pitch >> 1, pPriv->hw_align); - tex_res.dst_sel_x = SQ_SEL_X; /* V or U */ - tex_res.dst_sel_y = SQ_SEL_1; - tex_res.dst_sel_z = SQ_SEL_1; - tex_res.dst_sel_w = SQ_SEL_1; - tex_res.interlaced = 0; - - tex_res.base = accel_state->src_obj[0].offset + pPriv->planeu_offset; - tex_res.mip_base = accel_state->src_obj[0].offset + pPriv->planeu_offset; - tex_res.size = tex_res.pitch * (pPriv->h >> 1); - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.array_mode = 1; - evergreen_set_tex_resource(pScrn, &tex_res, accel_state->src_obj[0].domain); - - /* UV sampler */ - tex_samp.id = 2; - evergreen_set_tex_sampler(pScrn, &tex_samp); - break; - case FOURCC_UYVY: - case FOURCC_YUY2: - default: - accel_state->src_size[0] = accel_state->src_obj[0].pitch * pPriv->h; - - /* Y texture */ - tex_res.id = 0; - tex_res.w = accel_state->src_obj[0].width; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch >> 1; - tex_res.depth = 0; - tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - tex_res.bo = accel_state->src_obj[0].bo; - tex_res.mip_bo = accel_state->src_obj[0].bo; - - tex_res.format = FMT_8_8; - if (pPriv->id == FOURCC_UYVY) - tex_res.dst_sel_x = SQ_SEL_Y; /* Y */ - else - tex_res.dst_sel_x = SQ_SEL_X; /* Y */ - tex_res.dst_sel_y = SQ_SEL_1; - tex_res.dst_sel_z = SQ_SEL_1; - tex_res.dst_sel_w = SQ_SEL_1; - - tex_res.base_level = 0; - tex_res.last_level = 0; - tex_res.perf_modulation = 0; - tex_res.interlaced = 0; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.array_mode = 1; - evergreen_set_tex_resource(pScrn, &tex_res, accel_state->src_obj[0].domain); - - /* Y sampler */ - tex_samp.id = 0; - tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_z = SQ_TEX_WRAP; - - tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; - tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_BILINEAR; - - tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; - tex_samp.mip_filter = 0; /* no mipmap */ - evergreen_set_tex_sampler(pScrn, &tex_samp); - - /* UV texture */ - tex_res.id = 1; - tex_res.format = FMT_8_8_8_8; - tex_res.w = accel_state->src_obj[0].width >> 1; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch >> 2; - if (pPriv->id == FOURCC_UYVY) { - tex_res.dst_sel_x = SQ_SEL_X; /* V */ - tex_res.dst_sel_y = SQ_SEL_Z; /* U */ - } else { - tex_res.dst_sel_x = SQ_SEL_Y; /* V */ - tex_res.dst_sel_y = SQ_SEL_W; /* U */ - } - tex_res.dst_sel_z = SQ_SEL_1; - tex_res.dst_sel_w = SQ_SEL_1; - tex_res.interlaced = 0; - - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.array_mode = 1; - evergreen_set_tex_resource(pScrn, &tex_res, accel_state->src_obj[0].domain); - - /* UV sampler */ - tex_samp.id = 1; - evergreen_set_tex_sampler(pScrn, &tex_samp); - break; - } - - cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; - cb_conf.bo = accel_state->dst_obj.bo; - - switch (accel_state->dst_obj.bpp) { - case 16: - if (pPixmap->drawable.depth == 15) { - cb_conf.format = COLOR_1_5_5_5; - cb_conf.comp_swap = 1; /* ARGB */ - } else { - cb_conf.format = COLOR_5_6_5; - cb_conf.comp_swap = 2; /* RGB */ - } -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN16; -#endif - break; - case 32: - cb_conf.format = COLOR_8_8_8_8; - cb_conf.comp_swap = 1; /* ARGB */ -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN32; -#endif - break; - default: - return; - } - - cb_conf.source_format = EXPORT_4C_16BPC; - cb_conf.blend_clamp = 1; - cb_conf.pmask = 0xf; - cb_conf.rop = 3; - if (accel_state->dst_obj.tiling_flags == 0) { - cb_conf.array_mode = 1; - cb_conf.non_disp_tiling = 1; - } - evergreen_set_render_target(pScrn, &cb_conf, accel_state->dst_obj.domain); - - evergreen_set_spi(pScrn, (1 - 1), 1); - - /* PS alu constants */ - ps_const_conf.size_bytes = 256; - ps_const_conf.type = SHADER_TYPE_PS; - ps_alu_consts = radeon_vbo_space(pScrn, &accel_state->cbuf, 256); - ps_const_conf.bo = accel_state->cbuf.vb_bo; - ps_const_conf.const_addr = accel_state->cbuf.vb_mc_addr + accel_state->cbuf.vb_offset; - - ps_alu_consts[0] = off[0]; - ps_alu_consts[1] = off[1]; - ps_alu_consts[2] = off[2]; - ps_alu_consts[3] = yco; - - ps_alu_consts[4] = uco[0]; - ps_alu_consts[5] = uco[1]; - ps_alu_consts[6] = uco[2]; - ps_alu_consts[7] = gamma; - - ps_alu_consts[8] = vco[0]; - ps_alu_consts[9] = vco[1]; - ps_alu_consts[10] = vco[2]; - ps_alu_consts[11] = 0.0; - - radeon_vbo_commit(pScrn, &accel_state->cbuf); - evergreen_set_alu_consts(pScrn, &ps_const_conf, RADEON_GEM_DOMAIN_GTT); - - /* VS alu constants */ - vs_const_conf.size_bytes = 256; - vs_const_conf.type = SHADER_TYPE_VS; - vs_alu_consts = radeon_vbo_space(pScrn, &accel_state->cbuf, 256); - vs_const_conf.bo = accel_state->cbuf.vb_bo; - vs_const_conf.const_addr = accel_state->cbuf.vb_mc_addr + accel_state->cbuf.vb_offset; - - vs_alu_consts[0] = 1.0 / pPriv->w; - vs_alu_consts[1] = 1.0 / pPriv->h; - vs_alu_consts[2] = 0.0; - vs_alu_consts[3] = 0.0; - - radeon_vbo_commit(pScrn, &accel_state->cbuf); - evergreen_set_alu_consts(pScrn, &vs_const_conf, RADEON_GEM_DOMAIN_GTT); - - if (pPriv->vsync) { - xf86CrtcPtr crtc; - if (pPriv->desired_crtc) - crtc = pPriv->desired_crtc; - else - crtc = radeon_pick_best_crtc(pScrn, - pPriv->drw_x, - pPriv->drw_x + pPriv->dst_w, - pPriv->drw_y, - pPriv->drw_y + pPriv->dst_h); - if (crtc) - evergreen_cp_wait_vline_sync(pScrn, pPixmap, - crtc, - pPriv->drw_y - crtc->y, - (pPriv->drw_y - crtc->y) + pPriv->dst_h); - } - - while (nBox--) { - int srcX, srcY, srcw, srch; - int dstX, dstY, dstw, dsth; - float *vb; - - - dstX = pBox->x1 + dstxoff; - dstY = pBox->y1 + dstyoff; - dstw = pBox->x2 - pBox->x1; - dsth = pBox->y2 - pBox->y1; - - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; - - srcw = (pPriv->src_w * dstw) / pPriv->dst_w; - srch = (pPriv->src_h * dsth) / pPriv->dst_h; - - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 16); - - vb[0] = (float)dstX; - vb[1] = (float)dstY; - vb[2] = (float)srcX; - vb[3] = (float)srcY; - - vb[4] = (float)dstX; - vb[5] = (float)(dstY + dsth); - vb[6] = (float)srcX; - vb[7] = (float)(srcY + srch); - - vb[8] = (float)(dstX + dstw); - vb[9] = (float)(dstY + dsth); - vb[10] = (float)(srcX + srcw); - vb[11] = (float)(srcY + srch); - - radeon_vbo_commit(pScrn, &accel_state->vbo); - - pBox++; - } - - evergreen_finish_op(pScrn, 16); - - DamageDamageRegion(pPriv->pDraw, &pPriv->clip); -} - -#endif diff --git a/driver/xf86-video-ati/src/legacy_crtc.c b/driver/xf86-video-ati/src/legacy_crtc.c index 0beb54d48..829b453e8 100644 --- a/driver/xf86-video-ati/src/legacy_crtc.c +++ b/driver/xf86-video-ati/src/legacy_crtc.c @@ -649,9 +649,6 @@ radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post) if (!info->directRenderingEnabled) return; - if (info->ChipFamily >= CHIP_FAMILY_R600) - return; - modeset.crtc = radeon_crtc->crtc_id; modeset.cmd = post ? _DRM_POST_MODESET : _DRM_PRE_MODESET; @@ -664,41 +661,55 @@ radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post) void legacy_crtc_dpms(xf86CrtcPtr crtc, int mode) { - uint32_t mask; + int mask; RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn); unsigned char *RADEONMMIO = pRADEONEnt->MMIO; - if (radeon_crtc->crtc_id) - mask = (RADEON_CRTC2_DISP_DIS | - RADEON_CRTC2_VSYNC_DIS | - RADEON_CRTC2_HSYNC_DIS | - RADEON_CRTC2_DISP_REQ_EN_B); - else - mask = (RADEON_CRTC_DISPLAY_DIS | - RADEON_CRTC_HSYNC_DIS | - RADEON_CRTC_VSYNC_DIS); + mask = radeon_crtc->crtc_id ? (RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_VSYNC_DIS | RADEON_CRTC2_HSYNC_DIS | RADEON_CRTC2_DISP_REQ_EN_B) : (RADEON_CRTC_DISPLAY_DIS | RADEON_CRTC_HSYNC_DIS | RADEON_CRTC_VSYNC_DIS); + + if (mode == DPMSModeOff) + radeon_crtc_modeset_ioctl(crtc, FALSE); switch(mode) { case DPMSModeOn: if (radeon_crtc->crtc_id) { - OUTREGP(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask)); + OUTREGP(RADEON_CRTC2_GEN_CNTL, 0, ~mask); } else { - OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B)); + OUTREGP(RADEON_CRTC_GEN_CNTL, 0, ~RADEON_CRTC_DISP_REQ_EN_B); OUTREGP(RADEON_CRTC_EXT_CNTL, 0, ~mask); } break; case DPMSModeStandby: + if (radeon_crtc->crtc_id) { + OUTREGP(RADEON_CRTC2_GEN_CNTL, (RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_HSYNC_DIS), ~mask); + } else { + OUTREGP(RADEON_CRTC_GEN_CNTL, 0, ~RADEON_CRTC_DISP_REQ_EN_B); + OUTREGP(RADEON_CRTC_EXT_CNTL, (RADEON_CRTC_DISPLAY_DIS | RADEON_CRTC_HSYNC_DIS), ~mask); + } + break; case DPMSModeSuspend: + if (radeon_crtc->crtc_id) { + OUTREGP(RADEON_CRTC2_GEN_CNTL, (RADEON_CRTC2_DISP_DIS | RADEON_CRTC2_VSYNC_DIS), ~mask); + } else { + OUTREGP(RADEON_CRTC_GEN_CNTL, 0, ~RADEON_CRTC_DISP_REQ_EN_B); + OUTREGP(RADEON_CRTC_EXT_CNTL, (RADEON_CRTC_DISPLAY_DIS | RADEON_CRTC_VSYNC_DIS), ~mask); + } + break; case DPMSModeOff: if (radeon_crtc->crtc_id) { - OUTREGP(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask)); + OUTREGP(RADEON_CRTC2_GEN_CNTL, mask, ~mask); } else { - OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B)); + OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~RADEON_CRTC_DISP_REQ_EN_B); OUTREGP(RADEON_CRTC_EXT_CNTL, mask, ~mask); } break; } + + if (mode != DPMSModeOff) { + radeon_crtc_modeset_ioctl(crtc, TRUE); + radeon_crtc_load_lut(crtc); + } } @@ -901,6 +912,7 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, /*save->bios_4_scratch = info->SavedReg->bios_4_scratch;*/ save->crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN + | RADEON_CRTC_EN | (format << 8) | ((mode->Flags & V_DBLSCAN) ? RADEON_CRTC_DBL_SCAN_EN @@ -912,11 +924,6 @@ RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, ? RADEON_CRTC_INTERLACE_EN : 0)); - /* 200M freezes on VT switch sometimes if CRTC is disabled */ - if ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480)) - save->crtc_gen_cntl |= RADEON_CRTC_EN; - save->crtc_ext_cntl |= (RADEON_XCRT_CNT_EN| RADEON_CRTC_VSYNC_DIS | RADEON_CRTC_HSYNC_DIS | @@ -1153,7 +1160,8 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, else save->crtc2_gen_cntl = 0; - save->crtc2_gen_cntl |= ((format << 8) + save->crtc2_gen_cntl |= (RADEON_CRTC2_EN + | (format << 8) | RADEON_CRTC2_VSYNC_DIS | RADEON_CRTC2_HSYNC_DIS | RADEON_CRTC2_DISP_DIS @@ -1167,11 +1175,6 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, ? RADEON_CRTC2_INTERLACE_EN : 0)); - /* 200M freezes on VT switch sometimes if CRTC is disabled */ - if ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480)) - save->crtc2_gen_cntl |= RADEON_CRTC2_EN; - save->disp2_merge_cntl = info->SavedReg->disp2_merge_cntl; save->disp2_merge_cntl &= ~(RADEON_DISP2_RGB_OFFSET_EN); @@ -1184,15 +1187,12 @@ RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, /* Define PLL registers for requested video mode */ static void -RADEONInitPLLRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, +RADEONInitPLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, RADEONPLLPtr pll, DisplayModePtr mode, int flags) { - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - ScrnInfoPtr pScrn = crtc->scrn; RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t feedback_div = 0; - uint32_t frac_fb_div = 0; uint32_t reference_div = 0; uint32_t post_divider = 0; uint32_t freq = 0; @@ -1225,13 +1225,7 @@ RADEONInitPLLRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, return; } - if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, FALSE)) - radeon_crtc->pll_algo = RADEON_PLL_NEW; - else - radeon_crtc->pll_algo = RADEON_PLL_OLD; - - RADEONComputePLL(crtc, pll, mode->Clock, &freq, - &feedback_div, &frac_fb_div, &reference_div, &post_divider, flags); + RADEONComputePLL(pll, mode->Clock, &freq, &feedback_div, &reference_div, &post_divider, flags); for (post_div = &post_divs[0]; post_div->divider; ++post_div) { if (post_div->divider == post_divider) @@ -1274,15 +1268,12 @@ RADEONInitPLLRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, /* Define PLL2 registers for requested video mode */ static void -RADEONInitPLL2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, +RADEONInitPLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save, RADEONPLLPtr pll, DisplayModePtr mode, int flags) { - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - ScrnInfoPtr pScrn = crtc->scrn; RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t feedback_div = 0; - uint32_t frac_fb_div = 0; uint32_t reference_div = 0; uint32_t post_divider = 0; uint32_t freq = 0; @@ -1313,13 +1304,7 @@ RADEONInitPLL2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, return; } - if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, FALSE)) - radeon_crtc->pll_algo = RADEON_PLL_NEW; - else - radeon_crtc->pll_algo = RADEON_PLL_OLD; - - RADEONComputePLL(crtc, pll, mode->Clock, &freq, - &feedback_div, &frac_fb_div, &reference_div, &post_divider, flags); + RADEONComputePLL(pll, mode->Clock, &freq, &feedback_div, &reference_div, &post_divider, flags); for (post_div = &post_divs[0]; post_div->divider; ++post_div) { if (post_div->divider == post_divider) @@ -1376,12 +1361,17 @@ RADEONInitDispBandwidthLegacy(ScrnInfoPtr pScrn, uint32_t temp, data, mem_trcd, mem_trp, mem_tras, mem_trbs=0; float mem_tcas; int k1, c; + uint32_t MemTrcdExtMemCntl[4] = {1, 2, 3, 4}; + uint32_t MemTrpExtMemCntl[4] = {1, 2, 3, 4}; + uint32_t MemTrasExtMemCntl[8] = {1, 2, 3, 4, 5, 6, 7, 8}; - float MemTcas[8] = {0, 1, 2, 3, 0, 1.5, 2.5, 0.0}; - float MemTcas_rs480[8] = {0, 1, 2, 3, 0, 1.5, 2.5, 3.5}; + uint32_t MemTrcdMemTimingCntl[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + uint32_t MemTrpMemTimingCntl[8] = {1, 2, 3, 4, 5, 6, 7, 8}; + uint32_t MemTrasMemTimingCntl[16] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; + + float MemTcas[8] = {0, 1, 2, 3, 0, 1.5, 2.5, 0}; float MemTcas2[8] = {0, 1, 2, 3, 4, 5, 6, 7}; float MemTrbs[8] = {1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5}; - float MemTrbs_r4xx[8] = {4, 5, 6, 7, 8, 9, 10, 11}; float mem_bw, peak_disp_bw; float min_mem_eff = 0.8; @@ -1410,6 +1400,9 @@ RADEONInitDispBandwidthLegacy(ScrnInfoPtr pScrn, OUTREG(R300_MC_INIT_MISC_LAT_TIMER, mc_init_misc_lat_timer); } + /* R420 and RV410 family not supported yet */ + if (info->ChipFamily == CHIP_FAMILY_R420 || info->ChipFamily == CHIP_FAMILY_RV410) return; + /* * Determine if there is enough bandwidth for current display mode */ @@ -1436,58 +1429,25 @@ RADEONInitDispBandwidthLegacy(ScrnInfoPtr pScrn, /* Get values from the EXT_MEM_CNTL register...converting its contents. */ temp = INREG(RADEON_MEM_TIMING_CNTL); if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */ - mem_trcd = ((temp >> 2) & 0x3) + 1; - mem_trp = ((temp & 0x3)) + 1; - mem_tras = ((temp & 0x70) >> 4) + 1; - } else if (info->ChipFamily == CHIP_FAMILY_R300 || - info->ChipFamily == CHIP_FAMILY_R350) { /* r300, r350 */ - mem_trcd = (temp & 0x7) + 1; - mem_trp = ((temp >> 8) & 0x7) + 1; - mem_tras = ((temp >> 11) & 0xf) + 4; - } else if (info->ChipFamily == CHIP_FAMILY_RV350 || - info->ChipFamily <= CHIP_FAMILY_RV380) { - /* rv3x0 */ - mem_trcd = (temp & 0x7) + 3; - mem_trp = ((temp >> 8) & 0x7) + 3; - mem_tras = ((temp >> 11) & 0xf) + 6; - } else if (info->ChipFamily == CHIP_FAMILY_R420 || - info->ChipFamily == CHIP_FAMILY_RV410) { - /* r4xx */ - mem_trcd = (temp & 0xf) + 3; - if (mem_trcd > 15) - mem_trcd = 15; - mem_trp = ((temp >> 8) & 0xf) + 3; - if (mem_trp > 15) - mem_trp = 15; - mem_tras = ((temp >> 12) & 0x1f) + 6; - if (mem_tras > 31) - mem_tras = 31; - } else { /* RV200, R200 */ - mem_trcd = (temp & 0x7) + 1; - mem_trp = ((temp >> 8) & 0x7) + 1; - mem_tras = ((temp >> 12) & 0xf) + 4; + mem_trcd = MemTrcdExtMemCntl[(temp & 0x0c) >> 2]; + mem_trp = MemTrpExtMemCntl[ (temp & 0x03) >> 0]; + mem_tras = MemTrasExtMemCntl[(temp & 0x70) >> 4]; + } else { /* RV200 and later */ + mem_trcd = MemTrcdMemTimingCntl[(temp & 0x07) >> 0]; + mem_trp = MemTrpMemTimingCntl[ (temp & 0x700) >> 8]; + mem_tras = MemTrasMemTimingCntl[(temp & 0xf000) >> 12]; } /* Get values from the MEM_SDRAM_MODE_REG register...converting its */ temp = INREG(RADEON_MEM_SDRAM_MODE_REG); data = (temp & (7<<20)) >> 20; if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */ - if (info->ChipFamily == CHIP_FAMILY_RS480) /* don't think rs400 */ - mem_tcas = MemTcas_rs480[data]; - else - mem_tcas = MemTcas[data]; + mem_tcas = MemTcas [data]; } else { mem_tcas = MemTcas2 [data]; } - if (info->ChipFamily == CHIP_FAMILY_RS400 || - info->ChipFamily == CHIP_FAMILY_RS480) { - /* extra cas latency stored in bits 23-25 0-4 clocks */ - data = (temp >> 23) & 0x7; - if (data < 5) - mem_tcas += data; - } - if (IS_R300_VARIANT && !info->IsIGP) { + if (IS_R300_VARIANT) { /* on the R300, Tcas is included in Trbs. */ temp = INREG(RADEON_MEM_CNTL); @@ -1509,11 +1469,7 @@ RADEONInitDispBandwidthLegacy(ScrnInfoPtr pScrn, data = (R300_MEM_RBS_POSITION_A_MASK & temp); } - if (info->ChipFamily == CHIP_FAMILY_RV410 || - info->ChipFamily == CHIP_FAMILY_R420) - mem_trbs = MemTrbs_r4xx[data]; - else - mem_trbs = MemTrbs[data]; + mem_trbs = MemTrbs[data]; mem_tcas += mem_trbs; } @@ -1811,7 +1767,7 @@ legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, dot_clock = adjusted_mode->Clock / 1000.0; if (dot_clock) { ErrorF("init pll1\n"); - RADEONInitPLLRegisters(crtc, info->ModeReg, &info->pll, adjusted_mode, pll_flags); + RADEONInitPLLRegisters(pScrn, info->ModeReg, &info->pll, adjusted_mode, pll_flags); } else { info->ModeReg->ppll_ref_div = info->SavedReg->ppll_ref_div; info->ModeReg->ppll_div_3 = info->SavedReg->ppll_div_3; @@ -1825,7 +1781,7 @@ legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, dot_clock = adjusted_mode->Clock / 1000.0; if (dot_clock) { ErrorF("init pll2\n"); - RADEONInitPLL2Registers(crtc, info->ModeReg, &info->pll, adjusted_mode, pll_flags); + RADEONInitPLL2Registers(pScrn, info->ModeReg, &info->pll, adjusted_mode, pll_flags); } break; } diff --git a/driver/xf86-video-ati/src/legacy_output.c b/driver/xf86-video-ati/src/legacy_output.c index d7b79e2ed..423a3e27a 100644 --- a/driver/xf86-video-ati/src/legacy_output.c +++ b/driver/xf86-video-ati/src/legacy_output.c @@ -150,6 +150,7 @@ void RADEONGetExtTMDSInfo(ScrnInfoPtr pScrn, radeon_dvo_ptr dvo) { RADEONInfoPtr info = RADEONPTR(pScrn); + I2CBusPtr pDVOBus; if (!info->IsAtomBios) { #if defined(__powerpc__) @@ -161,11 +162,11 @@ RADEONGetExtTMDSInfo(ScrnInfoPtr pScrn, radeon_dvo_ptr dvo) dvo->dvo_i2c_slave_addr = 0x70; } #endif - if (RADEONI2CInit(pScrn, &dvo->pI2CBus, "DVO", &dvo->dvo_i2c)) { + if (RADEONI2CInit(pScrn, &pDVOBus, "DVO", &dvo->dvo_i2c)) { dvo->DVOChip = - RADEONDVODeviceInit(dvo->pI2CBus, dvo->dvo_i2c_slave_addr); + RADEONDVODeviceInit(pDVOBus, dvo->dvo_i2c_slave_addr); if (!dvo->DVOChip) - free(dvo->pI2CBus); + xfree(pDVOBus); } } } @@ -442,7 +443,7 @@ RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr) { I2CDevPtr dvo; - dvo = calloc(1, sizeof(I2CDevRec)); + dvo = xcalloc(1, sizeof(I2CDevRec)); if (dvo == NULL) return NULL; @@ -458,7 +459,7 @@ RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr) return dvo; } - free(dvo); + xfree(dvo); return NULL; } @@ -480,7 +481,7 @@ RADEONRestoreDVOChip(ScrnInfoPtr pScrn, xf86OutputPtr output) if (!dvo->DVOChip) return; - RADEONI2CDoLock(output, dvo->pI2CBus, TRUE); + RADEONI2CDoLock(output, TRUE); if (!RADEONInitExtTMDSInfoFromBIOS(output)) { if (dvo->DVOChip) { switch(info->ext_tmds_chip) { @@ -510,7 +511,7 @@ RADEONRestoreDVOChip(ScrnInfoPtr pScrn, xf86OutputPtr output) } } } - RADEONI2CDoLock(output, dvo->pI2CBus, FALSE); + RADEONI2CDoLock(output, FALSE); } #if 0 @@ -912,11 +913,6 @@ legacy_output_dpms(xf86OutputPtr output, int mode) ErrorF("enable LVDS\n"); tmp = INREG(RADEON_LVDS_GEN_CNTL); tmp |= (RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); -#if defined(__powerpc__) - /* not sure if this is needed on non-Macs */ - if (info->MacModel) - tmp |= RADEON_LVDS_BL_MOD_EN; -#endif tmp &= ~(RADEON_LVDS_DISPLAY_DIS); usleep (lvds->PanelPwrDly * 1000); OUTREG(RADEON_LVDS_GEN_CNTL, tmp); @@ -999,39 +995,22 @@ legacy_output_dpms(xf86OutputPtr output, int mode) case ENCODER_OBJECT_ID_INTERNAL_LVDS: { unsigned long tmpPixclksCntl = INPLL(pScrn, RADEON_PIXCLKS_CNTL); - radeon_lvds_ptr lvds = (radeon_lvds_ptr)radeon_encoder->dev_priv; - if (lvds == NULL) - return; + ErrorF("disable LVDS\n"); if (info->IsMobility || info->IsIGP) { /* Asic bug, when turning off LVDS_ON, we have to make sure RADEON_PIXCLK_LVDS_ALWAYS_ON bit is off */ OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); } -#if defined(__powerpc__) - /* not sure if this is needed on non-Macs */ - if (info->MacModel) { - tmp = INREG(RADEON_LVDS_GEN_CNTL); - tmp |= RADEON_LVDS_DISPLAY_DIS; - tmp &= ~RADEON_LVDS_BL_MOD_EN; - OUTREG(RADEON_LVDS_GEN_CNTL, tmp); - usleep(100); - tmp &= ~(RADEON_LVDS_ON | RADEON_LVDS_EN); - OUTREG(RADEON_LVDS_GEN_CNTL, tmp); - } else -#endif - { - tmp = INREG(RADEON_LVDS_GEN_CNTL); - tmp |= RADEON_LVDS_DISPLAY_DIS; - tmp &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); - OUTREG(RADEON_LVDS_GEN_CNTL, tmp); - } + tmp = INREG(RADEON_LVDS_GEN_CNTL); + tmp |= RADEON_LVDS_DISPLAY_DIS; + tmp &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); + OUTREG(RADEON_LVDS_GEN_CNTL, tmp); save->lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; save->lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); if (info->IsMobility || info->IsIGP) { OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmpPixclksCntl); } - usleep (lvds->PanelPwrDly * 1000); } break; case ENCODER_OBJECT_ID_INTERNAL_TMDS1: @@ -1238,25 +1217,14 @@ RADEONInitFP2Registers(xf86OutputPtr output, RADEONSavePtr save, if ((info->Chipset == PCI_CHIP_RV350_NP) && (PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1028) && (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x2001)) - save->fp2_gen_cntl |= R200_FP2_DVO_CLOCK_MODE_SINGLE; /* Dell Inspiron 8600 */ + save->fp2_gen_cntl |= R300_FP2_DVO_CLOCK_MODE_SINGLE; /* Dell Inspiron 8600 */ else - save->fp2_gen_cntl |= RADEON_FP2_PAD_FLOP_EN | R200_FP2_DVO_CLOCK_MODE_SINGLE; - } - + save->fp2_gen_cntl |= RADEON_FP2_PAD_FLOP_EN | R300_FP2_DVO_CLOCK_MODE_SINGLE; #if 0 - /* DVO configurations: - * SDR single channel (data rate 165 Mhz, port width 12 bits) - * DDR single channel (data rate 330 Mhz, port width 12 bits) - * SDR dual channel (data rate 330 Mhz, port width 24 bits) - * - dual channel is only available on r3xx+ - */ - if (info->ChipFamily >= CHIP_FAMILY_R200) { - if (sdr) - save->fp2_gen_cntl |= R200_FP2_DVO_RATE_SEL_SDR; - if (IS_R300_VARIANT && dual channel) + if (mode->Clock > 165000) save->fp2_gen_cntl |= R300_FP2_DVO_DUAL_CHANNEL_EN; - } #endif + } if (IsPrimary) { if ((info->ChipFamily == CHIP_FAMILY_R200) || IS_R300_VARIANT) { @@ -1543,7 +1511,7 @@ RADEONInitTvDacCntl(xf86OutputPtr output, RADEONSavePtr save) R420_TV_DAC_DACADJ_MASK | R420_TV_DAC_RDACPD | R420_TV_DAC_GDACPD | - R420_TV_DAC_BDACPD | + R420_TV_DAC_GDACPD | R420_TV_DAC_TVENABLE); } else { save->tv_dac_cntl = info->SavedReg->tv_dac_cntl & @@ -1552,7 +1520,7 @@ RADEONInitTvDacCntl(xf86OutputPtr output, RADEONSavePtr save) RADEON_TV_DAC_DACADJ_MASK | RADEON_TV_DAC_RDACPD | RADEON_TV_DAC_GDACPD | - RADEON_TV_DAC_BDACPD); + RADEON_TV_DAC_GDACPD); } save->tv_dac_cntl |= (RADEON_TV_DAC_NBLANK | diff --git a/driver/xf86-video-ati/src/local_xf86Rename.h b/driver/xf86-video-ati/src/local_xf86Rename.h new file mode 100644 index 000000000..51021709a --- /dev/null +++ b/driver/xf86-video-ati/src/local_xf86Rename.h @@ -0,0 +1,23 @@ +/* + * Copyright © 2006 Keith Packard + * + * 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, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#define XF86NAME(x) radeon_##x diff --git a/driver/xf86-video-ati/src/pcidb/ati_pciids.csv b/driver/xf86-video-ati/src/pcidb/ati_pciids.csv index 131e56c65..b361d9dd4 100644 --- a/driver/xf86-video-ati/src/pcidb/ati_pciids.csv +++ b/driver/xf86-video-ati/src/pcidb/ati_pciids.csv @@ -3,7 +3,6 @@ "0x3151","RV380_3151","RV380",,,,,,"ATI FireMV 2400 (PCI)" "0x3152","RV380_3152","RV380",1,,,,,"ATI Radeon Mobility X300 (M24) 3152 (PCIE)" "0x3154","RV380_3154","RV380",1,,,,,"ATI FireGL M24 GL 3154 (PCIE)" -"0x3155","RV380_3155","RV380",1,,,,,"ATI FireMV 2400 3155 (PCI)" "0x3E50","RV380_3E50","RV380",,,,,,"ATI Radeon X600 (RV380) 3E50 (PCIE)" "0x3E54","RV380_3E54","RV380",,,,,,"ATI FireGL V3200 (RV380) 3E54 (PCIE)" "0x4136","RS100_4136","RS100",,1,,,1,"ATI Radeon IGP320 (A3) 4136" @@ -26,6 +25,7 @@ "0x4158","MACH32","MACH32",,,,,, "0x4237","RS250_4237","RS200",,1,,,1,"ATI Radeon 7000 IGP (A4+) 4237" "0x4242","R200_BB","R200",,,,1,,"ATI Radeon 8500 AIW BB (AGP)" +"0x4243","R200_BC","R200",,,,1,,"ATI Radeon 8500 AIW BC (AGP)" "0x4336","RS100_4336","RS100",1,1,,,1,"ATI Radeon IGP320M (U1) 4336" "0x4337","RS200_4337","RS200",1,1,,,1,"ATI Radeon IGP330M/340M/350M (U2) 4337" "0x4354","MACH64CT","MACH64",,,,,, @@ -61,8 +61,6 @@ "0x4A4E","R420_JN","R420",1,,,,,"ATI Radeon Mobility 9800 (M18) JN (AGP)" "0x4A4F","R420_4A4F","R420",,,,,,"ATI Radeon X800 SE (R420) (AGP)" "0x4A50","R420_JP","R420",,,,,,"ATI Radeon X800XT (R420) JP (AGP)" -"0x4A54","R420_JT","R420",,,,,,"ATI Radeon X800 VE (R420) JT (AGP)" -"0x4B48","R481_4B48","R420",,,,,,"ATI Radeon X850 (R480) (AGP)" "0x4B49","R481_4B49","R420",,,,,,"ATI Radeon X850 XT (R480) (AGP)" "0x4B4A","R481_4B4A","R420",,,,,,"ATI Radeon X850 SE (R480) (AGP)" "0x4B4B","R481_4B4B","R420",,,,,,"ATI Radeon X850 PRO (R480) (AGP)" @@ -337,7 +335,6 @@ "0x9440","RV770_9440","RV770",,,,,,"ATI Radeon 4800 Series" "0x9441","RV770_9441","RV770",,,,,,"ATI Radeon HD 4870 x2" "0x9442","RV770_9442","RV770",,,,,,"ATI Radeon 4800 Series" -"0x9443","RV770_9443","RV770",,,,,,"ATI Radeon HD 4850 x2" "0x9444","RV770_9444","RV770",,,,,,"ATI FirePro V8750 (FireGL)" "0x9446","RV770_9446","RV770",,,,,,"ATI FirePro V7760 (FireGL)" "0x944A","RV770_944A","RV770",1,,,,,"ATI Mobility RADEON HD 4850" @@ -349,34 +346,21 @@ "0x9456","RV770_9456","RV770",,,,,,"ATI FirePro V8700 (FireGL)" "0x945A","RV770_945A","RV770",1,,,,,"ATI Mobility RADEON HD 4870" "0x945B","RV770_945B","RV770",1,,,,,"ATI Mobility RADEON M98" -"0x945E","RV770_945E","RV770",1,,,,,"ATI Mobility RADEON HD 4870" "0x9460","RV790_9460","RV770",,,,,,"ATI Radeon 4800 Series" "0x9462","RV790_9462","RV770",,,,,,"ATI Radeon 4800 Series" "0x946A","RV770_946A","RV770",1,,,,,"ATI FirePro M7750" "0x946B","RV770_946B","RV770",1,,,,,"ATI M98" "0x947A","RV770_947A","RV770",1,,,,,"ATI M98" "0x947B","RV770_947B","RV770",1,,,,,"ATI M98" -"0x9480","RV730_9480","RV730",1,,,,,"ATI Mobility Radeon HD 4650" "0x9487","RV730_9487","RV730",,,,,,"ATI Radeon RV730 (AGP)" -"0x9488","RV730_9488","RV730",1,,,,,"ATI Mobility Radeon HD 4670" "0x9489","RV730_9489","RV730",1,,,,,"ATI FirePro M5750" -"0x948A","RV730_948A","RV730",1,,,,,"ATI Mobility Radeon HD 4670" "0x948F","RV730_948F","RV730",,,,,,"ATI Radeon RV730 (AGP)" "0x9490","RV730_9490","RV730",,,,,,"ATI RV730XT [Radeon HD 4670]" "0x9491","RV730_9491","RV730",,,,,,"ATI RADEON E4600" -"0x9495","RV730_9495","RV730",,,,,,"ATI Radeon HD 4600 Series" "0x9498","RV730_9498","RV730",,,,,,"ATI RV730 PRO [Radeon HD 4650]" "0x949C","RV730_949C","RV730",,,,,,"ATI FirePro V7750 (FireGL)" "0x949E","RV730_949E","RV730",,,,,,"ATI FirePro V5700 (FireGL)" "0x949F","RV730_949F","RV730",,,,,,"ATI FirePro V3750 (FireGL)" -"0x94A0","RV740_94A0","RV740",1,,,,,"ATI Mobility Radeon HD 4830" -"0x94A1","RV740_94A1","RV740",1,,,,,"ATI Mobility Radeon HD 4850" -"0x94A3","RV740_94A3","RV740",1,,,,,"ATI FirePro M7740" -"0x94B1","RV740_94B1","RV740",,,,,,"ATI RV740" -"0x94B3","RV740_94B3","RV740",,,,,,"ATI Radeon HD 4770" -"0x94B4","RV740_94B4","RV740",,,,,,"ATI Radeon HD 4700 Series" -"0x94B5","RV740_94B5","RV740",,,,,,"ATI Radeon HD 4770" -"0x94B9","RV740_94B9","RV740",1,,,,,"ATI FirePro M5750" "0x94C0","RV610_94C0","RV610",,,,,,"ATI RV610" "0x94C1","RV610_94C1","RV610",,,,,,"ATI Radeon HD 2400 XT" "0x94C3","RV610_94C3","RV610",,,,,,"ATI Radeon HD 2400 Pro" @@ -404,14 +388,11 @@ "0x9519","RV670_9519","RV670",,,,,,"AMD Firestream 9170" "0x9540","RV710_9540","RV710",,,,,,"ATI Radeon HD 4550" "0x9541","RV710_9541","RV710",,,,,,"ATI Radeon RV710" -"0x9542","RV710_9542","RV710",,,,,,"ATI Radeon RV710" "0x954E","RV710_954E","RV710",,,,,,"ATI Radeon RV710" "0x954F","RV710_954F","RV710",,,,,,"ATI Radeon HD 4350" "0x9552","RV710_9552","RV710",1,,,,,"ATI Mobility Radeon 4300 Series" "0x9553","RV710_9553","RV710",1,,,,,"ATI Mobility Radeon 4500 Series" "0x9555","RV710_9555","RV710",1,,,,,"ATI Mobility Radeon 4500 Series" -"0x9557","RV710_9557","RV710",1,,,,,"ATI FirePro RG220" -"0x955F","RV710_955F","RV710",1,,,,,"ATI Mobility Radeon 4330" "0x9580","RV630_9580","RV630",,,,,,"ATI RV630" "0x9581","RV630_9581","RV630",1,,,,,"ATI Mobility Radeon HD 2600" "0x9583","RV630_9583","RV630",1,,,,,"ATI Mobility Radeon HD 2600 XT" @@ -425,6 +406,7 @@ "0x958D","RV630_958D","RV630",,,,,,"ATI FireGL V3600" "0x958E","RV630_958E","RV630",,,,,,"ATI Radeon HD 2600 LE" "0x958F","RV630_958F","RV630",1,,,,,"ATI Mobility FireGL Graphics Processor" +"0x9542","RV710_9542","RV710",,,,,,"ATI Radeon RV710" "0x95C0","RV620_95C0","RV620",,,,,,"ATI Radeon HD 3470" "0x95C2","RV620_95C2","RV620",1,,,,,"ATI Mobility Radeon HD 3430" "0x95C4","RV620_95C4","RV620",1,,,,,"ATI Mobility Radeon HD 3400 Series" @@ -452,122 +434,8 @@ "0x9614","RS780_9614","RS780",,1,,,1,"ATI Radeon HD 3300 Graphics" "0x9615","RS780_9615","RS780",,1,,,1,"ATI Radeon HD 3200 Graphics" "0x9616","RS780_9616","RS780",,1,,,1,"ATI Radeon 3000 Graphics" -"0x9640","SUMO_9640","SUMO",,1,,,1,"SUMO" -"0x9641","SUMO_9641","SUMO",1,1,,,1,"SUMO" -"0x9642","SUMO2_9642","SUMO2",,1,,,1,"SUMO2" -"0x9643","SUMO2_9643","SUMO2",1,1,,,1,"SUMO2" -"0x9644","SUMO2_9644","SUMO2",,1,,,1,"SUMO2" -"0x9645","SUMO2_9645","SUMO2",1,1,,,1,"SUMO2" -"0x9647","SUMO_9647","SUMO",1,1,,,1,"SUMO" -"0x9648","SUMO_9648","SUMO",1,1,,,1,"SUMO" -"0x964A","SUMO_964A","SUMO",,1,,,1,"SUMO" -"0x964E","SUMO_964E","SUMO",1,1,,,1,"SUMO" -"0x964F","SUMO_964F","SUMO",1,1,,,1,"SUMO" -"0x9710","RS880_9710","RS880",,1,,,1,"ATI Radeon HD 4200" -"0x9711","RS880_9711","RS880",,1,,,1,"ATI Radeon 4100" -"0x9712","RS880_9712","RS880",1,1,,,1,"ATI Mobility Radeon HD 4200" -"0x9713","RS880_9713","RS880",1,1,,,1,"ATI Mobility Radeon 4100" -"0x9714","RS880_9714","RS880",,1,,,1,"ATI Radeon HD 4290" -"0x9715","RS880_9715","RS880",,1,,,1,"ATI Radeon HD 4250" -"0x9802","PALM_9802","PALM",,1,,,1,"AMD Radeon HD 6310 Graphics" -"0x9803","PALM_9803","PALM",,1,,,1,"AMD Radeon HD 6310 Graphics" -"0x9804","PALM_9804","PALM",,1,,,1,"AMD Radeon HD 6250 Graphics" -"0x9805","PALM_9805","PALM",,1,,,1,"AMD Radeon HD 6250 Graphics" -"0x9806","PALM_9806","PALM",,1,,,1,"AMD Radeon HD 6300 Series Graphics" -"0x9807","PALM_9807","PALM",,1,,,1,"AMD Radeon HD 6200 Series Graphics" -"0x6880","CYPRESS_6880","CYPRESS",1,,,,,"CYPRESS" -"0x6888","CYPRESS_6888","CYPRESS",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x6889","CYPRESS_6889","CYPRESS",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x688A","CYPRESS_688A","CYPRESS",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x688C","CYPRESS_688C","CYPRESS",,,,,,"AMD Firestream 9370" -"0x688D","CYPRESS_688D","CYPRESS",,,,,,"AMD Firestream 9350" -"0x6898","CYPRESS_6898","CYPRESS",,,,,,"ATI Radeon HD 5800 Series" -"0x6899","CYPRESS_6899","CYPRESS",,,,,,"ATI Radeon HD 5800 Series" -"0x689B","CYPRESS_689B","CYPRESS",,,,,,"ATI Radeon HD 5800 Series" -"0x689E","CYPRESS_689E","CYPRESS",,,,,,"ATI Radeon HD 5800 Series" -"0x689C","HEMLOCK_689C","HEMLOCK",,,,,,"ATI Radeon HD 5900 Series" -"0x689D","HEMLOCK_689D","HEMLOCK",,,,,,"ATI Radeon HD 5900 Series" -"0x68A0","JUNIPER_68A0","JUNIPER",1,,,,,"ATI Mobility Radeon HD 5800 Series" -"0x68A1","JUNIPER_68A1","JUNIPER",1,,,,,"ATI Mobility Radeon HD 5800 Series" -"0x68A8","JUNIPER_68A8","JUNIPER",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x68A9","JUNIPER_68A9","JUNIPER",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x68B0","JUNIPER_68B0","JUNIPER",1,,,,,"ATI Mobility Radeon HD 5800 Series" -"0x68B8","JUNIPER_68B8","JUNIPER",,,,,,"ATI Radeon HD 5700 Series" -"0x68B9","JUNIPER_68B9","JUNIPER",,,,,,"ATI Radeon HD 5700 Series" -"0x68BA","JUNIPER_68BA","JUNIPER",,,,,,"ATI Radeon HD 6700 Series" -"0x68BE","JUNIPER_68BE","JUNIPER",,,,,,"ATI Radeon HD 5700 Series" -"0x68BF","JUNIPER_68BF","JUNIPER",,,,,,"ATI Radeon HD 6700 Series" -"0x68C0","REDWOOD_68C0","REDWOOD",1,,,,,"ATI Mobility Radeon HD 5000 Series" -"0x68C1","REDWOOD_68C1","REDWOOD",1,,,,,"ATI Mobility Radeon HD 5000 Series" -"0x68C7","REDWOOD_68C7","REDWOOD",1,,,,,"ATI Mobility Radeon HD 5570" -"0x68C8","REDWOOD_68C8","REDWOOD",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x68C9","REDWOOD_68C9","REDWOOD",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x68D8","REDWOOD_68D8","REDWOOD",,,,,,"ATI Radeon HD 5670" -"0x68D9","REDWOOD_68D9","REDWOOD",,,,,,"ATI Radeon HD 5570" -"0x68DA","REDWOOD_68DA","REDWOOD",,,,,,"ATI Radeon HD 5500 Series" -"0x68DE","REDWOOD_68DE","REDWOOD",,,,,,"REDWOOD" -"0x68E0","CEDAR_68E0","CEDAR",1,,,,,"ATI Mobility Radeon HD 5000 Series" -"0x68E1","CEDAR_68E1","CEDAR",1,,,,,"ATI Mobility Radeon HD 5000 Series" -"0x68E4","CEDAR_68E4","CEDAR",1,,,,,"ATI Mobility Radeon Graphics" -"0x68E5","CEDAR_68E5","CEDAR",1,,,,,"ATI Mobility Radeon Graphics" -"0x68E8","CEDAR_68E8","CEDAR",,,,,,"CEDAR" -"0x68E9","CEDAR_68E9","CEDAR",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x68F1","CEDAR_68F1","CEDAR",,,,,,"ATI FirePro (FireGL) Graphics Adapter" -"0x68F2","CEDAR_68F2","CEDAR",,,,,,"ATI FirePro 2270" -"0x68F8","CEDAR_68F8","CEDAR",,,,,,"CEDAR" -"0x68F9","CEDAR_68F9","CEDAR",,,,,,"ATI Radeon HD 5450" -"0x68FE","CEDAR_68FE","CEDAR",,,,,,"CEDAR" -"0x6700","CAYMAN_6700","CAYMAN",,,,,,"CAYMAN" -"0x6701","CAYMAN_6701","CAYMAN",,,,,,"CAYMAN" -"0x6702","CAYMAN_6702","CAYMAN",,,,,,"CAYMAN" -"0x6703","CAYMAN_6703","CAYMAN",,,,,,"CAYMAN" -"0x6704","CAYMAN_6704","CAYMAN",,,,,,"CAYMAN" -"0x6705","CAYMAN_6705","CAYMAN",,,,,,"CAYMAN" -"0x6706","CAYMAN_6706","CAYMAN",,,,,,"CAYMAN" -"0x6707","CAYMAN_6707","CAYMAN",,,,,,"CAYMAN" -"0x6708","CAYMAN_6708","CAYMAN",,,,,,"CAYMAN" -"0x6709","CAYMAN_6709","CAYMAN",,,,,,"CAYMAN" -"0x6718","CAYMAN_6718","CAYMAN",,,,,,"AMD Radeon HD 6900 Series" -"0x6719","CAYMAN_6719","CAYMAN",,,,,,"AMD Radeon HD 6900 Series" -"0x671C","CAYMAN_671C","CAYMAN",,,,,,"CAYMAN" -"0x671D","CAYMAN_671D","CAYMAN",,,,,,"CAYMAN" -"0x671F","CAYMAN_671F","CAYMAN",,,,,,"CAYMAN" -"0x6720","BARTS_6720","BARTS",1,,,,,"AMD Radeon HD 6900M Series" -"0x6721","BARTS_6721","BARTS",1,,,,,"Mobility Radeon HD 6000 Series" -"0x6722","BARTS_6722","BARTS",,,,,,"BARTS" -"0x6723","BARTS_6723","BARTS",,,,,,"BARTS" -"0x6724","BARTS_6724","BARTS",1,,,,,"Mobility Radeon HD 6000 Series" -"0x6725","BARTS_6725","BARTS",1,,,,,"Mobility Radeon HD 6000 Series" -"0x6726","BARTS_6726","BARTS",,,,,,"BARTS" -"0x6727","BARTS_6727","BARTS",,,,,,"BARTS" -"0x6728","BARTS_6728","BARTS",,,,,,"BARTS" -"0x6729","BARTS_6729","BARTS",,,,,,"BARTS" -"0x6738","BARTS_6738","BARTS",,,,,,"AMD Radeon HD 6800 Series" -"0x6739","BARTS_6739","BARTS",,,,,,"AMD Radeon HD 6800 Series" -"0x673E","BARTS_673E","BARTS",,,,,,"AMD Radeon HD 6700 Series" -"0x6740","TURKS_6740","TURKS",1,,,,,"TURKS" -"0x6741","TURKS_6741","TURKS",1,,,,,"TURKS" -"0x6742","TURKS_6742","TURKS",1,,,,,"TURKS" -"0x6743","TURKS_6743","TURKS",1,,,,,"TURKS" -"0x6744","TURKS_6744","TURKS",1,,,,,"TURKS" -"0x6745","TURKS_6745","TURKS",1,,,,,"TURKS" -"0x6746","TURKS_6746","TURKS",,,,,,"TURKS" -"0x6747","TURKS_6747","TURKS",,,,,,"TURKS" -"0x6748","TURKS_6748","TURKS",,,,,,"TURKS" -"0x6749","TURKS_6749","TURKS",,,,,,"TURKS" -"0x6750","TURKS_6750","TURKS",,,,,,"TURKS" -"0x6758","TURKS_6758","TURKS",,,,,,"TURKS" -"0x6759","TURKS_6759","TURKS",,,,,,"TURKS" -"0x675F","TURKS_675F","TURKS",,,,,,"TURKS" -"0x6760","CAICOS_6760","CAICOS",1,,,,,"CAICOS" -"0x6761","CAICOS_6761","CAICOS",1,,,,,"CAICOS" -"0x6762","CAICOS_6762","CAICOS",,,,,,"CAICOS" -"0x6763","CAICOS_6763","CAICOS",,,,,,"CAICOS" -"0x6764","CAICOS_6764","CAICOS",1,,,,,"CAICOS" -"0x6765","CAICOS_6765","CAICOS",1,,,,,"CAICOS" -"0x6766","CAICOS_6766","CAICOS",,,,,,"CAICOS" -"0x6767","CAICOS_6767","CAICOS",,,,,,"CAICOS" -"0x6768","CAICOS_6768","CAICOS",,,,,,"CAICOS" -"0x6770","CAICOS_6770","CAICOS",,,,,,"CAICOS" -"0x6778","CAICOS_6778","CAICOS",,,,,,"CAICOS" -"0x6779","CAICOS_6779","CAICOS",,,,,,"CAICOS" +"0x9710","RS880_9710","RS880",,1,,,1,"ATI Radeon HD Graphics" +"0x9711","RS880_9711","RS880",,1,,,1,"ATI Radeon Graphics" +"0x9712","RS880_9712","RS880",1,1,,,1,"ATI Mobility Radeon HD Graphics" +"0x9713","RS880_9713","RS880",1,1,,,1,"ATI Mobility Radeon Graphics" +"0x9714","RS880_9714","RS880",,1,,,1,"ATI Radeon Graphics" diff --git a/driver/xf86-video-ati/src/pcidb/parse_pci_ids.pl b/driver/xf86-video-ati/src/pcidb/parse_pci_ids.pl index d1900a481..a3a8af89f 100755 --- a/driver/xf86-video-ati/src/pcidb/parse_pci_ids.pl +++ b/driver/xf86-video-ati/src/pcidb/parse_pci_ids.pl @@ -33,7 +33,7 @@ print PCICHIPSET "PciChipsets RADEONPciChipsets[] = {\n"; print PCIDEVICEMATCH "/* This file is autogenerated please do not edit */\n"; print PCIDEVICEMATCH "static const struct pci_id_match radeon_device_match[] = {\n"; print RADEONCHIPINFO "/* This file is autogenerated please do not edit */\n"; -print RADEONCHIPINFO "static RADEONCardInfo RADEONCards[] = {\n"; +print RADEONCHIPINFO "RADEONCardInfo RADEONCards[] = {\n"; while () { if ($csv->parse($_)) { my @columns = $csv->fields(); diff --git a/driver/xf86-video-ati/src/r600_exa.c b/driver/xf86-video-ati/src/r600_exa.c index bc3387dc3..bef66632d 100644 --- a/driver/xf86-video-ati/src/r600_exa.c +++ b/driver/xf86-video-ati/src/r600_exa.c @@ -38,142 +38,54 @@ #include "r600_shader.h" #include "r600_reg.h" #include "r600_state.h" -#include "radeon_exa_shared.h" -#include "radeon_vbo.h" + +extern PixmapPtr +RADEONGetDrawablePixmap(DrawablePtr pDrawable); /* #define SHOW_VERTEXES */ -Bool -R600SetAccelState(ScrnInfoPtr pScrn, - struct r600_accel_object *src0, - struct r600_accel_object *src1, - struct r600_accel_object *dst, - uint32_t vs_offset, uint32_t ps_offset, - int rop, Pixel planemask) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - uint32_t pitch_align = 0x7, base_align = 0xff; -#if defined(XF86DRM_MODE) - int ret; -#endif +# define RADEON_ROP3_ZERO 0x00000000 +# define RADEON_ROP3_DSa 0x00880000 +# define RADEON_ROP3_SDna 0x00440000 +# define RADEON_ROP3_S 0x00cc0000 +# define RADEON_ROP3_DSna 0x00220000 +# define RADEON_ROP3_D 0x00aa0000 +# define RADEON_ROP3_DSx 0x00660000 +# define RADEON_ROP3_DSo 0x00ee0000 +# define RADEON_ROP3_DSon 0x00110000 +# define RADEON_ROP3_DSxn 0x00990000 +# define RADEON_ROP3_Dn 0x00550000 +# define RADEON_ROP3_SDno 0x00dd0000 +# define RADEON_ROP3_Sn 0x00330000 +# define RADEON_ROP3_DSno 0x00bb0000 +# define RADEON_ROP3_DSan 0x00770000 +# define RADEON_ROP3_ONE 0x00ff0000 - if (src0) { - memcpy(&accel_state->src_obj[0], src0, sizeof(struct r600_accel_object)); - accel_state->src_size[0] = src0->pitch * src0->height * (src0->bpp/8); -#if defined(XF86DRM_MODE) - if (info->cs) { - pitch_align = drmmode_get_pitch_align(pScrn, - accel_state->src_obj[0].bpp / 8, - accel_state->src_obj[0].tiling_flags) - 1; - base_align = drmmode_get_base_align(pScrn, - accel_state->src_obj[0].bpp / 8, - accel_state->src_obj[0].tiling_flags) - 1; - } -#endif - /* bad pitch */ - if (accel_state->src_obj[0].pitch & pitch_align) - RADEON_FALLBACK(("Bad src pitch 0x%08x\n", accel_state->src_obj[0].pitch)); +uint32_t RADEON_ROP[16] = { + RADEON_ROP3_ZERO, /* GXclear */ + RADEON_ROP3_DSa, /* Gxand */ + RADEON_ROP3_SDna, /* GXandReverse */ + RADEON_ROP3_S, /* GXcopy */ + RADEON_ROP3_DSna, /* GXandInverted */ + RADEON_ROP3_D, /* GXnoop */ + RADEON_ROP3_DSx, /* GXxor */ + RADEON_ROP3_DSo, /* GXor */ + RADEON_ROP3_DSon, /* GXnor */ + RADEON_ROP3_DSxn, /* GXequiv */ + RADEON_ROP3_Dn, /* GXinvert */ + RADEON_ROP3_SDno, /* GXorReverse */ + RADEON_ROP3_Sn, /* GXcopyInverted */ + RADEON_ROP3_DSno, /* GXorInverted */ + RADEON_ROP3_DSan, /* GXnand */ + RADEON_ROP3_ONE, /* GXset */ +}; - /* bad offset */ - if (accel_state->src_obj[0].offset & base_align) - RADEON_FALLBACK(("Bad src offset 0x%08x\n", accel_state->src_obj[0].offset)); +static void +R600DoneSolid(PixmapPtr pPix); - } else { - memset(&accel_state->src_obj[0], 0, sizeof(struct r600_accel_object)); - accel_state->src_size[0] = 0; - } +static void +R600DoneComposite(PixmapPtr pDst); - if (src1) { - memcpy(&accel_state->src_obj[1], src1, sizeof(struct r600_accel_object)); - accel_state->src_size[1] = src1->pitch * src1->height * (src1->bpp/8); -#if defined(XF86DRM_MODE) - if (info->cs) { - pitch_align = drmmode_get_pitch_align(pScrn, - accel_state->src_obj[1].bpp / 8, - accel_state->src_obj[1].tiling_flags) - 1; - base_align = drmmode_get_base_align(pScrn, - accel_state->src_obj[1].bpp / 8, - accel_state->src_obj[1].tiling_flags) - 1; - } -#endif - /* bad pitch */ - if (accel_state->src_obj[1].pitch & pitch_align) - RADEON_FALLBACK(("Bad src pitch 0x%08x\n", accel_state->src_obj[1].pitch)); - - /* bad offset */ - if (accel_state->src_obj[1].offset & base_align) - RADEON_FALLBACK(("Bad src offset 0x%08x\n", accel_state->src_obj[1].offset)); - } else { - memset(&accel_state->src_obj[1], 0, sizeof(struct r600_accel_object)); - accel_state->src_size[1] = 0; - } - - if (dst) { - memcpy(&accel_state->dst_obj, dst, sizeof(struct r600_accel_object)); - accel_state->dst_size = dst->pitch * dst->height * (dst->bpp/8); -#if defined(XF86DRM_MODE) - if (info->cs) { - pitch_align = drmmode_get_pitch_align(pScrn, - accel_state->dst_obj.bpp / 8, - accel_state->dst_obj.tiling_flags) - 1; - base_align = drmmode_get_base_align(pScrn, - accel_state->dst_obj.bpp / 8, - accel_state->dst_obj.tiling_flags) - 1; - } -#endif - if (accel_state->dst_obj.pitch & pitch_align) - RADEON_FALLBACK(("Bad dst pitch 0x%08x\n", accel_state->dst_obj.pitch)); - - if (accel_state->dst_obj.offset & base_align) - RADEON_FALLBACK(("Bad dst offset 0x%08x\n", accel_state->dst_obj.offset)); - } else { - memset(&accel_state->dst_obj, 0, sizeof(struct r600_accel_object)); - accel_state->dst_size = 0; - } - -#ifdef XF86DRM_MODE - if (info->cs && CS_FULL(info->cs)) - radeon_cs_flush_indirect(pScrn); -#endif - - accel_state->rop = rop; - accel_state->planemask = planemask; - - accel_state->vs_size = 512; - accel_state->ps_size = 512; -#if defined(XF86DRM_MODE) - if (info->cs) { - accel_state->vs_mc_addr = vs_offset; - accel_state->ps_mc_addr = ps_offset; - - radeon_cs_space_reset_bos(info->cs); - radeon_cs_space_add_persistent_bo(info->cs, accel_state->shaders_bo, - RADEON_GEM_DOMAIN_VRAM, 0); - if (accel_state->src_obj[0].bo) - radeon_cs_space_add_persistent_bo(info->cs, accel_state->src_obj[0].bo, - accel_state->src_obj[0].domain, 0); - if (accel_state->src_obj[1].bo) - radeon_cs_space_add_persistent_bo(info->cs, accel_state->src_obj[1].bo, - accel_state->src_obj[1].domain, 0); - if (accel_state->dst_obj.bo) - radeon_cs_space_add_persistent_bo(info->cs, accel_state->dst_obj.bo, - 0, accel_state->dst_obj.domain); - ret = radeon_cs_space_check(info->cs); - if (ret) - RADEON_FALLBACK(("Not enough RAM to hw accel operation\n")); - - } else -#endif - { - accel_state->vs_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + - vs_offset; - accel_state->ps_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + - ps_offset; - } - - return TRUE; -} static Bool R600PrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) @@ -183,114 +95,134 @@ R600PrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) struct radeon_accel_state *accel_state = info->accel_state; cb_config_t cb_conf; shader_config_t vs_conf, ps_conf; + int pmask = 0; uint32_t a, r, g, b; float ps_alu_consts[4]; - struct r600_accel_object dst; - if (!RADEONCheckBPP(pPix->drawable.bitsPerPixel)) - RADEON_FALLBACK(("R600CheckDatatype failed\n")); - if (!RADEONValidPM(pm, pPix->drawable.bitsPerPixel)) - RADEON_FALLBACK(("invalid planemask\n")); + accel_state->dst_mc_addr = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; + accel_state->dst_size = exaGetPixmapPitch(pPix) * pPix->drawable.height; + accel_state->dst_pitch = exaGetPixmapPitch(pPix) / (pPix->drawable.bitsPerPixel / 8); -#if defined(XF86DRM_MODE) - if (info->cs) { - dst.offset = 0; - dst.bo = radeon_get_pixmap_bo(pPix); - dst.tiling_flags = radeon_get_pixmap_tiling(pPix); - } else -#endif - { - dst.offset = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; - dst.bo = NULL; - } + /* bad pitch */ + if (accel_state->dst_pitch & 7) + return FALSE; - dst.pitch = exaGetPixmapPitch(pPix) / (pPix->drawable.bitsPerPixel / 8); - dst.width = pPix->drawable.width; - dst.height = pPix->drawable.height; - dst.bpp = pPix->drawable.bitsPerPixel; - dst.domain = RADEON_GEM_DOMAIN_VRAM; + /* bad offset */ + if (accel_state->dst_mc_addr & 0xff) + return FALSE; - if (!R600SetAccelState(pScrn, - NULL, - NULL, - &dst, - accel_state->solid_vs_offset, accel_state->solid_ps_offset, - alu, pm)) + if (pPix->drawable.bitsPerPixel == 24) return FALSE; CLEAR (cb_conf); CLEAR (vs_conf); CLEAR (ps_conf); - radeon_vbo_check(pScrn, &accel_state->vbo, 16); - radeon_cp_start(pScrn); + /* return FALSE; */ - r600_set_default_state(pScrn, accel_state->ib); +#ifdef SHOW_VERTEXES + ErrorF("%dx%d @ %dbpp, 0x%08x\n", pPix->drawable.width, pPix->drawable.height, + pPix->drawable.bitsPerPixel, exaGetPixmapPitch(pPix)); +#endif - r600_set_generic_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_screen_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_window_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); + accel_state->ib = RADEONCPGetBuffer(pScrn); + + /* Init */ + start_3d(pScrn, accel_state->ib); + + set_default_state(pScrn, accel_state->ib); + + /* Scissor / viewport */ + EREG(accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG(accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); + + accel_state->vs_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->solid_vs_offset; + accel_state->ps_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->solid_ps_offset; + accel_state->vs_size = 512; + accel_state->ps_size = 512; /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; vs_conf.num_gprs = 2; vs_conf.stack_size = 0; - vs_conf.bo = accel_state->shaders_bo; - r600_vs_setup(pScrn, accel_state->ib, &vs_conf, RADEON_GEM_DOMAIN_VRAM); + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; ps_conf.num_gprs = 1; ps_conf.stack_size = 0; ps_conf.uncached_first_inst = 1; ps_conf.clamp_consts = 0; ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - r600_ps_setup(pScrn, accel_state->ib, &ps_conf, RADEON_GEM_DOMAIN_VRAM); + ps_setup (pScrn, accel_state->ib, &ps_conf); + + /* Render setup */ + if (pm & 0x000000ff) + pmask |= 4; /* B */ + if (pm & 0x0000ff00) + pmask |= 2; /* G */ + if (pm & 0x00ff0000) + pmask |= 1; /* R */ + if (pm & 0xff000000) + pmask |= 8; /* A */ + EREG(accel_state->ib, CB_SHADER_MASK, (pmask << OUTPUT0_ENABLE_shift)); + EREG(accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + EREG(accel_state->ib, CB_COLOR_CONTROL, RADEON_ROP[alu]); cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; - cb_conf.bo = accel_state->dst_obj.bo; + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = pPix->drawable.height; + cb_conf.base = accel_state->dst_mc_addr; - if (accel_state->dst_obj.bpp == 8) { + if (pPix->drawable.bitsPerPixel == 8) { cb_conf.format = COLOR_8; cb_conf.comp_swap = 3; /* A */ - } else if (accel_state->dst_obj.bpp == 16) { + } else if (pPix->drawable.bitsPerPixel == 16) { cb_conf.format = COLOR_5_6_5; cb_conf.comp_swap = 2; /* RGB */ -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN16; -#endif } else { cb_conf.format = COLOR_8_8_8_8; cb_conf.comp_swap = 1; /* ARGB */ -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN32; -#endif } cb_conf.source_format = 1; cb_conf.blend_clamp = 1; - /* Render setup */ - if (accel_state->planemask & 0x000000ff) - cb_conf.pmask |= 4; /* B */ - if (accel_state->planemask & 0x0000ff00) - cb_conf.pmask |= 2; /* G */ - if (accel_state->planemask & 0x00ff0000) - cb_conf.pmask |= 1; /* R */ - if (accel_state->planemask & 0xff000000) - cb_conf.pmask |= 8; /* A */ - cb_conf.rop = accel_state->rop; - if (accel_state->dst_obj.tiling_flags == 0) - cb_conf.array_mode = 1; - r600_set_render_target(pScrn, accel_state->ib, &cb_conf, accel_state->dst_obj.domain); + set_render_target(pScrn, accel_state->ib, &cb_conf); - r600_set_spi(pScrn, accel_state->ib, 0, 0); + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ + + /* Interpolator setup */ + /* one unused export from VS (VS_EXPORT_COUNT is zero based, count minus one) */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, (0 << VS_EXPORT_COUNT_shift)); + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + + /* Enabling flat shading needs both FLAT_SHADE_bit in SPI_PS_INPUT_CNTL_x + * *and* FLAT_SHADE_ENA_bit in SPI_INTERP_CONTROL_0 */ + /* no VS exports as PS input (NUM_INTERP is not zero based, no minus one) */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, (0 << NUM_INTERP_shift)); + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + /* color semantic id 0 -> GPR[0] */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x03 << DEFAULT_VAL_shift) | + FLAT_SHADE_bit | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, FLAT_SHADE_ENA_bit | 0); /* PS alu constants */ - if (accel_state->dst_obj.bpp == 16) { + if (pPix->drawable.bitsPerPixel == 16) { r = (fg >> 11) & 0x1f; g = (fg >> 5) & 0x3f; b = (fg >> 0) & 0x1f; @@ -298,7 +230,7 @@ R600PrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) ps_alu_consts[1] = (float)g / 63; /* G */ ps_alu_consts[2] = (float)b / 31; /* B */ ps_alu_consts[3] = 1.0; /* A */ - } else if (accel_state->dst_obj.bpp == 8) { + } else if (pPix->drawable.bitsPerPixel == 8) { a = (fg >> 0) & 0xff; ps_alu_consts[0] = 0.0; /* R */ ps_alu_consts[1] = 0.0; /* G */ @@ -314,33 +246,18 @@ R600PrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) ps_alu_consts[2] = (float)b / 255; /* B */ ps_alu_consts[3] = (float)a / 255; /* A */ } - r600_set_alu_consts(pScrn, accel_state->ib, SQ_ALU_CONSTANT_ps, - sizeof(ps_alu_consts) / SQ_ALU_CONSTANT_offset, ps_alu_consts); + set_alu_consts(pScrn, accel_state->ib, SQ_ALU_CONSTANT_ps, + sizeof(ps_alu_consts) / SQ_ALU_CONSTANT_offset, ps_alu_consts); - if (accel_state->vsync) - RADEONVlineHelperClear(pScrn); + accel_state->vb_index = 0; - accel_state->dst_pix = pPix; - accel_state->fg = fg; +#ifdef SHOW_VERTEXES + ErrorF("PM: 0x%08x\n", pm); +#endif return TRUE; } -static void -R600DoneSolid(PixmapPtr pPix) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - if (accel_state->vsync) - r600_cp_wait_vline_sync(pScrn, accel_state->ib, pPix, - accel_state->vline_crtc, - accel_state->vline_y1, - accel_state->vline_y2); - - r600_finish_op(pScrn, 8); -} static void R600Solid(PixmapPtr pPix, int x1, int y1, int x2, int y2) @@ -350,21 +267,15 @@ R600Solid(PixmapPtr pPix, int x1, int y1, int x2, int y2) struct radeon_accel_state *accel_state = info->accel_state; float *vb; -#ifdef XF86DRM_MODE - if (info->cs && CS_FULL(info->cs)) { - R600DoneSolid(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - R600PrepareSolid(accel_state->dst_pix, - accel_state->rop, - accel_state->planemask, - accel_state->fg); + if (((accel_state->vb_index + 3) * 8) > (accel_state->ib->total / 2)) { + R600DoneSolid(pPix); + accel_state->vb_index = 0; + accel_state->ib = RADEONCPGetBuffer(pScrn); } -#endif - if (accel_state->vsync) - RADEONVlineHelperSet(pScrn, x1, y1, x2, y2); - - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 8); + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 8); vb[0] = (float)x1; vb[1] = (float)y1; @@ -375,14 +286,77 @@ R600Solid(PixmapPtr pPix, int x1, int y1, int x2, int y2) vb[4] = (float)x2; vb[5] = (float)y2; - radeon_vbo_commit(pScrn, &accel_state->vbo); + accel_state->vb_index += 3; + } static void -R600DoPrepareCopy(ScrnInfoPtr pScrn) +R600DoneSolid(PixmapPtr pPix) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + struct radeon_accel_state *accel_state = info->accel_state; + draw_config_t draw_conf; + vtx_resource_t vtx_res; + + CLEAR (draw_conf); + CLEAR (vtx_res); + + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = info->gartLocation + info->dri->bufStart + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + accel_state->vb_size = accel_state->vb_index * 8; + + /* flush vertex cache */ + if ((info->ChipFamily == CHIP_FAMILY_RV610) || + (info->ChipFamily == CHIP_FAMILY_RV620) || + (info->ChipFamily == CHIP_FAMILY_RS780) || + (info->ChipFamily == CHIP_FAMILY_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + /* Vertex buffer setup */ + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 8 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + /* Draw */ + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + /* sync dst surface */ + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); +} + +static void +R600DoPrepareCopy(ScrnInfoPtr pScrn, + int src_pitch, int src_width, int src_height, uint32_t src_offset, int src_bpp, + int dst_pitch, int dst_height, uint32_t dst_offset, int dst_bpp, + int rop, Pixel planemask) { RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_accel_state *accel_state = info->accel_state; + int pmask = 0; cb_config_t cb_conf; tex_resource_t tex_res; tex_sampler_t tex_samp; @@ -394,52 +368,74 @@ R600DoPrepareCopy(ScrnInfoPtr pScrn) CLEAR (vs_conf); CLEAR (ps_conf); - radeon_vbo_check(pScrn, &accel_state->vbo, 16); - radeon_cp_start(pScrn); + accel_state->ib = RADEONCPGetBuffer(pScrn); - r600_set_default_state(pScrn, accel_state->ib); + /* Init */ + start_3d(pScrn, accel_state->ib); - r600_set_generic_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_screen_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_window_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); + set_default_state(pScrn, accel_state->ib); + + /* Scissor / viewport */ + EREG(accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG(accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); + + accel_state->vs_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->copy_vs_offset; + accel_state->ps_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->copy_ps_offset; + accel_state->vs_size = 512; + accel_state->ps_size = 512; /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; vs_conf.num_gprs = 2; vs_conf.stack_size = 0; - vs_conf.bo = accel_state->shaders_bo; - r600_vs_setup(pScrn, accel_state->ib, &vs_conf, RADEON_GEM_DOMAIN_VRAM); + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; ps_conf.num_gprs = 1; ps_conf.stack_size = 0; ps_conf.uncached_first_inst = 1; ps_conf.clamp_consts = 0; ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - r600_ps_setup(pScrn, accel_state->ib, &ps_conf, RADEON_GEM_DOMAIN_VRAM); + ps_setup (pScrn, accel_state->ib, &ps_conf); + + accel_state->src_size[0] = src_pitch * src_height * (src_bpp/8); + accel_state->src_mc_addr[0] = src_offset; + accel_state->src_pitch[0] = src_pitch; + accel_state->src_width[0] = src_width; + accel_state->src_height[0] = src_height; + accel_state->src_bpp[0] = src_bpp; + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[0], accel_state->src_mc_addr[0]); /* Texture */ tex_res.id = 0; - tex_res.w = accel_state->src_obj[0].width; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch; + tex_res.w = src_width; + tex_res.h = src_height; + tex_res.pitch = accel_state->src_pitch[0]; tex_res.depth = 0; tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - tex_res.bo = accel_state->src_obj[0].bo; - tex_res.mip_bo = accel_state->src_obj[0].bo; - if (accel_state->src_obj[0].bpp == 8) { + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; + if (src_bpp == 8) { tex_res.format = FMT_8; tex_res.dst_sel_x = SQ_SEL_1; /* R */ tex_res.dst_sel_y = SQ_SEL_1; /* G */ tex_res.dst_sel_z = SQ_SEL_1; /* B */ tex_res.dst_sel_w = SQ_SEL_X; /* A */ - } else if (accel_state->src_obj[0].bpp == 16) { + } else if (src_bpp == 16) { tex_res.format = FMT_5_6_5; tex_res.dst_sel_x = SQ_SEL_Z; /* R */ tex_res.dst_sel_y = SQ_SEL_Y; /* G */ @@ -457,9 +453,7 @@ R600DoPrepareCopy(ScrnInfoPtr pScrn) tex_res.base_level = 0; tex_res.last_level = 0; tex_res.perf_modulation = 0; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.tile_mode = 1; - r600_set_tex_resource(pScrn, accel_state->ib, &tex_res, accel_state->src_obj[0].domain); + set_tex_resource (pScrn, accel_state->ib, &tex_res); tex_samp.id = 0; tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; @@ -467,20 +461,38 @@ R600DoPrepareCopy(ScrnInfoPtr pScrn) tex_samp.clamp_z = SQ_TEX_WRAP; tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_POINT; tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_POINT; - tex_samp.mc_coord_truncate = 1; tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; tex_samp.mip_filter = 0; /* no mipmap */ - r600_set_tex_sampler(pScrn, accel_state->ib, &tex_samp); + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + + + /* Render setup */ + if (planemask & 0x000000ff) + pmask |= 4; /* B */ + if (planemask & 0x0000ff00) + pmask |= 2; /* G */ + if (planemask & 0x00ff0000) + pmask |= 1; /* R */ + if (planemask & 0xff000000) + pmask |= 8; /* A */ + EREG(accel_state->ib, CB_SHADER_MASK, (pmask << OUTPUT0_ENABLE_shift)); + EREG(accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + EREG(accel_state->ib, CB_COLOR_CONTROL, RADEON_ROP[rop]); + + accel_state->dst_size = dst_pitch * dst_height * (dst_bpp/8); + accel_state->dst_mc_addr = dst_offset; + accel_state->dst_pitch = dst_pitch; + accel_state->dst_height = dst_height; + accel_state->dst_bpp = dst_bpp; cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; - cb_conf.bo = accel_state->dst_obj.bo; - if (accel_state->dst_obj.bpp == 8) { + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = dst_height; + cb_conf.base = accel_state->dst_mc_addr; + if (dst_bpp == 8) { cb_conf.format = COLOR_8; cb_conf.comp_swap = 3; /* A */ - } else if (accel_state->dst_obj.bpp == 16) { + } else if (dst_bpp == 16) { cb_conf.format = COLOR_5_6_5; cb_conf.comp_swap = 2; /* RGB */ } else { @@ -489,45 +501,88 @@ R600DoPrepareCopy(ScrnInfoPtr pScrn) } cb_conf.source_format = 1; cb_conf.blend_clamp = 1; + set_render_target(pScrn, accel_state->ib, &cb_conf); - /* Render setup */ - if (accel_state->planemask & 0x000000ff) - cb_conf.pmask |= 4; /* B */ - if (accel_state->planemask & 0x0000ff00) - cb_conf.pmask |= 2; /* G */ - if (accel_state->planemask & 0x00ff0000) - cb_conf.pmask |= 1; /* R */ - if (accel_state->planemask & 0xff000000) - cb_conf.pmask |= 8; /* A */ - cb_conf.rop = accel_state->rop; - if (accel_state->dst_obj.tiling_flags == 0) - cb_conf.array_mode = 1; - r600_set_render_target(pScrn, accel_state->ib, &cb_conf, accel_state->dst_obj.domain); + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ - r600_set_spi(pScrn, accel_state->ib, (1 - 1), 1); + /* Interpolator setup */ + /* export tex coord from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((1 - 1) << VS_EXPORT_COUNT_shift)); + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + + /* Enabling flat shading needs both FLAT_SHADE_bit in SPI_PS_INPUT_CNTL_x + * *and* FLAT_SHADE_ENA_bit in SPI_INTERP_CONTROL_0 */ + /* input tex coord from VS */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, ((1 << NUM_INTERP_shift))); + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + /* color semantic id 0 -> GPR[0] */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x01 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, 0); + + accel_state->vb_index = 0; } static void R600DoCopy(ScrnInfoPtr pScrn) { - r600_finish_op(pScrn, 16); -} - -static void -R600DoCopyVline(PixmapPtr pPix) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_accel_state *accel_state = info->accel_state; + draw_config_t draw_conf; + vtx_resource_t vtx_res; - if (accel_state->vsync) - r600_cp_wait_vline_sync(pScrn, accel_state->ib, pPix, - accel_state->vline_crtc, - accel_state->vline_y1, - accel_state->vline_y2); + CLEAR (draw_conf); + CLEAR (vtx_res); - r600_finish_op(pScrn, 16); + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = info->gartLocation + info->dri->bufStart + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + accel_state->vb_size = accel_state->vb_index * 16; + + /* flush vertex cache */ + if ((info->ChipFamily == CHIP_FAMILY_RV610) || + (info->ChipFamily == CHIP_FAMILY_RV620) || + (info->ChipFamily == CHIP_FAMILY_RS780) || + (info->ChipFamily == CHIP_FAMILY_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + /* Vertex buffer setup */ + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 16 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + /* sync dst surface */ + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); } static void @@ -540,7 +595,15 @@ R600AppendCopyVertex(ScrnInfoPtr pScrn, struct radeon_accel_state *accel_state = info->accel_state; float *vb; - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 16); + if (((accel_state->vb_index + 3) * 16) > (accel_state->ib->total / 2)) { + R600DoCopy(pScrn); + accel_state->vb_index = 0; + accel_state->ib = RADEONCPGetBuffer(pScrn); + } + + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 16); vb[0] = (float)dstX; vb[1] = (float)dstY; @@ -557,7 +620,7 @@ R600AppendCopyVertex(ScrnInfoPtr pScrn, vb[10] = (float)(srcX + w); vb[11] = (float)(srcY + h); - radeon_vbo_commit(pScrn, &accel_state->vbo); + accel_state->vb_index += 3; } static Bool @@ -569,129 +632,212 @@ R600PrepareCopy(PixmapPtr pSrc, PixmapPtr pDst, ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_accel_state *accel_state = info->accel_state; - struct r600_accel_object src_obj, dst_obj; - if (!RADEONCheckBPP(pSrc->drawable.bitsPerPixel)) - RADEON_FALLBACK(("R600CheckDatatype src failed\n")); - if (!RADEONCheckBPP(pDst->drawable.bitsPerPixel)) - RADEON_FALLBACK(("R600CheckDatatype dst failed\n")); - if (!RADEONValidPM(planemask, pDst->drawable.bitsPerPixel)) - RADEON_FALLBACK(("Invalid planemask\n")); + accel_state->dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + accel_state->src_pitch[0] = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); - dst_obj.pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); - src_obj.pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); + accel_state->src_mc_addr[0] = exaGetPixmapOffset(pSrc) + info->fbLocation + pScrn->fbOffset; + accel_state->dst_mc_addr = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; - accel_state->same_surface = FALSE; + accel_state->src_width[0] = pSrc->drawable.width; + accel_state->src_height[0] = pSrc->drawable.height; + accel_state->src_bpp[0] = pSrc->drawable.bitsPerPixel; + accel_state->dst_height = pDst->drawable.height; + accel_state->dst_bpp = pDst->drawable.bitsPerPixel; -#if defined(XF86DRM_MODE) - if (info->cs) { - src_obj.offset = 0; - dst_obj.offset = 0; - src_obj.bo = radeon_get_pixmap_bo(pSrc); - dst_obj.bo = radeon_get_pixmap_bo(pDst); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst); - src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc); - if (radeon_get_pixmap_bo(pSrc) == radeon_get_pixmap_bo(pDst)) - accel_state->same_surface = TRUE; - } else -#endif - { - src_obj.offset = exaGetPixmapOffset(pSrc) + info->fbLocation + pScrn->fbOffset; - dst_obj.offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; - if (exaGetPixmapOffset(pSrc) == exaGetPixmapOffset(pDst)) - accel_state->same_surface = TRUE; - src_obj.bo = NULL; - dst_obj.bo = NULL; - } - - src_obj.width = pSrc->drawable.width; - src_obj.height = pSrc->drawable.height; - src_obj.bpp = pSrc->drawable.bitsPerPixel; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - - dst_obj.width = pDst->drawable.width; - dst_obj.height = pDst->drawable.height; - dst_obj.bpp = pDst->drawable.bitsPerPixel; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - rop, planemask)) + /* bad pitch */ + if (accel_state->src_pitch[0] & 7) + return FALSE; + if (accel_state->dst_pitch & 7) return FALSE; - if (accel_state->same_surface == TRUE) { -#if defined(XF86DRM_MODE) - unsigned height = RADEON_ALIGN(pDst->drawable.height, - drmmode_get_height_align(pScrn, accel_state->dst_obj.tiling_flags)); -#else - unsigned height = pDst->drawable.height; -#endif - unsigned long size = height * accel_state->dst_obj.pitch * pDst->drawable.bitsPerPixel/8; + /* bad offset */ + if (accel_state->src_mc_addr[0] & 0xff) + return FALSE; + if (accel_state->dst_mc_addr & 0xff) + return FALSE; -#if defined(XF86DRM_MODE) - if (info->cs) { - if (accel_state->copy_area_bo) { - radeon_bo_unref(accel_state->copy_area_bo); - accel_state->copy_area_bo = NULL; - } - accel_state->copy_area_bo = radeon_bo_open(info->bufmgr, 0, size, 0, - RADEON_GEM_DOMAIN_VRAM, - 0); - if (accel_state->copy_area_bo == NULL) - RADEON_FALLBACK(("temp copy surface alloc failed\n")); + if (pSrc->drawable.bitsPerPixel == 24) + return FALSE; + if (pDst->drawable.bitsPerPixel == 24) + return FALSE; - radeon_cs_space_add_persistent_bo(info->cs, accel_state->copy_area_bo, - RADEON_GEM_DOMAIN_VRAM, RADEON_GEM_DOMAIN_VRAM); - if (radeon_cs_space_check(info->cs)) { - radeon_bo_unref(accel_state->copy_area_bo); - accel_state->copy_area_bo = NULL; - return FALSE; - } - accel_state->copy_area = (void*)accel_state->copy_area_bo; - } else + /* return FALSE; */ + +#ifdef SHOW_VERTEXES + ErrorF("src: %dx%d @ %dbpp, 0x%08x\n", pSrc->drawable.width, pSrc->drawable.height, + pSrc->drawable.bitsPerPixel, exaGetPixmapPitch(pSrc)); + ErrorF("dst: %dx%d @ %dbpp, 0x%08x\n", pDst->drawable.width, pDst->drawable.height, + pDst->drawable.bitsPerPixel, exaGetPixmapPitch(pDst)); #endif - { - if (accel_state->copy_area) { - exaOffscreenFree(pDst->drawable.pScreen, accel_state->copy_area); - accel_state->copy_area = NULL; - } - accel_state->copy_area = exaOffscreenAlloc(pDst->drawable.pScreen, size, 256, TRUE, NULL, NULL); - if (!accel_state->copy_area) - RADEON_FALLBACK(("temp copy surface alloc failed\n")); + + accel_state->rop = rop; + accel_state->planemask = planemask; + + if (exaGetPixmapOffset(pSrc) == exaGetPixmapOffset(pDst)) { + unsigned long size = pDst->drawable.height * accel_state->dst_pitch * pDst->drawable.bitsPerPixel/8; + accel_state->same_surface = TRUE; + + if (accel_state->copy_area) { + exaOffscreenFree(pDst->drawable.pScreen, accel_state->copy_area); + accel_state->copy_area = NULL; } - } else - R600DoPrepareCopy(pScrn); + accel_state->copy_area = exaOffscreenAlloc(pDst->drawable.pScreen, size, 256, TRUE, NULL, NULL); + } else { + accel_state->same_surface = FALSE; - if (accel_state->vsync) - RADEONVlineHelperClear(pScrn); + R600DoPrepareCopy(pScrn, + accel_state->src_pitch[0], pSrc->drawable.width, pSrc->drawable.height, + accel_state->src_mc_addr[0], pSrc->drawable.bitsPerPixel, + accel_state->dst_pitch, pDst->drawable.height, + accel_state->dst_mc_addr, pDst->drawable.bitsPerPixel, + rop, planemask); - accel_state->dst_pix = pDst; - accel_state->src_pix = pSrc; - accel_state->xdir = xdir; - accel_state->ydir = ydir; + } return TRUE; } +static Bool +is_overlap(int sx1, int sx2, int sy1, int sy2, int dx1, int dx2, int dy1, int dy2) +{ + if (((sx1 >= dx1) && (sx1 <= dx2) && (sy1 >= dy1) && (sy1 <= dy2)) || /* TL x1, y1 */ + ((sx2 >= dx1) && (sx2 <= dx2) && (sy1 >= dy1) && (sy1 <= dy2)) || /* TR x2, y1 */ + ((sx1 >= dx1) && (sx1 <= dx2) && (sy2 >= dy1) && (sy2 <= dy2)) || /* BL x1, y2 */ + ((sx2 >= dx1) && (sx2 <= dx2) && (sy2 >= dy1) && (sy2 <= dy2))) /* BR x2, y2 */ + return TRUE; + else + return FALSE; +} + static void -R600DoneCopy(PixmapPtr pDst) +R600OverlapCopy(PixmapPtr pDst, + int srcX, int srcY, + int dstX, int dstY, + int w, int h) { ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_accel_state *accel_state = info->accel_state; + uint32_t dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + uint32_t dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + int i, hchunk, vchunk; - if (!accel_state->same_surface) - R600DoCopyVline(pDst); + if (is_overlap(srcX, srcX + w, srcY, srcY + h, + dstX, dstX + w, dstY, dstY + h)) { + /* Calculate height/width of non-overlapping area */ + hchunk = (srcX < dstX) ? (dstX - srcX) : (srcX - dstX); + vchunk = (srcY < dstY) ? (dstY - srcY) : (srcY - dstY); - if (accel_state->copy_area) { - if (!info->cs) - exaOffscreenFree(pDst->drawable.pScreen, accel_state->copy_area); - accel_state->copy_area = NULL; + /* Diagonally offset overlap is reduced to either horizontal or vertical offset-only + * by copying a part of the non-overlapping portion, then adjusting coordinates + * Choose horizontal vs vertical to minimize the total number of copy operations + */ + if (vchunk != 0 && hchunk != 0) { /* diagonal */ + if ((w / hchunk) <= (h / vchunk)) { /* reduce to horizontal */ + if (srcY > dstY ) { /* diagonal up */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, vchunk); + R600DoCopy(pScrn); + + srcY = srcY + vchunk; + dstY = dstY + vchunk; + } else { /* diagonal down */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY + h - vchunk, dstX, dstY + h - vchunk, w, vchunk); + R600DoCopy(pScrn); + } + h = h - vchunk; + vchunk = 0; + } else { /* reduce to vertical */ + if (srcX > dstX ) { /* diagonal left */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, hchunk, h); + R600DoCopy(pScrn); + + srcX = srcX + hchunk; + dstX = dstX + hchunk; + } else { /* diagonal right */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX + w - hchunk, srcY, dstX + w - hchunk, dstY, hchunk, h); + R600DoCopy(pScrn); + } + w = w - hchunk; + hchunk = 0; + } + } + + if (vchunk == 0) { /* left/right */ + if (srcX < dstX) { /* right */ + /* copy right to left */ + for (i = w; i > 0; i -= hchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX + i - hchunk, srcY, dstX + i - hchunk, dstY, hchunk, h); + R600DoCopy(pScrn); + } + } else { /* left */ + /* copy left to right */ + for (i = 0; i < w; i += hchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + R600AppendCopyVertex(pScrn, srcX + i, srcY, dstX + i, dstY, hchunk, h); + R600DoCopy(pScrn); + } + } + } else { /* up/down */ + if (srcY > dstY) { /* up */ + /* copy top to bottom */ + for (i = 0; i < h; i += vchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + if (vchunk > h - i) vchunk = h - i; + R600AppendCopyVertex(pScrn, srcX, srcY + i, dstX, dstY + i, w, vchunk); + R600DoCopy(pScrn); + } + } else { /* down */ + /* copy bottom to top */ + for (i = h; i > 0; i -= vchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + if (vchunk > i) vchunk = i; + R600AppendCopyVertex(pScrn, srcX, srcY + i - vchunk, dstX, dstY + i - vchunk, w, vchunk); + R600DoCopy(pScrn); + } + } + } + } else { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); + R600DoCopy(pScrn); } - } static void @@ -707,73 +853,88 @@ R600Copy(PixmapPtr pDst, if (accel_state->same_surface && (srcX == dstX) && (srcY == dstY)) return; -#ifdef XF86DRM_MODE - if (info->cs && CS_FULL(info->cs)) { - R600DoneCopy(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - R600PrepareCopy(accel_state->src_pix, - accel_state->dst_pix, - accel_state->xdir, - accel_state->ydir, - accel_state->rop, - accel_state->planemask); - } -#endif + if (accel_state->same_surface && is_overlap(srcX, srcX + w, srcY, srcY + h, dstX, dstX + w, dstY, dstY + h)) { + if (accel_state->copy_area) { + uint32_t pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + uint32_t orig_offset, tmp_offset; - if (accel_state->vsync) - RADEONVlineHelperSet(pScrn, dstX, dstY, dstX + w, dstY + h); - - if (accel_state->same_surface && accel_state->copy_area) { - uint32_t orig_offset, tmp_offset; - uint32_t orig_dst_domain = accel_state->dst_obj.domain; - uint32_t orig_src_domain = accel_state->src_obj[0].domain; - uint32_t orig_src_tiling_flags = accel_state->src_obj[0].tiling_flags; - uint32_t orig_dst_tiling_flags = accel_state->dst_obj.tiling_flags; - struct radeon_bo *orig_bo = accel_state->dst_obj.bo; - -#if defined(XF86DRM_MODE) - if (info->cs) { - tmp_offset = 0; - orig_offset = 0; - } else -#endif - { tmp_offset = accel_state->copy_area->offset + info->fbLocation + pScrn->fbOffset; orig_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; - } - /* src to tmp */ - accel_state->dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - accel_state->dst_obj.bo = accel_state->copy_area_bo; - accel_state->dst_obj.offset = tmp_offset; - accel_state->dst_obj.tiling_flags = 0; - R600DoPrepareCopy(pScrn); + R600DoPrepareCopy(pScrn, + pitch, pDst->drawable.width, pDst->drawable.height, orig_offset, pDst->drawable.bitsPerPixel, + pitch, pDst->drawable.height, tmp_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); + R600DoCopy(pScrn); + R600DoPrepareCopy(pScrn, + pitch, pDst->drawable.width, pDst->drawable.height, tmp_offset, pDst->drawable.bitsPerPixel, + pitch, pDst->drawable.height, orig_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, dstX, dstY, dstX, dstY, w, h); + R600DoCopy(pScrn); + } else + R600OverlapCopy(pDst, srcX, srcY, dstX, dstY, w, h); + } else if (accel_state->same_surface) { + uint32_t pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + uint32_t offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + + R600DoPrepareCopy(pScrn, + pitch, pDst->drawable.width, pDst->drawable.height, offset, pDst->drawable.bitsPerPixel, + pitch, pDst->drawable.height, offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); R600DoCopy(pScrn); - - /* tmp to dst */ - accel_state->src_obj[0].domain = RADEON_GEM_DOMAIN_VRAM; - accel_state->src_obj[0].bo = accel_state->copy_area_bo; - accel_state->src_obj[0].offset = tmp_offset; - accel_state->src_obj[0].tiling_flags = 0; - accel_state->dst_obj.domain = orig_dst_domain; - accel_state->dst_obj.bo = orig_bo; - accel_state->dst_obj.offset = orig_offset; - accel_state->dst_obj.tiling_flags = orig_dst_tiling_flags; - R600DoPrepareCopy(pScrn); - R600AppendCopyVertex(pScrn, dstX, dstY, dstX, dstY, w, h); - R600DoCopyVline(pDst); - - /* restore state */ - accel_state->src_obj[0].domain = orig_src_domain; - accel_state->src_obj[0].bo = orig_bo; - accel_state->src_obj[0].offset = orig_offset; - accel_state->src_obj[0].tiling_flags = orig_src_tiling_flags; - } else + } else { R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); + } } +static void +R600DoneCopy(PixmapPtr pDst) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + struct radeon_accel_state *accel_state = info->accel_state; + + if (!accel_state->same_surface) + R600DoCopy(pScrn); + + if (accel_state->copy_area) { + exaOffscreenFree(pDst->drawable.pScreen, accel_state->copy_area); + accel_state->copy_area = NULL; + } + +} + +#define RADEON_TRACE_FALL 0 +#define RADEON_TRACE_DRAW 0 + +#if RADEON_TRACE_FALL +#define RADEON_FALLBACK(x) \ +do { \ + ErrorF("%s: ", __FUNCTION__); \ + ErrorF x; \ + return FALSE; \ +} while (0) +#else +#define RADEON_FALLBACK(x) return FALSE +#endif + +#define xFixedToFloat(f) (((float) (f)) / 65536) + +static inline void transformPoint(PictTransform *transform, xPointFixed *point) +{ + PictVector v; + v.vector[0] = point->x; + v.vector[1] = point->y; + v.vector[2] = xFixed1; + PictureTransformPoint(transform, &v); + point->x = v.vector[0]; + point->y = v.vector[1]; +} + struct blendinfo { Bool dst_alpha; Bool src_alpha; @@ -819,10 +980,6 @@ static struct formatinfo R600TexFormats[] = { {PICT_x8r8g8b8, FMT_8_8_8_8}, {PICT_a8b8g8r8, FMT_8_8_8_8}, {PICT_x8b8g8r8, FMT_8_8_8_8}, -#ifdef PICT_TYPE_BGRA - {PICT_b8g8r8a8, FMT_8_8_8_8}, - {PICT_b8g8r8x8, FMT_8_8_8_8}, -#endif {PICT_r5g6b5, FMT_5_6_5}, {PICT_a1r5g5b5, FMT_1_5_5_5}, {PICT_x1r5g5b5, FMT_1_5_5_5}, @@ -866,12 +1023,6 @@ static Bool R600GetDestFormat(PicturePtr pDstPicture, uint32_t *dst_format) switch (pDstPicture->format) { case PICT_a8r8g8b8: case PICT_x8r8g8b8: - case PICT_a8b8g8r8: - case PICT_x8b8g8r8: -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - case PICT_b8g8r8x8: -#endif *dst_format = COLOR_8_8_8_8; break; case PICT_r5g6b5: @@ -898,7 +1049,6 @@ static Bool R600CheckCompositeTexture(PicturePtr pPict, { int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; unsigned int i; int max_tex_w, max_tex_h; @@ -929,14 +1079,11 @@ static Bool R600CheckCompositeTexture(PicturePtr pPict, * clipping. */ /* FIXME R6xx */ - if (pPict->transform != 0 && repeatType == RepeatNone && PICT_FORMAT_A(pPict->format) == 0) { + if (pPict->transform != 0 && !pPict->repeat && PICT_FORMAT_A(pPict->format) == 0) { if (!(((op == PictOpSrc) || (op == PictOpClear)) && (PICT_FORMAT_A(pDstPict->format) == 0))) RADEON_FALLBACK(("REPEAT_NONE unsupported for transformed xRGB source\n")); } - if (!radeon_transform_is_affine_or_scaled(pPict->transform)) - RADEON_FALLBACK(("non-affine transforms not supported\n")); - return TRUE; } @@ -948,49 +1095,50 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix, struct radeon_accel_state *accel_state = info->accel_state; int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; unsigned int i; tex_resource_t tex_res; tex_sampler_t tex_samp; int pix_r, pix_g, pix_b, pix_a; - float vs_alu_consts[8]; CLEAR (tex_res); CLEAR (tex_samp); + accel_state->src_mc_addr[unit] = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; + accel_state->src_pitch[unit] = exaGetPixmapPitch(pPix) / (pPix->drawable.bitsPerPixel / 8); + accel_state->src_size[unit] = exaGetPixmapPitch(pPix) * pPix->drawable.height; + + if (accel_state->src_pitch[1] & 7) + RADEON_FALLBACK(("Bad pitch %d 0x%x\n", (int)accel_state->src_pitch[unit], unit)); + + if (accel_state->src_mc_addr[1] & 0xff) + RADEON_FALLBACK(("Bad offset %d 0x%x\n", (int)accel_state->src_mc_addr[unit], unit)); + for (i = 0; i < sizeof(R600TexFormats) / sizeof(R600TexFormats[0]); i++) { if (R600TexFormats[i].fmt == pPict->format) break; } + accel_state->texW[unit] = w; + accel_state->texH[unit] = h; + + /* ErrorF("Tex %d setup %dx%d\n", unit, w, h); */ + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[unit], accel_state->src_mc_addr[unit]); + /* Texture */ tex_res.id = unit; tex_res.w = w; tex_res.h = h; - tex_res.pitch = accel_state->src_obj[unit].pitch; + tex_res.pitch = accel_state->src_pitch[unit]; tex_res.depth = 0; tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[unit].offset; - tex_res.mip_base = accel_state->src_obj[unit].offset; - tex_res.size = accel_state->src_size[unit]; + tex_res.base = accel_state->src_mc_addr[unit]; + tex_res.mip_base = accel_state->src_mc_addr[unit]; tex_res.format = R600TexFormats[i].card_fmt; - tex_res.bo = accel_state->src_obj[unit].bo; - tex_res.mip_bo = accel_state->src_obj[unit].bo; tex_res.request_size = 1; -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (accel_state->src_obj[unit].bpp) { - case 16: - tex_res.endian = SQ_ENDIAN_8IN16; - break; - case 32: - tex_res.endian = SQ_ENDIAN_8IN32; - break; - default : - break; - } -#endif - /* component swizzles */ switch (pPict->format) { case PICT_a1r5g5b5: @@ -1012,20 +1160,6 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix, pix_b = SQ_SEL_Z; /* B */ pix_a = SQ_SEL_1; /* A */ break; -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - pix_r = SQ_SEL_Y; /* R */ - pix_g = SQ_SEL_Z; /* G */ - pix_b = SQ_SEL_W; /* B */ - pix_a = SQ_SEL_X; /* A */ - break; - case PICT_b8g8r8x8: - pix_r = SQ_SEL_Y; /* R */ - pix_g = SQ_SEL_Z; /* G */ - pix_b = SQ_SEL_W; /* B */ - pix_a = SQ_SEL_1; /* A */ - break; -#endif case PICT_x1r5g5b5: case PICT_x8r8g8b8: case PICT_r5g6b5: @@ -1045,7 +1179,7 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix, } if (unit == 0) { - if (!accel_state->msk_pic) { + if (!accel_state->has_mask) { if (PICT_FORMAT_RGB(pPict->format) == 0) { pix_r = SQ_SEL_0; pix_g = SQ_SEL_0; @@ -1108,39 +1242,41 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix, tex_res.base_level = 0; tex_res.last_level = 0; tex_res.perf_modulation = 0; - if (accel_state->src_obj[unit].tiling_flags == 0) - tex_res.tile_mode = 1; - r600_set_tex_resource(pScrn, accel_state->ib, &tex_res, accel_state->src_obj[unit].domain); + set_tex_resource (pScrn, accel_state->ib, &tex_res); tex_samp.id = unit; tex_samp.border_color = SQ_TEX_BORDER_COLOR_TRANS_BLACK; - switch (repeatType) { - case RepeatNormal: - tex_samp.clamp_x = SQ_TEX_WRAP; - tex_samp.clamp_y = SQ_TEX_WRAP; - break; - case RepeatPad: - tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; - tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; - break; - case RepeatReflect: - tex_samp.clamp_x = SQ_TEX_MIRROR; - tex_samp.clamp_y = SQ_TEX_MIRROR; - break; - case RepeatNone: + if (pPict->repeat) { + switch (pPict->repeatType) { + case RepeatNormal: + tex_samp.clamp_x = SQ_TEX_WRAP; + tex_samp.clamp_y = SQ_TEX_WRAP; + break; + case RepeatPad: + tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; + break; + case RepeatReflect: + tex_samp.clamp_x = SQ_TEX_MIRROR; + tex_samp.clamp_y = SQ_TEX_MIRROR; + break; + case RepeatNone: + tex_samp.clamp_x = SQ_TEX_CLAMP_BORDER; + tex_samp.clamp_y = SQ_TEX_CLAMP_BORDER; + break; + default: + RADEON_FALLBACK(("Bad repeat 0x%x\n", pPict->repeatType)); + } + } else { tex_samp.clamp_x = SQ_TEX_CLAMP_BORDER; tex_samp.clamp_y = SQ_TEX_CLAMP_BORDER; - break; - default: - RADEON_FALLBACK(("Bad repeat 0x%x\n", repeatType)); } switch (pPict->filter) { case PictFilterNearest: tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_POINT; tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_POINT; - tex_samp.mc_coord_truncate = 1; break; case PictFilterBilinear: tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; @@ -1153,39 +1289,14 @@ static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix, tex_samp.clamp_z = SQ_TEX_WRAP; tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; tex_samp.mip_filter = 0; /* no mipmap */ - r600_set_tex_sampler(pScrn, accel_state->ib, &tex_samp); + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); if (pPict->transform != 0) { accel_state->is_transform[unit] = TRUE; accel_state->transform[unit] = pPict->transform; - - vs_alu_consts[0] = xFixedToFloat(pPict->transform->matrix[0][0]); - vs_alu_consts[1] = xFixedToFloat(pPict->transform->matrix[0][1]); - vs_alu_consts[2] = xFixedToFloat(pPict->transform->matrix[0][2]); - vs_alu_consts[3] = 1.0 / w; - - vs_alu_consts[4] = xFixedToFloat(pPict->transform->matrix[1][0]); - vs_alu_consts[5] = xFixedToFloat(pPict->transform->matrix[1][1]); - vs_alu_consts[6] = xFixedToFloat(pPict->transform->matrix[1][2]); - vs_alu_consts[7] = 1.0 / h; - } else { + } else accel_state->is_transform[unit] = FALSE; - vs_alu_consts[0] = 1.0; - vs_alu_consts[1] = 0.0; - vs_alu_consts[2] = 0.0; - vs_alu_consts[3] = 1.0 / w; - - vs_alu_consts[4] = 0.0; - vs_alu_consts[5] = 1.0; - vs_alu_consts[6] = 0.0; - vs_alu_consts[7] = 1.0 / h; - } - - /* VS alu constants */ - r600_set_alu_consts(pScrn, accel_state->ib, SQ_ALU_CONSTANT_vs + (unit * 2), - sizeof(vs_alu_consts) / SQ_ALU_CONSTANT_offset, vs_alu_consts); - return TRUE; } @@ -1203,9 +1314,6 @@ static Bool R600CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP if (!pSrcPicture->pDrawable) RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); - if (!pSrcPicture->pDrawable) - RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); - pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); max_tex_w = 8192; @@ -1278,71 +1386,14 @@ static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture, ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_accel_state *accel_state = info->accel_state; - uint32_t dst_format; + uint32_t blendcntl, dst_format; cb_config_t cb_conf; shader_config_t vs_conf, ps_conf; - struct r600_accel_object src_obj, mask_obj, dst_obj; - if (pDst->drawable.bitsPerPixel < 8 || pSrc->drawable.bitsPerPixel < 8) - return FALSE; - -#if defined(XF86DRM_MODE) - if (info->cs) { - src_obj.offset = 0; - dst_obj.offset = 0; - src_obj.bo = radeon_get_pixmap_bo(pSrc); - dst_obj.bo = radeon_get_pixmap_bo(pDst); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst); - src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc); - } else -#endif - { - src_obj.offset = exaGetPixmapOffset(pSrc) + info->fbLocation + pScrn->fbOffset; - dst_obj.offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; - src_obj.bo = NULL; - dst_obj.bo = NULL; - } - src_obj.pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); - dst_obj.pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); - - src_obj.width = pSrc->drawable.width; - src_obj.height = pSrc->drawable.height; - src_obj.bpp = pSrc->drawable.bitsPerPixel; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - - dst_obj.width = pDst->drawable.width; - dst_obj.height = pDst->drawable.height; - dst_obj.bpp = pDst->drawable.bitsPerPixel; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; + /* return FALSE; */ if (pMask) { -#if defined(XF86DRM_MODE) - if (info->cs) { - mask_obj.offset = 0; - mask_obj.bo = radeon_get_pixmap_bo(pMask); - mask_obj.tiling_flags = radeon_get_pixmap_tiling(pMask); - } else -#endif - { - mask_obj.offset = exaGetPixmapOffset(pMask) + info->fbLocation + pScrn->fbOffset; - mask_obj.bo = NULL; - } - mask_obj.pitch = exaGetPixmapPitch(pMask) / (pMask->drawable.bitsPerPixel / 8); - - mask_obj.width = pMask->drawable.width; - mask_obj.height = pMask->drawable.height; - mask_obj.bpp = pMask->drawable.bitsPerPixel; - mask_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - - if (!R600SetAccelState(pScrn, - &src_obj, - &mask_obj, - &dst_obj, - accel_state->comp_vs_offset, accel_state->comp_ps_offset, - 3, 0xffffffff)) - return FALSE; - - accel_state->msk_pic = pMaskPicture; + accel_state->has_mask = TRUE; if (pMaskPicture->componentAlpha) { accel_state->component_alpha = TRUE; if (R600BlendOp[op].src_alpha) @@ -1354,19 +1405,21 @@ static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture, accel_state->src_alpha = FALSE; } } else { - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->comp_vs_offset, accel_state->comp_ps_offset, - 3, 0xffffffff)) - return FALSE; - - accel_state->msk_pic = NULL; + accel_state->has_mask = FALSE; accel_state->component_alpha = FALSE; accel_state->src_alpha = FALSE; } + accel_state->dst_mc_addr = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + accel_state->dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + accel_state->dst_size = exaGetPixmapPitch(pDst) * pDst->drawable.height; + + if (accel_state->dst_pitch & 7) + RADEON_FALLBACK(("Bad dst pitch 0x%x\n", (int)accel_state->dst_pitch)); + + if (accel_state->dst_mc_addr & 0xff) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)accel_state->dst_mc_addr)); + if (!R600GetDestFormat(pDstPicture, &dst_format)) return FALSE; @@ -1374,64 +1427,90 @@ static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture, CLEAR (vs_conf); CLEAR (ps_conf); - if (pMask) - radeon_vbo_check(pScrn, &accel_state->vbo, 24); - else - radeon_vbo_check(pScrn, &accel_state->vbo, 16); + accel_state->ib = RADEONCPGetBuffer(pScrn); - radeon_cp_start(pScrn); + /* Init */ + start_3d(pScrn, accel_state->ib); - r600_set_default_state(pScrn, accel_state->ib); + set_default_state(pScrn, accel_state->ib); - r600_set_generic_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_screen_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_window_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); + /* Scissor / viewport */ + EREG(accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG(accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); if (!R600TextureSetup(pSrcPicture, pSrc, 0)) { - R600IBDiscard(pScrn, accel_state->ib); - return FALSE; + R600IBDiscard(pScrn, accel_state->ib); + return FALSE; } if (pMask) { - if (!R600TextureSetup(pMaskPicture, pMask, 1)) { - R600IBDiscard(pScrn, accel_state->ib); - return FALSE; - } + if (!R600TextureSetup(pMaskPicture, pMask, 1)) { + R600IBDiscard(pScrn, accel_state->ib); + return FALSE; + } } else - accel_state->is_transform[1] = FALSE; + accel_state->is_transform[1] = FALSE; if (pMask) { - r600_set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_vs, (1 << 0)); - r600_set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (1 << 0)); + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_vs, (1 << 0)); + accel_state->ps_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->comp_mask_ps_offset; } else { - r600_set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_vs, (0 << 0)); - r600_set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (0 << 0)); + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_vs, (0 << 0)); + accel_state->ps_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->comp_ps_offset; } + accel_state->vs_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->comp_vs_offset; + + accel_state->vs_size = 512; + accel_state->ps_size = 512; + /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; - vs_conf.num_gprs = 5; + vs_conf.num_gprs = 3; vs_conf.stack_size = 1; - vs_conf.bo = accel_state->shaders_bo; - r600_vs_setup(pScrn, accel_state->ib, &vs_conf, RADEON_GEM_DOMAIN_VRAM); + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; ps_conf.num_gprs = 3; - ps_conf.stack_size = 1; + ps_conf.stack_size = 0; ps_conf.uncached_first_inst = 1; ps_conf.clamp_consts = 0; ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - r600_ps_setup(pScrn, accel_state->ib, &ps_conf, RADEON_GEM_DOMAIN_VRAM); + ps_setup (pScrn, accel_state->ib, &ps_conf); + + EREG(accel_state->ib, CB_SHADER_MASK, (0xf << OUTPUT0_ENABLE_shift)); + EREG(accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + + blendcntl = R600GetBlendCntl(op, pMaskPicture, pDstPicture->format); + + if (info->ChipFamily == CHIP_FAMILY_R600) { + /* no per-MRT blend on R600 */ + EREG(accel_state->ib, CB_COLOR_CONTROL, RADEON_ROP[3] | (1 << TARGET_BLEND_ENABLE_shift)); + EREG(accel_state->ib, CB_BLEND_CONTROL, blendcntl); + } else { + EREG(accel_state->ib, CB_COLOR_CONTROL, (RADEON_ROP[3] | + (1 << TARGET_BLEND_ENABLE_shift) | + PER_MRT_BLEND_bit)); + EREG(accel_state->ib, CB_BLEND0_CONTROL, blendcntl); + } cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = pDst->drawable.height; + cb_conf.base = accel_state->dst_mc_addr; cb_conf.format = dst_format; - cb_conf.bo = accel_state->dst_obj.bo; switch (pDstPicture->format) { case PICT_a8r8g8b8: @@ -1441,16 +1520,6 @@ static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture, default: cb_conf.comp_swap = 1; /* ARGB */ break; - case PICT_a8b8g8r8: - case PICT_x8b8g8r8: - cb_conf.comp_swap = 0; /* ABGR */ - break; -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - case PICT_b8g8r8x8: - cb_conf.comp_swap = 3; /* BGRA */ - break; -#endif case PICT_r5g6b5: cb_conf.comp_swap = 2; /* RGB */ break; @@ -1460,62 +1529,47 @@ static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture, } cb_conf.source_format = 1; cb_conf.blend_clamp = 1; - cb_conf.blendcntl = R600GetBlendCntl(op, pMaskPicture, pDstPicture->format); - cb_conf.blend_enable = 1; - cb_conf.pmask = 0xf; - cb_conf.rop = 3; - if (accel_state->dst_obj.tiling_flags == 0) - cb_conf.array_mode = 1; -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (dst_obj.bpp) { - case 16: - cb_conf.endian = ENDIAN_8IN16; - break; - case 32: - cb_conf.endian = ENDIAN_8IN32; - break; - default: - break; + set_render_target(pScrn, accel_state->ib, &cb_conf); + + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ + + /* Interpolator setup */ + if (pMask) { + /* export 2 tex coords from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((2 - 1) << VS_EXPORT_COUNT_shift)); + /* src = semantic id 0; mask = semantic id 1 */ + EREG(accel_state->ib, SPI_VS_OUT_ID_0, ((0 << SEMANTIC_0_shift) | + (1 << SEMANTIC_1_shift))); + /* input 2 tex coords from VS */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, (2 << NUM_INTERP_shift)); + } else { + /* export 1 tex coords from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((1 - 1) << VS_EXPORT_COUNT_shift)); + /* src = semantic id 0 */ + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + /* input 1 tex coords from VS */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, (1 << NUM_INTERP_shift)); } -#endif - r600_set_render_target(pScrn, accel_state->ib, &cb_conf, accel_state->dst_obj.domain); + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + /* SPI_PS_INPUT_CNTL_0 maps to GPR[0] - load with semantic id 0 */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x01 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + /* SPI_PS_INPUT_CNTL_1 maps to GPR[1] - load with semantic id 1 */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (1 <<2), ((1 << SEMANTIC_shift) | + (0x01 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, 0); - if (pMask) - r600_set_spi(pScrn, accel_state->ib, (2 - 1), 2); - else - r600_set_spi(pScrn, accel_state->ib, (1 - 1), 1); - - if (accel_state->vsync) - RADEONVlineHelperClear(pScrn); - - accel_state->composite_op = op; - accel_state->dst_pic = pDstPicture; - accel_state->src_pic = pSrcPicture; - accel_state->dst_pix = pDst; - accel_state->msk_pix = pMask; - accel_state->src_pix = pSrc; + accel_state->vb_index = 0; return TRUE; } -static void R600DoneComposite(PixmapPtr pDst) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - int vtx_size; - - if (accel_state->vsync) - r600_cp_wait_vline_sync(pScrn, accel_state->ib, pDst, - accel_state->vline_crtc, - accel_state->vline_y1, - accel_state->vline_y2); - - vtx_size = accel_state->msk_pic ? 24 : 16; - - r600_finish_op(pScrn, vtx_size); -} - static void R600Composite(PixmapPtr pDst, int srcX, int srcY, int maskX, int maskY, @@ -1526,95 +1580,188 @@ static void R600Composite(PixmapPtr pDst, RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_accel_state *accel_state = info->accel_state; float *vb; + xPointFixed srcTopLeft, srcTopRight, srcBottomLeft, srcBottomRight; /* ErrorF("R600Composite (%d,%d) (%d,%d) (%d,%d) (%d,%d)\n", srcX, srcY, maskX, maskY,dstX, dstY, w, h); */ -#ifdef XF86DRM_MODE - if (info->cs && CS_FULL(info->cs)) { - R600DoneComposite(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - R600PrepareComposite(info->accel_state->composite_op, - info->accel_state->src_pic, - info->accel_state->msk_pic, - info->accel_state->dst_pic, - info->accel_state->src_pix, - info->accel_state->msk_pix, - info->accel_state->dst_pix); + srcTopLeft.x = IntToxFixed(srcX); + srcTopLeft.y = IntToxFixed(srcY); + srcTopRight.x = IntToxFixed(srcX + w); + srcTopRight.y = IntToxFixed(srcY); + srcBottomLeft.x = IntToxFixed(srcX); + srcBottomLeft.y = IntToxFixed(srcY + h); + srcBottomRight.x = IntToxFixed(srcX + w); + srcBottomRight.y = IntToxFixed(srcY + h); + + /* XXX do transform in vertex shader */ + if (accel_state->is_transform[0]) { + transformPoint(accel_state->transform[0], &srcTopLeft); + transformPoint(accel_state->transform[0], &srcTopRight); + transformPoint(accel_state->transform[0], &srcBottomLeft); + transformPoint(accel_state->transform[0], &srcBottomRight); } -#endif - if (accel_state->vsync) - RADEONVlineHelperSet(pScrn, dstX, dstY, dstX + w, dstY + h); + if (accel_state->has_mask) { + xPointFixed maskTopLeft, maskTopRight, maskBottomLeft, maskBottomRight; - if (accel_state->msk_pic) { + if (((accel_state->vb_index + 3) * 24) > (accel_state->ib->total / 2)) { + R600DoneComposite(pDst); + accel_state->vb_index = 0; + accel_state->ib = RADEONCPGetBuffer(pScrn); + } - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 24); + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 24); + + maskTopLeft.x = IntToxFixed(maskX); + maskTopLeft.y = IntToxFixed(maskY); + maskTopRight.x = IntToxFixed(maskX + w); + maskTopRight.y = IntToxFixed(maskY); + maskBottomLeft.x = IntToxFixed(maskX); + maskBottomLeft.y = IntToxFixed(maskY + h); + maskBottomRight.x = IntToxFixed(maskX + w); + maskBottomRight.y = IntToxFixed(maskY + h); + + if (accel_state->is_transform[1]) { + transformPoint(accel_state->transform[1], &maskTopLeft); + transformPoint(accel_state->transform[1], &maskTopRight); + transformPoint(accel_state->transform[1], &maskBottomLeft); + transformPoint(accel_state->transform[1], &maskBottomRight); + } vb[0] = (float)dstX; vb[1] = (float)dstY; - vb[2] = (float)srcX; - vb[3] = (float)srcY; - vb[4] = (float)maskX; - vb[5] = (float)maskY; + vb[2] = xFixedToFloat(srcTopLeft.x) / accel_state->texW[0]; + vb[3] = xFixedToFloat(srcTopLeft.y) / accel_state->texH[0]; + vb[4] = xFixedToFloat(maskTopLeft.x) / accel_state->texW[1]; + vb[5] = xFixedToFloat(maskTopLeft.y) / accel_state->texH[1]; vb[6] = (float)dstX; vb[7] = (float)(dstY + h); - vb[8] = (float)srcX; - vb[9] = (float)(srcY + h); - vb[10] = (float)maskX; - vb[11] = (float)(maskY + h); + vb[8] = xFixedToFloat(srcBottomLeft.x) / accel_state->texW[0]; + vb[9] = xFixedToFloat(srcBottomLeft.y) / accel_state->texH[0]; + vb[10] = xFixedToFloat(maskBottomLeft.x) / accel_state->texW[1]; + vb[11] = xFixedToFloat(maskBottomLeft.y) / accel_state->texH[1]; vb[12] = (float)(dstX + w); vb[13] = (float)(dstY + h); - vb[14] = (float)(srcX + w); - vb[15] = (float)(srcY + h); - vb[16] = (float)(maskX + w); - vb[17] = (float)(maskY + h); - - radeon_vbo_commit(pScrn, &accel_state->vbo); + vb[14] = xFixedToFloat(srcBottomRight.x) / accel_state->texW[0]; + vb[15] = xFixedToFloat(srcBottomRight.y) / accel_state->texH[0]; + vb[16] = xFixedToFloat(maskBottomRight.x) / accel_state->texW[1]; + vb[17] = xFixedToFloat(maskBottomRight.y) / accel_state->texH[1]; } else { + if (((accel_state->vb_index + 3) * 16) > (accel_state->ib->total / 2)) { + R600DoneComposite(pDst); + accel_state->vb_index = 0; + accel_state->ib = RADEONCPGetBuffer(pScrn); + } - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 16); + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 16); vb[0] = (float)dstX; vb[1] = (float)dstY; - vb[2] = (float)srcX; - vb[3] = (float)srcY; + vb[2] = xFixedToFloat(srcTopLeft.x) / accel_state->texW[0]; + vb[3] = xFixedToFloat(srcTopLeft.y) / accel_state->texH[0]; vb[4] = (float)dstX; vb[5] = (float)(dstY + h); - vb[6] = (float)srcX; - vb[7] = (float)(srcY + h); + vb[6] = xFixedToFloat(srcBottomLeft.x) / accel_state->texW[0]; + vb[7] = xFixedToFloat(srcBottomLeft.y) / accel_state->texH[0]; vb[8] = (float)(dstX + w); vb[9] = (float)(dstY + h); - vb[10] = (float)(srcX + w); - vb[11] = (float)(srcY + h); - - radeon_vbo_commit(pScrn, &accel_state->vbo); + vb[10] = xFixedToFloat(srcBottomRight.x) / accel_state->texW[0]; + vb[11] = xFixedToFloat(srcBottomRight.y) / accel_state->texH[0]; } + accel_state->vb_index += 3; } +static void R600DoneComposite(PixmapPtr pDst) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + struct radeon_accel_state *accel_state = info->accel_state; + draw_config_t draw_conf; + vtx_resource_t vtx_res; + + CLEAR (draw_conf); + CLEAR (vtx_res); + + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = info->gartLocation + info->dri->bufStart + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + + + /* Vertex buffer setup */ + if (accel_state->has_mask) { + accel_state->vb_size = accel_state->vb_index * 24; + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 24 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + } else { + accel_state->vb_size = accel_state->vb_index * 16; + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 16 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + } + /* flush vertex cache */ + if ((info->ChipFamily == CHIP_FAMILY_RV610) || + (info->ChipFamily == CHIP_FAMILY_RV620) || + (info->ChipFamily == CHIP_FAMILY_RS780) || + (info->ChipFamily == CHIP_FAMILY_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); +} + Bool R600CopyToVRAM(ScrnInfoPtr pScrn, char *src, int src_pitch, - uint32_t dst_pitch, uint32_t dst_mc_addr, uint32_t dst_width, uint32_t dst_height, int bpp, + uint32_t dst_pitch, uint32_t dst_mc_addr, uint32_t dst_height, int bpp, int x, int y, int w, int h) { RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; uint32_t scratch_mc_addr; int wpass = w * (bpp/8); - int scratch_pitch_bytes = RADEON_ALIGN(wpass, 256); + int scratch_pitch_bytes = (wpass + 255) & ~255; uint32_t scratch_pitch = scratch_pitch_bytes / (bpp / 8); int scratch_offset = 0, hpass, temph; char *dst; drmBufPtr scratch; - struct r600_accel_object scratch_obj, dst_obj; if (dst_pitch & 7) return FALSE; @@ -1630,30 +1777,6 @@ R600CopyToVRAM(ScrnInfoPtr pScrn, temph = hpass = min(h, scratch->total/2 / scratch_pitch_bytes); dst = (char *)scratch->address; - scratch_obj.pitch = scratch_pitch; - scratch_obj.width = w; - scratch_obj.height = hpass; - scratch_obj.offset = scratch_mc_addr; - scratch_obj.bpp = bpp; - scratch_obj.domain = RADEON_GEM_DOMAIN_GTT; - scratch_obj.bo = NULL; - - dst_obj.pitch = dst_pitch; - dst_obj.width = dst_width; - dst_obj.height = dst_height; - dst_obj.offset = dst_mc_addr; - dst_obj.bo = NULL; - dst_obj.bpp = bpp; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - - if (!R600SetAccelState(pScrn, - &scratch_obj, - NULL, - &dst_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - 3, 0xffffffff)) - return FALSE; - /* memcopy from sys to scratch */ while (temph--) { memcpy (dst, src, wpass); @@ -1680,9 +1803,10 @@ R600CopyToVRAM(ScrnInfoPtr pScrn, } } /* blit from scratch to vram */ - info->accel_state->src_obj[0].height = oldhpass; - info->accel_state->src_obj[0].offset = offset; - R600DoPrepareCopy(pScrn); + R600DoPrepareCopy(pScrn, + scratch_pitch, w, oldhpass, offset, bpp, + dst_pitch, dst_height, dst_mc_addr, bpp, + 3, 0xffffffff); R600AppendCopyVertex(pScrn, 0, 0, x, y, w, oldhpass); R600DoCopy(pScrn); y += oldhpass; @@ -1701,11 +1825,12 @@ R600UploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); uint32_t dst_mc_addr = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + uint32_t dst_height = pDst->drawable.height; int bpp = pDst->drawable.bitsPerPixel; return R600CopyToVRAM(pScrn, src, src_pitch, - dst_pitch, dst_mc_addr, pDst->drawable.width, pDst->drawable.height, bpp, + dst_pitch, dst_mc_addr, dst_height, bpp, x, y, w, h); } @@ -1715,25 +1840,17 @@ R600DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, { ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; uint32_t src_pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); uint32_t src_mc_addr = exaGetPixmapOffset(pSrc) + info->fbLocation + pScrn->fbOffset; uint32_t src_width = pSrc->drawable.width; uint32_t src_height = pSrc->drawable.height; int bpp = pSrc->drawable.bitsPerPixel; uint32_t scratch_mc_addr; - int scratch_pitch_bytes = RADEON_ALIGN(dst_pitch, 256); + int scratch_pitch_bytes = (dst_pitch + 255) & ~255; int scratch_offset = 0, hpass; uint32_t scratch_pitch = scratch_pitch_bytes / (bpp / 8); int wpass = w * (bpp/8); drmBufPtr scratch; - struct r600_accel_object scratch_obj, src_obj; - - /* bad pipe setup in drm prior to 1.32 */ - if (info->dri->pKernelDRMVersion->version_minor < 32) { - if ((info->ChipFamily == CHIP_FAMILY_RV740) && (w < 32 || h < 32)) - return FALSE; - } if (src_pitch & 7) return FALSE; @@ -1745,32 +1862,11 @@ R600DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, scratch_mc_addr = info->gartLocation + info->dri->bufStart + (scratch->idx * scratch->total); hpass = min(h, scratch->total/2 / scratch_pitch_bytes); - src_obj.pitch = src_pitch; - src_obj.width = src_width; - src_obj.height = src_height; - src_obj.offset = src_mc_addr; - src_obj.bo = NULL; - src_obj.bpp = bpp; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM; - - scratch_obj.pitch = scratch_pitch; - scratch_obj.width = src_width; - scratch_obj.height = hpass; - scratch_obj.offset = scratch_mc_addr; - scratch_obj.bpp = bpp; - scratch_obj.domain = RADEON_GEM_DOMAIN_GTT; - scratch_obj.bo = NULL; - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &scratch_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - 3, 0xffffffff)) - return FALSE; - /* blit from vram to scratch */ - R600DoPrepareCopy(pScrn); + R600DoPrepareCopy(pScrn, + src_pitch, src_width, src_height, src_mc_addr, bpp, + scratch_pitch, hpass, scratch_mc_addr, bpp, + 3, 0xffffffff); R600AppendCopyVertex(pScrn, x, y, 0, 0, w, hpass); R600DoCopy(pScrn); @@ -1784,9 +1880,10 @@ R600DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, if (hpass) { scratch_offset = scratch->total/2 - scratch_offset; /* blit from vram to scratch */ - info->accel_state->dst_obj.height = hpass; - info->accel_state->dst_obj.offset = scratch_mc_addr + scratch_offset; - R600DoPrepareCopy(pScrn); + R600DoPrepareCopy(pScrn, + src_pitch, src_width, src_height, src_mc_addr, bpp, + scratch_pitch, hpass, scratch_mc_addr + scratch_offset, bpp, + 3, 0xffffffff); R600AppendCopyVertex(pScrn, x, y, 0, 0, w, hpass); R600DoCopy(pScrn); } @@ -1807,258 +1904,6 @@ R600DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, } -#if defined(XF86DRM_MODE) - -static Bool -R600UploadToScreenCS(PixmapPtr pDst, int x, int y, int w, int h, - char *src, int src_pitch) -{ - ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *scratch = NULL; - struct radeon_bo *copy_dst; - unsigned char *dst; - unsigned size; - uint32_t dst_domain; - int bpp = pDst->drawable.bitsPerPixel; - uint32_t scratch_pitch; - uint32_t copy_pitch; - uint32_t dst_pitch_hw = exaGetPixmapPitch(pDst) / (bpp / 8); - int ret; - Bool flush = TRUE; - Bool r; - int i; - struct r600_accel_object src_obj, dst_obj; - uint32_t height, base_align; - - if (bpp < 8) - return FALSE; - - driver_priv = exaGetPixmapDriverPrivate(pDst); - if (!driver_priv || !driver_priv->bo) - return FALSE; - - /* If we know the BO won't be busy, don't bother with a scratch */ - copy_dst = driver_priv->bo; - copy_pitch = pDst->devKind; - if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) { - if (!radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) { - flush = FALSE; - if (!radeon_bo_is_busy(driver_priv->bo, &dst_domain)) - goto copy; - } - } - - scratch_pitch = RADEON_ALIGN(w, drmmode_get_pitch_align(pScrn, (bpp / 8), 0)); - height = RADEON_ALIGN(h, drmmode_get_height_align(pScrn, 0)); - base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0); - size = scratch_pitch * height * (bpp / 8); - scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0); - if (scratch == NULL) { - goto copy; - } - - src_obj.pitch = scratch_pitch; - src_obj.width = w; - src_obj.height = h; - src_obj.offset = 0; - src_obj.bpp = bpp; - src_obj.domain = RADEON_GEM_DOMAIN_GTT; - src_obj.bo = scratch; - src_obj.tiling_flags = 0; - - dst_obj.pitch = dst_pitch_hw; - dst_obj.width = pDst->drawable.width; - dst_obj.height = pDst->drawable.height; - dst_obj.offset = 0; - dst_obj.bpp = bpp; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - dst_obj.bo = radeon_get_pixmap_bo(pDst); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pDst); - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - 3, 0xffffffff)) { - goto copy; - } - copy_dst = scratch; - copy_pitch = scratch_pitch * (bpp / 8); - flush = FALSE; - -copy: - if (flush) - radeon_cs_flush_indirect(pScrn); - - ret = radeon_bo_map(copy_dst, 0); - if (ret) { - r = FALSE; - goto out; - } - r = TRUE; - size = w * bpp / 8; - dst = copy_dst->ptr; - if (copy_dst == driver_priv->bo) - dst += y * copy_pitch + x * bpp / 8; - for (i = 0; i < h; i++) { - memcpy(dst + i * copy_pitch, src, size); - src += src_pitch; - } - radeon_bo_unmap(copy_dst); - - if (copy_dst == scratch) { - if (info->accel_state->vsync) - RADEONVlineHelperSet(pScrn, x, y, x + w, y + h); - - /* blit from gart to vram */ - R600DoPrepareCopy(pScrn); - R600AppendCopyVertex(pScrn, 0, 0, x, y, w, h); - R600DoCopyVline(pDst); - } - -out: - if (scratch) - radeon_bo_unref(scratch); - return r; -} - -static Bool -R600DownloadFromScreenCS(PixmapPtr pSrc, int x, int y, int w, - int h, char *dst, int dst_pitch) -{ - ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *scratch = NULL; - struct radeon_bo *copy_src; - unsigned size; - uint32_t src_domain = 0; - int bpp = pSrc->drawable.bitsPerPixel; - uint32_t scratch_pitch; - uint32_t copy_pitch; - uint32_t src_pitch_hw = exaGetPixmapPitch(pSrc) / (bpp / 8); - int ret; - Bool flush = FALSE; - Bool r; - struct r600_accel_object src_obj, dst_obj; - uint32_t height, base_align; - - if (bpp < 8) - return FALSE; - - driver_priv = exaGetPixmapDriverPrivate(pSrc); - if (!driver_priv || !driver_priv->bo) - return FALSE; - - /* If we know the BO won't end up in VRAM anyway, don't bother with a scratch */ - copy_src = driver_priv->bo; - copy_pitch = pSrc->devKind; - if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) { - if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) { - src_domain = radeon_bo_get_src_domain(driver_priv->bo); - if ((src_domain & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) == - (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) - src_domain = 0; - else /* A write may be scheduled */ - flush = TRUE; - } - - if (!src_domain) - radeon_bo_is_busy(driver_priv->bo, &src_domain); - - if (src_domain & ~(uint32_t)RADEON_GEM_DOMAIN_VRAM) - goto copy; - } - - scratch_pitch = RADEON_ALIGN(w, drmmode_get_pitch_align(pScrn, (bpp / 8), 0)); - height = RADEON_ALIGN(h, drmmode_get_height_align(pScrn, 0)); - base_align = drmmode_get_base_align(pScrn, (bpp / 8), 0); - size = scratch_pitch * height * (bpp / 8); - scratch = radeon_bo_open(info->bufmgr, 0, size, base_align, RADEON_GEM_DOMAIN_GTT, 0); - if (scratch == NULL) { - goto copy; - } - radeon_cs_space_reset_bos(info->cs); - radeon_cs_space_add_persistent_bo(info->cs, info->accel_state->shaders_bo, - RADEON_GEM_DOMAIN_VRAM, 0); - accel_state->src_obj[0].domain = RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM; - radeon_add_pixmap(info->cs, pSrc, info->accel_state->src_obj[0].domain, 0); - accel_state->dst_obj.domain = RADEON_GEM_DOMAIN_GTT; - radeon_cs_space_add_persistent_bo(info->cs, scratch, 0, accel_state->dst_obj.domain); - ret = radeon_cs_space_check(info->cs); - if (ret) { - goto copy; - } - - src_obj.pitch = src_pitch_hw; - src_obj.width = pSrc->drawable.width; - src_obj.height = pSrc->drawable.height; - src_obj.offset = 0; - src_obj.bpp = bpp; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - src_obj.bo = radeon_get_pixmap_bo(pSrc); - src_obj.tiling_flags = radeon_get_pixmap_tiling(pSrc); - - dst_obj.pitch = scratch_pitch; - dst_obj.width = w; - dst_obj.height = h; - dst_obj.offset = 0; - dst_obj.bo = scratch; - dst_obj.bpp = bpp; - dst_obj.domain = RADEON_GEM_DOMAIN_GTT; - dst_obj.tiling_flags = 0; - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->copy_vs_offset, accel_state->copy_ps_offset, - 3, 0xffffffff)) { - goto copy; - } - - /* blit from vram to gart */ - R600DoPrepareCopy(pScrn); - R600AppendCopyVertex(pScrn, x, y, 0, 0, w, h); - R600DoCopy(pScrn); - copy_src = scratch; - copy_pitch = scratch_pitch * (bpp / 8); - flush = TRUE; - -copy: - if (flush && info->cs) - radeon_cs_flush_indirect(pScrn); - - ret = radeon_bo_map(copy_src, 0); - if (ret) { - ErrorF("failed to map pixmap: %d\n", ret); - r = FALSE; - goto out; - } - r = TRUE; - w *= bpp / 8; - if (copy_src == driver_priv->bo) - size = y * copy_pitch + x * bpp / 8; - else - size = 0; - while (h--) { - memcpy(dst, copy_src->ptr + size, w); - size += copy_pitch; - dst += dst_pitch; - } - radeon_bo_unmap(copy_src); -out: - if (scratch) - radeon_bo_unref(scratch); - return r; -} -#endif - static int R600MarkSync(ScreenPtr pScreen) { @@ -2078,12 +1923,7 @@ R600Sync(ScreenPtr pScreen, int marker) struct radeon_accel_state *accel_state = info->accel_state; if (accel_state->exaMarkerSynced != marker) { -#ifdef XF86DRM_MODE -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 4) - if (!info->cs) -#endif -#endif - RADEONWaitForIdleCP(pScrn); + RADEONWaitForIdleCP(pScrn); accel_state->exaMarkerSynced = marker; } @@ -2100,27 +1940,11 @@ R600AllocShaders(ScrnInfoPtr pScrn, ScreenPtr pScreen) accel_state->shaders = NULL; -#ifdef XF86DRM_MODE -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 4) - if (info->cs) { - accel_state->shaders_bo = radeon_bo_open(info->bufmgr, 0, size, 0, - RADEON_GEM_DOMAIN_VRAM, 0); - if (accel_state->shaders_bo == NULL) { - ErrorF("Allocating shader failed\n"); - return FALSE; - } - return TRUE; - } else -#endif -#endif - { - accel_state->shaders = exaOffscreenAlloc(pScreen, size, 256, - TRUE, NULL, NULL); - - if (accel_state->shaders == NULL) - return FALSE; - } + accel_state->shaders = exaOffscreenAlloc(pScreen, size, 256, + TRUE, NULL, NULL); + if (accel_state->shaders == NULL) + return FALSE; return TRUE; } @@ -2131,21 +1955,8 @@ R600LoadShaders(ScrnInfoPtr pScrn) struct radeon_accel_state *accel_state = info->accel_state; RADEONChipFamily ChipSet = info->ChipFamily; uint32_t *shader; -#ifdef XF86DRM_MODE -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 4) - int ret; - if (info->cs) { - ret = radeon_bo_map(accel_state->shaders_bo, 1); - if (ret) { - FatalError("failed to map shader %d\n", ret); - return FALSE; - } - shader = accel_state->shaders_bo->ptr; - } else -#endif -#endif - shader = (pointer)((char *)info->FB + accel_state->shaders->offset); + shader = (pointer)((char *)info->FB + accel_state->shaders->offset); /* solid vs --------------------------------------- */ accel_state->solid_vs_offset = 0; @@ -2171,22 +1982,18 @@ R600LoadShaders(ScrnInfoPtr pScrn) accel_state->comp_ps_offset = 2560; R600_comp_ps(ChipSet, shader + accel_state->comp_ps_offset / 4); + /* comp mask ps --------------------------------------- */ + accel_state->comp_mask_ps_offset = 3072; + R600_comp_mask_ps(ChipSet, shader + accel_state->comp_mask_ps_offset / 4); + /* xv vs --------------------------------------- */ - accel_state->xv_vs_offset = 3072; + accel_state->xv_vs_offset = 3584; R600_xv_vs(ChipSet, shader + accel_state->xv_vs_offset / 4); /* xv ps --------------------------------------- */ - accel_state->xv_ps_offset = 3584; + accel_state->xv_ps_offset = 4096; R600_xv_ps(ChipSet, shader + accel_state->xv_ps_offset / 4); -#ifdef XF86DRM_MODE -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 4) - if (info->cs) { - radeon_bo_unmap(accel_state->shaders_bo); - } -#endif -#endif - return TRUE; } @@ -2215,6 +2022,7 @@ R600FinishAccess(PixmapPtr pPix, int index) } + Bool R600DrawInit(ScreenPtr pScreen) { @@ -2240,47 +2048,18 @@ R600DrawInit(ScreenPtr pScreen) info->accel_state->exa->MarkSync = R600MarkSync; info->accel_state->exa->WaitMarker = R600Sync; -#ifdef XF86DRM_MODE -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 4) - if (info->cs) { - info->accel_state->exa->CreatePixmap = RADEONEXACreatePixmap; - info->accel_state->exa->DestroyPixmap = RADEONEXADestroyPixmap; - info->accel_state->exa->PixmapIsOffscreen = RADEONEXAPixmapIsOffscreen; - info->accel_state->exa->PrepareAccess = RADEONPrepareAccess_CS; - info->accel_state->exa->FinishAccess = RADEONFinishAccess_CS; - info->accel_state->exa->UploadToScreen = R600UploadToScreenCS; - info->accel_state->exa->DownloadFromScreen = R600DownloadFromScreenCS; -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 5) - info->accel_state->exa->CreatePixmap2 = RADEONEXACreatePixmap2; -#endif - } else -#endif -#endif - { - info->accel_state->exa->PrepareAccess = R600PrepareAccess; - info->accel_state->exa->FinishAccess = R600FinishAccess; + info->accel_state->exa->PrepareAccess = R600PrepareAccess; + info->accel_state->exa->FinishAccess = R600FinishAccess; - /* AGP seems to have problems with gart transfers */ - if (info->accelDFS) { - info->accel_state->exa->UploadToScreen = R600UploadToScreen; - info->accel_state->exa->DownloadFromScreen = R600DownloadFromScreen; - } + /* AGP seems to have problems with gart transfers */ + if (info->accelDFS) { + info->accel_state->exa->UploadToScreen = R600UploadToScreen; + info->accel_state->exa->DownloadFromScreen = R600DownloadFromScreen; } info->accel_state->exa->flags = EXA_OFFSCREEN_PIXMAPS; #ifdef EXA_SUPPORTS_PREPARE_AUX info->accel_state->exa->flags |= EXA_SUPPORTS_PREPARE_AUX; -#endif - -#ifdef XF86DRM_MODE -#ifdef EXA_HANDLES_PIXMAPS - if (info->cs) { - info->accel_state->exa->flags |= EXA_HANDLES_PIXMAPS; -#ifdef EXA_MIXED_PIXMAPS - info->accel_state->exa->flags |= EXA_MIXED_PIXMAPS; -#endif - } -#endif #endif info->accel_state->exa->pixmapOffsetAlign = 256; info->accel_state->exa->pixmapPitchAlign = 256; @@ -2301,39 +2080,18 @@ R600DrawInit(ScreenPtr pScreen) info->accel_state->exa->maxY = 8192; /* not supported yet */ - if (xf86ReturnOptValBool(info->Options, OPTION_EXA_VSYNC, FALSE)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EXA VSync enabled\n"); - info->accel_state->vsync = TRUE; - } else - info->accel_state->vsync = FALSE; + info->accel_state->vsync = FALSE; if (!exaDriverInit(pScreen, info->accel_state->exa)) { - free(info->accel_state->exa); + xfree(info->accel_state->exa); return FALSE; } -#ifdef XF86DRM_MODE -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 4) - if (!info->cs) -#endif -#endif - if (!info->gartLocation) - return FALSE; + if (!info->gartLocation) + return FALSE; info->accel_state->XInited3D = FALSE; info->accel_state->copy_area = NULL; - info->accel_state->src_obj[0].bo = NULL; - info->accel_state->src_obj[1].bo = NULL; - info->accel_state->dst_obj.bo = NULL; - info->accel_state->copy_area_bo = NULL; - info->accel_state->vbo.vb_start_op = -1; - info->accel_state->finish_op = r600_finish_op; - info->accel_state->vbo.verts_per_op = 3; - RADEONVlineHelperClear(pScrn); - -#ifdef XF86DRM_MODE - radeon_vbo_init_lists(pScrn); -#endif if (!R600AllocShaders(pScrn, pScreen)) return FALSE; diff --git a/driver/xf86-video-ati/src/r600_reg.h b/driver/xf86-video-ati/src/r600_reg.h index 8f17e1482..937926baa 100644 --- a/driver/xf86-video-ati/src/r600_reg.h +++ b/driver/xf86-video-ati/src/r600_reg.h @@ -35,23 +35,24 @@ /* SET_*_REG offsets + ends */ -#define SET_CONFIG_REG_offset 0x00008000 -#define SET_CONFIG_REG_end 0x0000ac00 -#define SET_CONTEXT_REG_offset 0x00028000 -#define SET_CONTEXT_REG_end 0x00029000 -#define SET_ALU_CONST_offset 0x00030000 -#define SET_ALU_CONST_end 0x00032000 -#define SET_RESOURCE_offset 0x00038000 -#define SET_RESOURCE_end 0x0003c000 -#define SET_SAMPLER_offset 0x0003c000 -#define SET_SAMPLER_end 0x0003cff0 -#define SET_CTL_CONST_offset 0x0003cff0 -#define SET_CTL_CONST_end 0x0003e200 -#define SET_LOOP_CONST_offset 0x0003e200 -#define SET_LOOP_CONST_end 0x0003e380 -#define SET_BOOL_CONST_offset 0x0003e380 -#define SET_BOOL_CONST_end 0x0003e38c - +enum { + SET_CONFIG_REG_offset = 0x00008000, + SET_CONFIG_REG_end = 0x0000ac00, + SET_CONTEXT_REG_offset = 0x00028000, + SET_CONTEXT_REG_end = 0x00029000, + SET_ALU_CONST_offset = 0x00030000, + SET_ALU_CONST_end = 0x00032000, + SET_RESOURCE_offset = 0x00038000, + SET_RESOURCE_end = 0x0003c000, + SET_SAMPLER_offset = 0x0003c000, + SET_SAMPLER_end = 0x0003cff0, + SET_CTL_CONST_offset = 0x0003cff0, + SET_CTL_CONST_end = 0x0003e200, + SET_LOOP_CONST_offset = 0x0003e200, + SET_LOOP_CONST_end = 0x0003e380, + SET_BOOL_CONST_offset = 0x0003e380, + SET_BOOL_CONST_end = 0x0003e38c, +}; /* packet3 IT_SURFACE_BASE_UPDATE bits */ enum { @@ -116,19 +117,16 @@ enum { /* IT_WAIT_REG_MEM operation encoding */ -#define IT_WAIT_ALWAYS (0 << 0) -#define IT_WAIT_LT (1 << 0) -#define IT_WAIT_LE (2 << 0) -#define IT_WAIT_EQ (3 << 0) -#define IT_WAIT_NE (4 << 0) -#define IT_WAIT_GE (5 << 0) -#define IT_WAIT_GT (6 << 0) -#define IT_WAIT_REG (0 << 4) -#define IT_WAIT_MEM (1 << 4) +#define IT_WAIT_ALWAYS (0<<0) +#define IT_WAIT_LT (1<<0) +#define IT_WAIT_LE (2<<0) +#define IT_WAIT_EQ (3<<0) +#define IT_WAIT_NE (4<<0) +#define IT_WAIT_GE (5<<0) +#define IT_WAIT_GT (6<<0) +#define IT_WAIT_REG (0<<4) +#define IT_WAIT_MEM (1<<4) #define IT_WAIT_ADDR(x) ((x) >> 2) -/* IT_INDEX_TYPE */ -#define IT_INDEX_TYPE_SWAP_MODE(x) ((x) << 2) - #endif diff --git a/driver/xf86-video-ati/src/r600_reg_r6xx.h b/driver/xf86-video-ati/src/r600_reg_r6xx.h index fec02ac4b..b4cc639a8 100644 --- a/driver/xf86-video-ati/src/r600_reg_r6xx.h +++ b/driver/xf86-video-ati/src/r600_reg_r6xx.h @@ -417,11 +417,11 @@ enum { ALPHA_TO_MASK_ENABLE = 1 << 0, ALPHA_TO_MASK_OFFSET0_mask = 0x03 << 8, ALPHA_TO_MASK_OFFSET0_shift = 8, - ALPHA_TO_MASK_OFFSET1_mask = 0x03 << 10, + ALPHA_TO_MASK_OFFSET1_mask = 0x03 << 8, ALPHA_TO_MASK_OFFSET1_shift = 10, - ALPHA_TO_MASK_OFFSET2_mask = 0x03 << 12, + ALPHA_TO_MASK_OFFSET2_mask = 0x03 << 8, ALPHA_TO_MASK_OFFSET2_shift = 12, - ALPHA_TO_MASK_OFFSET3_mask = 0x03 << 14, + ALPHA_TO_MASK_OFFSET3_mask = 0x03 << 8, ALPHA_TO_MASK_OFFSET3_shift = 14, // SQ_VTX_CONSTANT_WORD2_0 = 0x00038008, diff --git a/driver/xf86-video-ati/src/r600_shader.c b/driver/xf86-video-ati/src/r600_shader.c index ab2f4850f..addba36f3 100644 --- a/driver/xf86-video-ati/src/r600_shader.c +++ b/driver/xf86-video-ati/src/r600_shader.c @@ -106,16 +106,12 @@ int R600_solid_vs(RADEONChipFamily ChipSet, uint32_t* shader) DST_SEL_Z(SQ_SEL_0), DST_SEL_W(SQ_SEL_1), USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif + ENDIAN_SWAP(ENDIAN_NONE), CONST_BUF_NO_STRIDE(0), MEGA_FETCH(1)); shader[i++] = VTX_DWORD_PAD; @@ -161,11 +157,11 @@ int R600_solid_ps(RADEONChipFamily ChipSet, uint32_t* shader) BARRIER(1)); /* 2 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), + shader[i++] = ALU_DWORD0(SRC0_SEL(256), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_X), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_X), SRC1_NEG(0), @@ -187,11 +183,11 @@ int R600_solid_ps(RADEONChipFamily ChipSet, uint32_t* shader) DST_ELEM(ELEM_X), CLAMP(1)); /* 3 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), + shader[i++] = ALU_DWORD0(SRC0_SEL(256), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_Y), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_Y), SRC1_NEG(0), @@ -213,11 +209,11 @@ int R600_solid_ps(RADEONChipFamily ChipSet, uint32_t* shader) DST_ELEM(ELEM_Y), CLAMP(1)); /* 4 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), + shader[i++] = ALU_DWORD0(SRC0_SEL(256), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_Z), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_Z), SRC1_NEG(0), @@ -239,11 +235,11 @@ int R600_solid_ps(RADEONChipFamily ChipSet, uint32_t* shader) DST_ELEM(ELEM_Z), CLAMP(1)); /* 5 */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), + shader[i++] = ALU_DWORD0(SRC0_SEL(256), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_W), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_W), SRC1_NEG(0), @@ -340,16 +336,12 @@ int R600_copy_vs(RADEONChipFamily ChipSet, uint32_t* shader) DST_SEL_Z(SQ_SEL_0), DST_SEL_W(SQ_SEL_1), USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif + ENDIAN_SWAP(ENDIAN_NONE), CONST_BUF_NO_STRIDE(0), MEGA_FETCH(1)); shader[i++] = VTX_DWORD_PAD; @@ -369,16 +361,12 @@ int R600_copy_vs(RADEONChipFamily ChipSet, uint32_t* shader) DST_SEL_Z(SQ_SEL_0), DST_SEL_W(SQ_SEL_1), USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif + ENDIAN_SWAP(ENDIAN_NONE), CONST_BUF_NO_STRIDE(0), MEGA_FETCH(0)); shader[i++] = VTX_DWORD_PAD; @@ -469,7 +457,7 @@ int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) int i = 0; /* 0 */ - shader[i++] = CF_DWORD0(ADDR(6)); + shader[i++] = CF_DWORD0(ADDR(4)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), COND(SQ_CF_COND_ACTIVE), @@ -480,22 +468,7 @@ int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_VTX), WHOLE_QUAD_MODE(0), BARRIER(1)); - - /* 1 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(4), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(2), - USES_WATERFALL(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 2 */ + /* 1 */ shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), TYPE(SQ_EXPORT_POS), RW_GPR(1), @@ -513,7 +486,7 @@ int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_EXPORT_DONE), WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 3 */ + /* 2 */ shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), TYPE(SQ_EXPORT_PARAM), RW_GPR(0), @@ -531,63 +504,9 @@ int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_EXPORT_DONE), WHOLE_QUAD_MODE(0), BARRIER(0)); - - - /* 4 texX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 5 texY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 6/7 */ + shader[i++] = 0x00000000; + shader[i++] = 0x00000000; + /* 4/5 */ shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), FETCH_WHOLE_QUAD(0), @@ -604,19 +523,15 @@ int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) DST_SEL_W(SQ_SEL_1), USE_CONST_FIELDS(0), DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif + ENDIAN_SWAP(ENDIAN_NONE), CONST_BUF_NO_STRIDE(0), MEGA_FETCH(1)); shader[i++] = VTX_DWORD_PAD; - /* 8/9 */ + /* 6/7 */ shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), FETCH_WHOLE_QUAD(0), @@ -633,15 +548,11 @@ int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) DST_SEL_W(SQ_SEL_1), USE_CONST_FIELDS(0), DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif + ENDIAN_SWAP(ENDIAN_NONE), CONST_BUF_NO_STRIDE(0), MEGA_FETCH(0)); shader[i++] = VTX_DWORD_PAD; @@ -649,12 +560,41 @@ int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader) return i; } +/* + * ; xv ps planar + * 00 TEX: ADDR(20) CNT(3) NO_BARRIER + * 0 SAMPLE R1.x__1, R0.xy01, t0, s0 + * 1 SAMPLE R1.__x_, R0.xy01, t1, s1 + * 2 SAMPLE R1._x__, R0.xy01, t2, s2 + * 01 TEX: ADDR(28) CNT(2) NO_BARRIER + * 0 SAMPLE R1.x__1, R0.xy01, t0, s0 + * 1 SAMPLE R1._xy_, R0.xy01, t1, s1 + * 02 ALU: ADDR(4) CNT(16) + * 3 x: MULADD R1.x, R1.x, C3.x, C3.y CLAMP + * y: MULADD R1.y, R1.y, C3.z, C3.w + * z: MULADD R1.z, R1.z, C3.z, C3.w + * w: MOV R1.w, 0.0f + * 4 x: DOT4 R2.x, R1.x, C0.x CLAMP VEC_102 + * y: DOT4 ____, R1.y, C0.y CLAMP VEC_102 + * z: DOT4 ____, R1.z, C0.z CLAMP VEC_102 + * w: DOT4 ____, R1.w, C0.w CLAMP VEC_021 + * 5 x: DOT4 ____, R1.x, C1.x CLAMP VEC_102 + * y: DOT4 R2.y, R1.y, C1.y CLAMP VEC_102 + * z: DOT4 ____, R1.z, C1.z CLAMP VEC_102 + * w: DOT4 ____, R1.w, C1.w CLAMP VEC_021 + * 6 x: DOT4 ____, R1.x, C2.x CLAMP VEC_102 + * y: DOT4 ____, R1.y, C2.y CLAMP VEC_102 + * z: DOT4 R2.z, R1.z, C2.z CLAMP VEC_102 + * w: DOT4 ____, R1.w, C2.w CLAMP VEC_021 + * 03 EXP_DONE: PIX0, R2 + * END_OF_PROGRAM + */ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) { int i = 0; /* 0 */ - shader[i++] = CF_DWORD0(ADDR(16)); + shader[i++] = CF_DWORD0(ADDR(20)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), COND(SQ_CF_COND_BOOL), @@ -666,7 +606,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) WHOLE_QUAD_MODE(0), BARRIER(0)); /* 1 */ - shader[i++] = CF_DWORD0(ADDR(24)); + shader[i++] = CF_DWORD0(ADDR(28)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), COND(SQ_CF_COND_NOT_BOOL), @@ -685,7 +625,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), KCACHE_ADDR0(0), KCACHE_ADDR1(0), - I_COUNT(12), + I_COUNT(16), USES_WATERFALL(0), CF_INST(SQ_CF_INST_ALU), WHOLE_QUAD_MODE(0), @@ -708,253 +648,73 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_EXPORT_DONE), WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 4,5,6,7 */ - /* r2.x = MAD(c0.w, r1.x, c0.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), + /* 4 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), + SRC0_ELEM(ELEM_X), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), + SRC1_SEL(259), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_X), SRC1_NEG(0), INDEX_MODE(SQ_INDEX_LOOP), PRED_SEL(SQ_PRED_SEL_OFF), LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_CFILE_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - /* r2.y = MAD(c0.w, r1.x, c0.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_CFILE_BASE + 0), + shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(259), SRC2_REL(ABSOLUTE), SRC2_ELEM(ELEM_Y), SRC2_NEG(0), ALU_INST(SQ_OP3_INST_MULADD), BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* r2.z = MAD(c0.w, r1.x, c0.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(ALU_SRC_CFILE_BASE + 0), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 8,9,10,11 */ - /* r2.x = MAD(c1.x, r1.y, pv.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), + DST_GPR(1), DST_REL(ABSOLUTE), DST_ELEM(ELEM_X), - CLAMP(0)); - /* r2.y = MAD(c1.y, r1.y, pv.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 1), + CLAMP(1)); + /* 5 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_Y), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), + SRC1_SEL(259), SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), + SRC1_ELEM(ELEM_Z), SRC1_NEG(0), INDEX_MODE(SQ_INDEX_LOOP), PRED_SEL(SQ_PRED_SEL_OFF), LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - /* r2.z = MAD(c1.z, r1.y, pv.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - /* r2.w = MAD(0, 0, 1) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(SQ_ALU_SRC_0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), + shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(259), SRC2_REL(ABSOLUTE), SRC2_ELEM(ELEM_W), SRC2_NEG(0), ALU_INST(SQ_OP3_INST_MULADD), BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - /* 12,13,14,15 */ - /* r2.x = MAD(c2.x, r1.z, pv.x) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(1)); - /* r2.y = MAD(c2.y, r1.z, pv.y) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Y), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), + DST_GPR(1), DST_REL(ABSOLUTE), DST_ELEM(ELEM_Y), - CLAMP(1)); - /* r2.z = MAD(c2.z, r1.z, pv.z) */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_CFILE_BASE + 2), + CLAMP(0)); + /* 6 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_Z), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 1), + SRC1_SEL(259), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_Z), SRC1_NEG(0), INDEX_MODE(SQ_INDEX_LOOP), PRED_SEL(SQ_PRED_SEL_OFF), LAST(0)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_PV), + shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(259), SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_Z), + SRC2_ELEM(ELEM_W), SRC2_NEG(0), ALU_INST(SQ_OP3_INST_MULADD), BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), + DST_GPR(1), DST_REL(ABSOLUTE), DST_ELEM(ELEM_Z), - CLAMP(1)); - /* r2.w = MAD(0, 0, 1) */ + CLAMP(0)); + /* 7 */ shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_X), @@ -966,19 +726,334 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) INDEX_MODE(SQ_INDEX_LOOP), PRED_SEL(SQ_PRED_SEL_OFF), LAST(1)); - shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(SQ_ALU_SRC_1), - SRC2_REL(ABSOLUTE), - SRC2_ELEM(ELEM_X), - SRC2_NEG(0), - ALU_INST(SQ_OP3_INST_MULADD), + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MOV), BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(1), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(0)); + /* 8 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), DST_GPR(2), DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 9 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 10 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 11 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_021), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(1)); + /* 12 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 13 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 14 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 15 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_021), + DST_GPR(0), + DST_REL(ABSOLUTE), DST_ELEM(ELEM_W), CLAMP(1)); - /* 16 */ - shader[i++] = CF_DWORD0(ADDR(18)); + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 17 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 18 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 19 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_021), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(1)); + /* 20 */ + shader[i++] = CF_DWORD0(ADDR(22)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), COND(SQ_CF_COND_ACTIVE), @@ -989,7 +1064,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_TEX), WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 17 */ + /* 21 */ shader[i++] = CF_DWORD0(ADDR(0)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), @@ -1001,7 +1076,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_RETURN), WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 18/19 */ + /* 22/23 */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), @@ -1029,7 +1104,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) SRC_SEL_Z(SQ_SEL_0), SRC_SEL_W(SQ_SEL_1)); shader[i++] = TEX_DWORD_PAD; - /* 20/21 */ + /* 24/25 */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), @@ -1057,7 +1132,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) SRC_SEL_Z(SQ_SEL_0), SRC_SEL_W(SQ_SEL_1)); shader[i++] = TEX_DWORD_PAD; - /* 22/23 */ + /* 26/27 */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), @@ -1085,8 +1160,8 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) SRC_SEL_Z(SQ_SEL_0), SRC_SEL_W(SQ_SEL_1)); shader[i++] = TEX_DWORD_PAD; - /* 24 */ - shader[i++] = CF_DWORD0(ADDR(26)); + /* 28 */ + shader[i++] = CF_DWORD0(ADDR(30)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), COND(SQ_CF_COND_ACTIVE), @@ -1097,7 +1172,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_TEX), WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 25 */ + /* 29 */ shader[i++] = CF_DWORD0(ADDR(0)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), @@ -1109,7 +1184,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) CF_INST(SQ_CF_INST_RETURN), WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 26/27 */ + /* 30/31 */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), @@ -1137,7 +1212,7 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) SRC_SEL_Z(SQ_SEL_0), SRC_SEL_W(SQ_SEL_1)); shader[i++] = TEX_DWORD_PAD; - /* 28/29 */ + /* 32/33 */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), @@ -1169,1221 +1244,13 @@ int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader) return i; } -/* comp vs --------------------------------------- */ -int R600_comp_vs(RADEONChipFamily ChipSet, uint32_t* shader) +/* comp mask ps --------------------------------------- */ +int R600_comp_mask_ps(RADEONChipFamily ChipSet, uint32_t* shader) { int i = 0; /* 0 */ - shader[i++] = CF_DWORD0(ADDR(3)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(9)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 2 */ - shader[i++] = CF_DWORD0(ADDR(0)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_NOP), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 3 - mask sub */ - shader[i++] = CF_DWORD0(ADDR(44)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(3), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_VTX), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 4 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(14), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(20), - USES_WATERFALL(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 5 - dst */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(2), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - R6xx_ELEM_LOOP(0), - BURST_COUNT(1), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 6 - src */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - R6xx_ELEM_LOOP(0), - BURST_COUNT(1), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 7 - mask */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(1), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - R6xx_ELEM_LOOP(0), - BURST_COUNT(1), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 8 */ - shader[i++] = CF_DWORD0(ADDR(0)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 9 - non-mask sub */ - shader[i++] = CF_DWORD0(ADDR(50)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(2), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_VTX), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 10 - ALU */ - shader[i++] = CF_ALU_DWORD0(ADDR(34), - KCACHE_BANK0(0), - KCACHE_BANK1(0), - KCACHE_MODE0(SQ_CF_KCACHE_NOP)); - shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), - KCACHE_ADDR0(0), - KCACHE_ADDR1(0), - I_COUNT(10), - USES_WATERFALL(0), - CF_INST(SQ_CF_INST_ALU), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 11 - dst */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), - TYPE(SQ_EXPORT_POS), - RW_GPR(1), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - R6xx_ELEM_LOOP(0), - BURST_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 12 - src */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), - TYPE(SQ_EXPORT_PARAM), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(0)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_0), - SRC_SEL_W(SQ_SEL_1), - R6xx_ELEM_LOOP(0), - BURST_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 13 */ - shader[i++] = CF_DWORD0(ADDR(0)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - - /* 14 srcX.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 15 srcX.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 16 srcX.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 17 srcX.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 18 srcY.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 19 srcY.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 20 srcY.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 21 srcY.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(3), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 22 maskX.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 23 maskX.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 24 maskX.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 25 maskX.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 26 maskY.x DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 27 maskY.y DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 28 maskY.z DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 29 maskY.w DOT4 - mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(4), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 30 srcX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 3), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 31 srcY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 3), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(1), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 32 maskX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 4), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 2), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 33 maskY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 4), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 3), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 34 srcX.x DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 35 srcX.y DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 36 srcX.z DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 37 srcX.w DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 38 srcY.x DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_X), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 39 srcY.y DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Y), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 40 srcY.z DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Z), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_Z), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(0)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Z), - CLAMP(0)); - - /* 41 srcY.w DOT4 - non-mask */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 0), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_W), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_LOOP), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(0), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_DOT4), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(2), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_W), - CLAMP(0)); - - /* 42 srcX / w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_X), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 0), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_X), - CLAMP(0)); - - /* 43 srcY / h */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 2), - SRC0_REL(ABSOLUTE), - SRC0_ELEM(ELEM_Y), - SRC0_NEG(0), - SRC1_SEL(ALU_SRC_CFILE_BASE + 1), - SRC1_REL(ABSOLUTE), - SRC1_ELEM(ELEM_W), - SRC1_NEG(0), - INDEX_MODE(SQ_INDEX_AR_X), - PRED_SEL(SQ_PRED_SEL_OFF), - LAST(1)); - shader[i++] = ALU_DWORD1_OP2(ChipSet, - SRC0_ABS(0), - SRC1_ABS(0), - UPDATE_EXECUTE_MASK(0), - UPDATE_PRED(0), - WRITE_MASK(1), - FOG_MERGE(0), - OMOD(SQ_ALU_OMOD_OFF), - ALU_INST(SQ_OP2_INST_MUL), - BANK_SWIZZLE(SQ_ALU_VEC_012), - DST_GPR(0), - DST_REL(ABSOLUTE), - DST_ELEM(ELEM_Y), - CLAMP(0)); - - /* 44/45 - dst - mask */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(24)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(2), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(1)); - shader[i++] = VTX_DWORD_PAD; - /* 46/47 - src */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0)); - shader[i++] = VTX_DWORD_PAD; - /* 48/49 - mask */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(16), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0)); - shader[i++] = VTX_DWORD_PAD; - - /* 50/51 - dst - non-mask */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(16)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_0), - DST_SEL_W(SQ_SEL_1), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(0), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(1)); - shader[i++] = VTX_DWORD_PAD; - /* 52/53 - src */ - shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), - FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), - FETCH_WHOLE_QUAD(0), - BUFFER_ID(0), - SRC_GPR(0), - SRC_REL(ABSOLUTE), - SRC_SEL_X(SQ_SEL_X), - MEGA_FETCH_COUNT(8)); - shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), - DST_REL(0), - DST_SEL_X(SQ_SEL_X), - DST_SEL_Y(SQ_SEL_Y), - DST_SEL_Z(SQ_SEL_1), - DST_SEL_W(SQ_SEL_0), - USE_CONST_FIELDS(0), - DATA_FORMAT(FMT_32_32_FLOAT), - NUM_FORMAT_ALL(SQ_NUM_FORMAT_SCALED), - FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), - SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); - shader[i++] = VTX_DWORD2(OFFSET(8), -#if X_BYTE_ORDER == X_BIG_ENDIAN - ENDIAN_SWAP(SQ_ENDIAN_8IN32), -#else - ENDIAN_SWAP(SQ_ENDIAN_NONE), -#endif - CONST_BUF_NO_STRIDE(0), - MEGA_FETCH(0)); - shader[i++] = VTX_DWORD_PAD; - - return i; -} - -/* comp ps --------------------------------------- */ -int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) -{ - int i = 0; - - /* 0 */ - shader[i++] = CF_DWORD0(ADDR(3)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_BOOL), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 1 */ - shader[i++] = CF_DWORD0(ADDR(7)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_NOT_BOOL), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_CALL), - WHOLE_QUAD_MODE(0), - BARRIER(0)); - /* 2 */ - shader[i++] = CF_DWORD0(ADDR(0)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(1), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_NOP), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 3 - mask sub */ - shader[i++] = CF_DWORD0(ADDR(14)); + shader[i++] = CF_DWORD0(ADDR(8)); shader[i++] = CF_DWORD1(POP_COUNT(0), CF_CONST(0), COND(SQ_CF_COND_ACTIVE), @@ -2395,8 +1262,8 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 4 */ - shader[i++] = CF_ALU_DWORD0(ADDR(10), + /* 1 */ + shader[i++] = CF_ALU_DWORD0(ADDR(3), KCACHE_BANK0(0), KCACHE_BANK1(0), KCACHE_MODE0(SQ_CF_KCACHE_NOP)); @@ -2409,87 +1276,33 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 5 */ + /* 2 */ shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), TYPE(SQ_EXPORT_PIXEL), RW_GPR(2), RW_REL(ABSOLUTE), INDEX_GPR(0), ELEM_SIZE(1)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), SRC_SEL_Y(SQ_SEL_Y), SRC_SEL_Z(SQ_SEL_Z), SRC_SEL_W(SQ_SEL_W), R6xx_ELEM_LOOP(0), BURST_COUNT(1), - END_OF_PROGRAM(0), + END_OF_PROGRAM(1), VALID_PIXEL_MODE(0), CF_INST(SQ_CF_INST_EXPORT_DONE), WHOLE_QUAD_MODE(0), BARRIER(1)); - /* 6 */ - shader[i++] = CF_DWORD0(ADDR(0)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 7 non-mask sub */ - shader[i++] = CF_DWORD0(ADDR(18)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(1), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_TEX), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 8 */ - shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), - TYPE(SQ_EXPORT_PIXEL), - RW_GPR(0), - RW_REL(ABSOLUTE), - INDEX_GPR(0), - ELEM_SIZE(1)); - shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), - SRC_SEL_Y(SQ_SEL_Y), - SRC_SEL_Z(SQ_SEL_Z), - SRC_SEL_W(SQ_SEL_W), - R6xx_ELEM_LOOP(0), - BURST_COUNT(1), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_EXPORT_DONE), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - /* 9 */ - shader[i++] = CF_DWORD0(ADDR(0)); - shader[i++] = CF_DWORD1(POP_COUNT(0), - CF_CONST(0), - COND(SQ_CF_COND_ACTIVE), - I_COUNT(0), - CALL_COUNT(0), - END_OF_PROGRAM(0), - VALID_PIXEL_MODE(0), - CF_INST(SQ_CF_INST_RETURN), - WHOLE_QUAD_MODE(0), - BARRIER(1)); - - /* 10 - alu 0 */ + /* 3 - alu 0 */ /* MUL gpr[2].x gpr[1].x gpr[0].x */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), + shader[i++] = ALU_DWORD0(SRC0_SEL(1), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_X), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_X), SRC1_NEG(0), @@ -2510,13 +1323,13 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) DST_REL(ABSOLUTE), DST_ELEM(ELEM_X), CLAMP(1)); - /* 11 - alu 1 */ + /* 4 - alu 1 */ /* MUL gpr[2].y gpr[1].y gpr[0].y */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), + shader[i++] = ALU_DWORD0(SRC0_SEL(1), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_Y), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_Y), SRC1_NEG(0), @@ -2537,13 +1350,13 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) DST_REL(ABSOLUTE), DST_ELEM(ELEM_Y), CLAMP(1)); - /* 12 - alu 2 */ + /* 5 - alu 2 */ /* MUL gpr[2].z gpr[1].z gpr[0].z */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), + shader[i++] = ALU_DWORD0(SRC0_SEL(1), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_Z), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_Z), SRC1_NEG(0), @@ -2564,13 +1377,13 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) DST_REL(ABSOLUTE), DST_ELEM(ELEM_Z), CLAMP(1)); - /* 13 - alu 3 */ + /* 6 - alu 3 */ /* MUL gpr[2].w gpr[1].w gpr[0].w */ - shader[i++] = ALU_DWORD0(SRC0_SEL(ALU_SRC_GPR_BASE + 1), + shader[i++] = ALU_DWORD0(SRC0_SEL(1), SRC0_REL(ABSOLUTE), SRC0_ELEM(ELEM_W), SRC0_NEG(0), - SRC1_SEL(ALU_SRC_GPR_BASE + 0), + SRC1_SEL(0), SRC1_REL(ABSOLUTE), SRC1_ELEM(ELEM_W), SRC1_NEG(0), @@ -2591,8 +1404,11 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) DST_REL(ABSOLUTE), DST_ELEM(ELEM_W), CLAMP(1)); + /* 7 */ + shader[i++] = 0x00000000; + shader[i++] = 0x00000000; - /* 14/15 - src - mask */ + /* 8/9 - src */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), @@ -2620,7 +1436,7 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) SRC_SEL_Z(SQ_SEL_0), SRC_SEL_W(SQ_SEL_1)); shader[i++] = TEX_DWORD_PAD; - /* 16/17 - mask */ + /* 10/11 - mask */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), @@ -2649,7 +1465,357 @@ int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) SRC_SEL_W(SQ_SEL_1)); shader[i++] = TEX_DWORD_PAD; - /* 18/19 - src - non-mask */ + return i; +} + +/* comp vs --------------------------------------- */ +int R600_comp_vs(RADEONChipFamily ChipSet, uint32_t* shader) +{ + int i = 0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(3)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_BOOL), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_CALL), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 1 */ + shader[i++] = CF_DWORD0(ADDR(14)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_NOT_BOOL), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_CALL), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 2 */ + shader[i++] = CF_DWORD0(0); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_NOP), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 3 - mask sub */ + shader[i++] = CF_DWORD0(ADDR(8)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(3), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_VTX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 4 - dst */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), + TYPE(SQ_EXPORT_POS), + RW_GPR(2), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 5 - src */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(1), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 6 - mask */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(1), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 7 */ + shader[i++] = CF_DWORD0(ADDR(0)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_RETURN), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 8/9 - dst */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(24)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(2), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(0), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(1)); + shader[i++] = VTX_DWORD_PAD; + /* 10/11 - src */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(8), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + /* 12/13 - mask */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(16), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + + /* 14 - non-mask sub */ + shader[i++] = CF_DWORD0(ADDR(18)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(2), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_VTX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 15 - dst */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), + TYPE(SQ_EXPORT_POS), + RW_GPR(1), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 16 - src */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 17 */ + shader[i++] = CF_DWORD0(ADDR(0)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_RETURN), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 18/19 - dst */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(16)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(0), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(1)); + shader[i++] = VTX_DWORD_PAD; + /* 20/21 - src */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(8), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + + return i; +} + +/* comp ps --------------------------------------- */ +int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* shader) +{ + int i = 0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(2)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(1), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_TEX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 1 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), + TYPE(SQ_EXPORT_PIXEL), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(1)); + + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + + + /* 2/3 - src */ shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), BC_FRAC_MODE(0), FETCH_WHOLE_QUAD(0), diff --git a/driver/xf86-video-ati/src/r600_shader.h b/driver/xf86-video-ati/src/r600_shader.h index d79ed4005..6c1261448 100644 --- a/driver/xf86-video-ati/src/r600_shader.h +++ b/driver/xf86-video-ati/src/r600_shader.h @@ -157,32 +157,32 @@ #define SRC_SEL_Z(x) (x) #define SRC_SEL_W(x) (x) -#define CF_DWORD0(addr) cpu_to_le32((addr)) +#define CF_DWORD0(addr) (addr) // R7xx has another entry (COUNT3), but that is only used for adding a bit to count. // We allow one more bit for count in the argument of the macro on R7xx instead. // R6xx: [0,7] R7xx: [1,16] #define CF_DWORD1(pc, cf_const, cond, count, call_count, eop, vpm, cf_inst, wqm, b) \ - cpu_to_le32((((pc) << 0) | ((cf_const) << 3) | ((cond) << 8) | (((count) & 7) << 10) | (((count) >> 3) << 19) | \ - ((call_count) << 13) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31))) + (((pc) << 0) | ((cf_const) << 3) | ((cond) << 8) | (((count) & 7) << 10) | (((count) >> 3) << 19) | \ + ((call_count) << 13) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31)) -#define CF_ALU_DWORD0(addr, kb0, kb1, km0) cpu_to_le32((((addr) << 0) | ((kb0) << 22) | ((kb1) << 26) | ((km0) << 30))) +#define CF_ALU_DWORD0(addr, kb0, kb1, km0) (((addr) << 0) | ((kb0) << 22) | ((kb1) << 26) | ((km0) << 30)) #define CF_ALU_DWORD1(km1, kcache_addr0, kcache_addr1, count, uw, cf_inst, wqm, b) \ - cpu_to_le32((((km1) << 0) | ((kcache_addr0) << 2) | ((kcache_addr1) << 10) | \ - ((count) << 18) | ((uw) << 25) | ((cf_inst) << 26) | ((wqm) << 30) | ((b) << 31))) + (((km1) << 0) | ((kcache_addr0) << 2) | ((kcache_addr1) << 10) | \ + ((count) << 18) | ((uw) << 25) | ((cf_inst) << 26) | ((wqm) << 30) | ((b) << 31)) #define CF_ALLOC_IMP_EXP_DWORD0(array_base, type, rw_gpr, rr, index_gpr, es) \ - cpu_to_le32((((array_base) << 0) | ((type) << 13) | ((rw_gpr) << 15) | ((rr) << 22) | ((index_gpr) << 23) | \ - ((es) << 30))) + (((array_base) << 0) | ((type) << 13) | ((rw_gpr) << 15) | ((rr) << 22) | ((index_gpr) << 23) | \ + ((es) << 30)) // R7xx apparently doesn't have the ELEM_LOOP entry any more // We still expose it, but ELEM_LOOP is explicitely R6xx now. // TODO: is this just forgotten in the docs, or really not available any more? #define CF_ALLOC_IMP_EXP_DWORD1_BUF(array_size, comp_mask, el, bc, eop, vpm, cf_inst, wqm, b) \ - cpu_to_le32((((array_size) << 0) | ((comp_mask) << 12) | ((el) << 16) | ((bc) << 17) | \ - ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31))) + (((array_size) << 0) | ((comp_mask) << 12) | ((el) << 16) | ((bc) << 17) | \ + ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31)) #define CF_ALLOC_IMP_EXP_DWORD1_SWIZ(sel_x, sel_y, sel_z, sel_w, el, bc, eop, vpm, cf_inst, wqm, b) \ - cpu_to_le32((((sel_x) << 0) | ((sel_y) << 3) | ((sel_z) << 6) | ((sel_w) << 9) | ((el) << 16) | \ - ((bc) << 17) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | \ - ((wqm) << 30) | ((b) << 31))) + (((sel_x) << 0) | ((sel_y) << 3) | ((sel_z) << 6) | ((sel_w) << 9) | ((el) << 16) | \ + ((bc) << 17) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | \ + ((wqm) << 30) | ((b) << 31)) // ALU clause insts #define SRC0_SEL(x) (x) @@ -193,10 +193,6 @@ // 128-159 kcache constants bank 0 // 160-191 kcache constants bank 1 // 248-255 special SQ_ALU_SRC_* (0, 1, etc.) -#define ALU_SRC_GPR_BASE 0 -#define ALU_SRC_KCACHE0_BASE 128 -#define ALU_SRC_KCACHE1_BASE 160 -#define ALU_SRC_CFILE_BASE 256 #define SRC0_REL(x) (x) #define SRC1_REL(x) (x) @@ -242,18 +238,18 @@ #define CLAMP(x) (x) #define ALU_DWORD0(src0_sel, s0r, s0e, s0n, src1_sel, s1r, s1e, s1n, im, ps, last) \ - cpu_to_le32((((src0_sel) << 0) | ((s0r) << 9) | ((s0e) << 10) | ((s0n) << 12) | \ - ((src1_sel) << 13) | ((s1r) << 22) | ((s1e) << 23) | ((s1n) << 25) | \ - ((im) << 26) | ((ps) << 29) | ((last) << 31))) + (((src0_sel) << 0) | ((s0r) << 9) | ((s0e) << 10) | ((s0n) << 12) | \ + ((src1_sel) << 13) | ((s1r) << 22) | ((s1e) << 23) | ((s1n) << 25) | \ + ((im) << 26) | ((ps) << 29) | ((last) << 31)) // R7xx has alu_inst at a different slot, and no fog merge any more (no fix function fog any more) #define R6xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ - cpu_to_le32((((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ - ((fm) << 5) | ((omod) << 6) | ((alu_inst) << 8) | ((bs) << 18) | ((dst_gpr) << 21) | \ - ((dr) << 28) | ((de) << 29) | ((clamp) << 31))) + (((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ + ((fm) << 5) | ((omod) << 6) | ((alu_inst) << 8) | ((bs) << 18) | ((dst_gpr) << 21) | \ + ((dr) << 28) | ((de) << 29) | ((clamp) << 31)) #define R7xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ - cpu_to_le32((((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ - ((omod) << 5) | ((alu_inst) << 7) | ((bs) << 18) | ((dst_gpr) << 21) | \ - ((dr) << 28) | ((de) << 29) | ((clamp) << 31))) + (((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ + ((omod) << 5) | ((alu_inst) << 7) | ((bs) << 18) | ((dst_gpr) << 21) | \ + ((dr) << 28) | ((de) << 29) | ((clamp) << 31)) // This is a general chipset macro, but due to selection by chipid typically not usable in static arrays // Fog is NOT USED on R7xx, even if specified. #define ALU_DWORD1_OP2(chipfamily, s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ @@ -261,9 +257,9 @@ R6xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) : \ R7xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp)) #define ALU_DWORD1_OP3(src2_sel, s2r, s2e, s2n, alu_inst, bs, dst_gpr, dr, de, clamp) \ - cpu_to_le32((((src2_sel) << 0) | ((s2r) << 9) | ((s2e) << 10) | ((s2n) << 12) | \ - ((alu_inst) << 13) | ((bs) << 18) | ((dst_gpr) << 21) | ((dr) << 28) | \ - ((de) << 29) | ((clamp) << 31))) + (((src2_sel) << 0) | ((s2r) << 9) | ((s2e) << 10) | ((s2n) << 12) | \ + ((alu_inst) << 13) | ((bs) << 18) | ((dst_gpr) << 21) | ((dr) << 28) | \ + ((de) << 29) | ((clamp) << 31)) // VTX clause insts // vxt insts @@ -301,17 +297,17 @@ #define MEGA_FETCH(x) (x) #define VTX_DWORD0(vtx_inst, ft, fwq, buffer_id, src_gpr, sr, ssx, mfc) \ - cpu_to_le32((((vtx_inst) << 0) | ((ft) << 5) | ((fwq) << 7) | ((buffer_id) << 8) | \ - ((src_gpr) << 16) | ((sr) << 23) | ((ssx) << 24) | ((mfc) << 26))) + (((vtx_inst) << 0) | ((ft) << 5) | ((fwq) << 7) | ((buffer_id) << 8) | \ + ((src_gpr) << 16) | ((sr) << 23) | ((ssx) << 24) | ((mfc) << 26)) #define VTX_DWORD1_SEM(semantic_id, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ - cpu_to_le32((((semantic_id) << 0) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ - ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31))) + (((semantic_id) << 0) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ + ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31)) #define VTX_DWORD1_GPR(dst_gpr, dr, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ - cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ - ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31))) + (((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ + ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31)) #define VTX_DWORD2(offset, es, cbns, mf) \ - cpu_to_le32((((offset) << 0) | ((es) << 16) | ((cbns) << 18) | ((mf) << 19))) -#define VTX_DWORD_PAD cpu_to_le32(0x00000000) + (((offset) << 0) | ((es) << 16) | ((cbns) << 18) | ((mf) << 19)) +#define VTX_DWORD_PAD 0x00000000 // TEX clause insts // tex insts @@ -337,15 +333,15 @@ // R7xx has an additional parameter ALT_CONST. We always expose it, but ALT_CONST is R7xx only #define TEX_DWORD0(tex_inst, bfm, fwq, resource_id, src_gpr, sr, ac) \ - cpu_to_le32((((tex_inst) << 0) | ((bfm) << 5) | ((fwq) << 7) | ((resource_id) << 8) | \ - ((src_gpr) << 16) | ((sr) << 23) | ((ac) << 24))) + (((tex_inst) << 0) | ((bfm) << 5) | ((fwq) << 7) | ((resource_id) << 8) | \ + ((src_gpr) << 16) | ((sr) << 23) | ((ac) << 24)) #define TEX_DWORD1(dst_gpr, dr, dsx, dsy, dsz, dsw, lod_bias, ctx, cty, ctz, ctw) \ - cpu_to_le32((((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ - ((lod_bias) << 21) | ((ctx) << 28) | ((cty) << 29) | ((ctz) << 30) | ((ctw) << 31))) + (((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ + ((lod_bias) << 21) | ((ctx) << 28) | ((cty) << 29) | ((ctz) << 30) | ((ctw) << 31)) #define TEX_DWORD2(offset_x, offset_y, offset_z, sampler_id, ssx, ssy, ssz, ssw) \ - cpu_to_le32((((offset_x) << 0) | ((offset_y) << 5) | ((offset_z) << 10) | ((sampler_id) << 15) | \ - ((ssx) << 20) | ((ssy) << 23) | ((ssz) << 26) | ((ssw) << 29))) -#define TEX_DWORD_PAD cpu_to_le32(0x00000000) + (((offset_x) << 0) | ((offset_y) << 5) | ((offset_z) << 10) | ((sampler_id) << 15) | \ + ((ssx) << 20) | ((ssy) << 23) | ((ssz) << 26) | ((ssw) << 29)) +#define TEX_DWORD_PAD 0x00000000 extern int R600_solid_vs(RADEONChipFamily ChipSet, uint32_t* vs); extern int R600_solid_ps(RADEONChipFamily ChipSet, uint32_t* ps); @@ -357,6 +353,7 @@ extern int R600_xv_vs(RADEONChipFamily ChipSet, uint32_t* shader); extern int R600_xv_ps(RADEONChipFamily ChipSet, uint32_t* shader); extern int R600_comp_vs(RADEONChipFamily ChipSet, uint32_t* vs); +extern int R600_comp_mask_ps(RADEONChipFamily ChipSet, uint32_t* ps); extern int R600_comp_ps(RADEONChipFamily ChipSet, uint32_t* ps); #endif diff --git a/driver/xf86-video-ati/src/r600_state.h b/driver/xf86-video-ati/src/r600_state.h index d5785cdd8..181e1678d 100644 --- a/driver/xf86-video-ati/src/r600_state.h +++ b/driver/xf86-video-ati/src/r600_state.h @@ -50,12 +50,6 @@ typedef struct { int round_mode; int tile_compact; int source_format; - /* 2D related CB state */ - uint32_t pmask; - int rop; - int blend_enable; - uint32_t blendcntl; - struct radeon_bo *bo; } cb_config_t; /* Depth buffer */ @@ -69,13 +63,11 @@ typedef struct { int tile_surface_en; int tile_compact; int zrange_precision; - struct radeon_bo *bo; } db_config_t; /* Shader */ typedef struct { uint64_t shader_addr; - uint32_t shader_size; int num_gprs; int stack_size; int dx10_clamp; @@ -87,7 +79,6 @@ typedef struct { int clamp_consts; int export_mode; int uncached_first_inst; - struct radeon_bo *bo; } shader_config_t; /* Vertex buffer / vtx resource */ @@ -103,7 +94,6 @@ typedef struct { int srf_mode_all; int endian; int mem_req_size; - struct radeon_bo *bo; } vtx_resource_t; /* Texture resource */ @@ -119,7 +109,6 @@ typedef struct { int format; uint64_t base; uint64_t mip_base; - uint32_t size; int format_comp_x; int format_comp_y; int format_comp_z; @@ -140,8 +129,6 @@ typedef struct { int mpeg_clamp; int perf_modulation; int interlaced; - struct radeon_bo *bo; - struct radeon_bo *mip_bo; } tex_resource_t; /* Texture sampler */ @@ -183,46 +170,12 @@ typedef struct { uint32_t num_indices; } draw_config_t; -#if defined(XF86DRM_MODE) -#define BEGIN_BATCH(n) \ -do { \ - if (info->cs) \ - radeon_ddx_cs_start(pScrn, (n), __FILE__, __func__, __LINE__); \ -} while(0) -#define END_BATCH() \ -do { \ - if (info->cs) \ - radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); \ -} while(0) -#define RELOC_BATCH(bo, rd, wd) \ -do { \ - if (info->cs) { \ - int _ret; \ - _ret = radeon_cs_write_reloc(info->cs, (bo), (rd), (wd), 0); \ - if (_ret) ErrorF("reloc emit failure %d (%s %d)\n", _ret, __func__, __LINE__); \ - } \ -} while(0) -#define E32(ib, dword) \ -do { \ - if (info->cs) \ - radeon_cs_write_dword(info->cs, (dword)); \ - else { \ - uint32_t *ib_head = (pointer)(char*)(ib)->address; \ - ib_head[(ib)->used >> 2] = (dword); \ - (ib)->used += 4; \ - } \ -} while (0) -#else -#define BEGIN_BATCH(n) do {(void)info;} while(0) -#define END_BATCH() do {} while(0) -#define RELOC_BATCH(bo, wd, rd) do {} while(0) #define E32(ib, dword) \ do { \ uint32_t *ib_head = (pointer)(char*)(ib)->address; \ ib_head[(ib)->used >> 2] = (dword); \ (ib)->used += 4; \ } while (0) -#endif #define EFLOAT(ib, val) \ do { \ @@ -242,13 +195,13 @@ do { \ do { \ if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) { \ PACK3((ib), IT_SET_CONFIG_REG, (num) + 1); \ - E32((ib), ((reg) - SET_CONFIG_REG_offset) >> 2); \ + E32(ib, ((reg) - SET_CONFIG_REG_offset) >> 2); \ } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \ - PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1); \ - E32((ib), ((reg) - SET_CONTEXT_REG_offset) >> 2); \ + PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1); \ + E32(ib, ((reg) - 0x28000) >> 2); \ } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \ PACK3((ib), IT_SET_ALU_CONST, (num) + 1); \ - E32((ib), ((reg) - SET_ALU_CONST_offset) >> 2); \ + E32(ib, ((reg) - SET_ALU_CONST_offset) >> 2); \ } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \ PACK3((ib), IT_SET_RESOURCE, num + 1); \ E32((ib), ((reg) - SET_RESOURCE_offset) >> 2); \ @@ -279,68 +232,51 @@ do { \ void R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib); void R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib); +uint64_t +upload (ScrnInfoPtr pScrn, void *shader, int size, int offset); void -r600_wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib); +wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib); void -r600_wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib); +wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib); void -r600_start_3d(ScrnInfoPtr pScrn, drmBufPtr ib); +start_3d(ScrnInfoPtr pScrn, drmBufPtr ib); void -r600_set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf, uint32_t domain); +set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf); void -r600_cp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, xf86CrtcPtr crtc, int start, int stop); +cp_set_surface_sync(ScrnInfoPtr pScrn, drmBufPtr ib, uint32_t sync_type, uint32_t size, uint64_t mc_addr); void -r600_set_spi(ScrnInfoPtr pScrn, drmBufPtr ib, int vs_export_count, int num_interp); +cp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, int crtc, int start, int stop); void -r600_fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf, uint32_t domain); +fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf); void -r600_vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf, uint32_t domain); +vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf); void -r600_ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf, uint32_t domain); +ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf); void -r600_set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf); +set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf); void -r600_set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val); +set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val); void -r600_set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, uint32_t domain); +set_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res); void -r600_set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s); +set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res); void -r600_set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); +set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s); void -r600_set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); +set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); void -r600_set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); +set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); void -r600_set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); +set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); void -r600_set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); +set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); void -r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib); +set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); void -r600_draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices); +set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib); void -r600_draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf); - -void r600_finish_op(ScrnInfoPtr pScrn, int vtx_size); - -Bool -R600SetAccelState(ScrnInfoPtr pScrn, - struct r600_accel_object *src0, - struct r600_accel_object *src1, - struct r600_accel_object *dst, - uint32_t vs_offset, uint32_t ps_offset, - int rop, Pixel planemask); - -extern Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index); -extern void RADEONFinishAccess_CS(PixmapPtr pPix, int index); -extern void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align); -extern void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height, - int depth, int usage_hint, int bitsPerPixel, - int *new_pitch); -extern void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv); -extern struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix); -extern Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix); - +draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices); +void +draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf); #endif diff --git a/driver/xf86-video-ati/src/r600_textured_videofuncs.c b/driver/xf86-video-ati/src/r600_textured_videofuncs.c index aab43f3a7..88745d5c0 100644 --- a/driver/xf86-video-ati/src/r600_textured_videofuncs.c +++ b/driver/xf86-video-ati/src/r600_textured_videofuncs.c @@ -45,17 +45,61 @@ #include "damage.h" -#include "radeon_exa_shared.h" -#include "radeon_vbo.h" - -/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces - note the difference to the parameters used in overlay are due - to 10bit vs. float calcs */ -static REF_TRANSFORM trans[2] = +static void +R600DoneTexturedVideo(ScrnInfoPtr pScrn) { - {1.1643, 0.0, 1.5960, -0.3918, -0.8129, 2.0172, 0.0}, /* BT.601 */ - {1.1643, 0.0, 1.7927, -0.2132, -0.5329, 2.1124, 0.0} /* BT.709 */ -}; + RADEONInfoPtr info = RADEONPTR(pScrn); + struct radeon_accel_state *accel_state = info->accel_state; + draw_config_t draw_conf; + vtx_resource_t vtx_res; + + CLEAR (draw_conf); + CLEAR (vtx_res); + + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = info->gartLocation + info->dri->bufStart + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + accel_state->vb_size = accel_state->vb_index * 16; + + /* flush vertex cache */ + if ((info->ChipFamily == CHIP_FAMILY_RV610) || + (info->ChipFamily == CHIP_FAMILY_RV620) || + (info->ChipFamily == CHIP_FAMILY_RS780) || + (info->ChipFamily == CHIP_FAMILY_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + /* Vertex buffer setup */ + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 16 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + /* sync destination surface */ + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); +} void R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) @@ -66,97 +110,23 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) BoxPtr pBox = REGION_RECTS(&pPriv->clip); int nBox = REGION_NUM_RECTS(&pPriv->clip); int dstxoff, dstyoff; - struct r600_accel_object src_obj, dst_obj; cb_config_t cb_conf; tex_resource_t tex_res; tex_sampler_t tex_samp; shader_config_t vs_conf, ps_conf; - /* - * y' = y - .0625 - * u' = u - .5 - * v' = v - .5; - * - * r = 1.1643 * y' + 0.0 * u' + 1.5958 * v' - * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v' - * b = 1.1643 * y' + 2.017 * u' + 0.0 * v' - * - * DP3 might look like the straightforward solution - * but we'd need to move the texture yuv values in - * the same reg for this to work. Therefore use MADs. - * Brightness just adds to the off constant. - * Contrast is multiplication of luminance. - * Saturation and hue change the u and v coeffs. - * Default values (before adjustments - depend on colorspace): - * yco = 1.1643 - * uco = 0, -0.39173, 2.017 - * vco = 1.5958, -0.8129, 0 - * off = -0.0625 * yco + -0.5 * uco[r] + -0.5 * vco[r], - * -0.0625 * yco + -0.5 * uco[g] + -0.5 * vco[g], - * -0.0625 * yco + -0.5 * uco[b] + -0.5 * vco[b], - * - * temp = MAD(yco, yuv.yyyy, off) - * temp = MAD(uco, yuv.uuuu, temp) - * result = MAD(vco, yuv.vvvv, temp) - */ - /* TODO: calc consts in the shader */ - const float Loff = -0.0627; - const float Coff = -0.502; - float uvcosf, uvsinf; - float yco; - float uco[3], vco[3], off[3]; - float bright, cont, gamma; - int ref = pPriv->transform_index; - Bool needgamma = FALSE; - float ps_alu_consts[12]; - float vs_alu_consts[4]; - - cont = RTFContrast(pPriv->contrast); - bright = RTFBrightness(pPriv->brightness); - gamma = (float)pPriv->gamma / 1000.0; - uvcosf = RTFSaturation(pPriv->saturation) * cos(RTFHue(pPriv->hue)); - uvsinf = RTFSaturation(pPriv->saturation) * sin(RTFHue(pPriv->hue)); - /* overlay video also does pre-gamma contrast/sat adjust, should we? */ - - yco = trans[ref].RefLuma * cont; - uco[0] = -trans[ref].RefRCr * uvsinf; - uco[1] = trans[ref].RefGCb * uvcosf - trans[ref].RefGCr * uvsinf; - uco[2] = trans[ref].RefBCb * uvcosf; - vco[0] = trans[ref].RefRCr * uvcosf; - vco[1] = trans[ref].RefGCb * uvsinf + trans[ref].RefGCr * uvcosf; - vco[2] = trans[ref].RefBCb * uvsinf; - off[0] = Loff * yco + Coff * (uco[0] + vco[0]) + bright; - off[1] = Loff * yco + Coff * (uco[1] + vco[1]) + bright; - off[2] = Loff * yco + Coff * (uco[2] + vco[2]) + bright; - - // XXX - gamma = 1.0; - - if (gamma != 1.0) { - needgamma = TRUE; - /* note: gamma correction is out = in ^ gamma; - gpu can only do LG2/EX2 therefore we transform into - in ^ gamma = 2 ^ (log2(in) * gamma). - Lots of scalar ops, unfortunately (better solution?) - - without gamma that's 3 inst, with gamma it's 10... - could use different gamma factors per channel, - if that's of any use. */ - } - - /* setup the ps consts */ - ps_alu_consts[0] = off[0]; - ps_alu_consts[1] = off[1]; - ps_alu_consts[2] = off[2]; - ps_alu_consts[3] = yco; - - ps_alu_consts[4] = uco[0]; - ps_alu_consts[5] = uco[1]; - ps_alu_consts[6] = uco[2]; - ps_alu_consts[7] = gamma; - - ps_alu_consts[8] = vco[0]; - ps_alu_consts[9] = vco[1]; - ps_alu_consts[10] = vco[2]; - ps_alu_consts[11] = 0.0; + int uv_offset; + static float ps_alu_consts[] = { + 1.0, 0.0, 1.4020, 0, /* r - c[0] */ + 1.0, -0.34414, -0.71414, 0, /* g - c[1] */ + 1.0, 1.7720, 0.0, 0, /* b - c[2] */ + /* Constants for undoing Y'CbCr scaling + * - Y' is scaled from 16:235 + * - Cb/Cr are scaled from 16:240 + * Unscaled value N' = N * N_mul + N_shift (N' in range [-0.5, 0.5]) + * Vector is [Y_mul, Y_shfit, C_mul, C_shift] + */ + 256.0/219.0, -16.0/219.0, 256.0/224.0, -128.0/224.0, + }; CLEAR (cb_conf); CLEAR (tex_res); @@ -164,40 +134,13 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) CLEAR (vs_conf); CLEAR (ps_conf); -#if defined(XF86DRM_MODE) - if (info->cs) { - dst_obj.offset = 0; - src_obj.offset = 0; - dst_obj.bo = radeon_get_pixmap_bo(pPixmap); - dst_obj.tiling_flags = radeon_get_pixmap_tiling(pPixmap); - } else -#endif - { - dst_obj.offset = exaGetPixmapOffset(pPixmap) + info->fbLocation + pScrn->fbOffset; - src_obj.offset = pPriv->src_offset + info->fbLocation + pScrn->fbOffset; - dst_obj.bo = src_obj.bo = NULL; - } - dst_obj.pitch = exaGetPixmapPitch(pPixmap) / (pPixmap->drawable.bitsPerPixel / 8); + accel_state->dst_pitch = exaGetPixmapPitch(pPixmap) / (pPixmap->drawable.bitsPerPixel / 8); + accel_state->src_pitch[0] = pPriv->src_pitch; - src_obj.pitch = pPriv->src_pitch; - src_obj.width = pPriv->w; - src_obj.height = pPriv->h; - src_obj.bpp = 16; - src_obj.domain = RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT; - src_obj.bo = pPriv->src_bo[pPriv->currentBuffer]; - src_obj.tiling_flags = 0; - - dst_obj.width = pPixmap->drawable.width; - dst_obj.height = pPixmap->drawable.height; - dst_obj.bpp = pPixmap->drawable.bitsPerPixel; - dst_obj.domain = RADEON_GEM_DOMAIN_VRAM; - - if (!R600SetAccelState(pScrn, - &src_obj, - NULL, - &dst_obj, - accel_state->xv_vs_offset, accel_state->xv_ps_offset, - 3, 0xffffffff)) + /* bad pitch */ + if (accel_state->src_pitch[0] & 7) + return; + if (accel_state->dst_pitch & 7) return; #ifdef COMPOSITE @@ -208,68 +151,86 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) dstyoff = 0; #endif - radeon_vbo_check(pScrn, &accel_state->vbo, 16); - radeon_cp_start(pScrn); + accel_state->ib = RADEONCPGetBuffer(pScrn); - r600_set_default_state(pScrn, accel_state->ib); + /* Init */ + start_3d(pScrn, accel_state->ib); - r600_set_generic_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_screen_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); - r600_set_window_scissor(pScrn, accel_state->ib, 0, 0, accel_state->dst_obj.width, accel_state->dst_obj.height); + set_default_state(pScrn, accel_state->ib); + + /* Scissor / viewport */ + EREG(accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG(accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); + + accel_state->vs_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->xv_vs_offset; + + accel_state->ps_mc_addr = info->fbLocation + pScrn->fbOffset + accel_state->shaders->offset + + accel_state->xv_ps_offset; /* PS bool constant */ switch(pPriv->id) { case FOURCC_YV12: case FOURCC_I420: - r600_set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (1 << 0)); + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (1 << 0)); break; case FOURCC_UYVY: case FOURCC_YUY2: default: - r600_set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (0 << 0)); + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (0 << 0)); break; } + accel_state->vs_size = 512; + accel_state->ps_size = 512; + /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + vs_conf.shader_addr = accel_state->vs_mc_addr; - vs_conf.shader_size = accel_state->vs_size; vs_conf.num_gprs = 2; vs_conf.stack_size = 0; - vs_conf.bo = accel_state->shaders_bo; - r600_vs_setup(pScrn, accel_state->ib, &vs_conf, RADEON_GEM_DOMAIN_VRAM); + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); ps_conf.shader_addr = accel_state->ps_mc_addr; - ps_conf.shader_size = accel_state->ps_size; ps_conf.num_gprs = 3; ps_conf.stack_size = 1; ps_conf.uncached_first_inst = 1; ps_conf.clamp_consts = 0; ps_conf.export_mode = 2; - ps_conf.bo = accel_state->shaders_bo; - r600_ps_setup(pScrn, accel_state->ib, &ps_conf, RADEON_GEM_DOMAIN_VRAM); + ps_setup (pScrn, accel_state->ib, &ps_conf); /* PS alu constants */ - r600_set_alu_consts(pScrn, accel_state->ib, SQ_ALU_CONSTANT_ps, - sizeof(ps_alu_consts) / SQ_ALU_CONSTANT_offset, ps_alu_consts); + set_alu_consts(pScrn, accel_state->ib, SQ_ALU_CONSTANT_ps, + sizeof(ps_alu_consts) / SQ_ALU_CONSTANT_offset, ps_alu_consts); /* Texture */ switch(pPriv->id) { case FOURCC_YV12: case FOURCC_I420: - accel_state->src_size[0] = accel_state->src_obj[0].pitch * pPriv->h; + accel_state->src_mc_addr[0] = pPriv->src_offset; + accel_state->src_size[0] = accel_state->src_pitch[0] * pPriv->h; + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, accel_state->src_size[0], + accel_state->src_mc_addr[0]); /* Y texture */ tex_res.id = 0; - tex_res.w = accel_state->src_obj[0].width; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch; + tex_res.w = pPriv->w; + tex_res.h = pPriv->h; + tex_res.pitch = accel_state->src_pitch[0]; tex_res.depth = 0; tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - tex_res.bo = accel_state->src_obj[0].bo; - tex_res.mip_bo = accel_state->src_obj[0].bo; + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; tex_res.format = FMT_8; tex_res.dst_sel_x = SQ_SEL_X; /* Y */ @@ -282,9 +243,7 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) tex_res.last_level = 0; tex_res.perf_modulation = 0; tex_res.interlaced = 0; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.tile_mode = 1; - r600_set_tex_resource(pScrn, accel_state->ib, &tex_res, accel_state->src_obj[0].domain); + set_tex_resource (pScrn, accel_state->ib, &tex_res); /* Y sampler */ tex_samp.id = 0; @@ -298,71 +257,81 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; tex_samp.mip_filter = 0; /* no mipmap */ - r600_set_tex_sampler(pScrn, accel_state->ib, &tex_samp); + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); /* U or V texture */ + uv_offset = accel_state->src_pitch[0] * pPriv->h; + uv_offset = (uv_offset + 255) & ~255; + + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[0] / 4, + accel_state->src_mc_addr[0] + uv_offset); + tex_res.id = 1; tex_res.format = FMT_8; - tex_res.w = accel_state->src_obj[0].width >> 1; - tex_res.h = accel_state->src_obj[0].height >> 1; - tex_res.pitch = RADEON_ALIGN(accel_state->src_obj[0].pitch >> 1, pPriv->hw_align); + tex_res.w = pPriv->w >> 1; + tex_res.h = pPriv->h >> 1; + tex_res.pitch = accel_state->src_pitch[0] >> 1; tex_res.dst_sel_x = SQ_SEL_X; /* V or U */ tex_res.dst_sel_y = SQ_SEL_1; tex_res.dst_sel_z = SQ_SEL_1; tex_res.dst_sel_w = SQ_SEL_1; tex_res.interlaced = 0; - tex_res.base = accel_state->src_obj[0].offset + pPriv->planev_offset; - tex_res.mip_base = accel_state->src_obj[0].offset + pPriv->planev_offset; - tex_res.size = tex_res.pitch * (pPriv->h >> 1); - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.tile_mode = 1; - r600_set_tex_resource(pScrn, accel_state->ib, &tex_res, accel_state->src_obj[0].domain); + tex_res.base = accel_state->src_mc_addr[0] + uv_offset; + tex_res.mip_base = accel_state->src_mc_addr[0] + uv_offset; + set_tex_resource (pScrn, accel_state->ib, &tex_res); /* U or V sampler */ tex_samp.id = 1; - r600_set_tex_sampler(pScrn, accel_state->ib, &tex_samp); + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); /* U or V texture */ + uv_offset += ((accel_state->src_pitch[0] >> 1) * (pPriv->h >> 1)); + uv_offset = (uv_offset + 255) & ~255; + + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[0] / 4, + accel_state->src_mc_addr[0] + uv_offset); + tex_res.id = 2; tex_res.format = FMT_8; - tex_res.w = accel_state->src_obj[0].width >> 1; - tex_res.h = accel_state->src_obj[0].height >> 1; - tex_res.pitch = RADEON_ALIGN(accel_state->src_obj[0].pitch >> 1, pPriv->hw_align); + tex_res.w = pPriv->w >> 1; + tex_res.h = pPriv->h >> 1; + tex_res.pitch = accel_state->src_pitch[0] >> 1; tex_res.dst_sel_x = SQ_SEL_X; /* V or U */ tex_res.dst_sel_y = SQ_SEL_1; tex_res.dst_sel_z = SQ_SEL_1; tex_res.dst_sel_w = SQ_SEL_1; tex_res.interlaced = 0; - tex_res.base = accel_state->src_obj[0].offset + pPriv->planeu_offset; - tex_res.mip_base = accel_state->src_obj[0].offset + pPriv->planeu_offset; - tex_res.size = tex_res.pitch * (pPriv->h >> 1); - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.tile_mode = 1; - r600_set_tex_resource(pScrn, accel_state->ib, &tex_res, accel_state->src_obj[0].domain); + tex_res.base = accel_state->src_mc_addr[0] + uv_offset; + tex_res.mip_base = accel_state->src_mc_addr[0] + uv_offset; + set_tex_resource (pScrn, accel_state->ib, &tex_res); /* UV sampler */ tex_samp.id = 2; - r600_set_tex_sampler(pScrn, accel_state->ib, &tex_samp); + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); break; case FOURCC_UYVY: case FOURCC_YUY2: default: - accel_state->src_size[0] = accel_state->src_obj[0].pitch * pPriv->h; + accel_state->src_mc_addr[0] = pPriv->src_offset; + accel_state->src_size[0] = accel_state->src_pitch[0] * pPriv->h; + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, accel_state->src_size[0], + accel_state->src_mc_addr[0]); /* Y texture */ tex_res.id = 0; - tex_res.w = accel_state->src_obj[0].width; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch >> 1; + tex_res.w = pPriv->w; + tex_res.h = pPriv->h; + tex_res.pitch = accel_state->src_pitch[0] >> 1; tex_res.depth = 0; tex_res.dim = SQ_TEX_DIM_2D; - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - tex_res.bo = accel_state->src_obj[0].bo; - tex_res.mip_bo = accel_state->src_obj[0].bo; + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; tex_res.format = FMT_8_8; if (pPriv->id == FOURCC_UYVY) @@ -378,9 +347,7 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) tex_res.last_level = 0; tex_res.perf_modulation = 0; tex_res.interlaced = 0; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.tile_mode = 1; - r600_set_tex_resource(pScrn, accel_state->ib, &tex_res, accel_state->src_obj[0].domain); + set_tex_resource (pScrn, accel_state->ib, &tex_res); /* Y sampler */ tex_samp.id = 0; @@ -394,14 +361,14 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; tex_samp.mip_filter = 0; /* no mipmap */ - r600_set_tex_sampler(pScrn, accel_state->ib, &tex_samp); + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); /* UV texture */ tex_res.id = 1; tex_res.format = FMT_8_8_8_8; - tex_res.w = accel_state->src_obj[0].width >> 1; - tex_res.h = accel_state->src_obj[0].height; - tex_res.pitch = accel_state->src_obj[0].pitch >> 2; + tex_res.w = pPriv->w >> 1; + tex_res.h = pPriv->h; + tex_res.pitch = accel_state->src_pitch[0] >> 2; if (pPriv->id == FOURCC_UYVY) { tex_res.dst_sel_x = SQ_SEL_X; /* V */ tex_res.dst_sel_y = SQ_SEL_Z; /* U */ @@ -413,26 +380,30 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) tex_res.dst_sel_w = SQ_SEL_1; tex_res.interlaced = 0; - tex_res.base = accel_state->src_obj[0].offset; - tex_res.mip_base = accel_state->src_obj[0].offset; - tex_res.size = accel_state->src_size[0]; - if (accel_state->src_obj[0].tiling_flags == 0) - tex_res.tile_mode = 1; - r600_set_tex_resource(pScrn, accel_state->ib, &tex_res, accel_state->src_obj[0].domain); + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; + set_tex_resource (pScrn, accel_state->ib, &tex_res); /* UV sampler */ tex_samp.id = 1; - r600_set_tex_sampler(pScrn, accel_state->ib, &tex_samp); + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); break; } - cb_conf.id = 0; - cb_conf.w = accel_state->dst_obj.pitch; - cb_conf.h = accel_state->dst_obj.height; - cb_conf.base = accel_state->dst_obj.offset; - cb_conf.bo = accel_state->dst_obj.bo; + /* Render setup */ + EREG(accel_state->ib, CB_SHADER_MASK, (0x0f << OUTPUT0_ENABLE_shift)); + EREG(accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + EREG(accel_state->ib, CB_COLOR_CONTROL, (0xcc << ROP3_shift)); /* copy */ - switch (accel_state->dst_obj.bpp) { + cb_conf.id = 0; + + accel_state->dst_mc_addr = exaGetPixmapOffset(pPixmap) + info->fbLocation + pScrn->fbOffset; + + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = pPixmap->drawable.height; + cb_conf.base = accel_state->dst_mc_addr; + + switch (pPixmap->drawable.bitsPerPixel) { case 16: if (pPixmap->drawable.depth == 15) { cb_conf.format = COLOR_1_5_5_5; @@ -441,16 +412,10 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) cb_conf.format = COLOR_5_6_5; cb_conf.comp_swap = 2; /* RGB */ } -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN16; -#endif break; case 32: cb_conf.format = COLOR_8_8_8_8; cb_conf.comp_swap = 1; /* ARGB */ -#if X_BYTE_ORDER == X_BIG_ENDIAN - cb_conf.endian = ENDIAN_8IN32; -#endif break; default: return; @@ -458,84 +423,96 @@ R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) cb_conf.source_format = 1; cb_conf.blend_clamp = 1; - cb_conf.pmask = 0xf; - cb_conf.rop = 3; - if (accel_state->dst_obj.tiling_flags == 0) - cb_conf.array_mode = 1; - r600_set_render_target(pScrn, accel_state->ib, &cb_conf, accel_state->dst_obj.domain); + set_render_target(pScrn, accel_state->ib, &cb_conf); - r600_set_spi(pScrn, accel_state->ib, (1 - 1), 1); + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ - vs_alu_consts[0] = 1.0 / pPriv->w; - vs_alu_consts[1] = 1.0 / pPriv->h; - vs_alu_consts[2] = 0.0; - vs_alu_consts[3] = 0.0; + /* Interpolator setup */ + /* export tex coords from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((1 - 1) << VS_EXPORT_COUNT_shift)); + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + + /* Enabling flat shading needs both FLAT_SHADE_bit in SPI_PS_INPUT_CNTL_x + * *and* FLAT_SHADE_ENA_bit in SPI_INTERP_CONTROL_0 */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, ((1 << NUM_INTERP_shift))); + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x03 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, 0); - /* VS alu constants */ - r600_set_alu_consts(pScrn, accel_state->ib, SQ_ALU_CONSTANT_vs, - sizeof(vs_alu_consts) / SQ_ALU_CONSTANT_offset, vs_alu_consts); if (pPriv->vsync) { - xf86CrtcPtr crtc; - if (pPriv->desired_crtc) - crtc = pPriv->desired_crtc; - else - crtc = radeon_pick_best_crtc(pScrn, - pPriv->drw_x, - pPriv->drw_x + pPriv->dst_w, - pPriv->drw_y, - pPriv->drw_y + pPriv->dst_h); - if (crtc) - r600_cp_wait_vline_sync(pScrn, accel_state->ib, pPixmap, - crtc, - pPriv->drw_y - crtc->y, - (pPriv->drw_y - crtc->y) + pPriv->dst_h); + xf86CrtcPtr crtc = radeon_xv_pick_best_crtc(pScrn, + pPriv->drw_x, + pPriv->drw_x + pPriv->dst_w, + pPriv->drw_y, + pPriv->drw_y + pPriv->dst_h); + if (crtc) { + RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; + + cp_wait_vline_sync(pScrn, accel_state->ib, pPixmap, + radeon_crtc->crtc_id, + pPriv->drw_y - crtc->y, + (pPriv->drw_y - crtc->y) + pPriv->dst_h); + } } + accel_state->vb_index = 0; + while (nBox--) { int srcX, srcY, srcw, srch; int dstX, dstY, dstw, dsth; float *vb; + if (((accel_state->vb_index + 3) * 16) > (accel_state->ib->total / 2)) { + R600DoneTexturedVideo(pScrn); + accel_state->vb_index = 0; + accel_state->ib = RADEONCPGetBuffer(pScrn); + } + + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 16); dstX = pBox->x1 + dstxoff; dstY = pBox->y1 + dstyoff; dstw = pBox->x2 - pBox->x1; dsth = pBox->y2 - pBox->y1; - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; + srcX = ((pBox->x1 - pPriv->drw_x) * + pPriv->src_w) / pPriv->dst_w; + srcY = ((pBox->y1 - pPriv->drw_y) * + pPriv->src_h) / pPriv->dst_h; srcw = (pPriv->src_w * dstw) / pPriv->dst_w; srch = (pPriv->src_h * dsth) / pPriv->dst_h; - vb = radeon_vbo_space(pScrn, &accel_state->vbo, 16); - vb[0] = (float)dstX; vb[1] = (float)dstY; - vb[2] = (float)srcX; - vb[3] = (float)srcY; + vb[2] = (float)srcX / pPriv->w; + vb[3] = (float)srcY / pPriv->h; vb[4] = (float)dstX; vb[5] = (float)(dstY + dsth); - vb[6] = (float)srcX; - vb[7] = (float)(srcY + srch); + vb[6] = (float)srcX / pPriv->w; + vb[7] = (float)(srcY + srch) / pPriv->h; vb[8] = (float)(dstX + dstw); vb[9] = (float)(dstY + dsth); - vb[10] = (float)(srcX + srcw); - vb[11] = (float)(srcY + srch); + vb[10] = (float)(srcX + srcw) / pPriv->w; + vb[11] = (float)(srcY + srch) / pPriv->h; - radeon_vbo_commit(pScrn, &accel_state->vbo); + accel_state->vb_index += 3; pBox++; } - r600_finish_op(pScrn, 16); + R600DoneTexturedVideo(pScrn); DamageDamageRegion(pPriv->pDraw, &pPriv->clip); } diff --git a/driver/xf86-video-ati/src/r6xx_accel.c b/driver/xf86-video-ati/src/r6xx_accel.c index 752165b70..bce597b12 100644 --- a/driver/xf86-video-ati/src/r6xx_accel.c +++ b/driver/xf86-video-ati/src/r6xx_accel.c @@ -38,31 +38,6 @@ #include "r600_state.h" #include "radeon_drm.h" -#include "radeon_vbo.h" -#include "radeon_exa_shared.h" - -static const uint32_t R600_ROP[16] = { - RADEON_ROP3_ZERO, /* GXclear */ - RADEON_ROP3_DSa, /* Gxand */ - RADEON_ROP3_SDna, /* GXandReverse */ - RADEON_ROP3_S, /* GXcopy */ - RADEON_ROP3_DSna, /* GXandInverted */ - RADEON_ROP3_D, /* GXnoop */ - RADEON_ROP3_DSx, /* GXxor */ - RADEON_ROP3_DSo, /* GXor */ - RADEON_ROP3_DSon, /* GXnor */ - RADEON_ROP3_DSxn, /* GXequiv */ - RADEON_ROP3_Dn, /* GXinvert */ - RADEON_ROP3_SDno, /* GXorReverse */ - RADEON_ROP3_Sn, /* GXcopyInverted */ - RADEON_ROP3_DSno, /* GXorInverted */ - RADEON_ROP3_DSan, /* GXnand */ - RADEON_ROP3_ONE, /* GXset */ -}; - -/* we try and batch operations together under KMS - - but it doesn't work yet without misrendering */ -#define KMS_MULTI_OP 1 /* Flush the indirect buffer to the kernel for submission to the card */ void R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib) @@ -72,27 +47,15 @@ void R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib) int start = 0; drm_radeon_indirect_t indirect; -#if defined(XF86DRM_MODE) - if (info->cs) { - radeon_cs_flush_indirect(pScrn); - return; - } -#endif - if (!buffer) return; //xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Flushing buffer %d\n", // buffer->idx); while (buffer->used & 0x3c){ - BEGIN_BATCH(1); E32(buffer, CP_PACKET2()); /* fill up to multiple of 16 dwords */ - END_BATCH(); } - info->accel_state->vbo.vb_offset = 0; - info->accel_state->vbo.vb_start_op = -1; - //ErrorF("buffer bytes: %d\n", buffer->used); indirect.idx = buffer->idx; @@ -107,12 +70,6 @@ void R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib) void R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib) { -#if defined(XF86DRM_MODE) - RADEONInfoPtr info = RADEONPTR(pScrn); - if (info->cs) { - radeon_ib_discard(pScrn); - } -#endif if (!ib) return; ib->used = 0; @@ -120,47 +77,109 @@ void R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib) } void -r600_wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib) +wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib) { - RADEONInfoPtr info = RADEONPTR(pScrn); //flush caches, don't generate timestamp - BEGIN_BATCH(5); PACK3(ib, IT_EVENT_WRITE, 1); E32(ib, CACHE_FLUSH_AND_INV_EVENT); // wait for 3D idle clean EREG(ib, WAIT_UNTIL, (WAIT_3D_IDLE_bit | WAIT_3D_IDLECLEAN_bit)); - END_BATCH(); } void -r600_wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib) +wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib) { - RADEONInfoPtr info = RADEONPTR(pScrn); - BEGIN_BATCH(3); EREG(ib, WAIT_UNTIL, WAIT_3D_IDLE_bit); - END_BATCH(); + +} + +static void +reset_cb(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + PACK0(ib, CB_COLOR0_INFO, 8); + for (i = 0; i < 8; i++) + E32(ib, 0); +} + +static void +reset_td_samplers(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + wait_3d_idle(pScrn, ib); + + PACK0(ib, TD_PS_SAMPLER0_BORDER_RED, 4*TD_PS_SAMPLER0_BORDER_RED_num); + for (i = 0; i < 4*TD_PS_SAMPLER0_BORDER_RED_num; i++) + E32(ib, 0); + PACK0(ib, TD_VS_SAMPLER0_BORDER_RED, 4*TD_VS_SAMPLER0_BORDER_RED_num); + for (i = 0; i < 4*TD_VS_SAMPLER0_BORDER_RED_num; i++) + E32(ib, 0); + + wait_3d_idle(pScrn, ib); +} + +static void +reset_sampler_const (ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + for (i = 0; i < SQ_TEX_SAMPLER_WORD_all_num; i++) { + PACK0(ib, SQ_TEX_SAMPLER_WORD + i * SQ_TEX_SAMPLER_WORD_offset, 3); + E32(ib, SQ_TEX_DEPTH_COMPARE_LESSEQUAL << DEPTH_COMPARE_FUNCTION_shift); + E32(ib, MAX_LOD_mask); + E32(ib, 0); + } +} + +static void +reset_dx9_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + const int count = SQ_ALU_CONSTANT_all_num * (SQ_ALU_CONSTANT_offset >> 2); + + PACK0(ib, SQ_ALU_CONSTANT, count); + for (i = 0; i < count; i++) + EFLOAT(ib, 0.0); +} + +static void +reset_bool_loop_const(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + + PACK0(ib, SQ_BOOL_CONST, SQ_BOOL_CONST_all_num); + for (i = 0; i < SQ_BOOL_CONST_all_num; i++) + E32(ib, 0); + + PACK0(ib, SQ_LOOP_CONST, SQ_LOOP_CONST_all_num); + + for (i = 0; i < SQ_LOOP_CONST_all_num; i++) + E32(ib, 0); + } void -r600_start_3d(ScrnInfoPtr pScrn, drmBufPtr ib) +start_3d(ScrnInfoPtr pScrn, drmBufPtr ib) { RADEONInfoPtr info = RADEONPTR(pScrn); if (info->ChipFamily < CHIP_FAMILY_RV770) { - BEGIN_BATCH(5); PACK3(ib, IT_START_3D_CMDBUF, 1); E32(ib, 0); - } else - BEGIN_BATCH(3); + } PACK3(ib, IT_CONTEXT_CONTROL, 2); E32(ib, 0x80000000); E32(ib, 0x80000000); - END_BATCH(); + wait_3d_idle_clean (pScrn, ib); } /* @@ -169,7 +188,7 @@ r600_start_3d(ScrnInfoPtr pScrn, drmBufPtr ib) // asic stack/thread/gpr limits - need to query the drm static void -r600_sq_setup(ScrnInfoPtr pScrn, drmBufPtr ib, sq_config_t *sq_conf) +sq_setup(ScrnInfoPtr pScrn, drmBufPtr ib, sq_config_t *sq_conf) { uint32_t sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2; uint32_t sq_thread_resource_mgmt, sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2; @@ -178,7 +197,6 @@ r600_sq_setup(ScrnInfoPtr pScrn, drmBufPtr ib, sq_config_t *sq_conf) if ((info->ChipFamily == CHIP_FAMILY_RV610) || (info->ChipFamily == CHIP_FAMILY_RV620) || (info->ChipFamily == CHIP_FAMILY_RS780) || - (info->ChipFamily == CHIP_FAMILY_RS880) || (info->ChipFamily == CHIP_FAMILY_RV710)) sq_config = 0; // no VC else @@ -208,7 +226,6 @@ r600_sq_setup(ScrnInfoPtr pScrn, drmBufPtr ib, sq_config_t *sq_conf) sq_stack_resource_mgmt_2 = ((sq_conf->num_gs_stack_entries << NUM_GS_STACK_ENTRIES_shift) | (sq_conf->num_es_stack_entries << NUM_ES_STACK_ENTRIES_shift)); - BEGIN_BATCH(8); PACK0(ib, SQ_CONFIG, 6); E32(ib, sq_config); E32(ib, sq_gpr_resource_mgmt_1); @@ -216,13 +233,13 @@ r600_sq_setup(ScrnInfoPtr pScrn, drmBufPtr ib, sq_config_t *sq_conf) E32(ib, sq_thread_resource_mgmt); E32(ib, sq_stack_resource_mgmt_1); E32(ib, sq_stack_resource_mgmt_2); - END_BATCH(); + } void -r600_set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf, uint32_t domain) +set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf) { - uint32_t cb_color_info, cb_color_control; + uint32_t cb_color_info; int pitch, slice, h; RADEONInfoPtr info = RADEONPTR(pScrn); @@ -252,195 +269,101 @@ r600_set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf, ui cb_color_info |= SOURCE_FORMAT_bit; pitch = (cb_conf->w / 8) - 1; - h = RADEON_ALIGN(cb_conf->h, 8); + h = (cb_conf->h + 7) & ~7; slice = ((cb_conf->w * h) / 64) - 1; - BEGIN_BATCH(3 + 2); EREG(ib, (CB_COLOR0_BASE + (4 * cb_conf->id)), (cb_conf->base >> 8)); - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); // rv6xx workaround if ((info->ChipFamily > CHIP_FAMILY_R600) && - (info->ChipFamily < CHIP_FAMILY_RV770)) { - BEGIN_BATCH(2); - PACK3(ib, IT_SURFACE_BASE_UPDATE, 1); - E32(ib, (2 << cb_conf->id)); - END_BATCH(); + (info->ChipFamily < CHIP_FAMILY_RV770)) { + PACK3(ib, IT_SURFACE_BASE_UPDATE, 1); + E32(ib, (2 << cb_conf->id)); } - /* Set CMASK & TILE buffer to the offset of color buffer as - * we don't use those this shouldn't cause any issue and we - * then have a valid cmd stream - */ - BEGIN_BATCH(3 + 2); - EREG(ib, (CB_COLOR0_TILE + (4 * cb_conf->id)), (0 >> 8)); // CMASK per-tile data base/256 - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - BEGIN_BATCH(3 + 2); - EREG(ib, (CB_COLOR0_FRAG + (4 * cb_conf->id)), (0 >> 8)); // FMASK per-tile data base/256 - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - BEGIN_BATCH(9); + // pitch only for ARRAY_LINEAR_GENERAL, other tiling modes require addrlib EREG(ib, (CB_COLOR0_SIZE + (4 * cb_conf->id)), ((pitch << PITCH_TILE_MAX_shift) | (slice << SLICE_TILE_MAX_shift))); EREG(ib, (CB_COLOR0_VIEW + (4 * cb_conf->id)), ((0 << SLICE_START_shift) | (0 << SLICE_MAX_shift))); + EREG(ib, (CB_COLOR0_INFO + (4 * cb_conf->id)), cb_color_info); + EREG(ib, (CB_COLOR0_TILE + (4 * cb_conf->id)), (0 >> 8)); // CMASK per-tile data base/256 + EREG(ib, (CB_COLOR0_FRAG + (4 * cb_conf->id)), (0 >> 8)); // FMASK per-tile data base/256 EREG(ib, (CB_COLOR0_MASK + (4 * cb_conf->id)), ((0 << CMASK_BLOCK_MAX_shift) | (0 << FMASK_TILE_MAX_shift))); - END_BATCH(); - - BEGIN_BATCH(3 + 2); - EREG(ib, (CB_COLOR0_INFO + (4 * cb_conf->id)), cb_color_info); - RELOC_BATCH(cb_conf->bo, 0, domain); - END_BATCH(); - - BEGIN_BATCH(9); - EREG(ib, CB_TARGET_MASK, (cb_conf->pmask << TARGET0_ENABLE_shift)); - cb_color_control = R600_ROP[cb_conf->rop] | - (cb_conf->blend_enable << TARGET_BLEND_ENABLE_shift); - if (info->ChipFamily == CHIP_FAMILY_R600) { - /* no per-MRT blend on R600 */ - EREG(ib, CB_COLOR_CONTROL, cb_color_control); - EREG(ib, CB_BLEND_CONTROL, cb_conf->blendcntl); - } else { - if (cb_conf->blend_enable) - cb_color_control |= PER_MRT_BLEND_bit; - EREG(ib, CB_COLOR_CONTROL, cb_color_control); - EREG(ib, CB_BLEND0_CONTROL, cb_conf->blendcntl); - } - END_BATCH(); } -static void -r600_cp_set_surface_sync(ScrnInfoPtr pScrn, drmBufPtr ib, uint32_t sync_type, - uint32_t size, uint64_t mc_addr, - struct radeon_bo *bo, uint32_t rdomains, uint32_t wdomain) +void +cp_set_surface_sync(ScrnInfoPtr pScrn, drmBufPtr ib, uint32_t sync_type, uint32_t size, uint64_t mc_addr) { - RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t cp_coher_size; if (size == 0xffffffff) cp_coher_size = 0xffffffff; else cp_coher_size = ((size + 255) >> 8); - BEGIN_BATCH(5 + 2); PACK3(ib, IT_SURFACE_SYNC, 4); E32(ib, sync_type); E32(ib, cp_coher_size); E32(ib, (mc_addr >> 8)); E32(ib, 10); /* poll interval */ - RELOC_BATCH(bo, rdomains, wdomain); - END_BATCH(); } /* inserts a wait for vline in the command stream */ -void -r600_cp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, - xf86CrtcPtr crtc, int start, int stop) +void cp_wait_vline_sync(ScrnInfoPtr pScrn, drmBufPtr ib, PixmapPtr pPix, + int crtc, int start, int stop) { RADEONInfoPtr info = RADEONPTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); uint32_t offset; + RADEONCrtcPrivatePtr radeon_crtc; - if (!crtc) + if ((crtc < 0) || (crtc > 1)) return; if (stop < start) return; - if (!crtc->enabled) + if (!xf86_config->crtc[crtc]->enabled) return; - if (info->cs) { - if (pPix != pScrn->pScreen->GetScreenPixmap(pScrn->pScreen)) - return; - } else { #ifdef USE_EXA - if (info->useEXA) - offset = exaGetPixmapOffset(pPix); - else + if (info->useEXA) + offset = exaGetPixmapOffset(pPix); + else #endif - offset = pPix->devPrivate.ptr - info->FB; + offset = pPix->devPrivate.ptr - info->FB; - /* if drawing to front buffer */ - if (offset != 0) - return; - } + /* if drawing to front buffer */ + if (offset != 0) + return; start = max(start, 0); - stop = min(stop, crtc->mode.VDisplay); + stop = min(stop, xf86_config->crtc[crtc]->mode.VDisplay); - if (start > crtc->mode.VDisplay) + if (start > xf86_config->crtc[crtc]->mode.VDisplay) return; - /* on r5xx+ vline starts at viewport_y */ - start += crtc->y; - stop += crtc->y; + radeon_crtc = xf86_config->crtc[crtc]->driver_private; -#if defined(XF86DRM_MODE) - if (info->cs) { - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; + /* set the VLINE range */ + EREG(ib, AVIVO_D1MODE_VLINE_START_END + radeon_crtc->crtc_offset, + (start << AVIVO_D1MODE_VLINE_START_SHIFT) | + (stop << AVIVO_D1MODE_VLINE_END_SHIFT)); - BEGIN_BATCH(11); - /* set the VLINE range */ - EREG(ib, AVIVO_D1MODE_VLINE_START_END, /* this is just a marker */ - (start << AVIVO_D1MODE_VLINE_START_SHIFT) | - (stop << AVIVO_D1MODE_VLINE_END_SHIFT)); - - /* tell the CP to poll the VLINE state register */ - PACK3(ib, IT_WAIT_REG_MEM, 6); - E32(ib, IT_WAIT_REG | IT_WAIT_EQ); - E32(ib, IT_WAIT_ADDR(AVIVO_D1MODE_VLINE_STATUS)); - E32(ib, 0); - E32(ib, 0); // Ref value - E32(ib, AVIVO_D1MODE_VLINE_STAT); // Mask - E32(ib, 10); // Wait interval - /* add crtc reloc */ - PACK3(ib, IT_NOP, 1); - E32(ib, drmmode_crtc->mode_crtc->crtc_id); - END_BATCH(); - } else -#endif - { - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - - BEGIN_BATCH(9); - /* set the VLINE range */ - EREG(ib, AVIVO_D1MODE_VLINE_START_END + radeon_crtc->crtc_offset, - (start << AVIVO_D1MODE_VLINE_START_SHIFT) | - (stop << AVIVO_D1MODE_VLINE_END_SHIFT)); - - /* tell the CP to poll the VLINE state register */ - PACK3(ib, IT_WAIT_REG_MEM, 6); - E32(ib, IT_WAIT_REG | IT_WAIT_EQ); - E32(ib, IT_WAIT_ADDR(AVIVO_D1MODE_VLINE_STATUS + radeon_crtc->crtc_offset)); - E32(ib, 0); - E32(ib, 0); // Ref value - E32(ib, AVIVO_D1MODE_VLINE_STAT); // Mask - E32(ib, 10); // Wait interval - END_BATCH(); - } + /* tell the CP to poll the VLINE state register */ + PACK3(ib, IT_WAIT_REG_MEM, 6); + E32(ib, IT_WAIT_REG | IT_WAIT_EQ); + E32(ib, IT_WAIT_ADDR(AVIVO_D1MODE_VLINE_STATUS + radeon_crtc->crtc_offset)); + E32(ib, 0); + E32(ib, 0); // Ref value + E32(ib, AVIVO_D1MODE_VLINE_STAT); // Mask + E32(ib, 10); // Wait interval } void -r600_set_spi(ScrnInfoPtr pScrn, drmBufPtr ib, int vs_export_count, int num_interp) +fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf) { - RADEONInfoPtr info = RADEONPTR(pScrn); - - BEGIN_BATCH(8); - /* Interpolator setup */ - EREG(ib, SPI_VS_OUT_CONFIG, (vs_export_count << VS_EXPORT_COUNT_shift)); - PACK0(ib, SPI_PS_IN_CONTROL_0, 3); - E32(ib, (num_interp << NUM_INTERP_shift)); - E32(ib, 0); - E32(ib, 0); - END_BATCH(); -} - -void -r600_fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf, uint32_t domain) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t sq_pgm_resources; sq_pgm_resources = ((fs_conf->num_gprs << NUM_GPRS_shift) | @@ -449,21 +372,14 @@ r600_fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf, uint32_ if (fs_conf->dx10_clamp) sq_pgm_resources |= SQ_PGM_RESOURCES_FS__DX10_CLAMP_bit; - BEGIN_BATCH(3 + 2); EREG(ib, SQ_PGM_START_FS, fs_conf->shader_addr >> 8); - RELOC_BATCH(fs_conf->bo, domain, 0); - END_BATCH(); - - BEGIN_BATCH(6); EREG(ib, SQ_PGM_RESOURCES_FS, sq_pgm_resources); EREG(ib, SQ_PGM_CF_OFFSET_FS, 0); - END_BATCH(); } void -r600_vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf, uint32_t domain) +vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf) { - RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t sq_pgm_resources; sq_pgm_resources = ((vs_conf->num_gprs << NUM_GPRS_shift) | @@ -476,26 +392,14 @@ r600_vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf, uint32_ if (vs_conf->uncached_first_inst) sq_pgm_resources |= UNCACHED_FIRST_INST_bit; - /* flush SQ cache */ - r600_cp_set_surface_sync(pScrn, ib, SH_ACTION_ENA_bit, - vs_conf->shader_size, vs_conf->shader_addr, - vs_conf->bo, domain, 0); - - BEGIN_BATCH(3 + 2); EREG(ib, SQ_PGM_START_VS, vs_conf->shader_addr >> 8); - RELOC_BATCH(vs_conf->bo, domain, 0); - END_BATCH(); - - BEGIN_BATCH(6); EREG(ib, SQ_PGM_RESOURCES_VS, sq_pgm_resources); EREG(ib, SQ_PGM_CF_OFFSET_VS, 0); - END_BATCH(); } void -r600_ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf, uint32_t domain) +ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf) { - RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t sq_pgm_resources; sq_pgm_resources = ((ps_conf->num_gprs << NUM_GPRS_shift) | @@ -510,54 +414,35 @@ r600_ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf, uint32_ if (ps_conf->clamp_consts) sq_pgm_resources |= CLAMP_CONSTS_bit; - /* flush SQ cache */ - r600_cp_set_surface_sync(pScrn, ib, SH_ACTION_ENA_bit, - ps_conf->shader_size, ps_conf->shader_addr, - ps_conf->bo, domain, 0); - - BEGIN_BATCH(3 + 2); EREG(ib, SQ_PGM_START_PS, ps_conf->shader_addr >> 8); - RELOC_BATCH(ps_conf->bo, domain, 0); - END_BATCH(); - - BEGIN_BATCH(9); EREG(ib, SQ_PGM_RESOURCES_PS, sq_pgm_resources); EREG(ib, SQ_PGM_EXPORTS_PS, ps_conf->export_mode); EREG(ib, SQ_PGM_CF_OFFSET_PS, 0); - END_BATCH(); } void -r600_set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf) +set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf) { - RADEONInfoPtr info = RADEONPTR(pScrn); int i; const int countreg = count * (SQ_ALU_CONSTANT_offset >> 2); - BEGIN_BATCH(2 + countreg); PACK0(ib, SQ_ALU_CONSTANT + offset * SQ_ALU_CONSTANT_offset, countreg); for (i = 0; i < countreg; i++) EFLOAT(ib, const_buf[i]); - END_BATCH(); } void -r600_set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val) +set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val) { - RADEONInfoPtr info = RADEONPTR(pScrn); /* bool register order is: ps, vs, gs; one register each * 1 bits per bool; 32 bools each for ps, vs, gs. */ - BEGIN_BATCH(3); EREG(ib, SQ_BOOL_CONST + offset * SQ_BOOL_CONST_offset, val); - END_BATCH(); } -static void -r600_set_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res, uint32_t domain) +void +set_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res) { - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; uint32_t sq_vtx_constant_word2; sq_vtx_constant_word2 = ((((res->vb_addr) >> 32) & BASE_ADDRESS_HI_mask) | @@ -574,23 +459,6 @@ r600_set_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res, uint if (res->srf_mode_all) sq_vtx_constant_word2 |= SQ_VTX_CONSTANT_WORD2_0__SRF_MODE_ALL_bit; - /* flush vertex cache */ - if ((info->ChipFamily == CHIP_FAMILY_RV610) || - (info->ChipFamily == CHIP_FAMILY_RV620) || - (info->ChipFamily == CHIP_FAMILY_RS780) || - (info->ChipFamily == CHIP_FAMILY_RS880) || - (info->ChipFamily == CHIP_FAMILY_RV710)) - r600_cp_set_surface_sync(pScrn, ib, TC_ACTION_ENA_bit, - accel_state->vbo.vb_offset, accel_state->vbo.vb_mc_addr, - res->bo, - domain, 0); - else - r600_cp_set_surface_sync(pScrn, ib, VC_ACTION_ENA_bit, - accel_state->vbo.vb_offset, accel_state->vbo.vb_mc_addr, - res->bo, - domain, 0); - - BEGIN_BATCH(9 + 2); PACK0(ib, SQ_VTX_RESOURCE + res->id * SQ_VTX_RESOURCE_offset, 7); E32(ib, res->vb_addr & 0xffffffff); // 0: BASE_ADDRESS E32(ib, (res->vtx_num_entries << 2) - 1); // 1: SIZE @@ -599,14 +467,11 @@ r600_set_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res, uint E32(ib, 0); // 4: n/a E32(ib, 0); // 5: n/a E32(ib, SQ_TEX_VTX_VALID_BUFFER << SQ_VTX_CONSTANT_WORD6_0__TYPE_shift); // 6: TYPE - RELOC_BATCH(res->bo, domain, 0); - END_BATCH(); } void -r600_set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, uint32_t domain) +set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res) { - RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t sq_tex_resource_word0, sq_tex_resource_word1, sq_tex_resource_word4; uint32_t sq_tex_resource_word5, sq_tex_resource_word6; @@ -656,12 +521,6 @@ r600_set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, if (tex_res->interlaced) sq_tex_resource_word6 |= INTERLACED_bit; - /* flush texture cache */ - r600_cp_set_surface_sync(pScrn, ib, TC_ACTION_ENA_bit, - tex_res->size, tex_res->base, - tex_res->bo, domain, 0); - - BEGIN_BATCH(9 + 4); PACK0(ib, SQ_TEX_RESOURCE + tex_res->id * SQ_TEX_RESOURCE_offset, 7); E32(ib, sq_tex_resource_word0); E32(ib, sq_tex_resource_word1); @@ -670,15 +529,11 @@ r600_set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res, E32(ib, sq_tex_resource_word4); E32(ib, sq_tex_resource_word5); E32(ib, sq_tex_resource_word6); - RELOC_BATCH(tex_res->bo, domain, 0); - RELOC_BATCH(tex_res->mip_bo, domain, 0); - END_BATCH(); } void -r600_set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s) +set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s) { - RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t sq_tex_sampler_word0, sq_tex_sampler_word1, sq_tex_sampler_word2; sq_tex_sampler_word0 = ((s->clamp_x << SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift) | @@ -718,86 +573,68 @@ r600_set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s) if (s->type) sq_tex_sampler_word2 |= SQ_TEX_SAMPLER_WORD2_0__TYPE_bit; - BEGIN_BATCH(5); PACK0(ib, SQ_TEX_SAMPLER_WORD + s->id * SQ_TEX_SAMPLER_WORD_offset, 3); E32(ib, sq_tex_sampler_word0); E32(ib, sq_tex_sampler_word1); E32(ib, sq_tex_sampler_word2); - END_BATCH(); } //XXX deal with clip offsets in clip setup void -r600_set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) +set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) { - RADEONInfoPtr info = RADEONPTR(pScrn); - BEGIN_BATCH(4); - PACK0(ib, PA_SC_SCREEN_SCISSOR_TL, 2); - E32(ib, ((x1 << PA_SC_SCREEN_SCISSOR_TL__TL_X_shift) | - (y1 << PA_SC_SCREEN_SCISSOR_TL__TL_Y_shift))); - E32(ib, ((x2 << PA_SC_SCREEN_SCISSOR_BR__BR_X_shift) | - (y2 << PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift))); - END_BATCH(); + EREG(ib, PA_SC_SCREEN_SCISSOR_TL, ((x1 << PA_SC_SCREEN_SCISSOR_TL__TL_X_shift) | + (y1 << PA_SC_SCREEN_SCISSOR_TL__TL_Y_shift))); + EREG(ib, PA_SC_SCREEN_SCISSOR_BR, ((x2 << PA_SC_SCREEN_SCISSOR_BR__BR_X_shift) | + (y2 << PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift))); } void -r600_set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2) +set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2) { - RADEONInfoPtr info = RADEONPTR(pScrn); - BEGIN_BATCH(4); - PACK0(ib, PA_SC_VPORT_SCISSOR_0_TL + id * PA_SC_VPORT_SCISSOR_0_TL_offset, 2); - E32(ib, ((x1 << PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift) | - (y1 << PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift) | - WINDOW_OFFSET_DISABLE_bit)); - E32(ib, ((x2 << PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift) | - (y2 << PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift))); - END_BATCH(); + EREG(ib, PA_SC_VPORT_SCISSOR_0_TL + + id * PA_SC_VPORT_SCISSOR_0_TL_offset, ((x1 << PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift) | + (y1 << PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift) | + WINDOW_OFFSET_DISABLE_bit)); + EREG(ib, PA_SC_VPORT_SCISSOR_0_BR + + id * PA_SC_VPORT_SCISSOR_0_BR_offset, ((x2 << PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift) | + (y2 << PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift))); } void -r600_set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) +set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) { - RADEONInfoPtr info = RADEONPTR(pScrn); - BEGIN_BATCH(4); - PACK0(ib, PA_SC_GENERIC_SCISSOR_TL, 2); - E32(ib, ((x1 << PA_SC_GENERIC_SCISSOR_TL__TL_X_shift) | - (y1 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift) | - WINDOW_OFFSET_DISABLE_bit)); - E32(ib, ((x2 << PA_SC_GENERIC_SCISSOR_BR__BR_X_shift) | - (y2 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift))); - END_BATCH(); + EREG(ib, PA_SC_GENERIC_SCISSOR_TL, ((x1 << PA_SC_GENERIC_SCISSOR_TL__TL_X_shift) | + (y1 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift) | + WINDOW_OFFSET_DISABLE_bit)); + EREG(ib, PA_SC_GENERIC_SCISSOR_BR, ((x2 << PA_SC_GENERIC_SCISSOR_BR__BR_X_shift) | + (y2 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift))); } void -r600_set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) +set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) { - RADEONInfoPtr info = RADEONPTR(pScrn); - BEGIN_BATCH(4); - PACK0(ib, PA_SC_WINDOW_SCISSOR_TL, 2); - E32(ib, ((x1 << PA_SC_WINDOW_SCISSOR_TL__TL_X_shift) | - (y1 << PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift) | - WINDOW_OFFSET_DISABLE_bit)); - E32(ib, ((x2 << PA_SC_WINDOW_SCISSOR_BR__BR_X_shift) | - (y2 << PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift))); - END_BATCH(); + EREG(ib, PA_SC_WINDOW_SCISSOR_TL, ((x1 << PA_SC_WINDOW_SCISSOR_TL__TL_X_shift) | + (y1 << PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift) | + WINDOW_OFFSET_DISABLE_bit)); + EREG(ib, PA_SC_WINDOW_SCISSOR_BR, ((x2 << PA_SC_WINDOW_SCISSOR_BR__BR_X_shift) | + (y2 << PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift))); } void -r600_set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2) +set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2) { - RADEONInfoPtr info = RADEONPTR(pScrn); - BEGIN_BATCH(4); - PACK0(ib, PA_SC_CLIPRECT_0_TL + id * PA_SC_CLIPRECT_0_TL_offset, 2); - E32(ib, ((x1 << PA_SC_CLIPRECT_0_TL__TL_X_shift) | - (y1 << PA_SC_CLIPRECT_0_TL__TL_Y_shift))); - E32(ib, ((x2 << PA_SC_CLIPRECT_0_BR__BR_X_shift) | - (y2 << PA_SC_CLIPRECT_0_BR__BR_Y_shift))); - END_BATCH(); + EREG(ib, PA_SC_CLIPRECT_0_TL + + id * PA_SC_CLIPRECT_0_TL_offset, ((x1 << PA_SC_CLIPRECT_0_TL__TL_X_shift) | + (y1 << PA_SC_CLIPRECT_0_TL__TL_Y_shift))); + EREG(ib, PA_SC_CLIPRECT_0_BR + + id * PA_SC_CLIPRECT_0_BR_offset, ((x2 << PA_SC_CLIPRECT_0_BR__BR_X_shift) | + (y2 << PA_SC_CLIPRECT_0_BR__BR_Y_shift))); } /* @@ -805,7 +642,7 @@ r600_set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int */ void -r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) +set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) { tex_resource_t tex_res; shader_config_t fs_conf; @@ -814,15 +651,49 @@ r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) RADEONInfoPtr info = RADEONPTR(pScrn); struct radeon_accel_state *accel_state = info->accel_state; - if (accel_state->XInited3D) - return; - memset(&tex_res, 0, sizeof(tex_resource_t)); memset(&fs_conf, 0, sizeof(shader_config_t)); +#if 1 + if (accel_state->XInited3D) + return; +#endif + accel_state->XInited3D = TRUE; - r600_start_3d(pScrn, accel_state->ib); + wait_3d_idle(pScrn, ib); + + // ASIC specific setup, see drm + if (info->ChipFamily < CHIP_FAMILY_RV770) { + EREG(ib, TA_CNTL_AUX, (( 3 << GRADIENT_CREDIT_shift) | + (28 << TD_FIFO_CREDIT_shift))); + EREG(ib, VC_ENHANCE, 0); + EREG(ib, R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); + EREG(ib, DB_DEBUG, 0x82000000); /* ? */ + EREG(ib, DB_WATERMARKS, ((4 << DEPTH_FREE_shift) | + (16 << DEPTH_FLUSH_shift) | + (0 << FORCE_SUMMARIZE_shift) | + (4 << DEPTH_PENDING_FREE_shift) | + (16 << DEPTH_CACHELINE_FREE_shift) | + 0)); + } else { + EREG(ib, TA_CNTL_AUX, (( 2 << GRADIENT_CREDIT_shift) | + (28 << TD_FIFO_CREDIT_shift))); + EREG(ib, VC_ENHANCE, 0); + EREG(ib, R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, VS_PC_LIMIT_ENABLE_bit); + EREG(ib, DB_DEBUG, 0); + EREG(ib, DB_WATERMARKS, ((4 << DEPTH_FREE_shift) | + (16 << DEPTH_FLUSH_shift) | + (0 << FORCE_SUMMARIZE_shift) | + (4 << DEPTH_PENDING_FREE_shift) | + (4 << DEPTH_CACHELINE_FREE_shift) | + 0)); + } + + reset_td_samplers(pScrn, ib); + reset_dx9_alu_consts(pScrn, ib); + reset_bool_loop_const (pScrn, ib); + reset_sampler_const (pScrn, ib); // SQ sq_conf.ps_prio = 0; @@ -867,7 +738,6 @@ r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) case CHIP_FAMILY_RV610: case CHIP_FAMILY_RV620: case CHIP_FAMILY_RS780: - case CHIP_FAMILY_RS880: default: sq_conf.num_ps_gprs = 84; sq_conf.num_vs_gprs = 36; @@ -914,7 +784,6 @@ r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) sq_conf.num_es_stack_entries = 0; break; case CHIP_FAMILY_RV730: - case CHIP_FAMILY_RV740: sq_conf.num_ps_gprs = 84; sq_conf.num_vs_gprs = 36; sq_conf.num_temp_gprs = 4; @@ -946,152 +815,167 @@ r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) break; } - r600_sq_setup(pScrn, ib, &sq_conf); + sq_setup(pScrn, ib, &sq_conf); - /* set fake reloc for unused depth */ - BEGIN_BATCH(3 + 2); - EREG(ib, DB_DEPTH_INFO, 0); - RELOC_BATCH(accel_state->shaders_bo, RADEON_GEM_DOMAIN_VRAM, 0); - END_BATCH(); - - BEGIN_BATCH(80); - if (info->ChipFamily < CHIP_FAMILY_RV770) { - EREG(ib, TA_CNTL_AUX, (( 3 << GRADIENT_CREDIT_shift) | - (28 << TD_FIFO_CREDIT_shift))); - EREG(ib, VC_ENHANCE, 0); - EREG(ib, R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); - EREG(ib, DB_DEBUG, 0x82000000); /* ? */ - EREG(ib, DB_WATERMARKS, ((4 << DEPTH_FREE_shift) | - (16 << DEPTH_FLUSH_shift) | - (0 << FORCE_SUMMARIZE_shift) | - (4 << DEPTH_PENDING_FREE_shift) | - (16 << DEPTH_CACHELINE_FREE_shift) | - 0)); - } else { - EREG(ib, TA_CNTL_AUX, (( 2 << GRADIENT_CREDIT_shift) | - (28 << TD_FIFO_CREDIT_shift))); - EREG(ib, VC_ENHANCE, 0); - EREG(ib, R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, VS_PC_LIMIT_ENABLE_bit); - EREG(ib, DB_DEBUG, 0); - EREG(ib, DB_WATERMARKS, ((4 << DEPTH_FREE_shift) | - (16 << DEPTH_FLUSH_shift) | - (0 << FORCE_SUMMARIZE_shift) | - (4 << DEPTH_PENDING_FREE_shift) | - (4 << DEPTH_CACHELINE_FREE_shift) | - 0)); - } - - PACK0(ib, SQ_VTX_BASE_VTX_LOC, 2); - E32(ib, 0); - E32(ib, 0); + EREG(ib, SQ_VTX_BASE_VTX_LOC, 0); + EREG(ib, SQ_VTX_START_INST_LOC, 0); PACK0(ib, SQ_ESGS_RING_ITEMSIZE, 9); - E32(ib, 0); // SQ_ESGS_RING_ITEMSIZE - E32(ib, 0); // SQ_GSVS_RING_ITEMSIZE - E32(ib, 0); // SQ_ESTMP_RING_ITEMSIZE - E32(ib, 0); // SQ_GSTMP_RING_ITEMSIZE - E32(ib, 0); // SQ_VSTMP_RING_ITEMSIZE - E32(ib, 0); // SQ_PSTMP_RING_ITEMSIZE - E32(ib, 0); // SQ_FBUF_RING_ITEMSIZE - E32(ib, 0); // SQ_REDUC_RING_ITEMSIZE - E32(ib, 0); // SQ_GS_VERT_ITEMSIZE + E32(ib, 0); // SQ_ESGS_RING_ITEMSIZE + E32(ib, 0); // SQ_GSVS_RING_ITEMSIZE + E32(ib, 0); // SQ_ESTMP_RING_ITEMSIZE + E32(ib, 0); // SQ_GSTMP_RING_ITEMSIZE + E32(ib, 0); // SQ_VSTMP_RING_ITEMSIZE + E32(ib, 0); // SQ_PSTMP_RING_ITEMSIZE + E32(ib, 0); // SQ_FBUF_RING_ITEMSIZE + E32(ib, 0); // SQ_REDUC_RING_ITEMSIZE + E32(ib, 0); // SQ_GS_VERT_ITEMSIZE // DB + EREG(ib, DB_DEPTH_INFO, 0); + EREG(ib, DB_STENCIL_CLEAR, 0); + EREG(ib, DB_DEPTH_CLEAR, 0); + EREG(ib, DB_STENCILREFMASK, 0); + EREG(ib, DB_STENCILREFMASK_BF, 0); EREG(ib, DB_DEPTH_CONTROL, 0); - PACK0(ib, DB_RENDER_CONTROL, 2); - E32(ib, STENCIL_COMPRESS_DISABLE_bit | DEPTH_COMPRESS_DISABLE_bit); + EREG(ib, DB_RENDER_CONTROL, STENCIL_COMPRESS_DISABLE_bit | DEPTH_COMPRESS_DISABLE_bit); if (info->ChipFamily < CHIP_FAMILY_RV770) - E32(ib, FORCE_SHADER_Z_ORDER_bit); + EREG(ib, DB_RENDER_OVERRIDE, FORCE_SHADER_Z_ORDER_bit); else - E32(ib, 0); + EREG(ib, DB_RENDER_OVERRIDE, 0); EREG(ib, DB_ALPHA_TO_MASK, ((2 << ALPHA_TO_MASK_OFFSET0_shift) | (2 << ALPHA_TO_MASK_OFFSET1_shift) | (2 << ALPHA_TO_MASK_OFFSET2_shift) | (2 << ALPHA_TO_MASK_OFFSET3_shift))); - EREG(ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ - DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ - PACK0(ib, DB_STENCIL_CLEAR, 2); - E32(ib, 0); // DB_STENCIL_CLEAR - E32(ib, 0); // DB_DEPTH_CLEAR + // SX + EREG(ib, SX_ALPHA_TEST_CONTROL, 0); + EREG(ib, SX_ALPHA_REF, 0); - PACK0(ib, DB_STENCILREFMASK, 3); - E32(ib, 0); // DB_STENCILREFMASK - E32(ib, 0); // DB_STENCILREFMASK_BF - E32(ib, 0); // SX_ALPHA_REF + // CB + reset_cb(pScrn, ib); + PACK0(ib, CB_BLEND_RED, 4); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + + /* CB_COLOR_CONTROL.PER_MRT_BLEND is off */ + // RV6xx+ have per-MRT blend + if (info->ChipFamily > CHIP_FAMILY_R600) { + PACK0(ib, CB_BLEND0_CONTROL, CB_BLEND0_CONTROL_num); + for (i = 0; i < CB_BLEND0_CONTROL_num; i++) + E32(ib, 0); + } + + EREG(ib, CB_BLEND_CONTROL, 0); + + if (info->ChipFamily < CHIP_FAMILY_RV770) { + PACK0(ib, CB_FOG_RED, 3); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + } + + EREG(ib, CB_COLOR_CONTROL, 0); PACK0(ib, CB_CLRCMP_CONTROL, 4); E32(ib, 1 << CLRCMP_FCN_SEL_shift); // CB_CLRCMP_CONTROL: use CLRCMP_FCN_SRC E32(ib, 0); // CB_CLRCMP_SRC E32(ib, 0); // CB_CLRCMP_DST E32(ib, 0); // CB_CLRCMP_MSK - EREG(ib, CB_SHADER_MASK, OUTPUT0_ENABLE_mask); - EREG(ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); - PACK0(ib, SX_ALPHA_TEST_CONTROL, 5); - E32(ib, 0); // SX_ALPHA_TEST_CONTROL - E32(ib, 0x00000000); // CB_BLEND_RED - E32(ib, 0x00000000); // CB_BLEND_GREEN - E32(ib, 0x00000000); // CB_BLEND_BLUE - E32(ib, 0x00000000); // CB_BLEND_ALPHA + if (info->ChipFamily < CHIP_FAMILY_RV770) { + PACK0(ib, CB_CLEAR_RED, 4); + EFLOAT(ib, 1.0); /* WTF? */ + EFLOAT(ib, 0.0); + EFLOAT(ib, 1.0); + EFLOAT(ib, 1.0); + } + EREG(ib, CB_TARGET_MASK, (0x0f << TARGET0_ENABLE_shift)); + // SC + set_generic_scissor(pScrn, ib, 0, 0, 8192, 8192); + set_screen_scissor(pScrn, ib, 0, 0, 8192, 8192); EREG(ib, PA_SC_WINDOW_OFFSET, ((0 << WINDOW_X_OFFSET_shift) | (0 << WINDOW_Y_OFFSET_shift))); + set_window_scissor(pScrn, ib, 0, 0, 8192, 8192); + + EREG(ib, PA_SC_CLIPRECT_RULE, CLIP_RULE_mask); + + /* clip boolean is set to always visible -> doesn't matter */ + for (i = 0; i < PA_SC_CLIPRECT_0_TL_num; i++) + set_clip_rect (pScrn, ib, i, 0, 0, 8192, 8192); if (info->ChipFamily < CHIP_FAMILY_RV770) EREG(ib, R7xx_PA_SC_EDGERULE, 0x00000000); else EREG(ib, R7xx_PA_SC_EDGERULE, 0xAAAAAAAA); - EREG(ib, PA_SC_CLIPRECT_RULE, CLIP_RULE_mask); + for (i = 0; i < PA_SC_VPORT_SCISSOR_0_TL_num; i++) { + set_vport_scissor (pScrn, ib, i, 0, 0, 8192, 8192); + PACK0(ib, PA_SC_VPORT_ZMIN_0 + i * PA_SC_VPORT_ZMIN_0_offset, 2); + EFLOAT(ib, 0.0); + EFLOAT(ib, 1.0); + } - END_BATCH(); - - /* clip boolean is set to always visible -> doesn't matter */ - for (i = 0; i < PA_SC_CLIPRECT_0_TL_num; i++) - r600_set_clip_rect(pScrn, ib, i, 0, 0, 8192, 8192); - - for (i = 0; i < PA_SC_VPORT_SCISSOR_0_TL_num; i++) - r600_set_vport_scissor(pScrn, ib, i, 0, 0, 8192, 8192); - - BEGIN_BATCH(49); - PACK0(ib, PA_SC_MPASS_PS_CNTL, 2); - E32(ib, 0); if (info->ChipFamily < CHIP_FAMILY_RV770) - E32(ib, (WALK_ORDER_ENABLE_bit | FORCE_EOV_CNTDWN_ENABLE_bit)); + EREG(ib, PA_SC_MODE_CNTL, (WALK_ORDER_ENABLE_bit | FORCE_EOV_CNTDWN_ENABLE_bit)); else - E32(ib, (FORCE_EOV_CNTDWN_ENABLE_bit | FORCE_EOV_REZ_ENABLE_bit | - 0x00500000)); /* ? */ + EREG(ib, PA_SC_MODE_CNTL, (FORCE_EOV_CNTDWN_ENABLE_bit | FORCE_EOV_REZ_ENABLE_bit | + 0x00500000)); /* ? */ - PACK0(ib, PA_SC_LINE_CNTL, 9); - E32(ib, 0); // PA_SC_LINE_CNTL - E32(ib, 0); // PA_SC_AA_CONFIG - E32(ib, ((2 << PA_SU_VTX_CNTL__ROUND_MODE_shift) | PIX_CENTER_bit | // PA_SU_VTX_CNTL - (5 << QUANT_MODE_shift))); /* Round to Even, fixed point 1/256 */ + EREG(ib, PA_SC_LINE_CNTL, 0); + EREG(ib, PA_SC_AA_CONFIG, 0); + EREG(ib, PA_SC_AA_MASK, 0xFFFFFFFF); + + //XXX: double check this + if (info->ChipFamily > CHIP_FAMILY_R600) { + EREG(ib, PA_SC_AA_SAMPLE_LOCS_MCTX, 0); + EREG(ib, PA_SC_AA_SAMPLE_LOCS_8S_WD1_M, 0); + } + + EREG(ib, PA_SC_LINE_STIPPLE, 0); + EREG(ib, PA_SC_MPASS_PS_CNTL, 0); + + // CL + PACK0(ib, PA_CL_VPORT_XSCALE_0, 6); + EFLOAT(ib, 0.0f); // PA_CL_VPORT_XSCALE + EFLOAT(ib, 0.0f); // PA_CL_VPORT_XOFFSET + EFLOAT(ib, 0.0f); // PA_CL_VPORT_YSCALE + EFLOAT(ib, 0.0f); // PA_CL_VPORT_YOFFSET + EFLOAT(ib, 0.0f); // PA_CL_VPORT_ZSCALE + EFLOAT(ib, 0.0f); // PA_CL_VPORT_ZOFFSET + EREG(ib, PA_CL_CLIP_CNTL, (CLIP_DISABLE_bit | DX_CLIP_SPACE_DEF_bit)); + EREG(ib, PA_CL_VTE_CNTL, 0); + EREG(ib, PA_CL_VS_OUT_CNTL, 0); + EREG(ib, PA_CL_NANINF_CNTL, 0); + PACK0(ib, PA_CL_GB_VERT_CLIP_ADJ, 4); EFLOAT(ib, 1.0); // PA_CL_GB_VERT_CLIP_ADJ EFLOAT(ib, 1.0); // PA_CL_GB_VERT_DISC_ADJ EFLOAT(ib, 1.0); // PA_CL_GB_HORZ_CLIP_ADJ EFLOAT(ib, 1.0); // PA_CL_GB_HORZ_DISC_ADJ - E32(ib, 0); // PA_SC_AA_SAMPLE_LOCS_MCTX - E32(ib, 0); // PA_SC_AA_SAMPLE_LOCS_8S_WD1_M - EREG(ib, PA_SC_AA_MASK, 0xFFFFFFFF); + /* user clipping planes are disabled by default */ + PACK0(ib, PA_CL_UCP_0_X, 24); + for (i = 0; i < 24; i++) + EFLOAT(ib, 0.0); - PACK0(ib, PA_CL_CLIP_CNTL, 5); - E32(ib, CLIP_DISABLE_bit); // PA_CL_CLIP_CNTL - E32(ib, FACE_bit); // PA_SU_SC_MODE_CNTL - E32(ib, VTX_XY_FMT_bit); // PA_CL_VTE_CNTL - E32(ib, 0); // PA_CL_VS_OUT_CNTL - E32(ib, 0); // PA_CL_NANINF_CNTL + // SU + EREG(ib, PA_SU_SC_MODE_CNTL, FACE_bit); + EREG(ib, PA_SU_POINT_SIZE, 0); + EREG(ib, PA_SU_POINT_MINMAX, 0); + EREG(ib, PA_SU_POLY_OFFSET_DB_FMT_CNTL, 0); + EREG(ib, PA_SU_POLY_OFFSET_BACK_SCALE, 0); + EREG(ib, PA_SU_POLY_OFFSET_FRONT_SCALE, 0); + EREG(ib, PA_SU_POLY_OFFSET_BACK_OFFSET, 0); + EREG(ib, PA_SU_POLY_OFFSET_FRONT_OFFSET, 0); - PACK0(ib, PA_SU_POLY_OFFSET_DB_FMT_CNTL, 6); - E32(ib, 0); // PA_SU_POLY_OFFSET_DB_FMT_CNTL - E32(ib, 0); // PA_SU_POLY_OFFSET_CLAMP - E32(ib, 0); // PA_SU_POLY_OFFSET_FRONT_SCALE - E32(ib, 0); // PA_SU_POLY_OFFSET_FRONT_OFFSET - E32(ib, 0); // PA_SU_POLY_OFFSET_BACK_SCALE - E32(ib, 0); // PA_SU_POLY_OFFSET_BACK_OFFSET + EREG(ib, PA_SU_LINE_CNTL, (8 << PA_SU_LINE_CNTL__WIDTH_shift)); /* Line width 1 pixel */ + EREG(ib, PA_SU_VTX_CNTL, ((2 << PA_SU_VTX_CNTL__ROUND_MODE_shift) | + (5 << QUANT_MODE_shift))); /* Round to Even, fixed point 1/256 */ + EREG(ib, PA_SU_POLY_OFFSET_CLAMP, 0); // SPI if (info->ChipFamily < CHIP_FAMILY_RV770) @@ -1099,72 +983,69 @@ r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) else EREG(ib, R7xx_SPI_THREAD_GROUPING, (1 << PS_GROUPING_shift)); - /* default Interpolator setup */ - EREG(ib, SPI_VS_OUT_ID_0, ((0 << SEMANTIC_0_shift) | - (1 << SEMANTIC_1_shift))); - PACK0(ib, SPI_PS_INPUT_CNTL_0 + (0 << 2), 2); - /* SPI_PS_INPUT_CNTL_0 maps to GPR[0] - load with semantic id 0 */ - E32(ib, ((0 << SEMANTIC_shift) | - (0x01 << DEFAULT_VAL_shift) | - SEL_CENTROID_bit)); - /* SPI_PS_INPUT_CNTL_1 maps to GPR[1] - load with semantic id 1 */ - E32(ib, ((1 << SEMANTIC_shift) | - (0x01 << DEFAULT_VAL_shift) | - SEL_CENTROID_bit)); + EREG(ib, SPI_INTERP_CONTROL_0, ((2 << PNT_SPRITE_OVRD_X_shift) | + (3 << PNT_SPRITE_OVRD_Y_shift) | + (0 << PNT_SPRITE_OVRD_Z_shift) | + (1 << PNT_SPRITE_OVRD_W_shift))); /* s,t,0,1 */ + EREG(ib, SPI_INPUT_Z, 0); + EREG(ib, SPI_FOG_CNTL, 0); + EREG(ib, SPI_FOG_FUNC_SCALE, 0); + EREG(ib, SPI_FOG_FUNC_BIAS, 0); - PACK0(ib, SPI_INPUT_Z, 4); - E32(ib, 0); // SPI_INPUT_Z - E32(ib, 0); // SPI_FOG_CNTL - E32(ib, 0); // SPI_FOG_FUNC_SCALE - E32(ib, 0); // SPI_FOG_FUNC_BIAS - - END_BATCH(); + PACK0(ib, SPI_VS_OUT_ID_0, SPI_VS_OUT_ID_0_num); + for (i = 0; i < SPI_VS_OUT_ID_0_num; i++) /* identity mapping */ + E32(ib, 0x03020100 + i*0x04040404); + EREG(ib, SPI_VS_OUT_CONFIG, 0); // clear FS - fs_conf.bo = accel_state->shaders_bo; - r600_fs_setup(pScrn, ib, &fs_conf, RADEON_GEM_DOMAIN_VRAM); + fs_setup(pScrn, ib, &fs_conf); // VGT - BEGIN_BATCH(43); - PACK0(ib, VGT_MAX_VTX_INDX, 4); - E32(ib, 0xffffff); // VGT_MAX_VTX_INDX - E32(ib, 0); // VGT_MIN_VTX_INDX - E32(ib, 0); // VGT_INDX_OFFSET - E32(ib, 0); // VGT_MULTI_PRIM_IB_RESET_INDX + EREG(ib, VGT_MAX_VTX_INDX, 2048); /* XXX set to a reasonably large number of indices */ + EREG(ib, VGT_MIN_VTX_INDX, 0); + EREG(ib, VGT_INDX_OFFSET, 0); + EREG(ib, VGT_INSTANCE_STEP_RATE_0, 0); + EREG(ib, VGT_INSTANCE_STEP_RATE_1, 0); + EREG(ib, VGT_MULTI_PRIM_IB_RESET_INDX, 0); + EREG(ib, VGT_OUTPUT_PATH_CNTL, 0); + EREG(ib, VGT_GS_MODE, 0); + EREG(ib, VGT_HOS_CNTL, 0); + EREG(ib, VGT_HOS_MAX_TESS_LEVEL, 0); + EREG(ib, VGT_HOS_MIN_TESS_LEVEL, 0); + EREG(ib, VGT_HOS_REUSE_DEPTH, 0); + EREG(ib, VGT_GROUP_PRIM_TYPE, 0); + EREG(ib, VGT_GROUP_FIRST_DECR, 0); + EREG(ib, VGT_GROUP_DECR, 0); + EREG(ib, VGT_GROUP_VECT_0_CNTL, 0); + EREG(ib, VGT_GROUP_VECT_1_CNTL, 0); + EREG(ib, VGT_GROUP_VECT_0_FMT_CNTL, 0); + EREG(ib, VGT_GROUP_VECT_1_FMT_CNTL, 0); EREG(ib, VGT_PRIMITIVEID_EN, 0); EREG(ib, VGT_MULTI_PRIM_IB_RESET_EN, 0); - - PACK0(ib, VGT_INSTANCE_STEP_RATE_0, 2); - E32(ib, 0); // VGT_INSTANCE_STEP_RATE_0 - E32(ib, 0); // VGT_INSTANCE_STEP_RATE_1 - - PACK0(ib, PA_SU_POINT_SIZE, 17); - E32(ib, 0); // PA_SU_POINT_SIZE - E32(ib, 0); // PA_SU_POINT_MINMAX - E32(ib, (8 << PA_SU_LINE_CNTL__WIDTH_shift)); /* Line width 1 pixel */ // PA_SU_LINE_CNTL - E32(ib, 0); // PA_SC_LINE_STIPPLE - E32(ib, 0); // VGT_OUTPUT_PATH_CNTL - E32(ib, 0); // VGT_HOS_CNTL - E32(ib, 0); // VGT_HOS_MAX_TESS_LEVEL - E32(ib, 0); // VGT_HOS_MIN_TESS_LEVEL - E32(ib, 0); // VGT_HOS_REUSE_DEPTH - E32(ib, 0); // VGT_GROUP_PRIM_TYPE - E32(ib, 0); // VGT_GROUP_FIRST_DECR - E32(ib, 0); // VGT_GROUP_DECR - E32(ib, 0); // VGT_GROUP_VECT_0_CNTL - E32(ib, 0); // VGT_GROUP_VECT_1_CNTL - E32(ib, 0); // VGT_GROUP_VECT_0_FMT_CNTL - E32(ib, 0); // VGT_GROUP_VECT_1_FMT_CNTL - E32(ib, 0); // VGT_GS_MODE - - PACK0(ib, VGT_STRMOUT_EN, 3); - E32(ib, 0); // VGT_STRMOUT_EN - E32(ib, 0); // VGT_REUSE_OFF - E32(ib, 0); // VGT_VTX_CNT_EN - + EREG(ib, VGT_STRMOUT_EN, 0); + EREG(ib, VGT_REUSE_OFF, 0); + EREG(ib, VGT_VTX_CNT_EN, 0); EREG(ib, VGT_STRMOUT_BUFFER_EN, 0); - END_BATCH(); + + // clear tex resources - PS + for (i = 0; i < 16; i++) { + tex_res.id = i; + set_tex_resource(pScrn, ib, &tex_res); + } + + // clear tex resources - VS + for (i = 160; i < 164; i++) { + tex_res.id = i; + set_tex_resource(pScrn, ib, &tex_res); + } + + // clear tex resources - FS + for (i = 320; i < 335; i++) { + tex_res.id = i; + set_tex_resource(pScrn, ib, &tex_res); + } + } @@ -1173,11 +1054,16 @@ r600_set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) */ void -r600_draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices) +draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices) { - RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t i, count; + EREG(ib, VGT_PRIMITIVE_TYPE, draw_conf->prim_type); + PACK3(ib, IT_INDEX_TYPE, 1); + E32(ib, draw_conf->index_type); + PACK3(ib, IT_NUM_INSTANCES, 1); + E32(ib, draw_conf->num_instances); + // calculate num of packets count = 2; if (draw_conf->index_type == DI_INDEX_SIZE_16_BIT) @@ -1185,17 +1071,6 @@ r600_draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32 else count += draw_conf->num_indices; - BEGIN_BATCH(8 + count); - EREG(ib, VGT_PRIMITIVE_TYPE, draw_conf->prim_type); - PACK3(ib, IT_INDEX_TYPE, 1); -#if X_BYTE_ORDER == X_BIG_ENDIAN - E32(ib, IT_INDEX_TYPE_SWAP_MODE(ENDIAN_8IN32) | draw_conf->index_type); -#else - E32(ib, draw_conf->index_type); -#endif - PACK3(ib, IT_NUM_INSTANCES, 1); - E32(ib, draw_conf->num_instances); - PACK3(ib, IT_DRAW_INDEX_IMMD, count); E32(ib, draw_conf->num_indices); E32(ib, draw_conf->vgt_draw_initiator); @@ -1211,84 +1086,18 @@ r600_draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32 for (i = 0; i < draw_conf->num_indices; i++) E32(ib, indices[i]); } - END_BATCH(); } void -r600_draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf) +draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf) { - RADEONInfoPtr info = RADEONPTR(pScrn); - BEGIN_BATCH(10); EREG(ib, VGT_PRIMITIVE_TYPE, draw_conf->prim_type); PACK3(ib, IT_INDEX_TYPE, 1); -#if X_BYTE_ORDER == X_BIG_ENDIAN - E32(ib, IT_INDEX_TYPE_SWAP_MODE(ENDIAN_8IN32) | draw_conf->index_type); -#else E32(ib, draw_conf->index_type); -#endif PACK3(ib, IT_NUM_INSTANCES, 1); E32(ib, draw_conf->num_instances); PACK3(ib, IT_DRAW_INDEX_AUTO, 2); E32(ib, draw_conf->num_indices); E32(ib, draw_conf->vgt_draw_initiator); - END_BATCH(); } - -void r600_finish_op(ScrnInfoPtr pScrn, int vtx_size) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - draw_config_t draw_conf; - vtx_resource_t vtx_res; - - if (accel_state->vbo.vb_start_op == -1) - return; - - CLEAR (draw_conf); - CLEAR (vtx_res); - - if (accel_state->vbo.vb_offset == accel_state->vbo.vb_start_op) { - R600IBDiscard(pScrn, accel_state->ib); - return; - } - - /* Vertex buffer setup */ - accel_state->vbo.vb_size = accel_state->vbo.vb_offset - accel_state->vbo.vb_start_op; - vtx_res.id = SQ_VTX_RESOURCE_vs; - vtx_res.vtx_size_dw = vtx_size / 4; - vtx_res.vtx_num_entries = accel_state->vbo.vb_size / 4; - vtx_res.mem_req_size = 1; - vtx_res.vb_addr = accel_state->vbo.vb_mc_addr + accel_state->vbo.vb_start_op; - vtx_res.bo = accel_state->vbo.vb_bo; -#if X_BYTE_ORDER == X_BIG_ENDIAN - vtx_res.endian = SQ_ENDIAN_8IN32; -#endif - r600_set_vtx_resource(pScrn, accel_state->ib, &vtx_res, RADEON_GEM_DOMAIN_GTT); - - /* Draw */ - draw_conf.prim_type = DI_PT_RECTLIST; - draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; - draw_conf.num_instances = 1; - draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; - draw_conf.index_type = DI_INDEX_SIZE_16_BIT; - - r600_draw_auto(pScrn, accel_state->ib, &draw_conf); - - /* XXX drm should handle this in fence submit */ - r600_wait_3d_idle_clean(pScrn, accel_state->ib); - - /* sync dst surface */ - r600_cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), - accel_state->dst_size, accel_state->dst_obj.offset, - accel_state->dst_obj.bo, 0, accel_state->dst_obj.domain); - - accel_state->vbo.vb_start_op = -1; - accel_state->ib_reset_op = 0; - -#if KMS_MULTI_OP - if (!info->cs) -#endif - R600CPFlushIndirect(pScrn, accel_state->ib); -} - diff --git a/driver/xf86-video-ati/src/radeon.h b/driver/xf86-video-ati/src/radeon.h index c9f03d40c..23883fcfd 100644 --- a/driver/xf86-video-ati/src/radeon.h +++ b/driver/xf86-video-ati/src/radeon.h @@ -75,7 +75,6 @@ #include "dri.h" #include "GL/glxint.h" #include "xf86drm.h" -#include "radeon_drm.h" #ifdef DAMAGE #include "damage.h" @@ -86,21 +85,11 @@ #include "xf86Crtc.h" #include "X11/Xatom.h" -#ifdef XF86DRM_MODE -#include "radeon_bo.h" -#include "radeon_cs.h" -#include "radeon_dri2.h" -#include "drmmode_display.h" -#else -#include "radeon_dummy_bufmgr.h" -#endif - /* Render support */ #ifdef RENDER #include "picturestr.h" #endif -#include "simple_list.h" #include "atipcirename.h" #ifndef MAX @@ -174,11 +163,9 @@ typedef enum { OPTION_PCIAPER_SIZE, #ifdef USE_EXA OPTION_ACCEL_DFS, - OPTION_EXA_PIXMAPS, #endif #endif OPTION_IGNORE_EDID, - OPTION_CUSTOM_EDID, OPTION_DISP_PRIORITY, OPTION_PANEL_SIZE, OPTION_MIN_DOTCLOCK, @@ -199,7 +186,7 @@ typedef enum { OPTION_SUBPIXEL_ORDER, #endif OPTION_SHOWCACHE, - OPTION_CLOCK_GATING, + OPTION_DYNAMIC_CLOCKS, OPTION_BIOS_HOTKEYS, OPTION_VGA_ACCESS, OPTION_REVERSE_DDC, @@ -220,12 +207,7 @@ typedef enum { OPTION_INT10, OPTION_EXA_VSYNC, OPTION_ATOM_TVOUT, - OPTION_R4XX_ATOM, - OPTION_FORCE_LOW_POWER, - OPTION_DYNAMIC_PM, - OPTION_NEW_PLL, - OPTION_ZAPHOD_HEADS, - OPTION_SWAPBUFFERS_WAIT + OPTION_R4XX_ATOM } RADEONOpts; @@ -235,8 +217,7 @@ typedef enum { #define RADEON_VSYNC_TIMEOUT 20000 /* Maximum wait for VSYNC (in usecs) */ /* Buffer are aligned on 4096 byte boundaries */ -#define RADEON_GPU_PAGE_SIZE 4096 -#define RADEON_BUFFER_ALIGN (RADEON_GPU_PAGE_SIZE - 1) +#define RADEON_BUFFER_ALIGN 0x00000fff #define RADEON_VBIOS_SIZE 0x00010000 #define RADEON_USE_RMX 0x80000000 /* mode flag for using RMX * Need to comfirm this is not used @@ -278,14 +259,10 @@ typedef struct { #define RADEON_PLL_PREFER_HIGH_FB_DIV (1 << 7) #define RADEON_PLL_PREFER_LOW_POST_DIV (1 << 8) #define RADEON_PLL_PREFER_HIGH_POST_DIV (1 << 9) -#define RADEON_PLL_USE_FRAC_FB_DIV (1 << 10) -#define RADEON_PLL_PREFER_CLOSEST_LOWER (1 << 11) -#define RADEON_PLL_USE_POST_DIV (1 << 12) typedef struct { - uint32_t reference_freq; - uint32_t reference_div; - uint32_t post_div; + uint16_t reference_freq; + uint16_t reference_div; uint32_t pll_in_min; uint32_t pll_in_max; uint32_t pll_out_min; @@ -298,8 +275,6 @@ typedef struct { uint32_t max_post_div; uint32_t min_feedback_div; uint32_t max_feedback_div; - uint32_t min_frac_feedback_div; - uint32_t max_frac_feedback_div; uint32_t best_vco; } RADEONPLLRec, *RADEONPLLPtr; @@ -313,6 +288,50 @@ typedef struct { DisplayModePtr mode; } RADEONFBLayout; +typedef enum { + CHIP_FAMILY_UNKNOW, + CHIP_FAMILY_LEGACY, + CHIP_FAMILY_RADEON, + CHIP_FAMILY_RV100, + CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/ + CHIP_FAMILY_RV200, + CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */ + CHIP_FAMILY_R200, + CHIP_FAMILY_RV250, + CHIP_FAMILY_RS300, /* RS300/RS350 */ + CHIP_FAMILY_RV280, + CHIP_FAMILY_R300, + CHIP_FAMILY_R350, + CHIP_FAMILY_RV350, + CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */ + CHIP_FAMILY_R420, /* R420/R423/M18 */ + CHIP_FAMILY_RV410, /* RV410, M26 */ + CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */ + CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */ + CHIP_FAMILY_RV515, /* rv515 */ + CHIP_FAMILY_R520, /* r520 */ + CHIP_FAMILY_RV530, /* rv530 */ + CHIP_FAMILY_R580, /* r580 */ + CHIP_FAMILY_RV560, /* rv560 */ + CHIP_FAMILY_RV570, /* rv570 */ + CHIP_FAMILY_RS600, + CHIP_FAMILY_RS690, + CHIP_FAMILY_RS740, + CHIP_FAMILY_R600, /* r600 */ + CHIP_FAMILY_R630, + CHIP_FAMILY_RV610, + CHIP_FAMILY_RV630, + CHIP_FAMILY_RV670, + CHIP_FAMILY_RV620, + CHIP_FAMILY_RV635, + CHIP_FAMILY_RS780, + CHIP_FAMILY_RS880, + CHIP_FAMILY_RV770, + CHIP_FAMILY_RV730, + CHIP_FAMILY_RV710, + CHIP_FAMILY_LAST +} RADEONChipFamily; + #define IS_RV100_VARIANT ((info->ChipFamily == CHIP_FAMILY_RV100) || \ (info->ChipFamily == CHIP_FAMILY_RV200) || \ (info->ChipFamily == CHIP_FAMILY_RS100) || \ @@ -337,14 +356,6 @@ typedef struct { #define IS_DCE32_VARIANT ((info->ChipFamily >= CHIP_FAMILY_RV730)) -#define IS_DCE4_VARIANT ((info->ChipFamily >= CHIP_FAMILY_CEDAR)) - -#define IS_DCE41_VARIANT ((info->ChipFamily >= CHIP_FAMILY_PALM)) - -#define IS_DCE5_VARIANT ((info->ChipFamily >= CHIP_FAMILY_BARTS)) - -#define IS_EVERGREEN_3D (info->ChipFamily >= CHIP_FAMILY_CEDAR) - #define IS_R600_3D (info->ChipFamily >= CHIP_FAMILY_R600) #define IS_R500_3D ((info->ChipFamily == CHIP_FAMILY_RV515) || \ @@ -354,12 +365,6 @@ typedef struct { (info->ChipFamily == CHIP_FAMILY_RV560) || \ (info->ChipFamily == CHIP_FAMILY_RV570)) -#define IS_R400_3D ((info->ChipFamily == CHIP_FAMILY_R420) || \ - (info->ChipFamily == CHIP_FAMILY_RV410) || \ - (info->ChipFamily == CHIP_FAMILY_RS690) || \ - (info->ChipFamily == CHIP_FAMILY_RS600) || \ - (info->ChipFamily == CHIP_FAMILY_RS740)) - #define IS_R300_3D ((info->ChipFamily == CHIP_FAMILY_R300) || \ (info->ChipFamily == CHIP_FAMILY_RV350) || \ (info->ChipFamily == CHIP_FAMILY_R350) || \ @@ -372,11 +377,6 @@ typedef struct { (info->ChipFamily == CHIP_FAMILY_RS400) || \ (info->ChipFamily == CHIP_FAMILY_RS480)) -#define IS_R200_3D ((info->ChipFamily == CHIP_FAMILY_RV250) || \ - (info->ChipFamily == CHIP_FAMILY_RV280) || \ - (info->ChipFamily == CHIP_FAMILY_RS300) || \ - (info->ChipFamily == CHIP_FAMILY_R200)) - /* * Errata workarounds */ @@ -412,58 +412,18 @@ typedef enum { CARD_PCIE } RADEONCardType; -typedef enum { - POWER_DEFAULT, - POWER_LOW, - POWER_HIGH -} RADEONPMType; - -typedef struct { - RADEONPMType type; - uint32_t sclk; - uint32_t mclk; - uint32_t pcie_lanes; - uint32_t flags; -} RADEONPowerMode; - -typedef struct { - /* power modes */ - int num_modes; - int current_mode; - RADEONPowerMode mode[3]; - - Bool clock_gating_enabled; - Bool dynamic_mode_enabled; - Bool force_low_power_enabled; -} RADEONPowerManagement; - typedef struct _atomBiosHandle *atomBiosHandlePtr; -struct radeon_exa_pixmap_priv { - struct radeon_bo *bo; - uint32_t tiling_flags; - Bool bo_mapped; -}; +typedef struct { + uint32_t pci_device_id; + RADEONChipFamily chip_family; + int mobility; + int igp; + int nocrtc2; + int nointtvout; + int singledac; +} RADEONCardInfo; -#define RADEON_2D_EXA_COPY 1 -#define RADEON_2D_EXA_SOLID 2 - -struct radeon_2d_state { - int op; // - uint32_t dst_pitch_offset; - uint32_t src_pitch_offset; - uint32_t dp_gui_master_cntl; - uint32_t dp_cntl; - uint32_t dp_write_mask; - uint32_t dp_brush_frgd_clr; - uint32_t dp_brush_bkgd_clr; - uint32_t dp_src_frgd_clr; - uint32_t dp_src_bkgd_clr; - uint32_t default_sc_bottom_right; - struct radeon_bo *dst_bo; - struct radeon_bo *src_bo; -}; - #ifdef XF86DRI struct radeon_cp { Bool CPRuns; /* CP is running */ @@ -491,8 +451,13 @@ typedef struct { } RADEONConfigPrivRec, *RADEONConfigPrivPtr; typedef struct { +#ifdef PER_CONTEXT_SAREA + drm_context_t ctx_id; + drm_handle_t sarea_handle; +#else /* Nothing here yet */ int dummy; +#endif } RADEONDRIContextRec, *RADEONDRIContextPtr; struct radeon_dri { @@ -586,6 +551,10 @@ struct radeon_dri { int irq; +#ifdef PER_CONTEXT_SAREA + int perctx_sarea_size; +#endif + #ifdef USE_XAA uint32_t frontPitchOffset; uint32_t backPitchOffset; @@ -601,37 +570,6 @@ struct radeon_dri { }; #endif -#define DMA_BO_FREE_TIME 1000 - -struct radeon_dma_bo { - struct radeon_dma_bo *next, *prev; - struct radeon_bo *bo; - int expire_counter; -}; - -struct r600_accel_object { - uint32_t pitch; - uint32_t width; - uint32_t height; - uint32_t offset; - int bpp; - uint32_t domain; - struct radeon_bo *bo; - uint32_t tiling_flags; -}; - -struct radeon_vbo_object { - int vb_offset; - uint64_t vb_mc_addr; - int vb_total; - void *vb_ptr; - uint32_t vb_size; - uint32_t vb_op_vert_size; - int32_t vb_start_op; - struct radeon_bo *vb_bo; - unsigned verts_per_op; -}; - struct radeon_accel_state { /* common accel data */ int fifo_slots; /* Free slots in the FIFO (64 max) */ @@ -650,7 +588,6 @@ struct radeon_accel_state { Bool XInited3D; /* X itself has the 3D context */ int num_gb_pipes; Bool has_tcl; - Bool allowHWDFS; #ifdef USE_EXA /* EXA */ @@ -662,91 +599,64 @@ struct radeon_accel_state { #define EXA_ENGINEMODE_2D 1 #define EXA_ENGINEMODE_3D 2 - int composite_op; - PicturePtr dst_pic; - PicturePtr msk_pic; - PicturePtr src_pic; - PixmapPtr dst_pix; - PixmapPtr msk_pix; - PixmapPtr src_pix; Bool is_transform[2]; PictTransform *transform[2]; + Bool has_mask; /* Whether we are tiling horizontally and vertically */ Bool need_src_tile_x; Bool need_src_tile_y; /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ Bool src_tile_width; Bool src_tile_height; - uint32_t *draw_header; - unsigned vtx_count; - unsigned num_vtx; + Bool vsync; drmBufPtr ib; + int vb_index; - struct radeon_vbo_object vbo; - struct radeon_vbo_object cbuf; - - /* where to discard IB from if we cancel operation */ - uint32_t ib_reset_op; -#ifdef XF86DRM_MODE - struct radeon_dma_bo bo_free; - struct radeon_dma_bo bo_wait; - struct radeon_dma_bo bo_reserved; - Bool use_vbos; -#endif - void (*finish_op)(ScrnInfoPtr, int); // shader storage ExaOffscreenArea *shaders; - struct radeon_bo *shaders_bo; uint32_t solid_vs_offset; uint32_t solid_ps_offset; uint32_t copy_vs_offset; uint32_t copy_ps_offset; uint32_t comp_vs_offset; uint32_t comp_ps_offset; + uint32_t comp_mask_ps_offset; uint32_t xv_vs_offset; uint32_t xv_ps_offset; - // shader consts - uint32_t solid_vs_const_offset; - uint32_t solid_ps_const_offset; - uint32_t copy_vs_const_offset; - uint32_t copy_ps_const_offset; - uint32_t comp_vs_const_offset; - uint32_t comp_ps_const_offset; - uint32_t comp_mask_ps_const_offset; - uint32_t xv_vs_const_offset; - uint32_t xv_ps_const_offset; //size/addr stuff - struct r600_accel_object src_obj[2]; - struct r600_accel_object dst_obj; uint32_t src_size[2]; + uint64_t src_mc_addr[2]; + uint32_t src_pitch[2]; + uint32_t src_width[2]; + uint32_t src_height[2]; + uint32_t src_bpp[2]; uint32_t dst_size; - + uint64_t dst_mc_addr; + uint32_t dst_pitch; + uint32_t dst_height; + uint32_t dst_bpp; uint32_t vs_size; uint64_t vs_mc_addr; uint32_t ps_size; uint64_t ps_mc_addr; + uint32_t vb_size; + uint64_t vb_mc_addr; // UTS/DFS drmBufPtr scratch; - // solid/copy + // copy ExaOffscreenArea *copy_area; - struct radeon_bo *copy_area_bo; Bool same_surface; int rop; uint32_t planemask; - uint32_t fg; // composite Bool component_alpha; Bool src_alpha; - // vline - xf86CrtcPtr vline_crtc; - int vline_y1; - int vline_y2; #endif #ifdef USE_XAA @@ -797,7 +707,7 @@ typedef struct { unsigned long long LinearAddr; /* Frame buffer physical address */ unsigned long long MMIOAddr; /* MMIO region physical address */ unsigned long long BIOSAddr; /* BIOS physical address */ - uint64_t fbLocation; + uint32_t fbLocation; uint32_t gartLocation; uint32_t mc_fb_location; uint32_t mc_agp_location; @@ -837,8 +747,6 @@ typedef struct { Bool ddc2; RADEONPLLRec pll; - int default_dispclk; - int dp_extclk; int RamWidth; float sclk; /* in MHz */ @@ -864,6 +772,12 @@ typedef struct { int pix24bpp; /* Depth of pixmap for 24bpp fb */ Bool dac6bits; /* Use 6 bit DAC? */ + DGAModePtr DGAModes; + int numDGAModes; + Bool DGAactive; + int DGAViewportStatus; + DGAFunctionRec DGAFuncs; + RADEONFBLayout CurrentLayout; #ifdef XF86DRI @@ -872,9 +786,6 @@ typedef struct { RADEONCardType cardType; /* Current card is a PCI card */ struct radeon_cp *cp; struct radeon_dri *dri; -#ifdef XF86DRM_MODE - struct radeon_dri2 dri2; -#endif #ifdef USE_EXA Bool accelDFS; #endif @@ -889,8 +800,6 @@ typedef struct { Bool accelOn; Bool useEXA; #ifdef USE_EXA - Bool exa_pixmaps; - Bool exa_force_create; XF86ModReqInfo exaReq; #endif #ifdef USE_XAA @@ -924,10 +833,9 @@ typedef struct { uint16_t video_decoder_type; int overlay_scaler_buffer_width; int ecp_div; - unsigned int xv_max_width; - unsigned int xv_max_height; /* general */ + Bool showCache; OptionInfoPtr Options; DisplayModePtr currentMode, savedCurrentMode; @@ -960,6 +868,8 @@ typedef struct { unsigned long FbFreeStart, FbFreeSize; unsigned char* BIOSCopy; + Rotation rotation; + void (*PointerMoved)(int, int, int); CreateScreenResourcesProcPtr CreateScreenResources; /* if no devices are connected at server startup */ @@ -979,50 +889,6 @@ typedef struct { Bool r4xx_atom; - /* pm */ - RADEONPowerManagement pm; - - /* igp info */ - float igp_sideport_mclk; - float igp_system_mclk; - float igp_ht_link_clk; - float igp_ht_link_width; - - int can_resize; - void (*reemit_current2d)(ScrnInfoPtr pScrn, int op); // emit the current 2D state into the IB - struct radeon_2d_state state_2d; - Bool kms_enabled; - struct radeon_bo *front_bo; -#ifdef XF86DRM_MODE - struct radeon_bo_manager *bufmgr; - struct radeon_cs_manager *csm; - struct radeon_cs *cs; - - struct radeon_bo *cursor_bo[6]; - uint64_t vram_size; - uint64_t gart_size; - drmmode_rec drmmode; - /* r6xx+ tile config */ - Bool have_tiling_info; - uint32_t tile_config; - int group_bytes; - int num_channels; - int num_banks; - int r7xx_bank_op; -#else - /* fake bool */ - Bool cs; -#endif - - /* Xv bicubic filtering */ - struct radeon_bo *bicubic_bo; - void *bicubic_memory; - int bicubic_offset; - /* kms pageflipping */ - Bool allowPageFlip; - - /* Perform vsync'ed SwapBuffers? */ - Bool swapBuffersWait; } RADEONInfoRec, *RADEONInfoPtr; #define RADEONWaitForFifo(pScrn, entries) \ @@ -1104,9 +970,7 @@ extern int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info); # ifdef USE_XAA extern Bool RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen); # endif -uint32_t radeonGetPixmapOffset(PixmapPtr pPix); #endif -extern int radeon_cs_space_remaining(ScrnInfoPtr pScrn); #ifdef USE_XAA /* radeon_accelfuncs.c */ @@ -1133,11 +997,11 @@ extern Bool radeon_card_posted(ScrnInfoPtr pScrn); #ifdef XF86DRI extern void RADEONWaitForIdleCP(ScrnInfoPtr pScrn); extern void RADEONWaitForVLineCP(ScrnInfoPtr pScrn, PixmapPtr pPix, - xf86CrtcPtr crtc, int start, int stop); + int crtc, int start, int stop); #endif extern void RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn); extern void RADEONWaitForVLineMMIO(ScrnInfoPtr pScrn, PixmapPtr pPix, - xf86CrtcPtr crtc, int start, int stop); + int crtc, int start, int stop); /* radeon_crtc.c */ extern void radeon_crtc_dpms(xf86CrtcPtr crtc, int mode); @@ -1145,11 +1009,9 @@ extern void radeon_crtc_load_lut(xf86CrtcPtr crtc); extern void radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post); extern Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask); extern void RADEONBlank(ScrnInfoPtr pScrn); -extern void RADEONComputePLL(xf86CrtcPtr crtc, - RADEONPLLPtr pll, unsigned long freq, +extern void RADEONComputePLL(RADEONPLLPtr pll, unsigned long freq, uint32_t *chosen_dot_clock_freq, uint32_t *chosen_feedback_div, - uint32_t *chosen_frac_feedback_div, uint32_t *chosen_reference_div, uint32_t *chosen_post_div, int flags); extern DisplayModePtr RADEONCrtcFindClosestMode(xf86CrtcPtr crtc, @@ -1166,6 +1028,9 @@ extern void radeon_crtc_set_cursor_colors(xf86CrtcPtr crtc, int bg, int fg); extern void radeon_crtc_set_cursor_position(xf86CrtcPtr crtc, int x, int y); extern void radeon_crtc_show_cursor(xf86CrtcPtr crtc); +/* radeon_dga.c */ +extern Bool RADEONDGAInit(ScreenPtr pScreen); + #ifdef XF86DRI /* radeon_dri.c */ extern void RADEONDRIAllocatePCIGARTTable(ScreenPtr pScreen); @@ -1189,11 +1054,9 @@ extern int RADEONMinBits(int val); extern unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr); extern unsigned RADEONINPLL(ScrnInfoPtr pScrn, int addr); extern unsigned RADEONINPCIE(ScrnInfoPtr pScrn, int addr); -extern unsigned R600INPCIE_PORT(ScrnInfoPtr pScrn, int addr); extern void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data); extern void RADEONOUTPLL(ScrnInfoPtr pScrn, int addr, uint32_t data); extern void RADEONOUTPCIE(ScrnInfoPtr pScrn, int addr, uint32_t data); -extern void R600OUTPCIE_PORT(ScrnInfoPtr pScrn, int addr, uint32_t data); extern void RADEONPllErrataAfterData(RADEONInfoPtr info); extern void RADEONPllErrataAfterIndex(RADEONInfoPtr info); extern void RADEONWaitForVerticalSync(ScrnInfoPtr pScrn); @@ -1202,30 +1065,10 @@ extern void RADEONInitMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save, RADEONInfoPtr info); extern void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore); -extern Bool -RADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name); - -Bool RADEONGetRec(ScrnInfoPtr pScrn); -void RADEONFreeRec(ScrnInfoPtr pScrn); -Bool RADEONPreInitVisual(ScrnInfoPtr pScrn); -Bool RADEONPreInitWeight(ScrnInfoPtr pScrn); - -extern Bool RADEON_DP_I2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, - char *name, xf86OutputPtr output); -extern void RADEON_DP_GetDPCD(xf86OutputPtr output); -extern int RADEON_DP_GetSinkType(xf86OutputPtr output); - -/* radeon_pm.c */ -extern void RADEONPMInit(ScrnInfoPtr pScrn); -extern void RADEONPMBlockHandler(ScrnInfoPtr pScrn); -extern void RADEONPMEnterVT(ScrnInfoPtr pScrn); -extern void RADEONPMLeaveVT(ScrnInfoPtr pScrn); -extern void RADEONPMFini(ScrnInfoPtr pScrn); #ifdef USE_EXA /* radeon_exa.c */ extern Bool RADEONSetupMemEXA(ScreenPtr pScreen); -extern Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t); /* radeon_exa_funcs.c */ extern void RADEONCopyCP(PixmapPtr pDst, int srcX, int srcY, int dstX, @@ -1246,9 +1089,6 @@ extern void RADEONDoPrepareCopyMMIO(ScrnInfoPtr pScrn, Pixel planemask); extern Bool R600DrawInit(ScreenPtr pScreen); extern Bool R600LoadShaders(ScrnInfoPtr pScrn); -#ifdef XF86DRM_MODE -extern Bool EVERGREENDrawInit(ScreenPtr pScreen); -#endif #endif #if defined(XF86DRI) && defined(USE_EXA) @@ -1272,9 +1112,8 @@ extern void RADEONPrintPortMap(ScrnInfoPtr pScrn); extern void RADEONSetOutputType(ScrnInfoPtr pScrn, RADEONOutputPrivatePtr radeon_output); extern Bool RADEONSetupConnectors(ScrnInfoPtr pScrn); -extern Bool RADEONI2CDoLock(xf86OutputPtr output, I2CBusPtr b, Bool lock_state); +extern Bool RADEONI2CDoLock(xf86OutputPtr output, Bool lock_state); -extern Bool radeon_dp_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode); /* radeon_tv.c */ extern void RADEONSaveTVRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); @@ -1294,32 +1133,17 @@ extern void RADEONUpdateHVPosition(xf86OutputPtr output, DisplayModePtr mode); /* radeon_video.c */ extern void RADEONInitVideo(ScreenPtr pScreen); extern void RADEONResetVideo(ScrnInfoPtr pScrn); -extern Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn); -extern xf86CrtcPtr radeon_pick_best_crtc(ScrnInfoPtr pScrn, - int x1, int x2, int y1, int y2); /* radeon_legacy_memory.c */ extern uint32_t radeon_legacy_allocate_memory(ScrnInfoPtr pScrn, void **mem_struct, int size, - int align, - int domain); + int align); extern void radeon_legacy_free_memory(ScrnInfoPtr pScrn, void *mem_struct); -#ifdef XF86DRM_MODE -extern void radeon_cs_flush_indirect(ScrnInfoPtr pScrn); -extern void radeon_ddx_cs_start(ScrnInfoPtr pScrn, - int num, const char *file, - const char *func, int line); -void radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, int new_fb_size); -#endif -struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix); -void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo); -uint32_t radeon_get_pixmap_tiling(PixmapPtr pPix); - #ifdef XF86DRI # ifdef USE_XAA /* radeon_accelfuncs.c */ @@ -1338,9 +1162,7 @@ do { \ #define RADEONCP_RELEASE(pScrn, info) \ do { \ - if (info->cs) { \ - radeon_cs_flush_indirect(pScrn); \ - } else if (info->cp->CPInUse) { \ + if (info->cp->CPInUse) { \ RADEON_PURGE_CACHE(); \ RADEON_WAIT_UNTIL_IDLE(); \ RADEONCPReleaseIndirect(pScrn); \ @@ -1375,7 +1197,7 @@ do { \ #define RADEONCP_REFRESH(pScrn, info) \ do { \ - if (!info->cp->CPInUse && !info->cs) { \ + if (!info->cp->CPInUse) { \ if (info->cp->needCacheFlush) { \ RADEON_PURGE_CACHE(); \ RADEON_PURGE_ZCACHE(); \ @@ -1406,59 +1228,54 @@ do { \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ "BEGIN_RING(%d) in %s\n", (unsigned int)n, __FUNCTION__);\ } \ - if (info->cs) { radeon_ddx_cs_start(pScrn, n, __FILE__, __func__, __LINE__); } else { \ - if (++info->cp->dma_begin_count != 1) { \ + if (++info->cp->dma_begin_count != 1) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "BEGIN_RING without end at %s:%d\n", \ - info->cp->dma_debug_func, info->cp->dma_debug_lineno); \ + info->cp->dma_debug_func, info->cp->dma_debug_lineno); \ info->cp->dma_begin_count = 1; \ - } \ - info->cp->dma_debug_func = __FILE__; \ - info->cp->dma_debug_lineno = __LINE__; \ - if (!info->cp->indirectBuffer) { \ + } \ + info->cp->dma_debug_func = __FILE__; \ + info->cp->dma_debug_lineno = __LINE__; \ + if (!info->cp->indirectBuffer) { \ info->cp->indirectBuffer = RADEONCPGetBuffer(pScrn); \ info->cp->indirectStart = 0; \ - } else if (info->cp->indirectBuffer->used + (n) * (int)sizeof(uint32_t) > \ - info->cp->indirectBuffer->total) { \ + } else if (info->cp->indirectBuffer->used + (n) * (int)sizeof(uint32_t) > \ + info->cp->indirectBuffer->total) { \ RADEONCPFlushIndirect(pScrn, 1); \ - } \ - __expected = n; \ - __head = (pointer)((char *)info->cp->indirectBuffer->address + \ - info->cp->indirectBuffer->used); \ - __count = 0; \ } \ + __expected = n; \ + __head = (pointer)((char *)info->cp->indirectBuffer->address + \ + info->cp->indirectBuffer->used); \ + __count = 0; \ } while (0) #define ADVANCE_RING() do { \ - if (info->cs) radeon_cs_end(info->cs, __FILE__, __func__, __LINE__); else { \ - if (info->cp->dma_begin_count-- != 1) { \ + if (info->cp->dma_begin_count-- != 1) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "ADVANCE_RING without begin at %s:%d\n", \ __FILE__, __LINE__); \ info->cp->dma_begin_count = 0; \ - } \ - if (__count != __expected) { \ + } \ + if (__count != __expected) { \ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, \ "ADVANCE_RING count != expected (%d vs %d) at %s:%d\n", \ __count, __expected, __FILE__, __LINE__); \ - } \ - if (RADEON_VERBOSE) { \ + } \ + if (RADEON_VERBOSE) { \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ "ADVANCE_RING() start: %d used: %d count: %d\n", \ info->cp->indirectStart, \ info->cp->indirectBuffer->used, \ __count * (int)sizeof(uint32_t)); \ - } \ - info->cp->indirectBuffer->used += __count * (int)sizeof(uint32_t); \ } \ - } while (0) + info->cp->indirectBuffer->used += __count * (int)sizeof(uint32_t); \ +} while (0) #define OUT_RING(x) do { \ if (RADEON_VERBOSE) { \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ " OUT_RING(0x%08x)\n", (unsigned int)(x)); \ } \ - if (info->cs) radeon_cs_write_dword(info->cs, (x)); else \ __head[__count++] = (x); \ } while (0) @@ -1468,22 +1285,12 @@ do { \ OUT_RING(val); \ } while (0) -#define OUT_RING_RELOC(x, read_domains, write_domain) \ - do { \ - int _ret; \ - _ret = radeon_cs_write_reloc(info->cs, x, read_domains, write_domain, 0); \ - if (_ret) ErrorF("reloc emit failure %d\n", _ret); \ - } while(0) - - #define FLUSH_RING() \ do { \ if (RADEON_VERBOSE) \ xf86DrvMsg(pScrn->scrnIndex, X_INFO, \ "FLUSH_RING in %s\n", __FUNCTION__); \ - if (info->cs) \ - radeon_cs_flush_indirect(pScrn); \ - else if (info->cp->indirectBuffer) \ + if (info->cp->indirectBuffer) \ RADEONCPFlushIndirect(pScrn, 0); \ } while (0) @@ -1559,33 +1366,18 @@ do { \ #endif /* XF86DRI */ #if defined(XF86DRI) && defined(USE_EXA) - -#ifdef XF86DRM_MODE -#define CS_FULL(cs) ((cs)->cdw > 15 * 1024) -#else -#define CS_FULL(cs) FALSE -#endif - #define RADEON_SWITCH_TO_2D() \ do { \ uint32_t flush = 0; \ switch (info->accel_state->engineMode) { \ case EXA_ENGINEMODE_UNKNOWN: \ - flush = 1; \ - break; \ case EXA_ENGINEMODE_3D: \ - flush = !info->cs || CS_FULL(info->cs); \ - break; \ + flush = 1; \ case EXA_ENGINEMODE_2D: \ - flush = info->cs && CS_FULL(info->cs); \ break; \ } \ - if (flush) { \ - if (info->cs) \ - radeon_cs_flush_indirect(pScrn); \ - else if (info->directRenderingEnabled) \ - RADEONCPFlushIndirect(pScrn, 1); \ - } \ + if (flush && info->directRenderingEnabled) \ + RADEONCPFlushIndirect(pScrn, 1); \ info->accel_state->engineMode = EXA_ENGINEMODE_2D; \ } while (0); @@ -1594,23 +1386,16 @@ do { \ uint32_t flush = 0; \ switch (info->accel_state->engineMode) { \ case EXA_ENGINEMODE_UNKNOWN: \ - flush = 1; \ - break; \ case EXA_ENGINEMODE_2D: \ - flush = !info->cs || CS_FULL(info->cs); \ - break; \ + flush = 1; \ case EXA_ENGINEMODE_3D: \ - flush = info->cs && CS_FULL(info->cs); \ break; \ } \ if (flush) { \ - if (info->cs) \ - radeon_cs_flush_indirect(pScrn); \ - else if (info->directRenderingEnabled) \ + if (info->directRenderingEnabled) \ RADEONCPFlushIndirect(pScrn, 1); \ - } \ - if (!info->accel_state->XInited3D) \ RADEONInit3DEngine(pScrn); \ + } \ info->accel_state->engineMode = EXA_ENGINEMODE_3D; \ } while (0); #else @@ -1659,9 +1444,4 @@ static __inline__ int radeon_timedout(const struct timeval *endtime) now.tv_usec > endtime->tv_usec : now.tv_sec > endtime->tv_sec; } -enum { - RADEON_CREATE_PIXMAP_TILING_MACRO = 0x10000000, - RADEON_CREATE_PIXMAP_TILING_MICRO = 0x20000000, -}; - #endif /* _RADEON_H_ */ diff --git a/driver/xf86-video-ati/src/radeon_accel.c b/driver/xf86-video-ati/src/radeon_accel.c index 1cebcf6a7..a9a484808 100644 --- a/driver/xf86-video-ati/src/radeon_accel.c +++ b/driver/xf86-video-ati/src/radeon_accel.c @@ -75,7 +75,6 @@ #include #include -#include /* Driver data structures */ #include "radeon.h" #include "radeon_reg.h" @@ -88,8 +87,6 @@ #include "radeon_drm.h" #endif -#include "ati_pciids_gen.h" - /* Line support */ #include "miline.h" @@ -329,6 +326,10 @@ void RADEONEngineReset(ScrnInfoPtr pScrn) INREG(RADEON_RBBM_SOFT_RESET); } + OUTREG(RADEON_HOST_PATH_CNTL, host_path_cntl | RADEON_HDP_SOFT_RESET); + INREG(RADEON_HOST_PATH_CNTL); + OUTREG(RADEON_HOST_PATH_CNTL, host_path_cntl); + if (!IS_R300_VARIANT && !IS_AVIVO_VARIANT) OUTREG(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); @@ -372,9 +373,6 @@ void RADEONEngineRestore(ScrnInfoPtr pScrn) RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - if (info->cs) - return; - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, "EngineRestore (%d/%d)\n", info->CurrentLayout.pixel_code, @@ -421,24 +419,6 @@ void RADEONEngineRestore(ScrnInfoPtr pScrn) info->accel_state->XInited3D = FALSE; } -static int RADEONDRMGetNumPipes(ScrnInfoPtr pScrn, int *num_pipes) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - if (info->dri->pKernelDRMVersion->version_major < 2) { - drm_radeon_getparam_t np; - - memset(&np, 0, sizeof(np)); - np.param = RADEON_PARAM_NUM_GB_PIPES; - np.value = num_pipes; - return drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_GETPARAM, &np, sizeof(np)); - } else { - struct drm_radeon_info np2; - np2.value = (unsigned long)num_pipes; - np2.request = RADEON_INFO_NUM_GB_PIPES; - return drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_INFO, &np2, sizeof(np2)); - } -} - /* Initialize the acceleration hardware */ void RADEONEngineInit(ScrnInfoPtr pScrn) { @@ -454,9 +434,15 @@ void RADEONEngineInit(ScrnInfoPtr pScrn) #ifdef XF86DRI if (info->directRenderingEnabled && (IS_R300_3D || IS_R500_3D)) { + drm_radeon_getparam_t np; int num_pipes; - if(RADEONDRMGetNumPipes(pScrn, &num_pipes) < 0) { + memset(&np, 0, sizeof(np)); + np.param = RADEON_PARAM_NUM_GB_PIPES; + np.value = &num_pipes; + + if (drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_GETPARAM, &np, + sizeof(np)) < 0) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Failed to determine num pipes from DRM, falling back to " "manual look-up!\n"); @@ -467,70 +453,60 @@ void RADEONEngineInit(ScrnInfoPtr pScrn) } #endif - if (!info->cs) { - if ((info->ChipFamily == CHIP_FAMILY_RV410) || - (info->ChipFamily == CHIP_FAMILY_R420) || - (info->ChipFamily == CHIP_FAMILY_RS600) || - (info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740) || - (info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480) || - IS_R500_3D) { - if (info->accel_state->num_gb_pipes == 0) { - uint32_t gb_pipe_sel = INREG(R400_GB_PIPE_SELECT); + if ((info->ChipFamily == CHIP_FAMILY_RV410) || + (info->ChipFamily == CHIP_FAMILY_R420) || + (info->ChipFamily == CHIP_FAMILY_RS600) || + (info->ChipFamily == CHIP_FAMILY_RS690) || + (info->ChipFamily == CHIP_FAMILY_RS740) || + (info->ChipFamily == CHIP_FAMILY_RS400) || + (info->ChipFamily == CHIP_FAMILY_RS480) || + IS_R500_3D) { + if (info->accel_state->num_gb_pipes == 0) { + uint32_t gb_pipe_sel = INREG(R400_GB_PIPE_SELECT); - info->accel_state->num_gb_pipes = ((gb_pipe_sel >> 12) & 0x3) + 1; - if (IS_R500_3D) - OUTPLL(pScrn, R500_DYN_SCLK_PWMEM_PIPE, (1 | ((gb_pipe_sel >> 8) & 0xf) << 4)); - } - } else { - if (info->accel_state->num_gb_pipes == 0) { - if ((info->ChipFamily == CHIP_FAMILY_R300) || - (info->ChipFamily == CHIP_FAMILY_R350)) { - /* R3xx chips */ - info->accel_state->num_gb_pipes = 2; - } else { - /* RV3xx chips */ - info->accel_state->num_gb_pipes = 1; - } + info->accel_state->num_gb_pipes = ((gb_pipe_sel >> 12) & 0x3) + 1; + if (IS_R500_3D) + OUTPLL(pScrn, R500_DYN_SCLK_PWMEM_PIPE, (1 | ((gb_pipe_sel >> 8) & 0xf) << 4)); + } + } else { + if (info->accel_state->num_gb_pipes == 0) { + if ((info->ChipFamily == CHIP_FAMILY_R300) || + (info->ChipFamily == CHIP_FAMILY_R350)) { + /* R3xx chips */ + info->accel_state->num_gb_pipes = 2; + } else { + /* RV3xx chips */ + info->accel_state->num_gb_pipes = 1; } } - - /* SE cards only have 1 quadpipe */ - if ((info->Chipset == PCI_CHIP_RV410_5E4C) || - (info->Chipset == PCI_CHIP_RV410_5E4F) || - (info->Chipset == PCI_CHIP_R300_AD) || - (info->Chipset == PCI_CHIP_R350_AH)) - info->accel_state->num_gb_pipes = 1; - - if (IS_R300_3D || IS_R500_3D) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "num quad-pipes is %d\n", info->accel_state->num_gb_pipes); - - if (IS_R300_3D || IS_R500_3D) { - uint32_t gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); - - switch(info->accel_state->num_gb_pipes) { - case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break; - case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break; - case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break; - default: - case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break; - } - - OUTREG(R300_GB_TILE_CONFIG, gb_tile_config); - OUTREG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); - if (info->ChipFamily >= CHIP_FAMILY_R420) - OUTREG(R300_DST_PIPE_CONFIG, INREG(R300_DST_PIPE_CONFIG) | R300_PIPE_AUTO_CONFIG); - OUTREG(R300_RB2D_DSTCACHE_MODE, (INREG(R300_RB2D_DSTCACHE_MODE) | - R300_DC_AUTOFLUSH_ENABLE | - R300_DC_DC_DISABLE_IGNORE_PE)); - } else - OUTREG(RADEON_RB3D_CNTL, 0); - - RADEONEngineReset(pScrn); } + if (IS_R300_3D || IS_R500_3D) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "num quad-pipes is %d\n", info->accel_state->num_gb_pipes); + + if (IS_R300_3D || IS_R500_3D) { + uint32_t gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16 | R300_SUBPIXEL_1_16); + + switch(info->accel_state->num_gb_pipes) { + case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break; + case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break; + case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break; + default: + case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break; + } + + OUTREG(R300_GB_TILE_CONFIG, gb_tile_config); + OUTREG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); + OUTREG(R300_DST_PIPE_CONFIG, INREG(R300_DST_PIPE_CONFIG) | R300_PIPE_AUTO_CONFIG); + OUTREG(R300_RB2D_DSTCACHE_MODE, (INREG(R300_RB2D_DSTCACHE_MODE) | + R300_DC_AUTOFLUSH_ENABLE | + R300_DC_DC_DISABLE_IGNORE_PE)); + } else + OUTREG(RADEON_RB3D_CNTL, 0); + + RADEONEngineReset(pScrn); + switch (info->CurrentLayout.pixel_code) { case 8: datatype = 2; break; case 15: datatype = 3; break; @@ -553,36 +529,6 @@ void RADEONEngineInit(ScrnInfoPtr pScrn) RADEONEngineRestore(pScrn); } -uint32_t radeonGetPixmapOffset(PixmapPtr pPix) -{ - ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t offset = 0; - if (info->cs) - return 0; -#ifdef USE_EXA - if (info->useEXA) { - offset = exaGetPixmapOffset(pPix); - } else -#endif - { - offset = pPix->devPrivate.ptr - info->FB; - } - offset += info->fbLocation + pScrn->fbOffset; - return offset; -} - -int radeon_cs_space_remaining(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - -#ifdef XF86DRM_MODE - if (info->cs) - return (info->cs->ndw - info->cs->cdw); - else -#endif - return (info->cp->indirectBuffer->total - info->cp->indirectBuffer->used) / (int)sizeof(uint32_t); -} #define ACCEL_MMIO #define ACCEL_PREAMBLE() unsigned char *RADEONMMIO = info->MMIO @@ -667,8 +613,6 @@ int RADEONCPStop(ScrnInfoPtr pScrn, RADEONInfoPtr info) } } -#define RADEON_IB_RESERVE (16 * sizeof(uint32_t)) - /* Get an indirect buffer for the CP 2D acceleration commands */ drmBufPtr RADEONCPGetBuffer(ScrnInfoPtr pScrn) { @@ -745,7 +689,6 @@ void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard) int start = info->cp->indirectStart; drm_radeon_indirect_t indirect; - assert(!info->cs); if (!buffer) return; if (start == buffer->used && !discard) return; @@ -779,7 +722,7 @@ void RADEONCPFlushIndirect(ScrnInfoPtr pScrn, int discard) info->cp->indirectStart = 0; } else { /* Start on a double word boundary */ - info->cp->indirectStart = buffer->used = RADEON_ALIGN(buffer->used, 8); + info->cp->indirectStart = buffer->used = (buffer->used + 7) & ~7; if (RADEON_VERBOSE) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, " Starting at %d\n", info->cp->indirectStart); @@ -795,7 +738,6 @@ void RADEONCPReleaseIndirect(ScrnInfoPtr pScrn) int start = info->cp->indirectStart; drm_radeon_indirect_t indirect; - assert(!info->cs); if (info->ChipFamily >= CHIP_FAMILY_R600) { if (buffer && (buffer->used & 0x3c)) { RING_LOCALS; @@ -878,11 +820,11 @@ RADEONHostDataBlit( break; case 2: format = RADEON_GMC_DST_16BPP; - *bufPitch = 2 * RADEON_ALIGN(w, 2); + *bufPitch = 2 * ((w + 1) & ~1); break; case 1: format = RADEON_GMC_DST_8BPP_CI; - *bufPitch = RADEON_ALIGN(w, 4); + *bufPitch = (w + 3) & ~3; break; default: xf86DrvMsg( pScrn->scrnIndex, X_ERROR, @@ -991,7 +933,7 @@ void RADEONCopySwap(uint8_t *dst, uint8_t *src, unsigned int size, int swap) } } if (src != dst) - memcpy(dst, src, size); + memmove(dst, src, size); } /* Copies a single pass worth of data for a hostdata blit set up by @@ -1073,13 +1015,7 @@ Bool RADEONAccelInit(ScreenPtr pScreen) if (info->useEXA) { # ifdef XF86DRI if (info->directRenderingEnabled) { -#ifdef XF86DRM_MODE - if (info->ChipFamily >= CHIP_FAMILY_CEDAR) { - if (!EVERGREENDrawInit(pScreen)) - return FALSE; - } else -#endif - if (info->ChipFamily >= CHIP_FAMILY_R600) { + if (info->ChipFamily >= CHIP_FAMILY_R600) { if (!R600DrawInit(pScreen)) return FALSE; } else { @@ -1136,10 +1072,8 @@ void RADEONInit3DEngine(ScrnInfoPtr pScrn) if (info->directRenderingEnabled) { drm_radeon_sarea_t *pSAREAPriv; - if (!info->kms_enabled) { - pSAREAPriv = DRIGetSAREAPrivate(pScrn->pScreen); - pSAREAPriv->ctx_owner = DRIGetContext(pScrn->pScreen); - } + pSAREAPriv = DRIGetSAREAPrivate(pScrn->pScreen); + pSAREAPriv->ctx_owner = DRIGetContext(pScrn->pScreen); RADEONInit3DEngineCP(pScrn); } else #endif @@ -1174,20 +1108,20 @@ RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen) * Might need that for non-XF86DRI too? */ if (info->allowColorTiling) { - bufferSize = RADEON_ALIGN((RADEON_ALIGN(pScrn->virtualY, 16)) * width_bytes, - RADEON_GPU_PAGE_SIZE); + bufferSize = (((pScrn->virtualY + 15) & ~15) * width_bytes + + RADEON_BUFFER_ALIGN) & ~RADEON_BUFFER_ALIGN; } else { - bufferSize = RADEON_ALIGN(pScrn->virtualY * width_bytes, - RADEON_GPU_PAGE_SIZE); + bufferSize = (pScrn->virtualY * width_bytes + + RADEON_BUFFER_ALIGN) & ~RADEON_BUFFER_ALIGN; } /* Due to tiling, the Z buffer pitch must be a multiple of 32 pixels, * which is always the case if color tiling is used due to color pitch * but not necessarily otherwise, and its height a multiple of 16 lines. */ - info->dri->depthPitch = RADEON_ALIGN(pScrn->displayWidth, 32); - depthSize = RADEON_ALIGN((RADEON_ALIGN(pScrn->virtualY, 16)) * info->dri->depthPitch - * depthCpp, RADEON_GPU_PAGE_SIZE); + info->dri->depthPitch = (pScrn->displayWidth + 31) & ~31; + depthSize = ((((pScrn->virtualY + 15) & ~15) * info->dri->depthPitch + * depthCpp + RADEON_BUFFER_ALIGN) & ~RADEON_BUFFER_ALIGN); xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %d MB GART aperture\n", info->dri->gartSize); @@ -1294,22 +1228,25 @@ RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen) } else { /* Reserve space for textures */ - info->dri->textureOffset = RADEON_ALIGN(info->FbMapSize - info->dri->textureSize, - RADEON_GPU_PAGE_SIZE); + info->dri->textureOffset = ((info->FbMapSize - info->dri->textureSize + + RADEON_BUFFER_ALIGN) & + ~(uint32_t)RADEON_BUFFER_ALIGN); } /* Reserve space for the shared depth * buffer. */ - info->dri->depthOffset = RADEON_ALIGN(info->dri->textureOffset - depthSize, - RADEON_GPU_PAGE_SIZE); + info->dri->depthOffset = ((info->dri->textureOffset - depthSize + + RADEON_BUFFER_ALIGN) & + ~(uint32_t)RADEON_BUFFER_ALIGN); /* Reserve space for the shared back buffer */ if (info->dri->noBackBuffer) { info->dri->backOffset = info->dri->depthOffset; } else { - info->dri->backOffset = RADEON_ALIGN(info->dri->depthOffset - bufferSize, - RADEON_GPU_PAGE_SIZE); + info->dri->backOffset = ((info->dri->depthOffset - bufferSize + + RADEON_BUFFER_ALIGN) & + ~(uint32_t)RADEON_BUFFER_ALIGN); } info->dri->backY = info->dri->backOffset / width_bytes; @@ -1341,7 +1278,7 @@ RADEONSetupMemXAA_DRI(int scrnIndex, ScreenPtr pScreen) if ((fbarea = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth, info->allowColorTiling ? - (RADEON_ALIGN(pScrn->virtualY, 16)) + ((pScrn->virtualY + 15) & ~15) - pScrn->virtualY + 2 : 2, 0, NULL, NULL, NULL))) { @@ -1449,7 +1386,7 @@ RADEONSetupMemXAA(int scrnIndex, ScreenPtr pScreen) if ((fbarea = xf86AllocateOffscreenArea(pScreen, pScrn->displayWidth, info->allowColorTiling ? - (RADEON_ALIGN(pScrn->virtualY, 16)) + ((pScrn->virtualY + 15) & ~15) - pScrn->virtualY + 2 : 2, 0, NULL, NULL, NULL))) { diff --git a/driver/xf86-video-ati/src/radeon_accelfuncs.c b/driver/xf86-video-ati/src/radeon_accelfuncs.c index d0bead353..45eb6d559 100644 --- a/driver/xf86-video-ati/src/radeon_accelfuncs.c +++ b/driver/xf86-video-ati/src/radeon_accelfuncs.c @@ -827,7 +827,7 @@ FUNC_NAME(RADEONSubsequentScanlineCPUToScreenColorExpandFill)(ScrnInfoPtr OUT_ACCEL_REG(RADEON_SC_BOTTOM_RIGHT, ((y+h) << 16) | ((x+w) & 0xffff)); OUT_ACCEL_REG(RADEON_DST_Y_X, (y << 16) | (x & 0xffff)); /* Have to pad the width here and use clipping engine */ - OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | RADEON_ALIGN(w, 32)); + OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | ((w + 31) & ~31)); FINISH_ACCEL(); @@ -836,7 +836,7 @@ FUNC_NAME(RADEONSubsequentScanlineCPUToScreenColorExpandFill)(ScrnInfoPtr info->accel_state->scanline_x = x; info->accel_state->scanline_y = y; /* Have to pad the width here and use clipping engine */ - info->accel_state->scanline_w = RADEON_ALIGN(w, 32); + info->accel_state->scanline_w = (w + 31) & ~31; info->accel_state->scanline_h = h; info->accel_state->scanline_x1clip = x + skipleft; @@ -1206,7 +1206,7 @@ FUNC_NAME(RADEONAccelInit)(ScreenPtr pScreen, XAAInfoRecPtr a) a->ScanlineColorExpandBuffers = info->accel_state->scratch_buffer; if (!info->accel_state->scratch_save) info->accel_state->scratch_save - = malloc(((pScrn->virtualX+31)/32*4) + = xalloc(((pScrn->virtualX+31)/32*4) + (pScrn->virtualX * info->CurrentLayout.pixel_bytes)); info->accel_state->scratch_buffer[0] = info->accel_state->scratch_save; a->SetupForScanlineCPUToScreenColorExpandFill @@ -1332,7 +1332,6 @@ FUNC_NAME(RADEONAccelInit)(ScreenPtr pScreen, XAAInfoRecPtr a) #endif #ifdef RENDER - info->RenderAccel = FALSE; if (info->RenderAccel && info->xaaReq.minorversion >= 2) { a->CPUToScreenAlphaTextureFlags = XAA_RENDER_POWER_OF_2_TILE_ONLY; @@ -1346,7 +1345,10 @@ FUNC_NAME(RADEONAccelInit)(ScreenPtr pScreen, XAAInfoRecPtr a) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "XAA Render acceleration " "unsupported on Radeon 9500/9700 and newer. " "Please use EXA instead.\n"); - } else if (IS_R200_3D) { + } else if ((info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280) || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_R200)) { a->SetupForCPUToScreenAlphaTexture2 = FUNC_NAME(R200SetupForCPUToScreenAlphaTexture); a->SubsequentCPUToScreenAlphaTexture = diff --git a/driver/xf86-video-ati/src/radeon_atombios.c b/driver/xf86-video-ati/src/radeon_atombios.c index 6cc3daa8d..10fdefeb1 100644 --- a/driver/xf86-video-ati/src/radeon_atombios.c +++ b/driver/xf86-video-ati/src/radeon_atombios.c @@ -30,7 +30,6 @@ #include "xf86_OSproc.h" #include "radeon.h" -#include "radeon_reg.h" #include "radeon_atombios.h" #include "radeon_atomwrapper.h" #include "radeon_probe.h" @@ -490,7 +489,7 @@ rhdAtomAllocateFbScratch(atomBiosHandlePtr handle, xf86DrvMsg(handle->scrnIndex, X_INFO, "Cannot get VRAM scratch space. " "Allocating in main memory instead\n"); - handle->scratchBase = calloc(fb_size,1); + handle->scratchBase = xcalloc(fb_size,1); return ATOM_SUCCESS; } return ATOM_FAILED; @@ -525,7 +524,7 @@ rhdAtomASICInit(atomBiosHandlePtr handle) } int -atombios_clk_gating_setup(ScrnInfoPtr pScrn, Bool enable) +atombios_dyn_clk_setup(ScrnInfoPtr pScrn, int enable) { RADEONInfoPtr info = RADEONPTR(pScrn); DYNAMIC_CLOCK_GATING_PS_ALLOCATION dynclk_data; @@ -549,19 +548,13 @@ atombios_clk_gating_setup(ScrnInfoPtr pScrn, Bool enable) } int -atombios_static_pwrmgt_setup(ScrnInfoPtr pScrn, Bool enable) +atombios_static_pwrmgt_setup(ScrnInfoPtr pScrn, int enable) { RADEONInfoPtr info = RADEONPTR(pScrn); ENABLE_ASIC_STATIC_PWR_MGT_PS_ALLOCATION pwrmgt_data; AtomBiosArgRec data; unsigned char *space; - /* disabling static power management causes hangs on some r4xx chips */ - if (((info->ChipFamily == CHIP_FAMILY_R420) || - (info->ChipFamily == CHIP_FAMILY_RV410)) && - !enable) - return ATOM_NOT_IMPLEMENTED; - pwrmgt_data.ucEnable = enable; data.exec.index = GetIndexIntoMasterTable(COMMAND, EnableASIC_StaticPwrMgt); @@ -578,59 +571,6 @@ atombios_static_pwrmgt_setup(ScrnInfoPtr pScrn, Bool enable) } -int -atombios_set_engine_clock(ScrnInfoPtr pScrn, uint32_t engclock) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - SET_ENGINE_CLOCK_PS_ALLOCATION eng_clock_ps; - AtomBiosArgRec data; - unsigned char *space; - - RADEONWaitForIdleMMIO(pScrn); - - eng_clock_ps.ulTargetEngineClock = engclock; /* 10 khz */ - - /*ErrorF("Attempting to set engine clock to: %d\n", engclock);*/ - data.exec.index = GetIndexIntoMasterTable(COMMAND, SetEngineClock); - data.exec.dataSpace = (void *)&space; - data.exec.pspace = &eng_clock_ps; - - if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { - /* ErrorF("Set engine clock success\n"); */ - return ATOM_SUCCESS; - } - /* ErrorF("Set engine clock failed\n"); */ - return ATOM_NOT_IMPLEMENTED; -} - -int -atombios_set_memory_clock(ScrnInfoPtr pScrn, uint32_t memclock) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - SET_MEMORY_CLOCK_PS_ALLOCATION mem_clock_ps; - AtomBiosArgRec data; - unsigned char *space; - - if (info->IsIGP) - return ATOM_SUCCESS; - - RADEONWaitForIdleMMIO(pScrn); - - mem_clock_ps.ulTargetMemoryClock = memclock; /* 10 khz */ - - /* ErrorF("Attempting to set mem clock to: %d\n", memclock); */ - data.exec.index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock); - data.exec.dataSpace = (void *)&space; - data.exec.pspace = &mem_clock_ps; - - if (RHDAtomBiosFunc(info->atomBIOS->scrnIndex, info->atomBIOS, ATOMBIOS_EXEC, &data) == ATOM_SUCCESS) { - /* ErrorF("Set memory clock success\n"); */ - return ATOM_SUCCESS; - } - /* ErrorF("Set memory clock failed\n"); */ - return ATOM_NOT_IMPLEMENTED; -} - # endif static AtomBiosResult @@ -651,14 +591,14 @@ rhdAtomInit(atomBiosHandlePtr unused1, AtomBiosRequestID unused2, BIOSImageSize = RADEON_VBIOS_SIZE; #endif - if (!(atomDataPtr = calloc(1, sizeof(atomDataTables)))) { + if (!(atomDataPtr = xcalloc(1, sizeof(atomDataTables)))) { xf86DrvMsg(scrnIndex,X_ERROR,"Cannot allocate memory for " "ATOM BIOS data tabes\n"); goto error; } if (!rhdAtomGetDataTable(scrnIndex, info->VBIOS, atomDataPtr, &cmd_offset, BIOSImageSize)) goto error1; - if (!(handle = calloc(1, sizeof(atomBiosHandleRec)))) { + if (!(handle = xcalloc(1, sizeof(atomBiosHandleRec)))) { xf86DrvMsg(scrnIndex,X_ERROR,"Cannot allocate memory\n"); goto error1; } @@ -677,7 +617,7 @@ rhdAtomInit(atomBiosHandlePtr unused1, AtomBiosRequestID unused2, return ATOM_SUCCESS; error1: - free(atomDataPtr); + xfree(atomDataPtr); error: return ATOM_FAILED; } @@ -688,10 +628,10 @@ rhdAtomTearDown(atomBiosHandlePtr handle, { //RHDFUNC(handle); - free(handle->BIOSBase); - free(handle->atomDataPtr); - if (handle->scratchBase) free(handle->scratchBase); - free(handle); + xfree(handle->BIOSBase); + xfree(handle->atomDataPtr); + if (handle->scratchBase) xfree(handle->scratchBase); + xfree(handle); return ATOM_SUCCESS; } @@ -777,20 +717,20 @@ rhdAtomDTDTimings(atomBiosHandlePtr handle, ATOM_DTD_FORMAT *dtd) if (!dtd->usHActive || !dtd->usVActive) return NULL; - if (!(mode = (DisplayModePtr)calloc(1,sizeof(DisplayModeRec)))) + if (!(mode = (DisplayModePtr)xcalloc(1,sizeof(DisplayModeRec)))) return NULL; mode->CrtcHDisplay = mode->HDisplay = le16_to_cpu(dtd->usHActive); mode->CrtcVDisplay = mode->VDisplay = le16_to_cpu(dtd->usVActive); - mode->CrtcHBlankStart = le16_to_cpu(dtd->usHActive) + dtd->ucHBorder; + mode->CrtcHBlankStart = dtd->usHActive + dtd->ucHBorder; mode->CrtcHBlankEnd = mode->CrtcHBlankStart + le16_to_cpu(dtd->usHBlanking_Time); mode->CrtcHTotal = mode->HTotal = mode->CrtcHBlankEnd + dtd->ucHBorder; - mode->CrtcVBlankStart = le16_to_cpu(dtd->usVActive) + dtd->ucVBorder; + mode->CrtcVBlankStart = dtd->usVActive + dtd->ucVBorder; mode->CrtcVBlankEnd = mode->CrtcVBlankStart + le16_to_cpu(dtd->usVBlanking_Time); mode->CrtcVTotal = mode->VTotal = mode->CrtcVBlankEnd + dtd->ucVBorder; - mode->CrtcHSyncStart = mode->HSyncStart = le16_to_cpu(dtd->usHActive) + le16_to_cpu(dtd->usHSyncOffset); + mode->CrtcHSyncStart = mode->HSyncStart = dtd->usHActive + le16_to_cpu(dtd->usHSyncOffset); mode->CrtcHSyncEnd = mode->HSyncEnd = mode->HSyncStart + le16_to_cpu(dtd->usHSyncWidth); - mode->CrtcVSyncStart = mode->VSyncStart = le16_to_cpu(dtd->usVActive) + le16_to_cpu(dtd->usVSyncOffset); + mode->CrtcVSyncStart = mode->VSyncStart = dtd->usVActive + le16_to_cpu(dtd->usVSyncOffset); mode->CrtcVSyncEnd = mode->VSyncEnd = mode->VSyncStart + le16_to_cpu(dtd->usVSyncWidth); mode->SynthClock = mode->Clock = le16_to_cpu(dtd->usPixClk) * 10; @@ -861,7 +801,7 @@ rhdAtomLvdsDDC(atomBiosHandlePtr handle, uint32_t offset, unsigned char *record) - sizeof(UCHAR); if (offset > handle->BIOSImageSize) break; /* dup string as we free it later */ - if (!(EDIDBlock = (unsigned char *)malloc( + if (!(EDIDBlock = (unsigned char *)xalloc( ((ATOM_FAKE_EDID_PATCH_RECORD*)record)->ucFakeEDIDLength))) return NULL; memcpy(EDIDBlock,&((ATOM_FAKE_EDID_PATCH_RECORD*)record)->ucFakeEDIDString, @@ -871,7 +811,7 @@ rhdAtomLvdsDDC(atomBiosHandlePtr handle, uint32_t offset, unsigned char *record) { xf86MonPtr mon = xf86InterpretEDID(handle->scrnIndex,EDIDBlock); xf86PrintEDID(mon); - free(mon); + xfree(mon); } return EDIDBlock; @@ -901,7 +841,6 @@ rhdAtomCVGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func, DisplayModePtr new = NULL; DisplayModePtr first = NULL; int i; - uint16_t size; data->modes = NULL; @@ -909,11 +848,12 @@ rhdAtomCVGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func, if (!rhdAtomGetTableRevisionAndSize( (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->ComponentVideoInfo.base), - &crev,&frev,&size)) { + &frev,&crev,NULL)) { return ATOM_FAILED; } switch (frev) { + case 1: switch (func) { case ATOMBIOS_GET_CV_MODES: @@ -947,11 +887,6 @@ rhdAtomCVGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func, switch (func) { case ATOMBIOS_GET_CV_MODES: for (i = 0; i < MAX_SUPPORTED_CV_STANDARDS; i++) { - /* my rv730 table has only room for one mode */ - if ((void *)&atomDataPtr->ComponentVideoInfo.ComponentVideoInfo_v21->aModeTimings[i] - - atomDataPtr->ComponentVideoInfo.base > size) - break; - new = rhdAtomDTDTimings(handle, &atomDataPtr->ComponentVideoInfo .ComponentVideoInfo_v21->aModeTimings[i]); @@ -1442,19 +1377,17 @@ const int object_connector_convert[] = CONNECTOR_CTV, CONNECTOR_STV, CONNECTOR_NONE, - CONNECTOR_NONE, CONNECTOR_DIN, CONNECTOR_SCART, CONNECTOR_HDMI_TYPE_A, CONNECTOR_HDMI_TYPE_B, + CONNECTOR_HDMI_TYPE_B, CONNECTOR_LVDS, CONNECTOR_DIN, CONNECTOR_NONE, CONNECTOR_NONE, CONNECTOR_NONE, CONNECTOR_DISPLAY_PORT, - CONNECTOR_EDP, - CONNECTOR_NONE, }; xf86MonPtr radeon_atom_get_edid(xf86OutputPtr output) @@ -1515,11 +1448,9 @@ RADEONLookupGPIOLineForDDC(ScrnInfoPtr pScrn, uint8_t id) { RADEONInfoPtr info = RADEONPTR (pScrn); atomDataTablesPtr atomDataPtr; - ATOM_GPIO_I2C_ASSIGMENT *gpio; + ATOM_GPIO_I2C_ASSIGMENT gpio; RADEONI2CBusRec i2c; uint8_t crev, frev; - unsigned short size; - int i, num_indices; memset(&i2c, 0, sizeof(RADEONI2CBusRec)); i2c.valid = FALSE; @@ -1528,73 +1459,53 @@ RADEONLookupGPIOLineForDDC(ScrnInfoPtr pScrn, uint8_t id) if (!rhdAtomGetTableRevisionAndSize( &(atomDataPtr->GPIO_I2C_Info->sHeader), - &crev,&frev,&size)) { + &crev,&frev,NULL)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "No GPIO Info Table found!\n"); return i2c; } - num_indices = size / sizeof(ATOM_GPIO_I2C_ASSIGMENT); - - for (i = 0; i < num_indices; i++) { - gpio = &atomDataPtr->GPIO_I2C_Info->asGPIO_Info[i]; - - if (IS_DCE4_VARIANT) { - if ((i == 7) && - (le16_to_cpu(gpio->usClkMaskRegisterIndex) == 0x1936) && - (gpio->sucI2cId.ucAccess == 0)) { - gpio->sucI2cId.ucAccess = 0x97; - gpio->ucDataMaskShift = 8; - gpio->ucDataEnShift = 8; - gpio->ucDataY_Shift = 8; - gpio->ucDataA_Shift = 8; - } - } - - if (gpio->sucI2cId.ucAccess == id) { - i2c.mask_clk_reg = le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4; - i2c.mask_data_reg = le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4; - i2c.put_clk_reg = le16_to_cpu(gpio->usClkEnRegisterIndex) * 4; - i2c.put_data_reg = le16_to_cpu(gpio->usDataEnRegisterIndex) * 4; - i2c.get_clk_reg = le16_to_cpu(gpio->usClkY_RegisterIndex) * 4; - i2c.get_data_reg = le16_to_cpu(gpio->usDataY_RegisterIndex) * 4; - i2c.a_clk_reg = le16_to_cpu(gpio->usClkA_RegisterIndex) * 4; - i2c.a_data_reg = le16_to_cpu(gpio->usDataA_RegisterIndex) * 4; - i2c.mask_clk_mask = (1 << gpio->ucClkMaskShift); - i2c.mask_data_mask = (1 << gpio->ucDataMaskShift); - i2c.put_clk_mask = (1 << gpio->ucClkEnShift); - i2c.put_data_mask = (1 << gpio->ucDataEnShift); - i2c.get_clk_mask = (1 << gpio->ucClkY_Shift); - i2c.get_data_mask = (1 << gpio->ucDataY_Shift); - i2c.a_clk_mask = (1 << gpio->ucClkA_Shift); - i2c.a_data_mask = (1 << gpio->ucDataA_Shift); - i2c.hw_line = gpio->sucI2cId.ucAccess; - i2c.hw_capable = gpio->sucI2cId.sbfAccess.bfHW_Capable; - i2c.valid = TRUE; - break; - } - } + gpio = atomDataPtr->GPIO_I2C_Info->asGPIO_Info[id]; + i2c.mask_clk_reg = le16_to_cpu(gpio.usClkMaskRegisterIndex) * 4; + i2c.mask_data_reg = le16_to_cpu(gpio.usDataMaskRegisterIndex) * 4; + i2c.put_clk_reg = le16_to_cpu(gpio.usClkEnRegisterIndex) * 4; + i2c.put_data_reg = le16_to_cpu(gpio.usDataEnRegisterIndex) * 4; + i2c.get_clk_reg = le16_to_cpu(gpio.usClkY_RegisterIndex) * 4; + i2c.get_data_reg = le16_to_cpu(gpio.usDataY_RegisterIndex) * 4; + i2c.a_clk_reg = le16_to_cpu(gpio.usClkA_RegisterIndex) * 4; + i2c.a_data_reg = le16_to_cpu(gpio.usDataA_RegisterIndex) * 4; + i2c.mask_clk_mask = (1 << gpio.ucClkMaskShift); + i2c.mask_data_mask = (1 << gpio.ucDataMaskShift); + i2c.put_clk_mask = (1 << gpio.ucClkEnShift); + i2c.put_data_mask = (1 << gpio.ucDataEnShift); + i2c.get_clk_mask = (1 << gpio.ucClkY_Shift); + i2c.get_data_mask = (1 << gpio.ucDataY_Shift); + i2c.a_clk_mask = (1 << gpio.ucClkA_Shift); + i2c.a_data_mask = (1 << gpio.ucDataA_Shift); + i2c.hw_line = gpio.sucI2cId.sbfAccess.bfI2C_LineMux; + i2c.hw_capable = gpio.sucI2cId.sbfAccess.bfHW_Capable; + i2c.valid = TRUE; #if 0 ErrorF("id: %d\n", id); - ErrorF("hw capable: %d\n", gpio->sucI2cId.sbfAccess.bfHW_Capable); - ErrorF("hw engine id: %d\n", gpio->sucI2cId.sbfAccess.bfHW_EngineID); - ErrorF("line mux %d\n", gpio->sucI2cId.sbfAccess.bfI2C_LineMux); - ErrorF("mask_clk_reg: 0x%x\n", le16_to_cpu(gpio->usClkMaskRegisterIndex) * 4); - ErrorF("mask_data_reg: 0x%x\n", le16_to_cpu(gpio->usDataMaskRegisterIndex) * 4); - ErrorF("put_clk_reg: 0x%x\n", le16_to_cpu(gpio->usClkEnRegisterIndex) * 4); - ErrorF("put_data_reg: 0x%x\n", le16_to_cpu(gpio->usDataEnRegisterIndex) * 4); - ErrorF("get_clk_reg: 0x%x\n", le16_to_cpu(gpio->usClkY_RegisterIndex) * 4); - ErrorF("get_data_reg: 0x%x\n", le16_to_cpu(gpio->usDataY_RegisterIndex) * 4); - ErrorF("a_clk_reg: 0x%x\n", le16_to_cpu(gpio->usClkA_RegisterIndex) * 4); - ErrorF("a_data_reg: 0x%x\n", le16_to_cpu(gpio->usDataA_RegisterIndex) * 4); - ErrorF("mask_clk_mask: %d\n", gpio->ucClkMaskShift); - ErrorF("mask_data_mask: %d\n", gpio->ucDataMaskShift); - ErrorF("put_clk_mask: %d\n", gpio->ucClkEnShift); - ErrorF("put_data_mask: %d\n", gpio->ucDataEnShift); - ErrorF("get_clk_mask: %d\n", gpio->ucClkY_Shift); - ErrorF("get_data_mask: %d\n", gpio->ucDataY_Shift); - ErrorF("a_clk_mask: %d\n", gpio->ucClkA_Shift); - ErrorF("a_data_mask: %d\n", gpio->ucDataA_Shift); + ErrorF("hw capable: %d\n", gpio.sucI2cId.sbfAccess.bfHW_Capable); + ErrorF("hw engine id: %d\n", gpio.sucI2cId.sbfAccess.bfHW_EngineID); + ErrorF("line mux %d\n", gpio.sucI2cId.sbfAccess.bfI2C_LineMux); + ErrorF("mask_clk_reg: 0x%x\n", gpio.usClkMaskRegisterIndex * 4); + ErrorF("mask_data_reg: 0x%x\n", gpio.usDataMaskRegisterIndex * 4); + ErrorF("put_clk_reg: 0x%x\n", gpio.usClkEnRegisterIndex * 4); + ErrorF("put_data_reg: 0x%x\n", gpio.usDataEnRegisterIndex * 4); + ErrorF("get_clk_reg: 0x%x\n", gpio.usClkY_RegisterIndex * 4); + ErrorF("get_data_reg: 0x%x\n", gpio.usDataY_RegisterIndex * 4); + ErrorF("a_clk_reg: 0x%x\n", gpio.usClkA_RegisterIndex * 4); + ErrorF("a_data_reg: 0x%x\n", gpio.usDataA_RegisterIndex * 4); + ErrorF("mask_clk_mask: %d\n", gpio.ucClkMaskShift); + ErrorF("mask_data_mask: %d\n", gpio.ucDataMaskShift); + ErrorF("put_clk_mask: %d\n", gpio.ucClkEnShift); + ErrorF("put_data_mask: %d\n", gpio.ucDataEnShift); + ErrorF("get_clk_mask: %d\n", gpio.ucClkY_Shift); + ErrorF("get_data_mask: %d\n", gpio.ucDataY_Shift); + ErrorF("a_clk_mask: %d\n", gpio.ucClkA_Shift); + ErrorF("a_data_mask: %d\n", gpio.ucDataA_Shift); #endif return i2c; @@ -1605,74 +1516,9 @@ rhdAtomParseI2CRecord(ScrnInfoPtr pScrn, atomBiosHandlePtr handle, ATOM_I2C_RECORD *Record, int i) { RADEONInfoPtr info = RADEONPTR (pScrn); - uint8_t *temp = &Record->sucI2cId; - info->BiosConnector[i].i2c_line_mux = *temp; - info->BiosConnector[i].ucI2cId = *temp; - return RADEONLookupGPIOLineForDDC(pScrn, *temp); -} - -static uint8_t -radeon_lookup_hpd_id(ScrnInfoPtr pScrn, ATOM_HPD_INT_RECORD *record) -{ - RADEONInfoPtr info = RADEONPTR (pScrn); - unsigned short size; - uint8_t hpd = 0; - int i, num_indices; - struct _ATOM_GPIO_PIN_LUT *gpio_info; - ATOM_GPIO_PIN_ASSIGNMENT *pin; - atomDataTablesPtr atomDataPtr; - uint8_t crev, frev; - uint32_t reg; - - atomDataPtr = info->atomBIOS->atomDataPtr; - - if (!rhdAtomGetTableRevisionAndSize( - &(atomDataPtr->GPIO_Pin_LUT->sHeader), - &crev,&frev,&size)) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "No GPIO Pin Table found!\n"); - return hpd; - } - - num_indices = size / sizeof(ATOM_GPIO_PIN_ASSIGNMENT); - - if (IS_DCE4_VARIANT) - reg = EVERGREEN_DC_GPIO_HPD_A; - else - reg = AVIVO_DC_GPIO_HPD_A; - - gpio_info = atomDataPtr->GPIO_Pin_LUT; - for (i = 0; i < num_indices; i++) { - pin = &gpio_info->asGPIO_Pin[i]; - if (record->ucHPDIntGPIOID == pin->ucGPIO_ID) { - if ((le16_to_cpu(pin->usGpioPin_AIndex) * 4) == reg) { - switch (pin->ucGpioPinBitShift) { - case 0: - default: - hpd = 0; - break; - case 8: - hpd = 1; - break; - case 16: - hpd = 2; - break; - case 24: - hpd = 3; - break; - case 26: - hpd = 4; - break; - case 28: - hpd = 5; - break; - } - break; - } - } - } - - return hpd; + info->BiosConnector[i].i2c_line_mux = Record->sucI2cId.bfI2C_LineMux; + return RADEONLookupGPIOLineForDDC(pScrn, Record->sucI2cId.bfI2C_LineMux); } static void RADEONApplyATOMQuirks(ScrnInfoPtr pScrn, int index) @@ -1688,17 +1534,6 @@ static void RADEONApplyATOMQuirks(ScrnInfoPtr pScrn, int index) info->BiosConnector[index].ConnectorType = CONNECTOR_DVI_D; } } - - /* RS600 board lists the DVI port as HDMI */ - if ((info->Chipset == PCI_CHIP_RS600_7941) && - (PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1849) && - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x7941)) { - if ((info->BiosConnector[index].ConnectorType == CONNECTOR_HDMI_TYPE_A) && - (info->BiosConnector[index].devices & ATOM_DEVICE_DFP3_SUPPORT)) { - info->BiosConnector[index].ConnectorType = CONNECTOR_DVI_D; - } - } - /* a-bit f-i90hd - ciaranm on #radeonhd - this board has no DVI */ if ((info->Chipset == PCI_CHIP_RS600_7941) && (PCI_SUB_VENDOR_ID(info->PciInfo) == 0x147b) && @@ -1730,32 +1565,20 @@ static void RADEONApplyATOMQuirks(ScrnInfoPtr pScrn, int index) } } + /* some BIOSes seem to report DAC on HDMI - they hurt me with their lies */ + if ((info->BiosConnector[index].ConnectorType == CONNECTOR_HDMI_TYPE_A) || + (info->BiosConnector[index].ConnectorType == CONNECTOR_HDMI_TYPE_B)) { + info->BiosConnector[index].devices &= ~(ATOM_DEVICE_CRT_SUPPORT); + } + /* ASUS HD 3600 XT board lists the DVI port as HDMI */ if ((info->Chipset == PCI_CHIP_RV635_9598) && (PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1043) && (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x01da)) { - if (info->BiosConnector[index].ConnectorType == CONNECTOR_HDMI_TYPE_A) - info->BiosConnector[index].ConnectorType = CONNECTOR_DVI_I; + if (info->BiosConnector[index].ConnectorType == CONNECTOR_HDMI_TYPE_B) + info->BiosConnector[index].ConnectorType = CONNECTOR_DVI_D; } - /* ASUS HD 3450 board lists the DVI port as HDMI */ - if ((info->Chipset == PCI_CHIP_RV620_95C5) && - (PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1043) && - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x01e2)) { - if (info->BiosConnector[index].ConnectorType == CONNECTOR_HDMI_TYPE_A) - info->BiosConnector[index].ConnectorType = CONNECTOR_DVI_I; - } - - /* some BIOSes seem to report DAC on HDMI - usually this is a board with - * HDMI + VGA reporting as HDMI - */ - if (info->BiosConnector[index].ConnectorType == CONNECTOR_HDMI_TYPE_A) { - if (info->BiosConnector[index].devices & (ATOM_DEVICE_CRT_SUPPORT)) { - info->BiosConnector[index].devices &= ~(ATOM_DEVICE_DFP_SUPPORT); - info->BiosConnector[index].ConnectorType = CONNECTOR_VGA; - info->BiosConnector[index].connector_object = 0; - } - } } @@ -1815,9 +1638,9 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo if (device_support & ATOM_DEVICE_LCD1_SUPPORT) { if (info->encoders[device_index]->dev_priv == NULL) { info->encoders[device_index]->dev_priv = - (radeon_lvds_ptr)calloc(1,sizeof(radeon_lvds_rec)); + (radeon_lvds_ptr)xcalloc(1,sizeof(radeon_lvds_rec)); if (info->encoders[device_index]->dev_priv == NULL) { - ErrorF("calloc failed\n"); + ErrorF("xalloc failed\n"); return FALSE; } else RADEONGetATOMLVDSInfo(pScrn, (radeon_lvds_ptr)info->encoders[device_index]->dev_priv); @@ -1829,7 +1652,7 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo } } - info->encoders[device_index] = (radeon_encoder_ptr)calloc(1,sizeof(radeon_encoder_rec)); + info->encoders[device_index] = (radeon_encoder_ptr)xcalloc(1,sizeof(radeon_encoder_rec)); if (info->encoders[device_index] != NULL) { info->encoders[device_index]->ref_count++; info->encoders[device_index]->encoder_id = encoder_id; @@ -1838,9 +1661,9 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo // add dev_priv stuff switch (encoder_id) { case ENCODER_OBJECT_ID_INTERNAL_LVDS: - info->encoders[device_index]->dev_priv = (radeon_lvds_ptr)calloc(1,sizeof(radeon_lvds_rec)); + info->encoders[device_index]->dev_priv = (radeon_lvds_ptr)xcalloc(1,sizeof(radeon_lvds_rec)); if (info->encoders[device_index]->dev_priv == NULL) { - ErrorF("calloc failed\n"); + ErrorF("xalloc failed\n"); return FALSE; } else { if (info->IsAtomBios) @@ -1851,9 +1674,9 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo break; case ENCODER_OBJECT_ID_INTERNAL_DAC2: if (!IS_AVIVO_VARIANT) { - info->encoders[device_index]->dev_priv = (radeon_tvdac_ptr)calloc(1,sizeof(radeon_tvdac_rec)); + info->encoders[device_index]->dev_priv = (radeon_tvdac_ptr)xcalloc(1,sizeof(radeon_tvdac_rec)); if (info->encoders[device_index]->dev_priv == NULL) { - ErrorF("calloc failed\n"); + ErrorF("xalloc failed\n"); return FALSE; } else RADEONGetTVDacAdjInfo(pScrn, (radeon_tvdac_ptr)info->encoders[device_index]->dev_priv); @@ -1861,9 +1684,9 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo break; case ENCODER_OBJECT_ID_INTERNAL_TMDS1: if (!IS_AVIVO_VARIANT) { - info->encoders[device_index]->dev_priv = (radeon_tmds_ptr)calloc(1,sizeof(radeon_tmds_rec)); + info->encoders[device_index]->dev_priv = (radeon_tmds_ptr)xcalloc(1,sizeof(radeon_tmds_rec)); if (info->encoders[device_index]->dev_priv == NULL) { - ErrorF("calloc failed\n"); + ErrorF("xalloc failed\n"); return FALSE; } else RADEONGetTMDSInfo(pScrn, (radeon_tmds_ptr)info->encoders[device_index]->dev_priv); @@ -1871,9 +1694,9 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo break; case ENCODER_OBJECT_ID_INTERNAL_DVO1: if (!IS_AVIVO_VARIANT) { - info->encoders[device_index]->dev_priv = (radeon_dvo_ptr)calloc(1,sizeof(radeon_dvo_rec)); + info->encoders[device_index]->dev_priv = (radeon_dvo_ptr)xcalloc(1,sizeof(radeon_dvo_rec)); if (info->encoders[device_index]->dev_priv == NULL) { - ErrorF("calloc failed\n"); + ErrorF("xalloc failed\n"); return FALSE; } else RADEONGetExtTMDSInfo(pScrn, (radeon_dvo_ptr)info->encoders[device_index]->dev_priv); @@ -1885,9 +1708,9 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo case ENCODER_OBJECT_ID_INTERNAL_UNIPHY2: case ENCODER_OBJECT_ID_INTERNAL_LVTM1: if (device_support & ATOM_DEVICE_LCD1_SUPPORT) { - info->encoders[device_index]->dev_priv = (radeon_lvds_ptr)calloc(1,sizeof(radeon_lvds_rec)); + info->encoders[device_index]->dev_priv = (radeon_lvds_ptr)xcalloc(1,sizeof(radeon_lvds_rec)); if (info->encoders[device_index]->dev_priv == NULL) { - ErrorF("calloc failed\n"); + ErrorF("xalloc failed\n"); return FALSE; } else RADEONGetATOMLVDSInfo(pScrn, (radeon_lvds_ptr)info->encoders[device_index]->dev_priv); @@ -1896,7 +1719,7 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo } return TRUE; } else { - ErrorF("calloc failed\n"); + ErrorF("xalloc failed\n"); return FALSE; } } @@ -1940,17 +1763,17 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) ATOM_DISPLAY_OBJECT_PATH *path; addr += path_size; path = (ATOM_DISPLAY_OBJECT_PATH *)addr; - path_size += le16_to_cpu(path->usSize); + path_size += path->usSize; - if (device_support & le16_to_cpu(path->usDeviceTag)) { + if (device_support & path->usDeviceTag) { uint8_t con_obj_id, con_obj_num, con_obj_type; - con_obj_id = (le16_to_cpu(path->usConnObjectId) & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; - con_obj_num = (le16_to_cpu(path->usConnObjectId) & ENUM_ID_MASK) >> ENUM_ID_SHIFT; - con_obj_type = (le16_to_cpu(path->usConnObjectId) & OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; + con_obj_id = (path->usConnObjectId & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; + con_obj_num = (path->usConnObjectId & ENUM_ID_MASK) >> ENUM_ID_SHIFT; + con_obj_type = (path->usConnObjectId & OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; - if ((le16_to_cpu(path->usDeviceTag) == ATOM_DEVICE_TV1_SUPPORT) || - (le16_to_cpu(path->usDeviceTag) == ATOM_DEVICE_TV2_SUPPORT)) { + if ((path->usDeviceTag == ATOM_DEVICE_TV1_SUPPORT) || + (path->usDeviceTag == ATOM_DEVICE_TV2_SUPPORT)) { if (!enable_tv) { info->BiosConnector[i].valid = FALSE; continue; @@ -1958,7 +1781,7 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) } /* don't support CV yet */ - if (le16_to_cpu(path->usDeviceTag) == ATOM_DEVICE_CV_SUPPORT) { + if (path->usDeviceTag == ATOM_DEVICE_CV_SUPPORT) { info->BiosConnector[i].valid = FALSE; continue; } @@ -1979,28 +1802,25 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) ct = (slot_config >> 16) & 0xff; info->BiosConnector[i].ConnectorType = object_connector_convert[ct]; - info->BiosConnector[i].connector_object_id = ct; info->BiosConnector[i].igp_lane_info = slot_config & 0xffff; } - } else { + } else info->BiosConnector[i].ConnectorType = object_connector_convert[con_obj_id]; - info->BiosConnector[i].connector_object_id = con_obj_id; - } if (info->BiosConnector[i].ConnectorType == CONNECTOR_NONE) { info->BiosConnector[i].valid = FALSE; continue; } else info->BiosConnector[i].valid = TRUE; - info->BiosConnector[i].devices = le16_to_cpu(path->usDeviceTag); - info->BiosConnector[i].connector_object = le16_to_cpu(path->usConnObjectId); + info->BiosConnector[i].devices = path->usDeviceTag; + info->BiosConnector[i].connector_object = path->usConnObjectId; - for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) { + for (j = 0; j < ((path->usSize - 8) / 2); j++) { uint8_t enc_obj_id, enc_obj_num, enc_obj_type; - enc_obj_id = (le16_to_cpu(path->usGraphicObjIds[j]) & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; - enc_obj_num = (le16_to_cpu(path->usGraphicObjIds[j]) & ENUM_ID_MASK) >> ENUM_ID_SHIFT; - enc_obj_type = (le16_to_cpu(path->usGraphicObjIds[j]) & OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; + enc_obj_id = (path->usGraphicObjIds[j] & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; + enc_obj_num = (path->usGraphicObjIds[j] & ENUM_ID_MASK) >> ENUM_ID_SHIFT; + enc_obj_type = (path->usGraphicObjIds[j] & OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; if (enc_obj_type == GRAPH_OBJECT_TYPE_ENCODER) { if (enc_obj_num == 2) @@ -2008,15 +1828,15 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) else info->BiosConnector[i].linkb = FALSE; - if (!radeon_add_encoder(pScrn, enc_obj_id, le16_to_cpu(path->usDeviceTag))) + if (!radeon_add_encoder(pScrn, enc_obj_id, path->usDeviceTag)) return FALSE; } } /* look up gpio for ddc */ - if ((le16_to_cpu(path->usDeviceTag) & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) { + if ((path->usDeviceTag & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) == 0) { for (j = 0; j < con_obj->ucNumberOfObjects; j++) { - if (le16_to_cpu(path->usConnObjectId) == le16_to_cpu(con_obj->asObjects[j].usObjectID)) { + if (path->usConnObjectId == le16_to_cpu(con_obj->asObjects[j].usObjectID)) { ATOM_COMMON_RECORD_HEADER *Record = (ATOM_COMMON_RECORD_HEADER *) ((char *)&atomDataPtr->Object_Header->sHeader + le16_to_cpu(con_obj->asObjects[j].usRecordOffset)); @@ -2032,9 +1852,6 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) (ATOM_I2C_RECORD *)Record, j); break; case ATOM_HPD_INT_RECORD_TYPE: - info->BiosConnector[i].hpd_id = - radeon_lookup_hpd_id(pScrn, - (ATOM_HPD_INT_RECORD *)Record); break; case ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE: break; @@ -2066,6 +1883,7 @@ RADEONGetATOMConnectorInfoFromBIOSObject (ScrnInfoPtr pScrn) for (j = 0; j < ATOM_MAX_SUPPORTED_DEVICE; j++) { if (info->BiosConnector[j].valid && (i != j) ) { if (info->BiosConnector[i].i2c_line_mux == info->BiosConnector[j].i2c_line_mux) { + ErrorF("Shared DDC line: %d %d\n", i, j); info->BiosConnector[i].shared_ddc = TRUE; info->BiosConnector[j].shared_ddc = TRUE; } @@ -2084,7 +1902,6 @@ RADEONGetATOMLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds) radeon_native_mode_ptr native_mode = &lvds->native_mode; atomDataTablesPtr atomDataPtr; uint8_t crev, frev; - uint16_t misc; atomDataPtr = info->atomBIOS->atomDataPtr; @@ -2105,17 +1922,6 @@ RADEONGetATOMLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds) native_mode->VBlank = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info->sLCDTiming.usVBlanking_Time); native_mode->VOverPlus = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info->sLCDTiming.usVSyncOffset); native_mode->VSyncWidth = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info->sLCDTiming.usVSyncWidth); - misc = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info->sLCDTiming.susModeMiscInfo.usAccess); - if (misc & ATOM_VSYNC_POLARITY) - native_mode->Flags |= V_NVSYNC; - if (misc & ATOM_HSYNC_POLARITY) - native_mode->Flags |= V_NHSYNC; - if (misc & ATOM_COMPOSITESYNC) - native_mode->Flags |= V_CSYNC; - if (misc & ATOM_INTERLACE) - native_mode->Flags |= V_INTERLACE; - if (misc & ATOM_DOUBLE_CLOCK_MODE) - native_mode->Flags |= V_DBLSCAN; lvds->PanelPwrDly = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info->usOffDelayInMs); lvds->lvds_misc = atomDataPtr->LVDS_Info.LVDS_Info->ucLVDS_Misc; lvds->lvds_ss_id = atomDataPtr->LVDS_Info.LVDS_Info->ucSS_Id; @@ -2130,17 +1936,6 @@ RADEONGetATOMLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds) native_mode->VBlank = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info_v12->sLCDTiming.usVBlanking_Time); native_mode->VOverPlus = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info_v12->sLCDTiming.usVSyncOffset); native_mode->VSyncWidth = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info_v12->sLCDTiming.usVSyncWidth); - misc = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info_v12->sLCDTiming.susModeMiscInfo.usAccess); - if (misc & ATOM_VSYNC_POLARITY) - native_mode->Flags |= V_NVSYNC; - if (misc & ATOM_HSYNC_POLARITY) - native_mode->Flags |= V_NHSYNC; - if (misc & ATOM_COMPOSITESYNC) - native_mode->Flags |= V_CSYNC; - if (misc & ATOM_INTERLACE) - native_mode->Flags |= V_INTERLACE; - if (misc & ATOM_DOUBLE_CLOCK_MODE) - native_mode->Flags |= V_DBLSCAN; lvds->PanelPwrDly = le16_to_cpu(atomDataPtr->LVDS_Info.LVDS_Info_v12->usOffDelayInMs); lvds->lvds_misc = atomDataPtr->LVDS_Info.LVDS_Info_v12->ucLVDS_Misc; lvds->lvds_ss_id = atomDataPtr->LVDS_Info.LVDS_Info_v12->ucSS_Id; @@ -2161,35 +1956,6 @@ RADEONGetATOMLVDSInfo(ScrnInfoPtr pScrn, radeon_lvds_ptr lvds) native_mode->VBlank, native_mode->VOverPlus, native_mode->VSyncWidth); } -void -RADEONATOMGetIGPInfo(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - atomDataTablesPtr atomDataPtr; - unsigned short size; - uint8_t crev, frev; - - atomDataPtr = info->atomBIOS->atomDataPtr; - - if (!rhdAtomGetTableRevisionAndSize((ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->IntegratedSystemInfo.base), &frev, &crev, &size)) - return; - - switch (crev) { - case 1: - info->igp_sideport_mclk = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo->ulBootUpMemoryClock / 100.0; - info->igp_system_mclk = le16_to_cpu(atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo->usK8MemoryClock); - info->igp_ht_link_clk = le16_to_cpu(atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo->usFSBClock); - info->igp_ht_link_width = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo->ucHTLinkWidth; - break; - case 2: - info->igp_sideport_mclk = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->ulBootUpSidePortClock / 100.0; - info->igp_system_mclk = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->ulBootUpUMAClock / 100.0; - info->igp_ht_link_clk = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->ulHTLinkFreq / 100.0; - info->igp_ht_link_width = le16_to_cpu(atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->usMinHTLinkWidth); - break; - } -} - Bool RADEONGetATOMTVInfo(xf86OutputPtr output) { @@ -2263,76 +2029,7 @@ RADEONGetATOMTVInfo(xf86OutputPtr output) } Bool -RADEONGetATOMClockInfo(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR (pScrn); - RADEONPLLPtr pll = &info->pll; - atomDataTablesPtr atomDataPtr; - uint8_t crev, frev; - - atomDataPtr = info->atomBIOS->atomDataPtr; - if (!rhdAtomGetTableRevisionAndSize( - (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->FirmwareInfo.base), - &crev,&frev,NULL)) { - return FALSE; - } - - switch(crev) { - case 1: - info->sclk = le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->ulDefaultEngineClock) / 100.0; - info->mclk = le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->ulDefaultMemoryClock) / 100.0; - pll->xclk = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->usMaxPixelClock); - pll->pll_in_min = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->usMinPixelClockPLL_Input); - pll->pll_in_max = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->usMaxPixelClockPLL_Input); - pll->pll_out_min = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->usMinPixelClockPLL_Output); - pll->pll_out_max = le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->ulMaxPixelClockPLL_Output); - pll->reference_freq = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo->usReferenceClock); - break; - case 2: - case 3: - case 4: - default: - info->sclk = le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->ulDefaultEngineClock) / 100.0; - info->mclk = le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->ulDefaultMemoryClock) / 100.0; - pll->xclk = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->usMaxPixelClock); - pll->pll_in_min = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->usMinPixelClockPLL_Input); - pll->pll_in_max = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->usMaxPixelClockPLL_Input); - pll->pll_out_min = le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->ulMinPixelClockPLL_Output); - pll->pll_out_max = le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->ulMaxPixelClockPLL_Output); - pll->reference_freq = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_2->usReferenceClock); - break; - } - pll->reference_div = 0; - if (pll->pll_out_min == 0) { - if (IS_AVIVO_VARIANT) - pll->pll_out_min = 64800; - else - pll->pll_out_min = 20000; - } - - /* limiting the range is a good thing in most cases - * as it limits the number of matching pll combinations, - * however, some duallink DVI monitors seem to prefer combinations that - * would be limited by this. This may need to be revisited - * per chip family. - */ - if (!xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, TRUE)) { - if (pll->pll_out_min > 64800) - pll->pll_out_min = 64800; - } - - if (IS_DCE4_VARIANT) { - info->default_dispclk = - le32_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_2_1->ulDefaultDispEngineClkFreq); - if (info->default_dispclk == 0) - info->default_dispclk = 60000; - info->dp_extclk = le16_to_cpu(atomDataPtr->FirmwareInfo.FirmwareInfo_V_2_1->usUniphyDPModeExtClkFreq); - } - return TRUE; -} - -Bool -RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, DisplayModePtr mode) +RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION *crtc_timing, int32_t *pixel_clock) { RADEONInfoPtr info = RADEONPTR(pScrn); ATOM_ANALOG_TV_INFO *tv_info; @@ -2340,7 +2037,6 @@ RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, DisplayModePtr mode) ATOM_DTD_FORMAT *dtd_timings; atomDataTablesPtr atomDataPtr; uint8_t crev, frev; - uint16_t misc; atomDataPtr = info->atomBIOS->atomDataPtr; if (!rhdAtomGetTableRevisionAndSize( @@ -2352,41 +2048,32 @@ RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, DisplayModePtr mode) switch(crev) { case 1: tv_info = atomDataPtr->AnalogTV_Info.AnalogTV_Info; - + if (index > MAX_SUPPORTED_TV_TIMING) return FALSE; + + crtc_timing->usH_Total = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total); + crtc_timing->usH_Disp = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp); + crtc_timing->usH_SyncStart = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart); + crtc_timing->usH_SyncWidth = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth); + + crtc_timing->usV_Total = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total); + crtc_timing->usV_Disp = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp); + crtc_timing->usV_SyncStart = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart); + crtc_timing->usV_SyncWidth = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth); - mode->CrtcHTotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Total); - mode->CrtcHDisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_Disp); - mode->CrtcHSyncStart = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart); - mode->CrtcHSyncEnd = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncStart) + - le16_to_cpu(tv_info->aModeTimings[index].usCRTC_H_SyncWidth); + crtc_timing->susModeMiscInfo = tv_info->aModeTimings[index].susModeMiscInfo; - mode->CrtcVTotal = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Total); - mode->CrtcVDisplay = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_Disp); - mode->CrtcVSyncStart = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart); - mode->CrtcVSyncEnd = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncStart) + - le16_to_cpu(tv_info->aModeTimings[index].usCRTC_V_SyncWidth); - - mode->Flags = 0; - misc = le16_to_cpu(tv_info->aModeTimings[index].susModeMiscInfo.usAccess); - if (misc & ATOM_VSYNC_POLARITY) - mode->Flags |= V_NVSYNC; - if (misc & ATOM_HSYNC_POLARITY) - mode->Flags |= V_NHSYNC; - if (misc & ATOM_COMPOSITESYNC) - mode->Flags |= V_CSYNC; - if (misc & ATOM_INTERLACE) - mode->Flags |= V_INTERLACE; - if (misc & ATOM_DOUBLE_CLOCK_MODE) - mode->Flags |= V_DBLSCAN; - - mode->Clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10; + crtc_timing->ucOverscanRight = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanRight); + crtc_timing->ucOverscanLeft = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanLeft); + crtc_timing->ucOverscanBottom = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanBottom); + crtc_timing->ucOverscanTop = le16_to_cpu(tv_info->aModeTimings[index].usCRTC_OverscanTop); + *pixel_clock = le16_to_cpu(tv_info->aModeTimings[index].usPixelClock) * 10; if (index == 1) { /* PAL timings appear to have wrong values for totals */ - mode->CrtcHTotal -= 1; - mode->CrtcVTotal -= 1; + crtc_timing->usH_Total -= 1; + crtc_timing->usV_Total -= 1; } break; case 2: @@ -2395,31 +2082,18 @@ RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, DisplayModePtr mode) return FALSE; dtd_timings = &tv_info_v1_2->aModeTimings[index]; - mode->CrtcHTotal = le16_to_cpu(dtd_timings->usHActive) + le16_to_cpu(dtd_timings->usHBlanking_Time); - mode->CrtcHDisplay = le16_to_cpu(dtd_timings->usHActive); - mode->CrtcHSyncStart = le16_to_cpu(dtd_timings->usHActive) + le16_to_cpu(dtd_timings->usHSyncOffset); - mode->CrtcHSyncEnd = mode->CrtcHSyncStart + le16_to_cpu(dtd_timings->usHSyncWidth); + crtc_timing->usH_Total = le16_to_cpu(dtd_timings->usHActive) + le16_to_cpu(dtd_timings->usHBlanking_Time); + crtc_timing->usH_Disp = le16_to_cpu(dtd_timings->usHActive); + crtc_timing->usH_SyncStart = le16_to_cpu(dtd_timings->usHActive) + le16_to_cpu(dtd_timings->usHSyncOffset); + crtc_timing->usH_SyncWidth = le16_to_cpu(dtd_timings->usHSyncWidth); - mode->CrtcVTotal = le16_to_cpu(dtd_timings->usVActive) + le16_to_cpu(dtd_timings->usVBlanking_Time); - mode->CrtcVDisplay = le16_to_cpu(dtd_timings->usVActive); - mode->CrtcVSyncStart = le16_to_cpu(dtd_timings->usVActive) + le16_to_cpu(dtd_timings->usVSyncOffset); - mode->CrtcVSyncEnd = mode->CrtcVSyncStart + le16_to_cpu(dtd_timings->usVSyncWidth); - - mode->Flags = 0; - misc = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess); - if (misc & ATOM_VSYNC_POLARITY) - mode->Flags |= V_NVSYNC; - if (misc & ATOM_HSYNC_POLARITY) - mode->Flags |= V_NHSYNC; - if (misc & ATOM_COMPOSITESYNC) - mode->Flags |= V_CSYNC; - if (misc & ATOM_INTERLACE) - mode->Flags |= V_INTERLACE; - if (misc & ATOM_DOUBLE_CLOCK_MODE) - mode->Flags |= V_DBLSCAN; - - mode->Clock = le16_to_cpu(dtd_timings->usPixClk) * 10; + crtc_timing->usV_Total = le16_to_cpu(dtd_timings->usVActive) + le16_to_cpu(dtd_timings->usVBlanking_Time); + crtc_timing->usV_Disp = le16_to_cpu(dtd_timings->usVActive); + crtc_timing->usV_SyncStart = le16_to_cpu(dtd_timings->usVActive) + le16_to_cpu(dtd_timings->usVSyncOffset); + crtc_timing->usV_SyncWidth = le16_to_cpu(dtd_timings->usVSyncWidth); + crtc_timing->susModeMiscInfo.usAccess = le16_to_cpu(dtd_timings->susModeMiscInfo.usAccess); + *pixel_clock = le16_to_cpu(dtd_timings->usPixClk) * 10; break; } @@ -2552,7 +2226,7 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) info->BiosConnector[i].valid = TRUE; info->BiosConnector[i].load_detection = TRUE; info->BiosConnector[i].shared_ddc = FALSE; - info->BiosConnector[i].output_id = ci.sucI2cId.ucAccess; + info->BiosConnector[i].output_id = ci.sucI2cId.sbfAccess.bfI2C_LineMux; info->BiosConnector[i].devices = (1 << i); info->BiosConnector[i].ConnectorType = ci.sucConnectorInfo.sbfAccess.bfConnectorType; @@ -2566,9 +2240,18 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) (i == ATOM_DEVICE_TV2_INDEX) || (i == ATOM_DEVICE_CV_INDEX)) info->BiosConnector[i].ddc_i2c.valid = FALSE; - else + else if ((info->ChipFamily == CHIP_FAMILY_RS690) || + (info->ChipFamily == CHIP_FAMILY_RS740)) { + /* IGP DFP ports use non-standard gpio entries */ + if ((i == ATOM_DEVICE_DFP2_INDEX) || (i == ATOM_DEVICE_DFP3_INDEX)) + info->BiosConnector[i].ddc_i2c = + RADEONLookupGPIOLineForDDC(pScrn, ci.sucI2cId.sbfAccess.bfI2C_LineMux + 1); + else + info->BiosConnector[i].ddc_i2c = + RADEONLookupGPIOLineForDDC(pScrn, ci.sucI2cId.sbfAccess.bfI2C_LineMux); + } else info->BiosConnector[i].ddc_i2c = - RADEONLookupGPIOLineForDDC(pScrn, ci.sucI2cId.ucAccess); + RADEONLookupGPIOLineForDDC(pScrn, ci.sucI2cId.sbfAccess.bfI2C_LineMux); if (!radeon_add_encoder(pScrn, radeon_get_encoder_id_from_supported_device(pScrn, (1 << i), @@ -2622,8 +2305,6 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) ((j == ATOM_DEVICE_CRT1_INDEX) || (j == ATOM_DEVICE_CRT2_INDEX))) { info->BiosConnector[i].devices |= info->BiosConnector[j].devices; - if (info->BiosConnector[i].ConnectorType == CONNECTOR_DVI_D) - info->BiosConnector[i].ConnectorType = CONNECTOR_DVI_I; info->BiosConnector[j].valid = FALSE; } else if (((j == ATOM_DEVICE_DFP1_INDEX) || (j == ATOM_DEVICE_DFP2_INDEX) || @@ -2631,8 +2312,6 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) ((i == ATOM_DEVICE_CRT1_INDEX) || (i == ATOM_DEVICE_CRT2_INDEX))) { info->BiosConnector[j].devices |= info->BiosConnector[i].devices; - if (info->BiosConnector[j].ConnectorType == CONNECTOR_DVI_D) - info->BiosConnector[j].ConnectorType = CONNECTOR_DVI_I; info->BiosConnector[i].valid = FALSE; } else { info->BiosConnector[i].shared_ddc = TRUE; @@ -2645,6 +2324,12 @@ RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn) } } + for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) { + if (info->encoders[i] != NULL) { + ErrorF("encoder: 0x%x\n", info->encoders[i]->encoder_id); + } + } + return TRUE; } @@ -2789,20 +2474,12 @@ UINT32 CailReadATIRegister(VOID* CAIL, UINT32 idx) { ScrnInfoPtr pScrn = xf86Screens[((atomBiosHandlePtr)CAIL)->scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); unsigned char *RADEONMMIO = pRADEONEnt->MMIO; UINT32 ret; - UINT32 mm_reg = idx << 2; CAILFUNC(CAIL); - if (mm_reg < info->MMIOSize) - ret = INREG(mm_reg); - else { - OUTREG(RADEON_MM_INDEX, mm_reg); - ret = INREG(RADEON_MM_DATA); - } - + ret = INREG(idx << 2); /*DEBUGP(ErrorF("%s(%x) = %x\n",__func__,idx << 2,ret));*/ return ret; } @@ -2811,19 +2488,11 @@ VOID CailWriteATIRegister(VOID *CAIL, UINT32 idx, UINT32 data) { ScrnInfoPtr pScrn = xf86Screens[((atomBiosHandlePtr)CAIL)->scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); unsigned char *RADEONMMIO = pRADEONEnt->MMIO; - UINT32 mm_reg = idx << 2; CAILFUNC(CAIL); - if (mm_reg < info->MMIOSize) - OUTREG(mm_reg, data); - else { - OUTREG(RADEON_MM_INDEX, mm_reg); - OUTREG(RADEON_MM_DATA, data); - } - + OUTREG(idx << 2,data); /*DEBUGP(ErrorF("%s(%x,%x)\n",__func__,idx << 2,data));*/ } diff --git a/driver/xf86-video-ati/src/radeon_atombios.h b/driver/xf86-video-ati/src/radeon_atombios.h index 866c4bf39..b9a5398c5 100644 --- a/driver/xf86-video-ati/src/radeon_atombios.h +++ b/driver/xf86-video-ati/src/radeon_atombios.h @@ -117,16 +117,10 @@ extern Bool RADEONGetATOMConnectorInfoFromBIOSConnectorTable (ScrnInfoPtr pScrn); extern int -atombios_clk_gating_setup(ScrnInfoPtr pScrn, Bool enable); +atombios_dyn_clk_setup(ScrnInfoPtr pScrn, int enable); extern int -atombios_static_pwrmgt_setup(ScrnInfoPtr pScrn, Bool enable); - -extern int -atombios_set_engine_clock(ScrnInfoPtr pScrn, uint32_t engclock); - -extern int -atombios_set_memory_clock(ScrnInfoPtr pScrn, uint32_t memclock); +atombios_static_pwrmgt_setup(ScrnInfoPtr pScrn, int enable); extern Bool RADEONGetATOMTVInfo(xf86OutputPtr output); @@ -194,7 +188,6 @@ typedef struct _atomDataTables ATOM_FIRMWARE_INFO_V1_2 *FirmwareInfo_V_1_2; ATOM_FIRMWARE_INFO_V1_3 *FirmwareInfo_V_1_3; ATOM_FIRMWARE_INFO_V1_4 *FirmwareInfo_V_1_4; - ATOM_FIRMWARE_INFO_V2_1 *FirmwareInfo_V_2_1; } FirmwareInfo; ATOM_DAC_INFO *DAC_Info; union { @@ -271,13 +264,7 @@ typedef struct _atomBiosHandle { # endif extern Bool -RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, DisplayModePtr mode); - -extern void -RADEONATOMGetIGPInfo(ScrnInfoPtr pScrn); - -extern Bool -RADEONGetATOMClockInfo(ScrnInfoPtr pScrn); +RADEONATOMGetTVTimings(ScrnInfoPtr pScrn, int index, SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION *crtc_timing, int32_t *pixel_clock); extern uint32_t radeon_get_device_index(uint32_t device_support); @@ -288,5 +275,4 @@ radeon_add_encoder(ScrnInfoPtr pScrn, uint32_t encoder_id, uint32_t device_suppo extern uint32_t radeon_get_encoder_id_from_supported_device(ScrnInfoPtr pScrn, uint32_t supported_device, int dac); -void atombios_set_output_crtc_source(xf86OutputPtr output); #endif /* RHD_ATOMBIOS_H_ */ diff --git a/driver/xf86-video-ati/src/radeon_bios.c b/driver/xf86-video-ati/src/radeon_bios.c index 5f1253421..9b5cb88ae 100644 --- a/driver/xf86-video-ati/src/radeon_bios.c +++ b/driver/xf86-video-ati/src/radeon_bios.c @@ -34,12 +34,13 @@ #include "xf86.h" #include "xf86_OSproc.h" -#include "atipciids.h" +#include "xf86PciInfo.h" #include "radeon.h" #include "radeon_reg.h" #include "radeon_macros.h" #include "radeon_probe.h" #include "radeon_atombios.h" +#include "vbe.h" typedef enum { @@ -106,62 +107,7 @@ radeon_read_disabled_bios(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Attempting to read un-POSTed bios\n"); - if (info->ChipFamily >= CHIP_FAMILY_RV770) { - uint32_t viph_control = INREG(RADEON_VIPH_CONTROL); - uint32_t bus_cntl = INREG(RADEON_BUS_CNTL); - uint32_t d1vga_control = INREG(AVIVO_D1VGA_CONTROL); - uint32_t d2vga_control = INREG(AVIVO_D2VGA_CONTROL); - uint32_t vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL); - uint32_t rom_cntl = INREG(R600_ROM_CNTL); - uint32_t cg_spll_func_cntl = 0; - uint32_t cg_spll_status; - - /* disable VIP */ - OUTREG(RADEON_VIPH_CONTROL, (viph_control & ~RADEON_VIPH_EN)); - - /* enable the rom */ - OUTREG(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); - - /* Disable VGA mode */ - OUTREG(AVIVO_D1VGA_CONTROL, (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | - AVIVO_DVGA_CONTROL_TIMING_SELECT))); - OUTREG(AVIVO_D2VGA_CONTROL, (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | - AVIVO_DVGA_CONTROL_TIMING_SELECT))); - OUTREG(AVIVO_VGA_RENDER_CONTROL, (vga_render_control & ~AVIVO_VGA_VSTATUS_CNTL_MASK)); - - if (info->ChipFamily == CHIP_FAMILY_RV730) { - cg_spll_func_cntl = INREG(R600_CG_SPLL_FUNC_CNTL); - - /* enable bypass mode */ - OUTREG(R600_CG_SPLL_FUNC_CNTL, (cg_spll_func_cntl | R600_SPLL_BYPASS_EN)); - - /* wait for SPLL_CHG_STATUS to change to 1 */ - cg_spll_status = 0; - while (!(cg_spll_status & R600_SPLL_CHG_STATUS)) - cg_spll_status = INREG(R600_CG_SPLL_STATUS); - - OUTREG(R600_ROM_CNTL, (rom_cntl & ~R600_SCK_OVERWRITE)); - } else - OUTREG(R600_ROM_CNTL, (rom_cntl | R600_SCK_OVERWRITE)); - - ret = radeon_read_bios(pScrn); - - /* restore regs */ - if (info->ChipFamily == CHIP_FAMILY_RV730) { - OUTREG(R600_CG_SPLL_FUNC_CNTL, cg_spll_func_cntl); - - /* wait for SPLL_CHG_STATUS to change to 1 */ - cg_spll_status = 0; - while (!(cg_spll_status & R600_SPLL_CHG_STATUS)) - cg_spll_status = INREG(R600_CG_SPLL_STATUS); - } - OUTREG(RADEON_VIPH_CONTROL, viph_control); - OUTREG(RADEON_BUS_CNTL, bus_cntl); - OUTREG(AVIVO_D1VGA_CONTROL, d1vga_control); - OUTREG(AVIVO_D2VGA_CONTROL, d2vga_control); - OUTREG(AVIVO_VGA_RENDER_CONTROL, vga_render_control); - OUTREG(R600_ROM_CNTL, rom_cntl); - } else if (info->ChipFamily >= CHIP_FAMILY_R600) { + if (info->ChipFamily >= CHIP_FAMILY_R600) { uint32_t viph_control = INREG(RADEON_VIPH_CONTROL); uint32_t bus_cntl = INREG(RADEON_BUS_CNTL); uint32_t d1vga_control = INREG(AVIVO_D1VGA_CONTROL); @@ -181,7 +127,7 @@ radeon_read_disabled_bios(ScrnInfoPtr pScrn) /* enable the rom */ OUTREG(RADEON_BUS_CNTL, (bus_cntl & ~RADEON_BUS_BIOS_DIS_ROM)); - /* Disable VGA mode */ + /* Disable VGA mode */ OUTREG(AVIVO_D1VGA_CONTROL, (d1vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | AVIVO_DVGA_CONTROL_TIMING_SELECT))); OUTREG(AVIVO_D2VGA_CONTROL, (d2vga_control & ~(AVIVO_DVGA_CONTROL_MODE_ENABLE | @@ -327,7 +273,6 @@ radeon_card_posted(ScrnInfoPtr pScrn) unsigned char *RADEONMMIO = info->MMIO; uint32_t reg; - /* first check CRTCs */ if (IS_AVIVO_VARIANT) { reg = INREG(AVIVO_D1CRTC_CONTROL) | INREG(AVIVO_D2CRTC_CONTROL); if (reg & AVIVO_CRTC_EN) @@ -338,15 +283,6 @@ radeon_card_posted(ScrnInfoPtr pScrn) return TRUE; } - /* then check MEM_SIZE, in case something turned the crtcs off */ - if (info->ChipFamily >= CHIP_FAMILY_R600) - reg = INREG(R600_CONFIG_MEMSIZE); - else - reg = INREG(RADEON_CONFIG_MEMSIZE); - - if (reg) - return TRUE; - return FALSE; } @@ -360,9 +296,9 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) #ifdef XSERVER_LIBPCIACCESS int size = info->PciInfo->rom_size > RADEON_VBIOS_SIZE ? info->PciInfo->rom_size : RADEON_VBIOS_SIZE; - info->VBIOS = malloc(size); + info->VBIOS = xalloc(size); #else - info->VBIOS = malloc(RADEON_VBIOS_SIZE); + info->VBIOS = xalloc(RADEON_VBIOS_SIZE); #endif if (!info->VBIOS) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, @@ -380,7 +316,7 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) if (info->VBIOS[0] != 0x55 || info->VBIOS[1] != 0xaa) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Unrecognized BIOS signature, BIOS data will not be used\n"); - free (info->VBIOS); + xfree (info->VBIOS); info->VBIOS = NULL; return FALSE; } @@ -395,7 +331,7 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) else if (info->VBIOS[dptr + 0x14] != 0x0) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Not an x86 BIOS ROM image, BIOS data will not be used\n"); - free (info->VBIOS); + xfree (info->VBIOS); info->VBIOS = NULL; return FALSE; } @@ -405,7 +341,7 @@ RADEONGetBIOSInfo(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) if(!info->ROMHeaderStart) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Invalid ROM pointer, BIOS data will not be used\n"); - free (info->VBIOS); + xfree (info->VBIOS); info->VBIOS = NULL; return FALSE; } @@ -532,11 +468,6 @@ static void RADEONApplyLegacyQuirks(ScrnInfoPtr pScrn, int index) info->BiosConnector[index].ddc_i2c.get_data_reg = RADEON_LCD_GPIO_Y_REG; } - /* R3xx+ chips don't have GPIO_CRT2_DDC gpio pad */ - if ((IS_R300_VARIANT) && - info->BiosConnector[index].ddc_i2c.mask_clk_reg == RADEON_GPIO_CRT2_DDC) - info->BiosConnector[index].ddc_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); - /* Certain IBM chipset RN50s have a BIOS reporting two VGAs, one with VGA DDC and one with CRT2 DDC. - kill the CRT2 DDC one */ if (info->Chipset == PCI_CHIP_RN50_515E && @@ -547,6 +478,15 @@ static void RADEONApplyLegacyQuirks(ScrnInfoPtr pScrn, int index) } } + /* Some RV100 cards with 2 VGA ports show up with DVI+VGA */ + if (info->Chipset == PCI_CHIP_RV100_QY && + PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1002 && + PCI_SUB_DEVICE_ID(info->PciInfo) == 0x013a) { + if (info->BiosConnector[index].ConnectorType == CONNECTOR_DVI_I) { + info->BiosConnector[index].ConnectorType = CONNECTOR_VGA; + } + } + /* X300 card with extra non-existent DVI port */ if (info->Chipset == PCI_CHIP_RV370_5B60 && PCI_SUB_VENDOR_ID(info->PciInfo) == 0x17af && @@ -990,7 +930,30 @@ Bool RADEONGetClockInfoFromBIOS (ScrnInfoPtr pScrn) return FALSE; } else { if (info->IsAtomBios) { - return RADEONGetATOMClockInfo(pScrn); + pll_info_block = RADEON_BIOS16 (info->MasterDataStart + 12); + + pll->reference_freq = RADEON_BIOS16 (pll_info_block + 82); + pll->reference_div = 0; /* Need to derive from existing setting + or use a new algorithm to calculate + from min_input and max_input + */ + pll->pll_out_min = RADEON_BIOS16 (pll_info_block + 78); + pll->pll_out_max = RADEON_BIOS32 (pll_info_block + 32); + + if (pll->pll_out_min == 0) { + if (IS_AVIVO_VARIANT) + pll->pll_out_min = 64800; + else + pll->pll_out_min = 20000; + } + + pll->pll_in_min = RADEON_BIOS16 (pll_info_block + 74); + pll->pll_in_max = RADEON_BIOS16 (pll_info_block + 76); + + pll->xclk = RADEON_BIOS16 (pll_info_block + 72); + + info->sclk = RADEON_BIOS32(pll_info_block + 8) / 100.0; + info->mclk = RADEON_BIOS32(pll_info_block + 12) / 100.0; } else { int rev; @@ -1296,6 +1259,7 @@ RADEONLookupI2CBlock(ScrnInfoPtr pScrn, int id) for (i = 0; i < blocks; i++) { int i2c_id = RADEON_BIOS8(offset + 3 + (i * 5) + 0); if (id == i2c_id) { + int reg = RADEON_BIOS16(offset + 3 + (i * 5) + 1) * 4; int clock_shift = RADEON_BIOS8(offset + 3 + (i * 5) + 3); int data_shift = RADEON_BIOS8(offset + 3 + (i * 5) + 4); @@ -1307,14 +1271,14 @@ RADEONLookupI2CBlock(ScrnInfoPtr pScrn, int id) i2c.put_data_mask = (1 << data_shift); i2c.get_clk_mask = (1 << clock_shift); i2c.get_data_mask = (1 << data_shift); - i2c.mask_clk_reg = RADEON_GPIOPAD_MASK; - i2c.mask_data_reg = RADEON_GPIOPAD_MASK; - i2c.a_clk_reg = RADEON_GPIOPAD_A; - i2c.a_data_reg = RADEON_GPIOPAD_A; - i2c.put_clk_reg = RADEON_GPIOPAD_EN; - i2c.put_data_reg = RADEON_GPIOPAD_EN; - i2c.get_clk_reg = RADEON_LCD_GPIO_Y_REG; - i2c.get_data_reg = RADEON_LCD_GPIO_Y_REG; + i2c.mask_clk_reg = reg; + i2c.mask_data_reg = reg; + i2c.a_clk_reg = reg; + i2c.a_data_reg = reg; + i2c.put_clk_reg = reg; + i2c.put_data_reg = reg; + i2c.get_clk_reg = reg; + i2c.get_data_reg = reg; i2c.valid = TRUE; break; } @@ -1378,10 +1342,6 @@ Bool RADEONGetExtTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_dvo_ptr dvo) } } } - } else { - dvo->dvo_i2c_slave_addr = 0x70; - dvo->dvo_i2c = RADEONLookupI2CBlock(pScrn, 136); - info->ext_tmds_chip = RADEON_SIL_164; } } else { offset = RADEON_BIOS16(info->ROMHeaderStart + 0x58); @@ -1400,12 +1360,9 @@ Bool RADEONGetExtTMDSInfoFromBIOS (ScrnInfoPtr pScrn, radeon_dvo_ptr dvo) dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_DVI_DDC); else if (gpio_reg == 3) dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_VGA_DDC); - else if (gpio_reg == 4) { - if (IS_R300_VARIANT) - dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_MONID); - else - dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); - } else if (gpio_reg == 5) { + else if (gpio_reg == 4) + dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); + else if (gpio_reg == 5) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "unsupported MM gpio_reg\n"); return FALSE; diff --git a/driver/xf86-video-ati/src/radeon_chipinfo_gen.h b/driver/xf86-video-ati/src/radeon_chipinfo_gen.h index fcf6b3362..63212463d 100644 --- a/driver/xf86-video-ati/src/radeon_chipinfo_gen.h +++ b/driver/xf86-video-ati/src/radeon_chipinfo_gen.h @@ -1,10 +1,9 @@ /* This file is autogenerated please do not edit */ -static RADEONCardInfo RADEONCards[] = { +RADEONCardInfo RADEONCards[] = { { 0x3150, CHIP_FAMILY_RV380, 1, 0, 0, 0, 0 }, { 0x3151, CHIP_FAMILY_RV380, 0, 0, 0, 0, 0 }, { 0x3152, CHIP_FAMILY_RV380, 1, 0, 0, 0, 0 }, { 0x3154, CHIP_FAMILY_RV380, 1, 0, 0, 0, 0 }, - { 0x3155, CHIP_FAMILY_RV380, 1, 0, 0, 0, 0 }, { 0x3E50, CHIP_FAMILY_RV380, 0, 0, 0, 0, 0 }, { 0x3E54, CHIP_FAMILY_RV380, 0, 0, 0, 0, 0 }, { 0x4136, CHIP_FAMILY_RS100, 0, 1, 0, 0, 1 }, @@ -26,6 +25,7 @@ static RADEONCardInfo RADEONCards[] = { { 0x4156, CHIP_FAMILY_RV350, 0, 0, 0, 0, 0 }, { 0x4237, CHIP_FAMILY_RS200, 0, 1, 0, 0, 1 }, { 0x4242, CHIP_FAMILY_R200, 0, 0, 0, 1, 0 }, + { 0x4243, CHIP_FAMILY_R200, 0, 0, 0, 1, 0 }, { 0x4336, CHIP_FAMILY_RS100, 1, 1, 0, 0, 1 }, { 0x4337, CHIP_FAMILY_RS200, 1, 1, 0, 0, 1 }, { 0x4437, CHIP_FAMILY_RS200, 1, 1, 0, 0, 1 }, @@ -40,8 +40,6 @@ static RADEONCardInfo RADEONCards[] = { { 0x4A4E, CHIP_FAMILY_R420, 1, 0, 0, 0, 0 }, { 0x4A4F, CHIP_FAMILY_R420, 0, 0, 0, 0, 0 }, { 0x4A50, CHIP_FAMILY_R420, 0, 0, 0, 0, 0 }, - { 0x4A54, CHIP_FAMILY_R420, 0, 0, 0, 0, 0 }, - { 0x4B48, CHIP_FAMILY_R420, 0, 0, 0, 0, 0 }, { 0x4B49, CHIP_FAMILY_R420, 0, 0, 0, 0, 0 }, { 0x4B4A, CHIP_FAMILY_R420, 0, 0, 0, 0, 0 }, { 0x4B4B, CHIP_FAMILY_R420, 0, 0, 0, 0, 0 }, @@ -256,7 +254,6 @@ static RADEONCardInfo RADEONCards[] = { { 0x9440, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x9441, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x9442, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, - { 0x9443, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x9444, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x9446, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x944A, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, @@ -268,34 +265,21 @@ static RADEONCardInfo RADEONCards[] = { { 0x9456, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x945A, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, { 0x945B, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, - { 0x945E, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, { 0x9460, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x9462, CHIP_FAMILY_RV770, 0, 0, 0, 0, 0 }, { 0x946A, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, { 0x946B, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, { 0x947A, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, { 0x947B, CHIP_FAMILY_RV770, 1, 0, 0, 0, 0 }, - { 0x9480, CHIP_FAMILY_RV730, 1, 0, 0, 0, 0 }, { 0x9487, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, - { 0x9488, CHIP_FAMILY_RV730, 1, 0, 0, 0, 0 }, { 0x9489, CHIP_FAMILY_RV730, 1, 0, 0, 0, 0 }, - { 0x948A, CHIP_FAMILY_RV730, 1, 0, 0, 0, 0 }, { 0x948F, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, { 0x9490, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, { 0x9491, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, - { 0x9495, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, { 0x9498, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, { 0x949C, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, { 0x949E, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, { 0x949F, CHIP_FAMILY_RV730, 0, 0, 0, 0, 0 }, - { 0x94A0, CHIP_FAMILY_RV740, 1, 0, 0, 0, 0 }, - { 0x94A1, CHIP_FAMILY_RV740, 1, 0, 0, 0, 0 }, - { 0x94A3, CHIP_FAMILY_RV740, 1, 0, 0, 0, 0 }, - { 0x94B1, CHIP_FAMILY_RV740, 0, 0, 0, 0, 0 }, - { 0x94B3, CHIP_FAMILY_RV740, 0, 0, 0, 0, 0 }, - { 0x94B4, CHIP_FAMILY_RV740, 0, 0, 0, 0, 0 }, - { 0x94B5, CHIP_FAMILY_RV740, 0, 0, 0, 0, 0 }, - { 0x94B9, CHIP_FAMILY_RV740, 1, 0, 0, 0, 0 }, { 0x94C0, CHIP_FAMILY_RV610, 0, 0, 0, 0, 0 }, { 0x94C1, CHIP_FAMILY_RV610, 0, 0, 0, 0, 0 }, { 0x94C3, CHIP_FAMILY_RV610, 0, 0, 0, 0, 0 }, @@ -323,14 +307,11 @@ static RADEONCardInfo RADEONCards[] = { { 0x9519, CHIP_FAMILY_RV670, 0, 0, 0, 0, 0 }, { 0x9540, CHIP_FAMILY_RV710, 0, 0, 0, 0, 0 }, { 0x9541, CHIP_FAMILY_RV710, 0, 0, 0, 0, 0 }, - { 0x9542, CHIP_FAMILY_RV710, 0, 0, 0, 0, 0 }, { 0x954E, CHIP_FAMILY_RV710, 0, 0, 0, 0, 0 }, { 0x954F, CHIP_FAMILY_RV710, 0, 0, 0, 0, 0 }, { 0x9552, CHIP_FAMILY_RV710, 1, 0, 0, 0, 0 }, { 0x9553, CHIP_FAMILY_RV710, 1, 0, 0, 0, 0 }, { 0x9555, CHIP_FAMILY_RV710, 1, 0, 0, 0, 0 }, - { 0x9557, CHIP_FAMILY_RV710, 1, 0, 0, 0, 0 }, - { 0x955F, CHIP_FAMILY_RV710, 1, 0, 0, 0, 0 }, { 0x9580, CHIP_FAMILY_RV630, 0, 0, 0, 0, 0 }, { 0x9581, CHIP_FAMILY_RV630, 1, 0, 0, 0, 0 }, { 0x9583, CHIP_FAMILY_RV630, 1, 0, 0, 0, 0 }, @@ -344,6 +325,7 @@ static RADEONCardInfo RADEONCards[] = { { 0x958D, CHIP_FAMILY_RV630, 0, 0, 0, 0, 0 }, { 0x958E, CHIP_FAMILY_RV630, 0, 0, 0, 0, 0 }, { 0x958F, CHIP_FAMILY_RV630, 1, 0, 0, 0, 0 }, + { 0x9542, CHIP_FAMILY_RV710, 0, 0, 0, 0, 0 }, { 0x95C0, CHIP_FAMILY_RV620, 0, 0, 0, 0, 0 }, { 0x95C2, CHIP_FAMILY_RV620, 1, 0, 0, 0, 0 }, { 0x95C4, CHIP_FAMILY_RV620, 1, 0, 0, 0, 0 }, @@ -371,123 +353,9 @@ static RADEONCardInfo RADEONCards[] = { { 0x9614, CHIP_FAMILY_RS780, 0, 1, 0, 0, 1 }, { 0x9615, CHIP_FAMILY_RS780, 0, 1, 0, 0, 1 }, { 0x9616, CHIP_FAMILY_RS780, 0, 1, 0, 0, 1 }, - { 0x9640, CHIP_FAMILY_SUMO, 0, 1, 0, 0, 1 }, - { 0x9641, CHIP_FAMILY_SUMO, 1, 1, 0, 0, 1 }, - { 0x9642, CHIP_FAMILY_SUMO2, 0, 1, 0, 0, 1 }, - { 0x9643, CHIP_FAMILY_SUMO2, 1, 1, 0, 0, 1 }, - { 0x9644, CHIP_FAMILY_SUMO2, 0, 1, 0, 0, 1 }, - { 0x9645, CHIP_FAMILY_SUMO2, 1, 1, 0, 0, 1 }, - { 0x9647, CHIP_FAMILY_SUMO, 1, 1, 0, 0, 1 }, - { 0x9648, CHIP_FAMILY_SUMO, 1, 1, 0, 0, 1 }, - { 0x964A, CHIP_FAMILY_SUMO, 0, 1, 0, 0, 1 }, - { 0x964E, CHIP_FAMILY_SUMO, 1, 1, 0, 0, 1 }, - { 0x964F, CHIP_FAMILY_SUMO, 1, 1, 0, 0, 1 }, { 0x9710, CHIP_FAMILY_RS880, 0, 1, 0, 0, 1 }, { 0x9711, CHIP_FAMILY_RS880, 0, 1, 0, 0, 1 }, { 0x9712, CHIP_FAMILY_RS880, 1, 1, 0, 0, 1 }, { 0x9713, CHIP_FAMILY_RS880, 1, 1, 0, 0, 1 }, { 0x9714, CHIP_FAMILY_RS880, 0, 1, 0, 0, 1 }, - { 0x9715, CHIP_FAMILY_RS880, 0, 1, 0, 0, 1 }, - { 0x9802, CHIP_FAMILY_PALM, 0, 1, 0, 0, 1 }, - { 0x9803, CHIP_FAMILY_PALM, 0, 1, 0, 0, 1 }, - { 0x9804, CHIP_FAMILY_PALM, 0, 1, 0, 0, 1 }, - { 0x9805, CHIP_FAMILY_PALM, 0, 1, 0, 0, 1 }, - { 0x9806, CHIP_FAMILY_PALM, 0, 1, 0, 0, 1 }, - { 0x9807, CHIP_FAMILY_PALM, 0, 1, 0, 0, 1 }, - { 0x6880, CHIP_FAMILY_CYPRESS, 1, 0, 0, 0, 0 }, - { 0x6888, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x6889, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x688A, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x688C, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x688D, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x6898, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x6899, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x689B, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x689E, CHIP_FAMILY_CYPRESS, 0, 0, 0, 0, 0 }, - { 0x689C, CHIP_FAMILY_HEMLOCK, 0, 0, 0, 0, 0 }, - { 0x689D, CHIP_FAMILY_HEMLOCK, 0, 0, 0, 0, 0 }, - { 0x68A0, CHIP_FAMILY_JUNIPER, 1, 0, 0, 0, 0 }, - { 0x68A1, CHIP_FAMILY_JUNIPER, 1, 0, 0, 0, 0 }, - { 0x68A8, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 }, - { 0x68A9, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 }, - { 0x68B0, CHIP_FAMILY_JUNIPER, 1, 0, 0, 0, 0 }, - { 0x68B8, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 }, - { 0x68B9, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 }, - { 0x68BA, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 }, - { 0x68BE, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 }, - { 0x68BF, CHIP_FAMILY_JUNIPER, 0, 0, 0, 0, 0 }, - { 0x68C0, CHIP_FAMILY_REDWOOD, 1, 0, 0, 0, 0 }, - { 0x68C1, CHIP_FAMILY_REDWOOD, 1, 0, 0, 0, 0 }, - { 0x68C7, CHIP_FAMILY_REDWOOD, 1, 0, 0, 0, 0 }, - { 0x68C8, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 }, - { 0x68C9, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 }, - { 0x68D8, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 }, - { 0x68D9, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 }, - { 0x68DA, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 }, - { 0x68DE, CHIP_FAMILY_REDWOOD, 0, 0, 0, 0, 0 }, - { 0x68E0, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 }, - { 0x68E1, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 }, - { 0x68E4, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 }, - { 0x68E5, CHIP_FAMILY_CEDAR, 1, 0, 0, 0, 0 }, - { 0x68E8, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 }, - { 0x68E9, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 }, - { 0x68F1, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 }, - { 0x68F2, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 }, - { 0x68F8, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 }, - { 0x68F9, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 }, - { 0x68FE, CHIP_FAMILY_CEDAR, 0, 0, 0, 0, 0 }, - { 0x6700, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6701, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6702, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6703, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6704, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6705, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6706, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6707, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6708, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6709, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6718, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6719, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x671C, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x671D, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x671F, CHIP_FAMILY_CAYMAN, 0, 0, 0, 0, 0 }, - { 0x6720, CHIP_FAMILY_BARTS, 1, 0, 0, 0, 0 }, - { 0x6721, CHIP_FAMILY_BARTS, 1, 0, 0, 0, 0 }, - { 0x6722, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6723, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6724, CHIP_FAMILY_BARTS, 1, 0, 0, 0, 0 }, - { 0x6725, CHIP_FAMILY_BARTS, 1, 0, 0, 0, 0 }, - { 0x6726, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6727, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6728, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6729, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6738, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6739, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x673E, CHIP_FAMILY_BARTS, 0, 0, 0, 0, 0 }, - { 0x6740, CHIP_FAMILY_TURKS, 1, 0, 0, 0, 0 }, - { 0x6741, CHIP_FAMILY_TURKS, 1, 0, 0, 0, 0 }, - { 0x6742, CHIP_FAMILY_TURKS, 1, 0, 0, 0, 0 }, - { 0x6743, CHIP_FAMILY_TURKS, 1, 0, 0, 0, 0 }, - { 0x6744, CHIP_FAMILY_TURKS, 1, 0, 0, 0, 0 }, - { 0x6745, CHIP_FAMILY_TURKS, 1, 0, 0, 0, 0 }, - { 0x6746, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x6747, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x6748, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x6749, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x6750, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x6758, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x6759, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x675F, CHIP_FAMILY_TURKS, 0, 0, 0, 0, 0 }, - { 0x6760, CHIP_FAMILY_CAICOS, 1, 0, 0, 0, 0 }, - { 0x6761, CHIP_FAMILY_CAICOS, 1, 0, 0, 0, 0 }, - { 0x6762, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, - { 0x6763, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, - { 0x6764, CHIP_FAMILY_CAICOS, 1, 0, 0, 0, 0 }, - { 0x6765, CHIP_FAMILY_CAICOS, 1, 0, 0, 0, 0 }, - { 0x6766, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, - { 0x6767, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, - { 0x6768, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, - { 0x6770, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, - { 0x6778, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, - { 0x6779, CHIP_FAMILY_CAICOS, 0, 0, 0, 0, 0 }, }; diff --git a/driver/xf86-video-ati/src/radeon_chipset_gen.h b/driver/xf86-video-ati/src/radeon_chipset_gen.h index 0303a5dcb..631eda8d3 100644 --- a/driver/xf86-video-ati/src/radeon_chipset_gen.h +++ b/driver/xf86-video-ati/src/radeon_chipset_gen.h @@ -4,7 +4,6 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_RV380_3151, "ATI FireMV 2400 (PCI)" }, { PCI_CHIP_RV380_3152, "ATI Radeon Mobility X300 (M24) 3152 (PCIE)" }, { PCI_CHIP_RV380_3154, "ATI FireGL M24 GL 3154 (PCIE)" }, - { PCI_CHIP_RV380_3155, "ATI FireMV 2400 3155 (PCI)" }, { PCI_CHIP_RV380_3E50, "ATI Radeon X600 (RV380) 3E50 (PCIE)" }, { PCI_CHIP_RV380_3E54, "ATI FireGL V3200 (RV380) 3E54 (PCIE)" }, { PCI_CHIP_RS100_4136, "ATI Radeon IGP320 (A3) 4136" }, @@ -26,6 +25,7 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_RV350_AV, "ATI FireGL RV360 AV (AGP)" }, { PCI_CHIP_RS250_4237, "ATI Radeon 7000 IGP (A4+) 4237" }, { PCI_CHIP_R200_BB, "ATI Radeon 8500 AIW BB (AGP)" }, + { PCI_CHIP_R200_BC, "ATI Radeon 8500 AIW BC (AGP)" }, { PCI_CHIP_RS100_4336, "ATI Radeon IGP320M (U1) 4336" }, { PCI_CHIP_RS200_4337, "ATI Radeon IGP330M/340M/350M (U2) 4337" }, { PCI_CHIP_RS250_4437, "ATI Radeon Mobility 7000 IGP 4437" }, @@ -40,8 +40,6 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_R420_JN, "ATI Radeon Mobility 9800 (M18) JN (AGP)" }, { PCI_CHIP_R420_4A4F, "ATI Radeon X800 SE (R420) (AGP)" }, { PCI_CHIP_R420_JP, "ATI Radeon X800XT (R420) JP (AGP)" }, - { PCI_CHIP_R420_JT, "ATI Radeon X800 VE (R420) JT (AGP)" }, - { PCI_CHIP_R481_4B48, "ATI Radeon X850 (R480) (AGP)" }, { PCI_CHIP_R481_4B49, "ATI Radeon X850 XT (R480) (AGP)" }, { PCI_CHIP_R481_4B4A, "ATI Radeon X850 SE (R480) (AGP)" }, { PCI_CHIP_R481_4B4B, "ATI Radeon X850 PRO (R480) (AGP)" }, @@ -256,7 +254,6 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_RV770_9440, "ATI Radeon 4800 Series" }, { PCI_CHIP_RV770_9441, "ATI Radeon HD 4870 x2" }, { PCI_CHIP_RV770_9442, "ATI Radeon 4800 Series" }, - { PCI_CHIP_RV770_9443, "ATI Radeon HD 4850 x2" }, { PCI_CHIP_RV770_9444, "ATI FirePro V8750 (FireGL)" }, { PCI_CHIP_RV770_9446, "ATI FirePro V7760 (FireGL)" }, { PCI_CHIP_RV770_944A, "ATI Mobility RADEON HD 4850" }, @@ -268,34 +265,21 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_RV770_9456, "ATI FirePro V8700 (FireGL)" }, { PCI_CHIP_RV770_945A, "ATI Mobility RADEON HD 4870" }, { PCI_CHIP_RV770_945B, "ATI Mobility RADEON M98" }, - { PCI_CHIP_RV770_945E, "ATI Mobility RADEON HD 4870" }, { PCI_CHIP_RV790_9460, "ATI Radeon 4800 Series" }, { PCI_CHIP_RV790_9462, "ATI Radeon 4800 Series" }, { PCI_CHIP_RV770_946A, "ATI FirePro M7750" }, { PCI_CHIP_RV770_946B, "ATI M98" }, { PCI_CHIP_RV770_947A, "ATI M98" }, { PCI_CHIP_RV770_947B, "ATI M98" }, - { PCI_CHIP_RV730_9480, "ATI Mobility Radeon HD 4650" }, { PCI_CHIP_RV730_9487, "ATI Radeon RV730 (AGP)" }, - { PCI_CHIP_RV730_9488, "ATI Mobility Radeon HD 4670" }, { PCI_CHIP_RV730_9489, "ATI FirePro M5750" }, - { PCI_CHIP_RV730_948A, "ATI Mobility Radeon HD 4670" }, { PCI_CHIP_RV730_948F, "ATI Radeon RV730 (AGP)" }, { PCI_CHIP_RV730_9490, "ATI RV730XT [Radeon HD 4670]" }, { PCI_CHIP_RV730_9491, "ATI RADEON E4600" }, - { PCI_CHIP_RV730_9495, "ATI Radeon HD 4600 Series" }, { PCI_CHIP_RV730_9498, "ATI RV730 PRO [Radeon HD 4650]" }, { PCI_CHIP_RV730_949C, "ATI FirePro V7750 (FireGL)" }, { PCI_CHIP_RV730_949E, "ATI FirePro V5700 (FireGL)" }, { PCI_CHIP_RV730_949F, "ATI FirePro V3750 (FireGL)" }, - { PCI_CHIP_RV740_94A0, "ATI Mobility Radeon HD 4830" }, - { PCI_CHIP_RV740_94A1, "ATI Mobility Radeon HD 4850" }, - { PCI_CHIP_RV740_94A3, "ATI FirePro M7740" }, - { PCI_CHIP_RV740_94B1, "ATI RV740" }, - { PCI_CHIP_RV740_94B3, "ATI Radeon HD 4770" }, - { PCI_CHIP_RV740_94B4, "ATI Radeon HD 4700 Series" }, - { PCI_CHIP_RV740_94B5, "ATI Radeon HD 4770" }, - { PCI_CHIP_RV740_94B9, "ATI FirePro M5750" }, { PCI_CHIP_RV610_94C0, "ATI RV610" }, { PCI_CHIP_RV610_94C1, "ATI Radeon HD 2400 XT" }, { PCI_CHIP_RV610_94C3, "ATI Radeon HD 2400 Pro" }, @@ -323,14 +307,11 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_RV670_9519, "AMD Firestream 9170" }, { PCI_CHIP_RV710_9540, "ATI Radeon HD 4550" }, { PCI_CHIP_RV710_9541, "ATI Radeon RV710" }, - { PCI_CHIP_RV710_9542, "ATI Radeon RV710" }, { PCI_CHIP_RV710_954E, "ATI Radeon RV710" }, { PCI_CHIP_RV710_954F, "ATI Radeon HD 4350" }, { PCI_CHIP_RV710_9552, "ATI Mobility Radeon 4300 Series" }, { PCI_CHIP_RV710_9553, "ATI Mobility Radeon 4500 Series" }, { PCI_CHIP_RV710_9555, "ATI Mobility Radeon 4500 Series" }, - { PCI_CHIP_RV710_9557, "ATI FirePro RG220" }, - { PCI_CHIP_RV710_955F, "ATI Mobility Radeon 4330" }, { PCI_CHIP_RV630_9580, "ATI RV630" }, { PCI_CHIP_RV630_9581, "ATI Mobility Radeon HD 2600" }, { PCI_CHIP_RV630_9583, "ATI Mobility Radeon HD 2600 XT" }, @@ -344,6 +325,7 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_RV630_958D, "ATI FireGL V3600" }, { PCI_CHIP_RV630_958E, "ATI Radeon HD 2600 LE" }, { PCI_CHIP_RV630_958F, "ATI Mobility FireGL Graphics Processor" }, + { PCI_CHIP_RV710_9542, "ATI Radeon RV710" }, { PCI_CHIP_RV620_95C0, "ATI Radeon HD 3470" }, { PCI_CHIP_RV620_95C2, "ATI Mobility Radeon HD 3430" }, { PCI_CHIP_RV620_95C4, "ATI Mobility Radeon HD 3400 Series" }, @@ -371,124 +353,10 @@ static SymTabRec RADEONChipsets[] = { { PCI_CHIP_RS780_9614, "ATI Radeon HD 3300 Graphics" }, { PCI_CHIP_RS780_9615, "ATI Radeon HD 3200 Graphics" }, { PCI_CHIP_RS780_9616, "ATI Radeon 3000 Graphics" }, - { PCI_CHIP_SUMO_9640, "SUMO" }, - { PCI_CHIP_SUMO_9641, "SUMO" }, - { PCI_CHIP_SUMO2_9642, "SUMO2" }, - { PCI_CHIP_SUMO2_9643, "SUMO2" }, - { PCI_CHIP_SUMO2_9644, "SUMO2" }, - { PCI_CHIP_SUMO2_9645, "SUMO2" }, - { PCI_CHIP_SUMO_9647, "SUMO" }, - { PCI_CHIP_SUMO_9648, "SUMO" }, - { PCI_CHIP_SUMO_964A, "SUMO" }, - { PCI_CHIP_SUMO_964E, "SUMO" }, - { PCI_CHIP_SUMO_964F, "SUMO" }, - { PCI_CHIP_RS880_9710, "ATI Radeon HD 4200" }, - { PCI_CHIP_RS880_9711, "ATI Radeon 4100" }, - { PCI_CHIP_RS880_9712, "ATI Mobility Radeon HD 4200" }, - { PCI_CHIP_RS880_9713, "ATI Mobility Radeon 4100" }, - { PCI_CHIP_RS880_9714, "ATI Radeon HD 4290" }, - { PCI_CHIP_RS880_9715, "ATI Radeon HD 4250" }, - { PCI_CHIP_PALM_9802, "AMD Radeon HD 6310 Graphics" }, - { PCI_CHIP_PALM_9803, "AMD Radeon HD 6310 Graphics" }, - { PCI_CHIP_PALM_9804, "AMD Radeon HD 6250 Graphics" }, - { PCI_CHIP_PALM_9805, "AMD Radeon HD 6250 Graphics" }, - { PCI_CHIP_PALM_9806, "AMD Radeon HD 6300 Series Graphics" }, - { PCI_CHIP_PALM_9807, "AMD Radeon HD 6200 Series Graphics" }, - { PCI_CHIP_CYPRESS_6880, "CYPRESS" }, - { PCI_CHIP_CYPRESS_6888, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_CYPRESS_6889, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_CYPRESS_688A, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_CYPRESS_688C, "AMD Firestream 9370" }, - { PCI_CHIP_CYPRESS_688D, "AMD Firestream 9350" }, - { PCI_CHIP_CYPRESS_6898, "ATI Radeon HD 5800 Series" }, - { PCI_CHIP_CYPRESS_6899, "ATI Radeon HD 5800 Series" }, - { PCI_CHIP_CYPRESS_689B, "ATI Radeon HD 5800 Series" }, - { PCI_CHIP_CYPRESS_689E, "ATI Radeon HD 5800 Series" }, - { PCI_CHIP_HEMLOCK_689C, "ATI Radeon HD 5900 Series" }, - { PCI_CHIP_HEMLOCK_689D, "ATI Radeon HD 5900 Series" }, - { PCI_CHIP_JUNIPER_68A0, "ATI Mobility Radeon HD 5800 Series" }, - { PCI_CHIP_JUNIPER_68A1, "ATI Mobility Radeon HD 5800 Series" }, - { PCI_CHIP_JUNIPER_68A8, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_JUNIPER_68A9, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_JUNIPER_68B0, "ATI Mobility Radeon HD 5800 Series" }, - { PCI_CHIP_JUNIPER_68B8, "ATI Radeon HD 5700 Series" }, - { PCI_CHIP_JUNIPER_68B9, "ATI Radeon HD 5700 Series" }, - { PCI_CHIP_JUNIPER_68BA, "ATI Radeon HD 6700 Series" }, - { PCI_CHIP_JUNIPER_68BE, "ATI Radeon HD 5700 Series" }, - { PCI_CHIP_JUNIPER_68BF, "ATI Radeon HD 6700 Series" }, - { PCI_CHIP_REDWOOD_68C0, "ATI Mobility Radeon HD 5000 Series" }, - { PCI_CHIP_REDWOOD_68C1, "ATI Mobility Radeon HD 5000 Series" }, - { PCI_CHIP_REDWOOD_68C7, "ATI Mobility Radeon HD 5570" }, - { PCI_CHIP_REDWOOD_68C8, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_REDWOOD_68C9, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_REDWOOD_68D8, "ATI Radeon HD 5670" }, - { PCI_CHIP_REDWOOD_68D9, "ATI Radeon HD 5570" }, - { PCI_CHIP_REDWOOD_68DA, "ATI Radeon HD 5500 Series" }, - { PCI_CHIP_REDWOOD_68DE, "REDWOOD" }, - { PCI_CHIP_CEDAR_68E0, "ATI Mobility Radeon HD 5000 Series" }, - { PCI_CHIP_CEDAR_68E1, "ATI Mobility Radeon HD 5000 Series" }, - { PCI_CHIP_CEDAR_68E4, "ATI Mobility Radeon Graphics" }, - { PCI_CHIP_CEDAR_68E5, "ATI Mobility Radeon Graphics" }, - { PCI_CHIP_CEDAR_68E8, "CEDAR" }, - { PCI_CHIP_CEDAR_68E9, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_CEDAR_68F1, "ATI FirePro (FireGL) Graphics Adapter" }, - { PCI_CHIP_CEDAR_68F2, "ATI FirePro 2270" }, - { PCI_CHIP_CEDAR_68F8, "CEDAR" }, - { PCI_CHIP_CEDAR_68F9, "ATI Radeon HD 5450" }, - { PCI_CHIP_CEDAR_68FE, "CEDAR" }, - { PCI_CHIP_CAYMAN_6700, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6701, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6702, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6703, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6704, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6705, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6706, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6707, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6708, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6709, "CAYMAN" }, - { PCI_CHIP_CAYMAN_6718, "AMD Radeon HD 6900 Series" }, - { PCI_CHIP_CAYMAN_6719, "AMD Radeon HD 6900 Series" }, - { PCI_CHIP_CAYMAN_671C, "CAYMAN" }, - { PCI_CHIP_CAYMAN_671D, "CAYMAN" }, - { PCI_CHIP_CAYMAN_671F, "CAYMAN" }, - { PCI_CHIP_BARTS_6720, "AMD Radeon HD 6900M Series" }, - { PCI_CHIP_BARTS_6721, "Mobility Radeon HD 6000 Series" }, - { PCI_CHIP_BARTS_6722, "BARTS" }, - { PCI_CHIP_BARTS_6723, "BARTS" }, - { PCI_CHIP_BARTS_6724, "Mobility Radeon HD 6000 Series" }, - { PCI_CHIP_BARTS_6725, "Mobility Radeon HD 6000 Series" }, - { PCI_CHIP_BARTS_6726, "BARTS" }, - { PCI_CHIP_BARTS_6727, "BARTS" }, - { PCI_CHIP_BARTS_6728, "BARTS" }, - { PCI_CHIP_BARTS_6729, "BARTS" }, - { PCI_CHIP_BARTS_6738, "AMD Radeon HD 6800 Series" }, - { PCI_CHIP_BARTS_6739, "AMD Radeon HD 6800 Series" }, - { PCI_CHIP_BARTS_673E, "AMD Radeon HD 6700 Series" }, - { PCI_CHIP_TURKS_6740, "TURKS" }, - { PCI_CHIP_TURKS_6741, "TURKS" }, - { PCI_CHIP_TURKS_6742, "TURKS" }, - { PCI_CHIP_TURKS_6743, "TURKS" }, - { PCI_CHIP_TURKS_6744, "TURKS" }, - { PCI_CHIP_TURKS_6745, "TURKS" }, - { PCI_CHIP_TURKS_6746, "TURKS" }, - { PCI_CHIP_TURKS_6747, "TURKS" }, - { PCI_CHIP_TURKS_6748, "TURKS" }, - { PCI_CHIP_TURKS_6749, "TURKS" }, - { PCI_CHIP_TURKS_6750, "TURKS" }, - { PCI_CHIP_TURKS_6758, "TURKS" }, - { PCI_CHIP_TURKS_6759, "TURKS" }, - { PCI_CHIP_TURKS_675F, "TURKS" }, - { PCI_CHIP_CAICOS_6760, "CAICOS" }, - { PCI_CHIP_CAICOS_6761, "CAICOS" }, - { PCI_CHIP_CAICOS_6762, "CAICOS" }, - { PCI_CHIP_CAICOS_6763, "CAICOS" }, - { PCI_CHIP_CAICOS_6764, "CAICOS" }, - { PCI_CHIP_CAICOS_6765, "CAICOS" }, - { PCI_CHIP_CAICOS_6766, "CAICOS" }, - { PCI_CHIP_CAICOS_6767, "CAICOS" }, - { PCI_CHIP_CAICOS_6768, "CAICOS" }, - { PCI_CHIP_CAICOS_6770, "CAICOS" }, - { PCI_CHIP_CAICOS_6778, "CAICOS" }, - { PCI_CHIP_CAICOS_6779, "CAICOS" }, + { PCI_CHIP_RS880_9710, "ATI Radeon HD Graphics" }, + { PCI_CHIP_RS880_9711, "ATI Radeon Graphics" }, + { PCI_CHIP_RS880_9712, "ATI Mobility Radeon HD Graphics" }, + { PCI_CHIP_RS880_9713, "ATI Mobility Radeon Graphics" }, + { PCI_CHIP_RS880_9714, "ATI Radeon Graphics" }, { -1, NULL } }; diff --git a/driver/xf86-video-ati/src/radeon_commonfuncs.c b/driver/xf86-video-ati/src/radeon_commonfuncs.c index 728194904..a9bc7d28a 100644 --- a/driver/xf86-video-ati/src/radeon_commonfuncs.c +++ b/driver/xf86-video-ati/src/radeon_commonfuncs.c @@ -56,7 +56,6 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t gb_tile_config, su_reg_dest, vap_cntl; - int size; ACCEL_PREAMBLE(); info->accel_state->texW[0] = info->accel_state->texH[0] = @@ -64,15 +63,13 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) if (IS_R300_3D || IS_R500_3D) { - if (!info->cs) { - BEGIN_ACCEL(3); - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); - OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); - FINISH_ACCEL(); - } + BEGIN_ACCEL(3); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); + OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); + FINISH_ACCEL(); - gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); + gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16 | R300_SUBPIXEL_1_16); switch(info->accel_state->num_gb_pipes) { case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break; @@ -82,26 +79,20 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break; } - if (!info->cs) { - size = (info->ChipFamily >= CHIP_FAMILY_R420) ? 5 : 4; - BEGIN_ACCEL(size); - OUT_ACCEL_REG(R300_GB_TILE_CONFIG, gb_tile_config); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); - if (info->ChipFamily >= CHIP_FAMILY_R420) - OUT_ACCEL_REG(R300_DST_PIPE_CONFIG, R300_PIPE_AUTO_CONFIG); - OUT_ACCEL_REG(R300_GB_SELECT, 0); - OUT_ACCEL_REG(R300_GB_ENABLE, 0); - FINISH_ACCEL(); - } + BEGIN_ACCEL(5); + OUT_ACCEL_REG(R300_GB_TILE_CONFIG, gb_tile_config); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); + OUT_ACCEL_REG(R300_DST_PIPE_CONFIG, R300_PIPE_AUTO_CONFIG); + OUT_ACCEL_REG(R300_GB_SELECT, 0); + OUT_ACCEL_REG(R300_GB_ENABLE, 0); + FINISH_ACCEL(); if (IS_R500_3D) { - if (!info->cs) { - su_reg_dest = ((1 << info->accel_state->num_gb_pipes) - 1); - BEGIN_ACCEL(2); - OUT_ACCEL_REG(R500_SU_REG_DEST, su_reg_dest); - OUT_ACCEL_REG(R500_VAP_INDEX_OFFSET, 0); - FINISH_ACCEL(); - } + su_reg_dest = ((1 << info->accel_state->num_gb_pipes) - 1); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(R500_SU_REG_DEST, su_reg_dest); + OUT_ACCEL_REG(R500_VAP_INDEX_OFFSET, 0); + FINISH_ACCEL(); } BEGIN_ACCEL(3); @@ -110,34 +101,29 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); FINISH_ACCEL(); - BEGIN_ACCEL(3); + BEGIN_ACCEL(5); OUT_ACCEL_REG(R300_GB_AA_CONFIG, 0); OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); + OUT_ACCEL_REG(R300_GB_MSPOS0, ((8 << R300_MS_X0_SHIFT) | + (8 << R300_MS_Y0_SHIFT) | + (8 << R300_MS_X1_SHIFT) | + (8 << R300_MS_Y1_SHIFT) | + (8 << R300_MS_X2_SHIFT) | + (8 << R300_MS_Y2_SHIFT) | + (8 << R300_MSBD0_Y_SHIFT) | + (7 << R300_MSBD0_X_SHIFT))); + OUT_ACCEL_REG(R300_GB_MSPOS1, ((8 << R300_MS_X3_SHIFT) | + (8 << R300_MS_Y3_SHIFT) | + (8 << R300_MS_X4_SHIFT) | + (8 << R300_MS_Y4_SHIFT) | + (8 << R300_MS_X5_SHIFT) | + (8 << R300_MS_Y5_SHIFT) | + (8 << R300_MSBD1_SHIFT))); FINISH_ACCEL(); - if (!info->cs) { - BEGIN_ACCEL(3); - OUT_ACCEL_REG(R300_GB_MSPOS0, ((6 << R300_MS_X0_SHIFT) | - (6 << R300_MS_Y0_SHIFT) | - (6 << R300_MS_X1_SHIFT) | - (6 << R300_MS_Y1_SHIFT) | - (6 << R300_MS_X2_SHIFT) | - (6 << R300_MS_Y2_SHIFT) | - (6 << R300_MSBD0_Y_SHIFT) | - (6 << R300_MSBD0_X_SHIFT))); - OUT_ACCEL_REG(R300_GB_MSPOS1, ((6 << R300_MS_X3_SHIFT) | - (6 << R300_MS_Y3_SHIFT) | - (6 << R300_MS_X4_SHIFT) | - (6 << R300_MS_Y4_SHIFT) | - (6 << R300_MS_X5_SHIFT) | - (6 << R300_MS_Y5_SHIFT) | - (6 << R300_MSBD1_SHIFT))); - OUT_ACCEL_REG(R300_GA_ENHANCE, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); - FINISH_ACCEL(); - } - - BEGIN_ACCEL(4); + BEGIN_ACCEL(5); + OUT_ACCEL_REG(R300_GA_ENHANCE, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); OUT_ACCEL_REG(R300_GA_POLY_MODE, R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); OUT_ACCEL_REG(R300_GA_ROUND_MODE, (R300_GEOMETRY_ROUND_NEAREST | R300_COLOR_ROUND_NEAREST)); @@ -170,21 +156,20 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) (5 << R300_PVS_NUM_CNTLRS_SHIFT) | (5 << R300_VF_MAX_VTX_NUM_SHIFT)); - if ((info->ChipFamily == CHIP_FAMILY_R300) || - (info->ChipFamily == CHIP_FAMILY_R350)) - vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT); - else if (info->ChipFamily == CHIP_FAMILY_RV530) + if (info->ChipFamily == CHIP_FAMILY_RV515) + vap_cntl |= (2 << R300_PVS_NUM_FPUS_SHIFT); + else if ((info->ChipFamily == CHIP_FAMILY_RV530) || + (info->ChipFamily == CHIP_FAMILY_RV560) || + (info->ChipFamily == CHIP_FAMILY_RV570)) vap_cntl |= (5 << R300_PVS_NUM_FPUS_SHIFT); else if ((info->ChipFamily == CHIP_FAMILY_RV410) || (info->ChipFamily == CHIP_FAMILY_R420)) vap_cntl |= (6 << R300_PVS_NUM_FPUS_SHIFT); else if ((info->ChipFamily == CHIP_FAMILY_R520) || - (info->ChipFamily == CHIP_FAMILY_R580) || - (info->ChipFamily == CHIP_FAMILY_RV560) || - (info->ChipFamily == CHIP_FAMILY_RV570)) + (info->ChipFamily == CHIP_FAMILY_R580)) vap_cntl |= (8 << R300_PVS_NUM_FPUS_SHIFT); else - vap_cntl |= (2 << R300_PVS_NUM_FPUS_SHIFT); + vap_cntl |= (4 << R300_PVS_NUM_FPUS_SHIFT); if (info->accel_state->has_tcl) BEGIN_ACCEL(15); @@ -235,10 +220,10 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) /* pre-load the vertex shaders */ if (info->accel_state->has_tcl) { - BEGIN_ACCEL(37); - /* exa composite shader program */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, R300_PVS_VECTOR_INST_INDEX(0)); - /* PVS inst 0 - dst X,Y */ + /* exa mask/Xv bicubic shader program */ + BEGIN_ACCEL(13); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 0); + /* PVS inst 0 */ OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_DST_OPCODE(R300_VE_ADD) | R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | @@ -247,99 +232,44 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_1))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 1 - src X */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_DOT_PRODUCT) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_TEMPORARY) | - R300_PVS_DST_OFFSET(0) | - R300_PVS_DST_WE_X)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_1) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | R300_PVS_SRC_OFFSET(0) | R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_OFFSET(0) | R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - /* PVS inst 2 - src Y */ + /* PVS inst 1 */ OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_DOT_PRODUCT) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_TEMPORARY) | - R300_PVS_DST_OFFSET(0) | - R300_PVS_DST_WE_Y)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_1) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | - R300_PVS_SRC_OFFSET(1) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 3 - src X / w */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_MULTIPLY) | + (R300_PVS_DST_OPCODE(R300_VE_ADD) | R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | R300_PVS_DST_OFFSET(1) | - R300_PVS_DST_WE_X)); + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_TEMPORARY) | - R300_PVS_SRC_OFFSET(0) | + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_W) | + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); @@ -351,26 +281,82 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - /* PVS inst 4 - src y / h */ + /* PVS inst 2 */ OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_MULTIPLY) | + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(2) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(7) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(7) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(7) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + FINISH_ACCEL(); + + BEGIN_ACCEL(9); + /* exa no mask instruction */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 3); + /* PVS inst 0 */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(0) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + + /* PVS inst 1 */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | R300_PVS_DST_OFFSET(1) | - R300_PVS_DST_WE_Y)); + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_TEMPORARY) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | - R300_PVS_SRC_OFFSET(1) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_W) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | R300_PVS_SRC_OFFSET(6) | @@ -378,111 +364,6 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 5 - mask X */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_DOT_PRODUCT) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_TEMPORARY) | - R300_PVS_DST_OFFSET(0) | - R300_PVS_DST_WE_Z)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(7) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_1) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | - R300_PVS_SRC_OFFSET(2) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(7) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 6 - mask Y */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_DOT_PRODUCT) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_TEMPORARY) | - R300_PVS_DST_OFFSET(0) | - R300_PVS_DST_WE_W)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(7) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_1) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | - R300_PVS_SRC_OFFSET(3) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(7) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 7 - mask X / w */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_MULTIPLY) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | - R300_PVS_DST_OFFSET(2) | - R300_PVS_DST_WE_X)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_TEMPORARY) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_Z) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | - R300_PVS_SRC_OFFSET(2) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_W) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 8 - mask y / h */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_MULTIPLY) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | - R300_PVS_DST_OFFSET(2) | - R300_PVS_DST_WE_Y)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_TEMPORARY) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_W) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_CONSTANT) | - R300_PVS_SRC_OFFSET(3) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_W) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | R300_PVS_SRC_OFFSET(6) | @@ -494,7 +375,7 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) /* Xv shader program */ BEGIN_ACCEL(9); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, R300_PVS_VECTOR_INST_INDEX(9)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 5); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_DST_OPCODE(R300_VE_ADD) | @@ -507,8 +388,8 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) R300_PVS_SRC_OFFSET(0) | R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_1))); + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | R300_PVS_SRC_OFFSET(0) | @@ -528,14 +409,15 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) (R300_PVS_DST_OPCODE(R300_VE_ADD) | R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | R300_PVS_DST_OFFSET(1) | - R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y)); + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | R300_PVS_SRC_OFFSET(6) | R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_1))); + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | R300_PVS_SRC_OFFSET(6) | @@ -551,97 +433,6 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); FINISH_ACCEL(); - - /* Xv bicubic shader program */ - BEGIN_ACCEL(13); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, R300_PVS_VECTOR_INST_INDEX(11)); - /* PVS inst 0 */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_ADD) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | - R300_PVS_DST_OFFSET(0) | - R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | - R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_1))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(0) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 1 */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_ADD) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | - R300_PVS_DST_OFFSET(1) | - R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | - R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_1))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(6) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - - /* PVS inst 2 */ - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_DST_OPCODE(R300_VE_ADD) | - R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | - R300_PVS_DST_OFFSET(2) | - R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | - R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(7) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_1))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(7) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, - (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | - R300_PVS_SRC_OFFSET(7) | - R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | - R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); - FINISH_ACCEL(); } /* pre-load the RS instructions */ @@ -761,10 +552,10 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) OUT_ACCEL_REG(R300_SC_EDGERULE, 0xA5294A5); if (IS_R300_3D) { /* clip has offset 1440 */ - OUT_ACCEL_REG(R300_SC_CLIP_0_A, ((1440 << R300_CLIP_X_SHIFT) | - (1440 << R300_CLIP_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_CLIP_0_B, ((4080 << R300_CLIP_X_SHIFT) | - (4080 << R300_CLIP_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_CLIP_0_A, ((1088 << R300_CLIP_X_SHIFT) | + (1088 << R300_CLIP_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_CLIP_0_B, (((1080 + 2920) << R300_CLIP_X_SHIFT) | + ((1080 + 2920) << R300_CLIP_Y_SHIFT))); } else { OUT_ACCEL_REG(R300_SC_CLIP_0_A, ((0 << R300_CLIP_X_SHIFT) | (0 << R300_CLIP_Y_SHIFT))); @@ -774,7 +565,10 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA); OUT_ACCEL_REG(R300_SC_SCREENDOOR, 0xffffff); FINISH_ACCEL(); - } else if (IS_R200_3D) { + } else if ((info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280) || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_R200)) { BEGIN_ACCEL(6); if (info->ChipFamily == CHIP_FAMILY_RS300) { @@ -790,9 +584,10 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) R200_VAP_VF_MAX_VTX_NUM); FINISH_ACCEL(); - BEGIN_ACCEL(4); - OUT_ACCEL_REG(R200_RE_AUX_SCISSOR_CNTL, 0); - OUT_ACCEL_REG(R200_RE_CNTL, 0); + BEGIN_ACCEL(5); + OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0); + OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, 0x07ff07ff); + OUT_ACCEL_REG(RADEON_AUX_SC_CNTL, 0); OUT_ACCEL_REG(RADEON_RB3D_PLANEMASK, 0xffffffff); OUT_ACCEL_REG(RADEON_SE_CNTL, (RADEON_DIFFUSE_SHADE_GOURAUD | RADEON_BFACE_SOLID | @@ -809,13 +604,16 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) else OUT_ACCEL_REG(RADEON_SE_CNTL_STATUS, RADEON_TCL_BYPASS); OUT_ACCEL_REG(RADEON_SE_COORD_FMT, - RADEON_VTX_XY_PRE_MULT_1_OVER_W0 | - RADEON_VTX_ST0_PRE_MULT_1_OVER_W0 | - RADEON_VTX_ST1_PRE_MULT_1_OVER_W0 | - RADEON_TEX1_W_ROUTING_USE_W0); + RADEON_VTX_XY_PRE_MULT_1_OVER_W0 | + RADEON_VTX_ST0_NONPARAMETRIC | + RADEON_VTX_ST1_NONPARAMETRIC | + RADEON_TEX1_W_ROUTING_USE_W0); FINISH_ACCEL(); - BEGIN_ACCEL(2); + BEGIN_ACCEL(5); + OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0); + OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, 0x07ff07ff); + OUT_ACCEL_REG(RADEON_AUX_SC_CNTL, 0); OUT_ACCEL_REG(RADEON_RB3D_PLANEMASK, 0xffffffff); OUT_ACCEL_REG(RADEON_SE_CNTL, (RADEON_DIFFUSE_SHADE_GOURAUD | RADEON_BFACE_SOLID | @@ -830,106 +628,69 @@ static void FUNC_NAME(RADEONInit3DEngine)(ScrnInfoPtr pScrn) /* inserts a wait for vline in the command stream */ void FUNC_NAME(RADEONWaitForVLine)(ScrnInfoPtr pScrn, PixmapPtr pPix, - xf86CrtcPtr crtc, int start, int stop) + int crtc, int start, int stop) { RADEONInfoPtr info = RADEONPTR(pScrn); + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); uint32_t offset; ACCEL_PREAMBLE(); - if (!crtc) + if ((crtc < 0) || (crtc > 1)) return; if (stop < start) return; - if (!crtc->enabled) + if (!xf86_config->crtc[crtc]->enabled) return; - if (info->cs) { - if (pPix != pScrn->pScreen->GetScreenPixmap(pScrn->pScreen)) - return; - } else { #ifdef USE_EXA - if (info->useEXA) - offset = exaGetPixmapOffset(pPix); - else + if (info->useEXA) + offset = exaGetPixmapOffset(pPix); + else #endif - offset = pPix->devPrivate.ptr - info->FB; + offset = pPix->devPrivate.ptr - info->FB; - /* if drawing to front buffer */ - if (offset != 0) - return; - } + /* if drawing to front buffer */ + if (offset != 0) + return; start = max(start, 0); - stop = min(stop, crtc->mode.VDisplay); + stop = min(stop, xf86_config->crtc[crtc]->mode.VDisplay); - if (start > crtc->mode.VDisplay) + if (start > xf86_config->crtc[crtc]->mode.VDisplay) return; + BEGIN_ACCEL(2); + if (IS_AVIVO_VARIANT) { - /* on r5xx+ vline starts at viewport_y */ - start += crtc->y; - stop += crtc->y; - } + RADEONCrtcPrivatePtr radeon_crtc = xf86_config->crtc[crtc]->driver_private; -#if defined(ACCEL_CP) && defined(XF86DRM_MODE) - if (info->cs) { - drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; - - BEGIN_ACCEL(3); - if (IS_AVIVO_VARIANT) { - OUT_ACCEL_REG(AVIVO_D1MODE_VLINE_START_END, /* this is just a marker */ - ((start << AVIVO_D1MODE_VLINE_START_SHIFT) | - (stop << AVIVO_D1MODE_VLINE_END_SHIFT) | - AVIVO_D1MODE_VLINE_INV)); - } else { - OUT_ACCEL_REG(RADEON_CRTC_GUI_TRIG_VLINE, /* another placeholder */ + OUT_ACCEL_REG(AVIVO_D1MODE_VLINE_START_END + radeon_crtc->crtc_offset, + ((start << AVIVO_D1MODE_VLINE_START_SHIFT) | + (stop << AVIVO_D1MODE_VLINE_END_SHIFT) | + AVIVO_D1MODE_VLINE_INV)); + } else { + if (crtc == 0) + OUT_ACCEL_REG(RADEON_CRTC_GUI_TRIG_VLINE, ((start << RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT) | (stop << RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT) | - RADEON_CRTC_GUI_TRIG_VLINE_INV | - RADEON_CRTC_GUI_TRIG_VLINE_STALL)); - } + RADEON_CRTC_GUI_TRIG_VLINE_INV)); + else + OUT_ACCEL_REG(RADEON_CRTC2_GUI_TRIG_VLINE, + ((start << RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT) | + (stop << RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT) | + RADEON_CRTC_GUI_TRIG_VLINE_INV)); + } + + if (crtc == 0) OUT_ACCEL_REG(RADEON_WAIT_UNTIL, (RADEON_WAIT_CRTC_VLINE | RADEON_ENG_DISPLAY_SELECT_CRTC0)); + else + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, (RADEON_WAIT_CRTC_VLINE | + RADEON_ENG_DISPLAY_SELECT_CRTC1)); - OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_NOP, 0)); - OUT_RING(drmmode_crtc->mode_crtc->crtc_id); - FINISH_ACCEL(); - } else -#endif - { - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - - BEGIN_ACCEL(2); - if (IS_AVIVO_VARIANT) { - OUT_ACCEL_REG(AVIVO_D1MODE_VLINE_START_END + radeon_crtc->crtc_offset, - ((start << AVIVO_D1MODE_VLINE_START_SHIFT) | - (stop << AVIVO_D1MODE_VLINE_END_SHIFT) | - AVIVO_D1MODE_VLINE_INV)); - } else { - if (radeon_crtc->crtc_id == 0) - OUT_ACCEL_REG(RADEON_CRTC_GUI_TRIG_VLINE, - ((start << RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT) | - (stop << RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT) | - RADEON_CRTC_GUI_TRIG_VLINE_INV | - RADEON_CRTC_GUI_TRIG_VLINE_STALL)); - else - OUT_ACCEL_REG(RADEON_CRTC2_GUI_TRIG_VLINE, - ((start << RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT) | - (stop << RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT) | - RADEON_CRTC_GUI_TRIG_VLINE_INV | - RADEON_CRTC_GUI_TRIG_VLINE_STALL)); - } - - if (radeon_crtc->crtc_id == 0) - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, (RADEON_WAIT_CRTC_VLINE | - RADEON_ENG_DISPLAY_SELECT_CRTC0)); - else - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, (RADEON_WAIT_CRTC_VLINE | - RADEON_ENG_DISPLAY_SELECT_CRTC1)); - FINISH_ACCEL(); - } + FINISH_ACCEL(); } /* MMIO: diff --git a/driver/xf86-video-ati/src/radeon_crtc.c b/driver/xf86-video-ati/src/radeon_crtc.c index d0daa484a..2badca1ec 100644 --- a/driver/xf86-video-ati/src/radeon_crtc.c +++ b/driver/xf86-video-ati/src/radeon_crtc.c @@ -32,8 +32,6 @@ #include #include -#include -#include /* X and server generic header files */ #include "xf86.h" @@ -79,9 +77,6 @@ radeon_crtc_dpms(xf86CrtcPtr crtc, int mode) if ((mode == DPMSModeOn) && radeon_crtc->enabled) return; - if (mode == DPMSModeOff) - radeon_crtc_modeset_ioctl(crtc, FALSE); - if (IS_AVIVO_VARIANT || info->r4xx_atom) { atombios_crtc_dpms(crtc, mode); } else { @@ -102,11 +97,6 @@ radeon_crtc_dpms(xf86CrtcPtr crtc, int mode) } } - if (mode != DPMSModeOff) { - radeon_crtc_modeset_ioctl(crtc, TRUE); - radeon_crtc_load_lut(crtc); - } - if (mode == DPMSModeOn) radeon_crtc->enabled = TRUE; else @@ -125,6 +115,9 @@ radeon_crtc_mode_prepare(xf86CrtcPtr crtc) { RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; + if (radeon_crtc->initialized) + radeon_crtc_dpms(crtc, DPMSModeOff); + if (radeon_crtc->enabled) crtc->funcs->hide_cursor(crtc); } @@ -134,27 +127,21 @@ static uint32_t RADEONDiv(CARD64 n, uint32_t d) return (n + (d / 2)) / d; } -static void -RADEONComputePLL_old(RADEONPLLPtr pll, - unsigned long freq, - uint32_t *chosen_dot_clock_freq, - uint32_t *chosen_feedback_div, - uint32_t *chosen_frac_feedback_div, - uint32_t *chosen_reference_div, - uint32_t *chosen_post_div, - int flags) +void +RADEONComputePLL(RADEONPLLPtr pll, + unsigned long freq, + uint32_t *chosen_dot_clock_freq, + uint32_t *chosen_feedback_div, + uint32_t *chosen_reference_div, + uint32_t *chosen_post_div, + int flags) { uint32_t min_ref_div = pll->min_ref_div; uint32_t max_ref_div = pll->max_ref_div; - uint32_t min_post_div = pll->min_post_div; - uint32_t max_post_div = pll->max_post_div; - uint32_t min_fractional_feed_div = 0; - uint32_t max_fractional_feed_div = 0; uint32_t best_vco = pll->best_vco; uint32_t best_post_div = 1; uint32_t best_ref_div = 1; uint32_t best_feedback_div = 1; - uint32_t best_frac_feedback_div = 0; uint32_t best_freq = -1; uint32_t best_error = 0xffffffff; uint32_t best_vco_diff = 1; @@ -178,15 +165,7 @@ RADEONComputePLL_old(RADEONPLLPtr pll, } } - if (flags & RADEON_PLL_USE_POST_DIV) - min_post_div = max_post_div = pll->post_div; - - if (flags & RADEON_PLL_USE_FRAC_FB_DIV) { - min_fractional_feed_div = pll->min_frac_feedback_div; - max_fractional_feed_div = pll->max_frac_feedback_div; - } - - for (post_div = min_post_div; post_div <= max_post_div; ++post_div) { + for (post_div = pll->min_post_div; post_div <= pll->max_post_div; ++post_div) { uint32_t ref_div; if ((flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1)) @@ -203,7 +182,7 @@ RADEONComputePLL_old(RADEONPLLPtr pll, } for (ref_div = min_ref_div; ref_div <= max_ref_div; ++ref_div) { - uint32_t feedback_div, current_freq = 0, error, vco_diff; + uint32_t feedback_div, current_freq, error, vco_diff; uint32_t pll_in = pll->reference_freq / ref_div; uint32_t min_feed_div = pll->min_feedback_div; uint32_t max_feed_div = pll->max_feedback_div+1; @@ -213,15 +192,11 @@ RADEONComputePLL_old(RADEONPLLPtr pll, while (min_feed_div < max_feed_div) { uint32_t vco; - uint32_t min_frac_feed_div = min_fractional_feed_div; - uint32_t max_frac_feed_div = max_fractional_feed_div+1; - uint32_t frac_feedback_div; - CARD64 tmp; feedback_div = (min_feed_div+max_feed_div)/2; - tmp = (CARD64)pll->reference_freq * feedback_div; - vco = RADEONDiv(tmp, ref_div); + vco = RADEONDiv((CARD64)pll->reference_freq * feedback_div, + ref_div); if (vco < pll->pll_out_min) { min_feed_div = feedback_div+1; @@ -231,59 +206,45 @@ RADEONComputePLL_old(RADEONPLLPtr pll, continue; } - while (min_frac_feed_div < max_frac_feed_div) { - frac_feedback_div = (min_frac_feed_div+max_frac_feed_div)/2; - tmp = (CARD64)pll->reference_freq * 10000 * feedback_div; - tmp += (CARD64)pll->reference_freq * 1000 * frac_feedback_div; - current_freq = RADEONDiv(tmp, ref_div * post_div); + current_freq = RADEONDiv((CARD64)pll->reference_freq * 10000 * feedback_div, + ref_div * post_div); - if (flags & RADEON_PLL_PREFER_CLOSEST_LOWER) { - error = freq - current_freq; - error = (int32_t)error < 0 ? 0xffffffff : error; - } else - error = abs(current_freq - freq); - vco_diff = abs(vco - best_vco); + error = abs(current_freq - freq); + vco_diff = abs(vco - best_vco); - if ((best_vco == 0 && error < best_error) || - (best_vco != 0 && - (error < best_error - 100 || - (abs(error - best_error) < 100 && vco_diff < best_vco_diff )))) { + if ((best_vco == 0 && error < best_error) || + (best_vco != 0 && + (error < best_error - 100 || + (abs(error - best_error) < 100 && vco_diff < best_vco_diff )))) { + best_post_div = post_div; + best_ref_div = ref_div; + best_feedback_div = feedback_div; + best_freq = current_freq; + best_error = error; + best_vco_diff = vco_diff; + } else if (current_freq == freq) { + if (best_freq == -1) { + best_post_div = post_div; + best_ref_div = ref_div; + best_feedback_div = feedback_div; + best_freq = current_freq; + best_error = error; + best_vco_diff = vco_diff; + } else if (((flags & RADEON_PLL_PREFER_LOW_REF_DIV) && (ref_div < best_ref_div)) || + ((flags & RADEON_PLL_PREFER_HIGH_REF_DIV) && (ref_div > best_ref_div)) || + ((flags & RADEON_PLL_PREFER_LOW_FB_DIV) && (feedback_div < best_feedback_div)) || + ((flags & RADEON_PLL_PREFER_HIGH_FB_DIV) && (feedback_div > best_feedback_div)) || + ((flags & RADEON_PLL_PREFER_LOW_POST_DIV) && (post_div < best_post_div)) || + ((flags & RADEON_PLL_PREFER_HIGH_POST_DIV) && (post_div > best_post_div))) { best_post_div = post_div; best_ref_div = ref_div; best_feedback_div = feedback_div; - best_frac_feedback_div = frac_feedback_div; best_freq = current_freq; best_error = error; best_vco_diff = vco_diff; - } else if (current_freq == freq) { - if (best_freq == -1) { - best_post_div = post_div; - best_ref_div = ref_div; - best_feedback_div = feedback_div; - best_frac_feedback_div = frac_feedback_div; - best_freq = current_freq; - best_error = error; - best_vco_diff = vco_diff; - } else if (((flags & RADEON_PLL_PREFER_LOW_REF_DIV) && (ref_div < best_ref_div)) || - ((flags & RADEON_PLL_PREFER_HIGH_REF_DIV) && (ref_div > best_ref_div)) || - ((flags & RADEON_PLL_PREFER_LOW_FB_DIV) && (feedback_div < best_feedback_div)) || - ((flags & RADEON_PLL_PREFER_HIGH_FB_DIV) && (feedback_div > best_feedback_div)) || - ((flags & RADEON_PLL_PREFER_LOW_POST_DIV) && (post_div < best_post_div)) || - ((flags & RADEON_PLL_PREFER_HIGH_POST_DIV) && (post_div > best_post_div))) { - best_post_div = post_div; - best_ref_div = ref_div; - best_feedback_div = feedback_div; - best_frac_feedback_div = frac_feedback_div; - best_freq = current_freq; - best_error = error; - best_vco_diff = vco_diff; - } } - if (current_freq < freq) - min_frac_feed_div = frac_feedback_div+1; - else - max_frac_feed_div = frac_feedback_div; } + if (current_freq < freq) min_feed_div = feedback_div+1; else @@ -294,7 +255,6 @@ RADEONComputePLL_old(RADEONPLLPtr pll, ErrorF("best_freq: %u\n", (unsigned int)best_freq); ErrorF("best_feedback_div: %u\n", (unsigned int)best_feedback_div); - ErrorF("best_frac_feedback_div: %u\n", (unsigned int)best_frac_feedback_div); ErrorF("best_ref_div: %u\n", (unsigned int)best_ref_div); ErrorF("best_post_div: %u\n", (unsigned int)best_post_div); @@ -302,181 +262,11 @@ RADEONComputePLL_old(RADEONPLLPtr pll, FatalError("Couldn't find valid PLL dividers\n"); *chosen_dot_clock_freq = best_freq / 10000; *chosen_feedback_div = best_feedback_div; - *chosen_frac_feedback_div = best_frac_feedback_div; *chosen_reference_div = best_ref_div; *chosen_post_div = best_post_div; } -static Bool -calc_fb_div(RADEONPLLPtr pll, - unsigned long freq, - int flags, - int post_div, - int ref_div, - int *fb_div, - int *fb_div_frac) -{ - float ffreq = freq / 10; - float vco_freq = ffreq * post_div; - float feedback_divider = vco_freq * ref_div / pll->reference_freq; - - if (flags & RADEON_PLL_USE_FRAC_FB_DIV) { - feedback_divider = floor((feedback_divider * 10.0) + 0.5) * 0.1; - - *fb_div = floor(feedback_divider); - *fb_div_frac = fmod(feedback_divider, 1.0) * 10.0; - - } else { - *fb_div = floor(feedback_divider + 0.5); - *fb_div_frac = 0; - } - if ((*fb_div < pll->min_feedback_div) || (*fb_div > pll->max_feedback_div)) - return FALSE; - else - return TRUE; -} - -static Bool -calc_fb_ref_div(RADEONPLLPtr pll, - unsigned long freq, - int flags, - int post_div, - int *fb_div, - int *fb_div_frac, - int *ref_div) -{ - float ffreq = freq / 10; - float max_error = ffreq * 0.0025; - float vco, error, pll_out; - - for ((*ref_div) = pll->min_ref_div; (*ref_div) < pll->max_ref_div; ++(*ref_div)) { - if (calc_fb_div(pll, freq, flags, post_div, (*ref_div), fb_div, fb_div_frac)) { - vco = pll->reference_freq * ((*fb_div) + ((*fb_div_frac) * 0.1)) / (*ref_div); - - if ((vco < pll->pll_out_min) || (vco > pll->pll_out_max)) - continue; - - pll_out = vco / post_div; - - error = pll_out - ffreq; - if ((fabs(error) <= max_error) && (error >= 0)) - return TRUE; - } - } - return FALSE; -} - -static void -RADEONComputePLL_new(RADEONPLLPtr pll, - unsigned long freq, - uint32_t *chosen_dot_clock_freq, - uint32_t *chosen_feedback_div, - uint32_t *chosen_frac_feedback_div, - uint32_t *chosen_reference_div, - uint32_t *chosen_post_div, - int flags) -{ - float ffreq = freq / 10; - float vco_frequency; - int fb_div = 0, fb_div_frac = 0, post_div = 0, ref_div = 0; - uint32_t best_freq = 0; - - if (flags & RADEON_PLL_USE_POST_DIV) { - post_div = pll->post_div; - if ((post_div < pll->min_post_div) || (post_div > pll->max_post_div)) - goto done; - vco_frequency = ffreq * post_div; - if ((vco_frequency < pll->pll_out_min) || (vco_frequency > pll->pll_out_max)) - goto done; - - if (flags & RADEON_PLL_USE_REF_DIV) { - ref_div = pll->reference_div; - if ((ref_div < pll->min_ref_div) || (ref_div > pll->max_ref_div)) - goto done; - if (!calc_fb_div(pll, freq, flags, post_div, ref_div, &fb_div, &fb_div_frac)) - goto done; - } - } else { - for (post_div = pll->max_post_div; post_div >= pll->min_post_div; --post_div) { - if (flags & RADEON_PLL_LEGACY) { - if ((post_div == 5) || - (post_div == 7) || - (post_div == 9) || - (post_div == 10) || - (post_div == 11)) - continue; - } - if ((flags & RADEON_PLL_NO_ODD_POST_DIV) && (post_div & 1)) - continue; - - vco_frequency = ffreq * post_div; - if ((vco_frequency < pll->pll_out_min) || (vco_frequency > pll->pll_out_max)) - continue; - if (flags & RADEON_PLL_USE_REF_DIV) { - ref_div = pll->reference_div; - if ((ref_div < pll->min_ref_div) || (ref_div > pll->max_ref_div)) - goto done; - if (calc_fb_div(pll, freq, flags, post_div, ref_div, &fb_div, &fb_div_frac)) - break; - } else { - if (calc_fb_ref_div(pll, freq, flags, post_div, &fb_div, &fb_div_frac, &ref_div)) - break; - } - } - } - - best_freq = pll->reference_freq * 10 * fb_div; - best_freq += pll->reference_freq * fb_div_frac; - best_freq = best_freq / (ref_div * post_div); - - ErrorF("best_freq: %u\n", (unsigned int)best_freq); - ErrorF("best_feedback_div: %u\n", (unsigned int)fb_div); - ErrorF("best_frac_feedback_div: %u\n", (unsigned int)fb_div_frac); - ErrorF("best_ref_div: %u\n", (unsigned int)ref_div); - ErrorF("best_post_div: %u\n", (unsigned int)post_div); - -done: - if (best_freq == 0) - FatalError("Couldn't find valid PLL dividers\n"); - - *chosen_dot_clock_freq = best_freq; - *chosen_feedback_div = fb_div; - *chosen_frac_feedback_div = fb_div_frac; - *chosen_reference_div = ref_div; - *chosen_post_div = post_div; - -} - -void -RADEONComputePLL(xf86CrtcPtr crtc, - RADEONPLLPtr pll, - unsigned long freq, - uint32_t *chosen_dot_clock_freq, - uint32_t *chosen_feedback_div, - uint32_t *chosen_frac_feedback_div, - uint32_t *chosen_reference_div, - uint32_t *chosen_post_div, - int flags) -{ - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - - switch (radeon_crtc->pll_algo) { - case RADEON_PLL_OLD: - RADEONComputePLL_old(pll, freq, chosen_dot_clock_freq, - chosen_feedback_div, chosen_frac_feedback_div, - chosen_reference_div, chosen_post_div, flags); - break; - case RADEON_PLL_NEW: - /* disable frac fb dividers */ - flags &= ~RADEON_PLL_USE_FRAC_FB_DIV; - RADEONComputePLL_new(pll, freq, chosen_dot_clock_freq, - chosen_feedback_div, chosen_frac_feedback_div, - chosen_reference_div, chosen_post_div, flags); - break; - } -} - static void radeon_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode, int x, int y) @@ -497,6 +287,8 @@ radeon_crtc_mode_commit(xf86CrtcPtr crtc) { if (crtc->scrn->pScreen != NULL) xf86_reload_cursors(crtc->scrn->pScreen); + + radeon_crtc_dpms(crtc, DPMSModeOn); } void @@ -511,68 +303,63 @@ radeon_crtc_load_lut(xf86CrtcPtr crtc) if (!crtc->enabled) return; - if (IS_DCE4_VARIANT) { - OUTREG(EVERGREEN_DC_LUT_CONTROL + radeon_crtc->crtc_offset, 0); + if (IS_AVIVO_VARIANT) { + OUTREG(AVIVO_DC_LUTA_CONTROL + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_DC_LUT_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_DC_LUT_BLACK_OFFSET_GREEN + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_DC_LUT_BLACK_OFFSET_RED + radeon_crtc->crtc_offset, 0); + OUTREG(AVIVO_DC_LUTA_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0); + OUTREG(AVIVO_DC_LUTA_BLACK_OFFSET_GREEN + radeon_crtc->crtc_offset, 0); + OUTREG(AVIVO_DC_LUTA_BLACK_OFFSET_RED + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_DC_LUT_WHITE_OFFSET_BLUE + radeon_crtc->crtc_offset, 0x0000ffff); - OUTREG(EVERGREEN_DC_LUT_WHITE_OFFSET_GREEN + radeon_crtc->crtc_offset, 0x0000ffff); - OUTREG(EVERGREEN_DC_LUT_WHITE_OFFSET_RED + radeon_crtc->crtc_offset, 0x0000ffff); + OUTREG(AVIVO_DC_LUTA_WHITE_OFFSET_BLUE + radeon_crtc->crtc_offset, 0x0000ffff); + OUTREG(AVIVO_DC_LUTA_WHITE_OFFSET_GREEN + radeon_crtc->crtc_offset, 0x0000ffff); + OUTREG(AVIVO_DC_LUTA_WHITE_OFFSET_RED + radeon_crtc->crtc_offset, 0x0000ffff); + } - OUTREG(EVERGREEN_DC_LUT_RW_MODE + radeon_crtc->crtc_offset, 0); - OUTREG(EVERGREEN_DC_LUT_WRITE_EN_MASK + radeon_crtc->crtc_offset, 0x00000007); + PAL_SELECT(radeon_crtc->crtc_id); - for (i = 0; i < 256; i++) { - OUTREG(EVERGREEN_DC_LUT_RW_INDEX + radeon_crtc->crtc_offset, i); - OUTREG(EVERGREEN_DC_LUT_30_COLOR + radeon_crtc->crtc_offset, - (((radeon_crtc->lut_r[i]) << 20) | - ((radeon_crtc->lut_g[i]) << 10) | - (radeon_crtc->lut_b[i]))); - } - } else { - if (IS_AVIVO_VARIANT) { - OUTREG(AVIVO_DC_LUTA_CONTROL + radeon_crtc->crtc_offset, 0); + if (IS_AVIVO_VARIANT) { + OUTREG(AVIVO_DC_LUT_RW_MODE, 0); + OUTREG(AVIVO_DC_LUT_WRITE_EN_MASK, 0x0000003f); + } - OUTREG(AVIVO_DC_LUTA_BLACK_OFFSET_BLUE + radeon_crtc->crtc_offset, 0); - OUTREG(AVIVO_DC_LUTA_BLACK_OFFSET_GREEN + radeon_crtc->crtc_offset, 0); - OUTREG(AVIVO_DC_LUTA_BLACK_OFFSET_RED + radeon_crtc->crtc_offset, 0); + for (i = 0; i < 256; i++) { + OUTPAL(i, radeon_crtc->lut_r[i], radeon_crtc->lut_g[i], radeon_crtc->lut_b[i]); + } - OUTREG(AVIVO_DC_LUTA_WHITE_OFFSET_BLUE + radeon_crtc->crtc_offset, 0x0000ffff); - OUTREG(AVIVO_DC_LUTA_WHITE_OFFSET_GREEN + radeon_crtc->crtc_offset, 0x0000ffff); - OUTREG(AVIVO_DC_LUTA_WHITE_OFFSET_RED + radeon_crtc->crtc_offset, 0x0000ffff); - } - - PAL_SELECT(radeon_crtc->crtc_id); - - if (IS_AVIVO_VARIANT) { - OUTREG(AVIVO_DC_LUT_RW_MODE, 0); - OUTREG(AVIVO_DC_LUT_WRITE_EN_MASK, 0x0000003f); - } - - for (i = 0; i < 256; i++) { - OUTPAL(i, radeon_crtc->lut_r[i], radeon_crtc->lut_g[i], radeon_crtc->lut_b[i]); - } - - if (IS_AVIVO_VARIANT) - OUTREG(AVIVO_D1GRPH_LUT_SEL + radeon_crtc->crtc_offset, radeon_crtc->crtc_id); + if (IS_AVIVO_VARIANT) { + OUTREG(AVIVO_D1GRPH_LUT_SEL + radeon_crtc->crtc_offset, radeon_crtc->crtc_id); } } + static void radeon_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t *green, uint16_t *blue, int size) { RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - int i; + ScrnInfoPtr pScrn = crtc->scrn; + int i, j; - for (i = 0; i < 256; i++) { - radeon_crtc->lut_r[i] = red[i] >> 6; - radeon_crtc->lut_g[i] = green[i] >> 6; - radeon_crtc->lut_b[i] = blue[i] >> 6; + if (pScrn->depth == 16) { + for (i = 0; i < 64; i++) { + if (i <= 31) { + for (j = 0; j < 8; j++) { + radeon_crtc->lut_r[i * 8 + j] = red[i] >> 6; + radeon_crtc->lut_b[i * 8 + j] = blue[i] >> 6; + } + } + + for (j = 0; j < 4; j++) { + radeon_crtc->lut_g[i * 4 + j] = green[i] >> 6; + } + } + } else { + for (i = 0; i < 256; i++) { + radeon_crtc->lut_r[i] = red[i] >> 6; + radeon_crtc->lut_g[i] = green[i] >> 6; + radeon_crtc->lut_b[i] = blue[i] >> 6; + } } radeon_crtc_load_lut(crtc); @@ -626,7 +413,7 @@ radeon_crtc_shadow_allocate (xf86CrtcPtr crtc, int width, int height) RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; unsigned long rotate_pitch; unsigned long rotate_offset; - int size; + int align = 4096, size; int cpp = pScrn->bitsPerPixel / 8; /* No rotation without accel */ @@ -645,8 +432,7 @@ radeon_crtc_shadow_allocate (xf86CrtcPtr crtc, int width, int height) * setter for offscreen area locking in EXA currently. So, we just * allocate offscreen memory and fake up a pixmap header for it. */ - rotate_offset = radeon_legacy_allocate_memory(pScrn, &radeon_crtc->crtc_rotate_mem, - size, RADEON_GPU_PAGE_SIZE, RADEON_GEM_DOMAIN_VRAM); + rotate_offset = radeon_legacy_allocate_memory(pScrn, &radeon_crtc->crtc_rotate_mem, size, align); if (rotate_offset == 0) return NULL; @@ -726,14 +512,7 @@ radeon_crtc_set_origin(xf86CrtcPtr crtc, int x, int y) RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - - if (IS_DCE4_VARIANT) { - x &= ~3; - y &= ~1; - atombios_lock_crtc(info->atomBIOS, radeon_crtc->crtc_id, 1); - OUTREG(EVERGREEN_VIEWPORT_START + radeon_crtc->crtc_offset, (x << 16) | y); - atombios_lock_crtc(info->atomBIOS, radeon_crtc->crtc_id, 0); - } else if (IS_AVIVO_VARIANT) { + if (IS_AVIVO_VARIANT) { x &= ~3; y &= ~1; atombios_lock_crtc(info->atomBIOS, radeon_crtc->crtc_id, 1); @@ -791,10 +570,6 @@ RADEONInitDispBandwidth(ScrnInfoPtr pScrn) int pixel_bytes1 = info->CurrentLayout.pixel_bytes; int pixel_bytes2 = info->CurrentLayout.pixel_bytes; - /* XXX fix me */ - if (IS_DCE4_VARIANT) - return; - if (xf86_config->num_crtc == 2) { if (xf86_config->crtc[1]->enabled && xf86_config->crtc[0]->enabled) { @@ -827,7 +602,6 @@ Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask) { RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); RADEONInfoPtr info = RADEONPTR(pScrn); - int i; if (!xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, FALSE)) { radeon_crtc_funcs.shadow_create = radeon_crtc_shadow_create; @@ -855,7 +629,6 @@ Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask) pRADEONEnt->Controller[0]->can_tile = 1; else pRADEONEnt->Controller[0]->can_tile = 0; - pRADEONEnt->Controller[0]->pll_id = -1; } if (mask & 2) { @@ -869,67 +642,18 @@ Bool RADEONAllocateControllers(ScrnInfoPtr pScrn, int mask) pRADEONEnt->Controller[1] = xnfcalloc(sizeof(RADEONCrtcPrivateRec), 1); if (!pRADEONEnt->Controller[1]) { - free(pRADEONEnt->Controller[0]); + xfree(pRADEONEnt->Controller[0]); return FALSE; } pRADEONEnt->pCrtc[1]->driver_private = pRADEONEnt->Controller[1]; pRADEONEnt->Controller[1]->crtc_id = 1; - if (IS_DCE4_VARIANT) - pRADEONEnt->Controller[1]->crtc_offset = EVERGREEN_CRTC1_REGISTER_OFFSET; - else - pRADEONEnt->Controller[1]->crtc_offset = AVIVO_D2CRTC_H_TOTAL - AVIVO_D1CRTC_H_TOTAL; + pRADEONEnt->Controller[1]->crtc_offset = AVIVO_D2CRTC_H_TOTAL - AVIVO_D1CRTC_H_TOTAL; pRADEONEnt->Controller[1]->initialized = FALSE; if (info->allowColorTiling) pRADEONEnt->Controller[1]->can_tile = 1; else pRADEONEnt->Controller[1]->can_tile = 0; - pRADEONEnt->Controller[1]->pll_id = -1; - } - - /* 6 crtcs on DCE4 chips */ - if (IS_DCE4_VARIANT && ((mask & 3) == 3) && !IS_DCE41_VARIANT) { - for (i = 2; i < RADEON_MAX_CRTC; i++) { - pRADEONEnt->pCrtc[i] = xf86CrtcCreate(pScrn, &radeon_crtc_funcs); - if (!pRADEONEnt->pCrtc[i]) - return FALSE; - - pRADEONEnt->Controller[i] = xnfcalloc(sizeof(RADEONCrtcPrivateRec), 1); - if (!pRADEONEnt->Controller[i]) - { - free(pRADEONEnt->Controller[i]); - return FALSE; - } - - pRADEONEnt->pCrtc[i]->driver_private = pRADEONEnt->Controller[i]; - pRADEONEnt->Controller[i]->crtc_id = i; - switch (i) { - case 0: - pRADEONEnt->Controller[i]->crtc_offset = EVERGREEN_CRTC0_REGISTER_OFFSET; - break; - case 1: - pRADEONEnt->Controller[i]->crtc_offset = EVERGREEN_CRTC1_REGISTER_OFFSET; - break; - case 2: - pRADEONEnt->Controller[i]->crtc_offset = EVERGREEN_CRTC2_REGISTER_OFFSET; - break; - case 3: - pRADEONEnt->Controller[i]->crtc_offset = EVERGREEN_CRTC3_REGISTER_OFFSET; - break; - case 4: - pRADEONEnt->Controller[i]->crtc_offset = EVERGREEN_CRTC4_REGISTER_OFFSET; - break; - case 5: - pRADEONEnt->Controller[i]->crtc_offset = EVERGREEN_CRTC5_REGISTER_OFFSET; - break; - } - pRADEONEnt->Controller[i]->initialized = FALSE; - if (info->allowColorTiling) - pRADEONEnt->Controller[i]->can_tile = 1; - else - pRADEONEnt->Controller[i]->can_tile = 0; - pRADEONEnt->Controller[i]->pll_id = -1; - } } return TRUE; diff --git a/driver/xf86-video-ati/src/radeon_cursor.c b/driver/xf86-video-ati/src/radeon_cursor.c index 6c2b9e8ac..0fcdcf04d 100644 --- a/driver/xf86-video-ati/src/radeon_cursor.c +++ b/driver/xf86-video-ati/src/radeon_cursor.c @@ -73,17 +73,14 @@ #define CURSOR_SWAPPING_DECL_MMIO unsigned char *RADEONMMIO = info->MMIO; #define CURSOR_SWAPPING_START() \ do { \ - if (info->ChipFamily < CHIP_FAMILY_R600) \ OUTREG(RADEON_SURFACE_CNTL, \ (info->ModeReg->surface_cntl | \ RADEON_NONSURF_AP0_SWP_32BPP | RADEON_NONSURF_AP1_SWP_32BPP) & \ ~(RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP1_SWP_16BPP)); \ } while (0) -#define CURSOR_SWAPPING_END() \ - do { \ - if (info->ChipFamily < CHIP_FAMILY_R600) \ - OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); \ - } while (0) +#define CURSOR_SWAPPING_END() (OUTREG(RADEON_SURFACE_CNTL, \ + info->ModeReg->surface_cntl)) + #else #define CURSOR_SWAPPING_DECL_MMIO @@ -100,21 +97,13 @@ avivo_setup_cursor(xf86CrtcPtr crtc, Bool enable) RADEONInfoPtr info = RADEONPTR(crtc->scrn); unsigned char *RADEONMMIO = info->MMIO; - /* always use the same cursor mode even if the cursor is disabled, - * otherwise you may end up with cursor curruption bands - */ - OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset, (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT)); + OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset, 0); if (enable) { - uint64_t location = info->fbLocation + radeon_crtc->cursor_offset + pScrn->fbOffset; - if (info->ChipFamily >= CHIP_FAMILY_RV770) { - if (radeon_crtc->crtc_id) - OUTREG(R700_D2CUR_SURFACE_ADDRESS_HIGH, (location >> 32) & 0xf); - else - OUTREG(R700_D1CUR_SURFACE_ADDRESS_HIGH, (location >> 32) & 0xf); - } OUTREG(AVIVO_D1CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, info->fbLocation + radeon_crtc->cursor_offset + pScrn->fbOffset); + OUTREG(AVIVO_D1CUR_SIZE + radeon_crtc->crtc_offset, + ((CURSOR_WIDTH - 1) << 16) | (CURSOR_HEIGHT - 1)); OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset, AVIVO_D1CURSOR_EN | (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT)); } @@ -138,49 +127,6 @@ avivo_lock_cursor(xf86CrtcPtr crtc, Bool lock) OUTREG(AVIVO_D1CUR_UPDATE + radeon_crtc->crtc_offset, tmp); } -static void -evergreen_setup_cursor(xf86CrtcPtr crtc, Bool enable) -{ - ScrnInfoPtr pScrn = crtc->scrn; - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(crtc->scrn); - unsigned char *RADEONMMIO = info->MMIO; - - /* always use the same cursor mode even if the cursor is disabled, - * otherwise you may end up with cursor curruption bands - */ - OUTREG(EVERGREEN_CUR_CONTROL + radeon_crtc->crtc_offset, - EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT)); - - if (enable) { - uint64_t location = info->fbLocation + radeon_crtc->cursor_offset + pScrn->fbOffset; - OUTREG(EVERGREEN_CUR_SURFACE_ADDRESS_HIGH + radeon_crtc->crtc_offset, - (location >> 32) & 0xf); - OUTREG(EVERGREEN_CUR_SURFACE_ADDRESS + radeon_crtc->crtc_offset, - location & EVERGREEN_CUR_SURFACE_ADDRESS_MASK); - OUTREG(EVERGREEN_CUR_CONTROL + radeon_crtc->crtc_offset, - EVERGREEN_CURSOR_EN | EVERGREEN_CURSOR_MODE(EVERGREEN_CURSOR_24_8_PRE_MULT)); - } -} - -static void -evergreen_lock_cursor(xf86CrtcPtr crtc, Bool lock) -{ - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - RADEONInfoPtr info = RADEONPTR(crtc->scrn); - unsigned char *RADEONMMIO = info->MMIO; - uint32_t tmp; - - tmp = INREG(EVERGREEN_CUR_UPDATE + radeon_crtc->crtc_offset); - - if (lock) - tmp |= EVERGREEN_CURSOR_UPDATE_LOCK; - else - tmp &= ~EVERGREEN_CURSOR_UPDATE_LOCK; - - OUTREG(EVERGREEN_CUR_UPDATE + radeon_crtc->crtc_offset, tmp); -} - void radeon_crtc_show_cursor (xf86CrtcPtr crtc) { @@ -190,12 +136,11 @@ radeon_crtc_show_cursor (xf86CrtcPtr crtc) RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - if (IS_DCE4_VARIANT) { - evergreen_lock_cursor(crtc, TRUE); - evergreen_setup_cursor(crtc, TRUE); - evergreen_lock_cursor(crtc, FALSE); - } else if (IS_AVIVO_VARIANT) { + if (IS_AVIVO_VARIANT) { avivo_lock_cursor(crtc, TRUE); + OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset, + INREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset) + | AVIVO_D1CURSOR_EN); avivo_setup_cursor(crtc, TRUE); avivo_lock_cursor(crtc, FALSE); } else { @@ -210,7 +155,7 @@ radeon_crtc_show_cursor (xf86CrtcPtr crtc) return; } - OUTREGP(RADEON_MM_DATA, RADEON_CRTC_CUR_EN | 2 << 20, + OUTREGP(RADEON_MM_DATA, RADEON_CRTC_CUR_EN | 2 << 20, ~(RADEON_CRTC_CUR_EN | RADEON_CRTC_CUR_MODE_MASK)); } } @@ -224,12 +169,11 @@ radeon_crtc_hide_cursor (xf86CrtcPtr crtc) RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - if (IS_DCE4_VARIANT) { - evergreen_lock_cursor(crtc, TRUE); - evergreen_setup_cursor(crtc, FALSE); - evergreen_lock_cursor(crtc, FALSE); - } else if (IS_AVIVO_VARIANT) { + if (IS_AVIVO_VARIANT) { avivo_lock_cursor(crtc, TRUE); + OUTREG(AVIVO_D1CUR_CONTROL+ radeon_crtc->crtc_offset, + INREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset) + & ~(AVIVO_D1CURSOR_EN)); avivo_setup_cursor(crtc, FALSE); avivo_lock_cursor(crtc, FALSE); } else { @@ -252,7 +196,6 @@ void radeon_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) { ScrnInfoPtr pScrn = crtc->scrn; - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; int crtc_id = radeon_crtc->crtc_id; RADEONInfoPtr info = RADEONPTR(pScrn); @@ -260,7 +203,6 @@ radeon_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) int xorigin = 0, yorigin = 0; int stride = 256; DisplayModePtr mode = &crtc->mode; - int w = CURSOR_WIDTH; if (x < 0) xorigin = -x+1; if (y < 0) yorigin = -y+1; @@ -273,41 +215,10 @@ radeon_crtc_set_cursor_position (xf86CrtcPtr crtc, int x, int y) x += crtc->x; y += crtc->y; } - - if (pRADEONEnt->Controller[0]->enabled && - pRADEONEnt->Controller[1]->enabled) { - int cursor_end, frame_end; - - cursor_end = x - xorigin + w; - frame_end = crtc->x + mode->CrtcHDisplay; - - if (cursor_end >= frame_end) { - w = w - (cursor_end - frame_end); - if (!(frame_end & 0x7f)) - w--; - } else { - if (!(cursor_end & 0x7f)) - w--; - } - if (w <= 0) - w = 1; - } - } - - if (IS_DCE4_VARIANT) { - evergreen_lock_cursor(crtc, TRUE); - OUTREG(EVERGREEN_CUR_POSITION + radeon_crtc->crtc_offset, ((xorigin ? 0 : x) << 16) - | (yorigin ? 0 : y)); - OUTREG(EVERGREEN_CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin); - OUTREG(EVERGREEN_CUR_SIZE + radeon_crtc->crtc_offset, - ((w - 1) << 16) | (CURSOR_HEIGHT - 1)); - evergreen_lock_cursor(crtc, FALSE); - } else if (IS_AVIVO_VARIANT) { avivo_lock_cursor(crtc, TRUE); OUTREG(AVIVO_D1CUR_POSITION + radeon_crtc->crtc_offset, ((xorigin ? 0 : x) << 16) | (yorigin ? 0 : y)); OUTREG(AVIVO_D1CUR_HOT_SPOT + radeon_crtc->crtc_offset, (xorigin << 16) | yorigin); - OUTREG(AVIVO_D1CUR_SIZE + radeon_crtc->crtc_offset, ((w - 1) << 16) | (CURSOR_HEIGHT - 1)); avivo_lock_cursor(crtc, FALSE); } else { if (mode->Flags & V_DBLSCAN) @@ -345,7 +256,7 @@ radeon_crtc_set_cursor_colors (xf86CrtcPtr crtc, int bg, int fg) ScrnInfoPtr pScrn = crtc->scrn; RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t *pixels = (uint32_t *)(pointer)(info->FB + pScrn->fbOffset + radeon_crtc->cursor_offset); + uint32_t *pixels = (uint32_t *)(pointer)(info->FB + radeon_crtc->cursor_offset); int pixel, i; CURSOR_SWAPPING_DECL_MMIO @@ -388,7 +299,7 @@ radeon_crtc_load_cursor_argb (xf86CrtcPtr crtc, CARD32 *image) RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; RADEONInfoPtr info = RADEONPTR(pScrn); CURSOR_SWAPPING_DECL_MMIO - uint32_t *d = (uint32_t *)(pointer)(info->FB + pScrn->fbOffset + radeon_crtc->cursor_offset); + uint32_t *d = (uint32_t *)(pointer)(info->FB + radeon_crtc->cursor_offset); RADEONCTRACE(("RADEONLoadCursorARGB\n")); @@ -409,21 +320,26 @@ Bool RADEONCursorInit(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int width; + int width_bytes; + int height; + int size_bytes; int c; - for (c = 0; c < xf86_config->num_crtc; c++) { - xf86CrtcPtr crtc = xf86_config->crtc[c]; - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; + size_bytes = CURSOR_WIDTH * 4 * CURSOR_HEIGHT; + width = pScrn->displayWidth; + width_bytes = width * (pScrn->bitsPerPixel / 8); + height = ((size_bytes * xf86_config->num_crtc) + width_bytes - 1) / width_bytes; + int align = IS_AVIVO_VARIANT ? 4096 : 256; - if (!info->useEXA) { - int size_bytes = CURSOR_WIDTH * 4 * CURSOR_HEIGHT; - int align = IS_AVIVO_VARIANT ? 4096 : 256; + if (!info->useEXA) { + for (c = 0; c < xf86_config->num_crtc; c++) { + xf86CrtcPtr crtc = xf86_config->crtc[c]; + RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; radeon_crtc->cursor_offset = - radeon_legacy_allocate_memory(pScrn, &radeon_crtc->cursor_mem, - size_bytes, align, RADEON_GEM_DOMAIN_VRAM); + radeon_legacy_allocate_memory(pScrn, &radeon_crtc->cursor_mem, size_bytes, align); if (radeon_crtc->cursor_offset == 0) return FALSE; @@ -434,11 +350,6 @@ Bool RADEONCursorInit(ScreenPtr pScreen) c, (unsigned int)radeon_crtc->cursor_offset); } - /* set the cursor mode the same on both crtcs to avoid corruption */ - /* XXX check if this is needed on evergreen */ - if (IS_AVIVO_VARIANT) - OUTREG(AVIVO_D1CUR_CONTROL + radeon_crtc->crtc_offset, - (AVIVO_D1CURSOR_MODE_24BPP << AVIVO_D1CURSOR_MODE_SHIFT)); } return xf86_cursors_init (pScreen, CURSOR_WIDTH, CURSOR_HEIGHT, diff --git a/driver/xf86-video-ati/src/radeon_dga.c b/driver/xf86-video-ati/src/radeon_dga.c new file mode 100644 index 000000000..6b0fabea9 --- /dev/null +++ b/driver/xf86-video-ati/src/radeon_dga.c @@ -0,0 +1,466 @@ +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and + * VA Linux Systems Inc., Fremont, California. + * + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* + * Authors: + * Kevin E. Martin + * + * Credits: + * + * Thanks to Ove Kåven for writing the Rage 128 + * DGA support. Portions of this file are based on the initialization + * code for that driver. + * + */ + +#include + + /* Driver data structures */ +#include "radeon.h" +#include "radeon_probe.h" +#ifdef XF86DRI +#include "radeon_drm.h" +#endif + + /* X and server generic header files */ +#include "xf86.h" + + /* DGA support */ +#include "dgaproc.h" + + +static Bool RADEON_OpenFramebuffer(ScrnInfoPtr, char **, unsigned char **, + int *, int *, int *); +static Bool RADEON_SetMode(ScrnInfoPtr, DGAModePtr); +static int RADEON_GetViewport(ScrnInfoPtr); +static void RADEON_SetViewport(ScrnInfoPtr, int, int, int); +#ifdef USE_XAA +static void RADEON_FillRect(ScrnInfoPtr, int, int, int, int, unsigned long); +static void RADEON_BlitRect(ScrnInfoPtr, int, int, int, int, int, int); +static void RADEON_BlitTransRect(ScrnInfoPtr, int, int, int, int, int, int, + unsigned long); +#endif + +static DGAModePtr RADEONSetupDGAMode(ScrnInfoPtr pScrn, + DGAModePtr modes, + int *num, + int bitsPerPixel, + int depth, + Bool pixmap, + int secondPitch, + unsigned long red, + unsigned long green, + unsigned long blue, + short visualClass) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + DGAModePtr newmodes = NULL; + DGAModePtr currentMode; + DisplayModePtr pMode; + DisplayModePtr firstMode; + unsigned int size; + int pitch; + int Bpp = bitsPerPixel >> 3; + +SECOND_PASS: + + pMode = firstMode = pScrn->modes; + + while (1) { + pitch = pScrn->displayWidth; + size = pitch * Bpp * pMode->VDisplay; + + if ((!secondPitch || (pitch != secondPitch)) && + (size <= info->FbMapSize)) { + + if (secondPitch) + pitch = secondPitch; + + if (!(newmodes = xrealloc(modes, (*num + 1) * sizeof(DGAModeRec)))) + break; + + modes = newmodes; + currentMode = modes + *num; + + currentMode->mode = pMode; + currentMode->flags = DGA_CONCURRENT_ACCESS; + + if (pixmap) + currentMode->flags |= DGA_PIXMAP_AVAILABLE; + +#ifdef USE_EXA + if (info->useEXA) { + /* We need to fill in RADEON_FillRect and RADEON_BlitRect and + * connect them in RADEONDGAInit before turning these on. + */ + /*if (info->exa.accel.PrepareSolid && info->exa.accel.Solid) + currentMode->flags |= DGA_FILL_RECT; + if (info->exa.accel.PrepareCopy && info->exa.accel.Copy) + currentMode->flags |= DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS;*/ + } +#endif /* USE_EXA */ +#ifdef USE_XAA + if (!info->useEXA && info->accel_state->accel) { + if (info->accel_state->accel->SetupForSolidFill && + info->accel_state->accel->SubsequentSolidFillRect) + currentMode->flags |= DGA_FILL_RECT; + if (info->accel_state->accel->SetupForScreenToScreenCopy && + info->accel_state->accel->SubsequentScreenToScreenCopy) + currentMode->flags |= DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS; + if (currentMode->flags & + (DGA_PIXMAP_AVAILABLE | DGA_FILL_RECT | + DGA_BLIT_RECT | DGA_BLIT_RECT_TRANS)) + currentMode->flags &= ~DGA_CONCURRENT_ACCESS; + } +#endif /* USE_XAA */ + + if (pMode->Flags & V_DBLSCAN) + currentMode->flags |= DGA_DOUBLESCAN; + if (pMode->Flags & V_INTERLACE) + currentMode->flags |= DGA_INTERLACED; + + currentMode->byteOrder = pScrn->imageByteOrder; + currentMode->depth = depth; + currentMode->bitsPerPixel = bitsPerPixel; + currentMode->red_mask = red; + currentMode->green_mask = green; + currentMode->blue_mask = blue; + currentMode->visualClass = visualClass; + currentMode->viewportWidth = pMode->HDisplay; + currentMode->viewportHeight = pMode->VDisplay; + currentMode->xViewportStep = 8; + currentMode->yViewportStep = 1; + currentMode->viewportFlags = DGA_FLIP_RETRACE; + currentMode->offset = 0; + currentMode->address = (unsigned char*)info->LinearAddr; + currentMode->bytesPerScanline = pitch * Bpp; + currentMode->imageWidth = pitch; + currentMode->imageHeight = (info->FbMapSize + / currentMode->bytesPerScanline); + currentMode->pixmapWidth = currentMode->imageWidth; + currentMode->pixmapHeight = currentMode->imageHeight; + currentMode->maxViewportX = (currentMode->imageWidth + - currentMode->viewportWidth); + /* this might need to get clamped to some maximum */ + currentMode->maxViewportY = (currentMode->imageHeight + - currentMode->viewportHeight); + (*num)++; + } + + pMode = pMode->next; + if (pMode == firstMode) + break; + } + + if (secondPitch) { + secondPitch = 0; + goto SECOND_PASS; + } + + return modes; +} + +Bool RADEONDGAInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + DGAModePtr modes = NULL; + int num = 0; + + /* 8 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 8, 8, + (pScrn->bitsPerPixel == 8), + ((pScrn->bitsPerPixel != 8) + ? 0 : pScrn->displayWidth), + 0, 0, 0, PseudoColor); + + /* 15 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 15, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 15) + ? 0 : pScrn->displayWidth), + 0x7c00, 0x03e0, 0x001f, TrueColor); + + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 15, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 15) + ? 0 : pScrn->displayWidth), + 0x7c00, 0x03e0, 0x001f, DirectColor); + + /* 16 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 16, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 16) + ? 0 : pScrn->displayWidth), + 0xf800, 0x07e0, 0x001f, TrueColor); + + modes = RADEONSetupDGAMode(pScrn, modes, &num, 16, 16, + (pScrn->bitsPerPixel == 16), + ((pScrn->depth != 16) + ? 0 : pScrn->displayWidth), + 0xf800, 0x07e0, 0x001f, DirectColor); + + /* 32 */ + modes = RADEONSetupDGAMode(pScrn, modes, &num, 32, 24, + (pScrn->bitsPerPixel == 32), + ((pScrn->bitsPerPixel != 32) + ? 0 : pScrn->displayWidth), + 0xff0000, 0x00ff00, 0x0000ff, TrueColor); + + modes = RADEONSetupDGAMode(pScrn, modes, &num, 32, 24, + (pScrn->bitsPerPixel == 32), + ((pScrn->bitsPerPixel != 32) + ? 0 : pScrn->displayWidth), + 0xff0000, 0x00ff00, 0x0000ff, DirectColor); + + info->numDGAModes = num; + info->DGAModes = modes; + + info->DGAFuncs.OpenFramebuffer = RADEON_OpenFramebuffer; + info->DGAFuncs.CloseFramebuffer = NULL; + info->DGAFuncs.SetMode = RADEON_SetMode; + info->DGAFuncs.SetViewport = RADEON_SetViewport; + info->DGAFuncs.GetViewport = RADEON_GetViewport; + + info->DGAFuncs.Sync = NULL; + info->DGAFuncs.FillRect = NULL; + info->DGAFuncs.BlitRect = NULL; + info->DGAFuncs.BlitTransRect = NULL; + +#ifdef USE_EXA + /*info->DGAFuncs.Sync = info->exa.accel->Sync;*/ + if (info->useEXA) { + /*if (info->exa.accel.PrepareSolid && info->exa.accel.Solid) { + info->DGAFuncs.FillRect = RADEON_FillRect; + } + if (info->exa.accel.PrepareCopy && info->exa.accel.Copy) { + info->DGAFuncs.BlitRect = RADEON_BlitRect; + }*/ + } +#endif /* USE_EXA */ +#ifdef USE_XAA + if (!info->useEXA && info->accel_state->accel) { + info->DGAFuncs.Sync = info->accel_state->accel->Sync; + if (info->accel_state->accel->SetupForSolidFill && + info->accel_state->accel->SubsequentSolidFillRect) + info->DGAFuncs.FillRect = RADEON_FillRect; + if (info->accel_state->accel->SetupForScreenToScreenCopy && + info->accel_state->accel->SubsequentScreenToScreenCopy) { + info->DGAFuncs.BlitRect = RADEON_BlitRect; + info->DGAFuncs.BlitTransRect = RADEON_BlitTransRect; + } + } +#endif /* USE_XAA */ + + return DGAInit(pScreen, &info->DGAFuncs, modes, num); +} + +static Bool RADEON_SetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) +{ + static RADEONFBLayout SavedLayouts[MAXSCREENS]; + int indx = pScrn->pScreen->myNum; + RADEONInfoPtr info = RADEONPTR(pScrn); + + if (!pMode) { /* restore the original mode */ + /* put the ScreenParameters back */ + if (info->DGAactive) + memcpy(&info->CurrentLayout, &SavedLayouts[indx], + sizeof(RADEONFBLayout)); + + pScrn->currentMode = info->CurrentLayout.mode; + + RADEONSwitchMode(indx, pScrn->currentMode, 0); +#ifdef XF86DRI + if (info->directRenderingEnabled) { + RADEONCP_STOP(pScrn, info); + } +#endif + if (info->accelOn) + RADEONEngineInit(pScrn); +#ifdef XF86DRI + if (info->directRenderingEnabled) { + RADEONCP_START(pScrn, info); + } +#endif + RADEONAdjustFrame(indx, 0, 0, 0); + info->DGAactive = FALSE; + } else { + if (!info->DGAactive) { /* save the old parameters */ + memcpy(&SavedLayouts[indx], &info->CurrentLayout, + sizeof(RADEONFBLayout)); + info->DGAactive = TRUE; + } + + info->CurrentLayout.bitsPerPixel = pMode->bitsPerPixel; + info->CurrentLayout.depth = pMode->depth; + info->CurrentLayout.displayWidth = (pMode->bytesPerScanline / + (pMode->bitsPerPixel >> 3)); + info->CurrentLayout.pixel_bytes = pMode->bitsPerPixel / 8; + info->CurrentLayout.pixel_code = (pMode->bitsPerPixel != 16 + ? pMode->bitsPerPixel + : pMode->depth); + /* RADEONModeInit() will set the mode field */ + + RADEONSwitchMode(indx, pMode->mode, 0); + +#ifdef XF86DRI + if (info->directRenderingEnabled) { + RADEONCP_STOP(pScrn, info); + } +#endif + if (info->accelOn) + RADEONEngineInit(pScrn); +#ifdef XF86DRI + if (info->directRenderingEnabled) { + RADEONCP_START(pScrn, info); + } +#endif + } + + return TRUE; +} + +static int RADEON_GetViewport(ScrnInfoPtr pScrn) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + return info->DGAViewportStatus; +} + +static void RADEON_SetViewport(ScrnInfoPtr pScrn, int x, int y, int flags) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + RADEONAdjustFrame(pScrn->pScreen->myNum, x, y, flags); + info->DGAViewportStatus = 0; /* FIXME */ +} + + +#ifdef USE_XAA + +static void RADEON_FillRect(ScrnInfoPtr pScrn, + int x, int y, int w, int h, + unsigned long color) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + +#ifdef USE_EXA + /* XXX */ + if (info->useEXA) { + /* + info->exa.accel.PrepareSolid(pScrn, color, GXcopy, (uint32_t)(~0)); + info->exa.accel.Solid(pScrn, x, y, x+w, y+h); + info->exa.accel.DoneSolid(); + */ + RADEON_MARK_SYNC(info, pScrn); + } +#endif /* USE_EXA */ +#ifdef USE_XAA + if (!info->useEXA) { + (*info->accel_state->accel->SetupForSolidFill)(pScrn, color, GXcopy, (uint32_t)(~0)); + (*info->accel_state->accel->SubsequentSolidFillRect)(pScrn, x, y, w, h); + if (pScrn->bitsPerPixel == info->CurrentLayout.bitsPerPixel) + RADEON_MARK_SYNC(info, pScrn); + } +#endif /* USE_XAA */ + +} + +static void RADEON_BlitRect(ScrnInfoPtr pScrn, + int srcx, int srcy, int w, int h, + int dstx, int dsty) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; + int ydir = (srcy < dsty) ? -1 : 1; + + #ifdef USE_EXA + /* XXX */ + if (info->useEXA) { + /* + info->exa.accel.PrepareCopy(pScrn, color, GXcopy, (uint32_t)(~0)); + info->exa.accel.Copy(pScrn, srcx, srcy, dstx, dsty, w, h); + info->exa.accel.DoneCopy(); + */ + RADEON_MARK_SYNC(info, pScrn); + } +#endif /* USE_EXA */ +#ifdef USE_XAA + if (!info->useEXA) { + (*info->accel_state->accel->SetupForScreenToScreenCopy)(pScrn, xdir, ydir, + GXcopy, (uint32_t)(~0), -1); + (*info->accel_state->accel->SubsequentScreenToScreenCopy)(pScrn, srcx, srcy, + dstx, dsty, w, h); + if (pScrn->bitsPerPixel == info->CurrentLayout.bitsPerPixel) + RADEON_MARK_SYNC(info, pScrn); + } +#endif /* USE_XAA */ +} + +static void RADEON_BlitTransRect(ScrnInfoPtr pScrn, + int srcx, int srcy, int w, int h, + int dstx, int dsty, unsigned long color) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + int xdir = ((srcx < dstx) && (srcy == dsty)) ? -1 : 1; + int ydir = (srcy < dsty) ? -1 : 1; + + info->accel_state->XAAForceTransBlit = TRUE; + (*info->accel_state->accel->SetupForScreenToScreenCopy)(pScrn, xdir, ydir, + GXcopy, (uint32_t)(~0), color); + + info->accel_state->XAAForceTransBlit = FALSE; + + (*info->accel_state->accel->SubsequentScreenToScreenCopy)(pScrn, srcx, srcy, + dstx, dsty, w, h); + + if (pScrn->bitsPerPixel == info->CurrentLayout.bitsPerPixel) + RADEON_MARK_SYNC(info, pScrn); +} + +#endif /* USE_XAA */ + +static Bool RADEON_OpenFramebuffer(ScrnInfoPtr pScrn, + char **name, + unsigned char **mem, + int *size, int *offset, int *flags) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + + *name = NULL; /* no special device */ + *mem = (unsigned char*)info->LinearAddr; + *size = info->FbMapSize; + *offset = 0; + *flags = 0; /* DGA_NEED_ROOT; -- don't need root, just /dev/mem access */ + + return TRUE; +} diff --git a/driver/xf86-video-ati/src/radeon_dri.c b/driver/xf86-video-ati/src/radeon_dri.c index 35290387b..15021a1d6 100644 --- a/driver/xf86-video-ati/src/radeon_dri.c +++ b/driver/xf86-video-ati/src/radeon_dri.c @@ -51,9 +51,11 @@ #include "radeon_dri.h" #include "radeon_version.h" +#include "atipciids.h" /* X and server generic header files */ #include "xf86.h" +#include "xf86PciInfo.h" #include "windowstr.h" /* GLX/DRI/DRM definitions */ @@ -61,8 +63,6 @@ #include "GL/glxtokens.h" #include "sarea.h" -#include "atipciids.h" - static size_t radeon_drm_page_size; #define RADEON_MAX_DRAWABLES 256 @@ -121,21 +121,21 @@ static Bool RADEONInitVisualConfigs(ScreenPtr pScreen) if (use_db) numConfigs *= 2; if (!(pConfigs - = (__GLXvisualConfig *)calloc(sizeof(__GLXvisualConfig), - numConfigs))) { + = (__GLXvisualConfig *)xcalloc(sizeof(__GLXvisualConfig), + numConfigs))) { return FALSE; } if (!(pRADEONConfigs - = (RADEONConfigPrivPtr)calloc(sizeof(RADEONConfigPrivRec), - numConfigs))) { - free(pConfigs); + = (RADEONConfigPrivPtr)xcalloc(sizeof(RADEONConfigPrivRec), + numConfigs))) { + xfree(pConfigs); return FALSE; } if (!(pRADEONConfigPtrs - = (RADEONConfigPrivPtr *)calloc(sizeof(RADEONConfigPrivPtr), - numConfigs))) { - free(pConfigs); - free(pRADEONConfigs); + = (RADEONConfigPrivPtr *)xcalloc(sizeof(RADEONConfigPrivPtr), + numConfigs))) { + xfree(pConfigs); + xfree(pRADEONConfigs); return FALSE; } @@ -207,21 +207,21 @@ static Bool RADEONInitVisualConfigs(ScreenPtr pScreen) if (use_db) numConfigs *= 2; if (!(pConfigs - = (__GLXvisualConfig *)calloc(sizeof(__GLXvisualConfig), - numConfigs))) { + = (__GLXvisualConfig *)xcalloc(sizeof(__GLXvisualConfig), + numConfigs))) { return FALSE; } if (!(pRADEONConfigs - = (RADEONConfigPrivPtr)calloc(sizeof(RADEONConfigPrivRec), - numConfigs))) { - free(pConfigs); + = (RADEONConfigPrivPtr)xcalloc(sizeof(RADEONConfigPrivRec), + numConfigs))) { + xfree(pConfigs); return FALSE; } if (!(pRADEONConfigPtrs - = (RADEONConfigPrivPtr *)calloc(sizeof(RADEONConfigPrivPtr), - numConfigs))) { - free(pConfigs); - free(pRADEONConfigs); + = (RADEONConfigPrivPtr *)xcalloc(sizeof(RADEONConfigPrivPtr), + numConfigs))) { + xfree(pConfigs); + xfree(pRADEONConfigs); return FALSE; } @@ -299,6 +299,36 @@ static Bool RADEONCreateContext(ScreenPtr pScreen, VisualPtr visual, drm_context_t hwContext, void *pVisualConfigPriv, DRIContextType contextStore) { +#ifdef PER_CONTEXT_SAREA + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONDRIContextPtr ctx_info; + + ctx_info = (RADEONDRIContextPtr)contextStore; + if (!ctx_info) return FALSE; + + if (drmAddMap(info->dri->drmFD, 0, + info->dri->perctx_sarea_size, + DRM_SHM, + DRM_REMOVABLE, + &ctx_info->sarea_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[dri] could not create private sarea for ctx id (%d)\n", + (int)hwContext); + return FALSE; + } + + if (drmAddContextPrivateMapping(info->dri->drmFD, hwContext, + ctx_info->sarea_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[dri] could not associate private sarea to ctx id (%d)\n", + (int)hwContext); + drmRmMap(info->dri->drmFD, ctx_info->sarea_handle); + return FALSE; + } + + ctx_info->ctx_id = hwContext; +#endif return TRUE; } @@ -306,6 +336,20 @@ static Bool RADEONCreateContext(ScreenPtr pScreen, VisualPtr visual, static void RADEONDestroyContext(ScreenPtr pScreen, drm_context_t hwContext, DRIContextType contextStore) { +#ifdef PER_CONTEXT_SAREA + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONDRIContextPtr ctx_info; + + ctx_info = (RADEONDRIContextPtr)contextStore; + if (!ctx_info) return; + + if (drmRmMap(info->dri->drmFD, ctx_info->sarea_handle) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[dri] could not remove private sarea for ctx id (%d)\n", + (int)hwContext); + } +#endif } /* Called when the X server is woken up to allow the last client's @@ -522,12 +566,12 @@ static void RADEONDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, if (nbox > 1) { /* Keep ordering in each band, reverse order of bands */ - pboxNew1 = (BoxPtr)malloc(sizeof(BoxRec)*nbox); + pboxNew1 = (BoxPtr)xalloc(sizeof(BoxRec)*nbox); if (!pboxNew1) return; - pptNew1 = (DDXPointPtr)malloc(sizeof(DDXPointRec)*nbox); + pptNew1 = (DDXPointPtr)xalloc(sizeof(DDXPointRec)*nbox); if (!pptNew1) { - free(pboxNew1); + xfree(pboxNew1); return; } @@ -564,14 +608,14 @@ static void RADEONDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, if (nbox > 1) { /* reverse order of rects in each band */ - pboxNew2 = (BoxPtr)malloc(sizeof(BoxRec)*nbox); - pptNew2 = (DDXPointPtr)malloc(sizeof(DDXPointRec)*nbox); + pboxNew2 = (BoxPtr)xalloc(sizeof(BoxRec)*nbox); + pptNew2 = (DDXPointPtr)xalloc(sizeof(DDXPointRec)*nbox); if (!pboxNew2 || !pptNew2) { - free(pptNew2); - free(pboxNew2); - free(pptNew1); - free(pboxNew1); + xfree(pptNew2); + xfree(pboxNew2); + xfree(pptNew1); + xfree(pboxNew1); return; } @@ -642,10 +686,10 @@ static void RADEONDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, info->accel_state->dst_pitch_offset = info->dri->frontPitchOffset;; - free(pptNew2); - free(pboxNew2); - free(pptNew1); - free(pboxNew1); + xfree(pptNew2); + xfree(pboxNew2); + xfree(pptNew1); + xfree(pboxNew1); info->accel_state->accel->NeedToSync = TRUE; #endif /* USE_XAA */ @@ -701,8 +745,6 @@ static radeon_agpmode_quirk radeon_agpmode_quirk_list[] = { { PCI_VENDOR_INTEL,0x2570, PCI_VENDOR_ATI,0x4a4e, PCI_VENDOR_DELL,0x5106, 4 }, /* Intel 82865G/PE/P DRAM Controller/Host-Hub / RV280 [Radeon 9200 SE] Needs AGPMode 4 (lp #300304) */ { PCI_VENDOR_INTEL,0x2570, PCI_VENDOR_ATI,0x5964, 0x148c,0x2073, 4 }, - /* Intel 82855PM host bridge / Mobility M7 LW Needs AGPMode 4 (lp: #353996) */ - { PCI_VENDOR_INTEL,0x3340, PCI_VENDOR_ATI,0x4c57, PCI_VENDOR_IBM,0x0530, 4 }, /* Intel 82855PM Processor to I/O Controller / Mobility M6 LY Needs AGPMode 1 (deb #467235) */ { PCI_VENDOR_INTEL,0x3340, PCI_VENDOR_ATI,0x4c59, PCI_VENDOR_IBM,0x052f, 1 }, /* Intel 82855PM host bridge / Mobility 9600 M10 RV350 Needs AGPMode 1 (lp #195051) */ @@ -725,16 +767,6 @@ static radeon_agpmode_quirk radeon_agpmode_quirk_list[] = { { PCI_VENDOR_INTEL,0x3580, PCI_VENDOR_ATI,0x4e50, PCI_VENDOR_ASUS,0x1942, 1 }, /* Intel 82852/82855 host bridge / Mobility 9600/9700 Needs AGPMode 1 (deb #510208) */ { PCI_VENDOR_INTEL,0x3580, PCI_VENDOR_ATI,0x4e50, 0x10cf,0x127f, 1 }, - /* Intel 82443BX/ZX/DX Host bridge / RV280 [Radeon 9200] Needs AGPMode 1 (lp #370205) */ - { PCI_VENDOR_INTEL,0x7190, PCI_VENDOR_ATI,0x5961, 0x174b,0x7c13, 1 }, - - /* Ali Corp M1671 Super P4 Northbridge / Mobility M6 LY Needs AGPMode 1 (lp #146303)*/ - { 0x10b9,0x1671, PCI_VENDOR_ATI,0x4c59, 0x103c,0x0027, 1 }, - - /* SiS Host Bridge 655 / R420 [Radeon X800] Needs AGPMode 4 (lp #371296) */ - { 0x1039,0x0655, PCI_VENDOR_ATI,0x4a4b, PCI_VENDOR_ATI,0x4422, 4 }, - /* SiS Host Bridge / RV280 Needs AGPMode 4 */ - { 0x1039,0x0741, PCI_VENDOR_ATI,0x5964, 0x148c,0x2073, 4 }, /* ASRock K7VT4A+ AGP 8x / ATI Radeon 9250 AGP Needs AGPMode 4 (lp #133192) */ { 0x1849,0x3189, PCI_VENDOR_ATI,0x5960, 0x1787,0x5960, 4 }, @@ -755,10 +787,6 @@ static radeon_agpmode_quirk radeon_agpmode_quirk_list[] = { { PCI_VENDOR_VIA,0x3189, PCI_VENDOR_ATI,0x5960, 0x1462,0x0380, 4 }, /* VIA VT8377 Host Bridge / RV280 Needs AGPMode 4 (ati ML) */ { PCI_VENDOR_VIA,0x3189, PCI_VENDOR_ATI,0x5964, 0x148c,0x2073, 4 }, - /* VIA VT8377 Host Bridge / RV280 Needs AGPMode 4 (fdo #12544) */ - { PCI_VENDOR_VIA,0x3189, PCI_VENDOR_ATI,0x5964, PCI_VENDOR_ASUS,0xc008, 4 }, - /* VIA VT8377 Host Bridge / RV280 Needs AGPMode 4 (deb #545040) */ - { PCI_VENDOR_VIA,0x3189, PCI_VENDOR_ATI,0x5960, PCI_VENDOR_ASUS,0x004c, 4 }, /* ATI Host Bridge / RV280 [M9+] Needs AGPMode 1 (phoronix forum) */ { PCI_VENDOR_ATI,0xcbb2, PCI_VENDOR_ATI,0x5c61, PCI_VENDOR_SONY,0x8175, 1 }, @@ -766,9 +794,6 @@ static radeon_agpmode_quirk radeon_agpmode_quirk_list[] = { /* HP Host Bridge / R300 [FireGL X1] Needs AGPMode 2 (fdo #7770) */ { PCI_VENDOR_HP,0x122e, PCI_VENDOR_ATI,0x4e47, PCI_VENDOR_ATI,0x0152, 2 }, - /* nVidia Host Bridge / R420 [X800 Pro] Needs AGPMode 4 (fdo #22726) */ - { 0x10de,0x00e1, PCI_VENDOR_ATI,0x4a49, PCI_VENDOR_ATI,0x0002, 4 }, - { 0, 0, 0, 0, 0, 0, 0 }, }; @@ -1321,7 +1346,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); int major, minor, patch, fd; - int req_major, req_minor, req_patch; + int req_minor, req_patch; char *busId; /* Check that the GLX, DRI, and DRM modules have been loaded by testing @@ -1331,33 +1356,23 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn) if (!xf86LoaderCheckSymbol("drmAvailable")) return FALSE; if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] RADEONDRIGetVersion failed (libdri too old)\n" + "[dri] RADEONDRIGetVersion failed (libdri.a too old)\n" "[dri] Disabling DRI.\n"); return FALSE; } /* Check the DRI version */ DRIQueryVersion(&major, &minor, &patch); - if (major < DRIINFO_MAJOR_VERSION) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] RADEONDRIGetVersion failed because of a version mismatch.\n" - "[dri] This driver was built with %d.%d.x, which is too new;\n" - "[dri] libdri reports a version of %d.%d.%d." - "[dri] A server upgrade may be needed.\n" - "[dri] Disabling DRI.\n", - DRIINFO_MAJOR_VERSION, 0, - major, minor, patch); - return FALSE; - } else if (major > DRIINFO_MAJOR_VERSION) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] RADEONDRIGetVersion failed because of a version mismatch.\n" - "[dri] This driver was built with %d.%d.x, which is too old;\n" - "[dri] libdri reports a version of %d.%d.%d." - "[dri] This driver needs to be upgraded/rebuilt.\n" - "[dri] Disabling DRI.\n", - DRIINFO_MAJOR_VERSION, 0, - major, minor, patch); - return FALSE; + if (major != DRIINFO_MAJOR_VERSION || minor < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[dri] RADEONDRIGetVersion failed because of a version " + "mismatch.\n" + "[dri] libdri version is %d.%d.%d but version %d.%d.x is " + "needed.\n" + "[dri] Disabling DRI.\n", + major, minor, patch, + DRIINFO_MAJOR_VERSION, 0); + return FALSE; } /* Check the lib version */ @@ -1365,7 +1380,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn) info->dri->pLibDRMVersion = drmGetLibVersion(info->dri->drmFD); if (info->dri->pLibDRMVersion == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] RADEONDRIGetVersion failed because libdrm is really " + "[dri] RADEONDRIGetVersion failed because libDRM is really " "way to old to even get a version number out of it.\n" "[dri] Disabling DRI.\n"); return FALSE; @@ -1376,7 +1391,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] RADEONDRIGetVersion failed because of a " "version mismatch.\n" - "[dri] libdrm module version is %d.%d.%d but " + "[dri] libdrm.a module version is %d.%d.%d but " "version 1.2.x is needed.\n" "[dri] Disabling DRI.\n", info->dri->pLibDRMVersion->version_major, @@ -1391,7 +1406,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn) if (xf86LoaderCheckSymbol("DRICreatePCIBusID")) { busId = DRICreatePCIBusID(info->PciInfo); } else { - busId = malloc(64); + busId = xalloc(64); sprintf(busId, "PCI:%d:%d:%d", PCI_DEV_BUS(info->PciInfo), @@ -1401,7 +1416,7 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn) /* Low level DRM open */ fd = drmOpen(RADEON_DRIVER_NAME, busId); - free(busId); + xfree(busId); if (fd < 0) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[dri] RADEONDRIGetVersion failed to open the DRM\n" @@ -1420,55 +1435,37 @@ Bool RADEONDRIGetVersion(ScrnInfoPtr pScrn) } /* Now check if we qualify */ - req_major = 1; if (info->ChipFamily >= CHIP_FAMILY_R300) { req_minor = 17; req_patch = 0; } else if (info->IsIGP) { req_minor = 10; - req_patch = 0; + req_patch = 0; } else { /* Many problems have been reported with 1.7 in the 2.4 kernel */ - req_minor = 8; - req_patch = 0; + req_minor = 8; + req_patch = 0; } /* We don't, bummer ! */ - if (info->dri->pKernelDRMVersion->version_major != req_major) { - /* Looks like we're trying to start in UMS mode on a KMS kernel. - * This can happen if the radeon kernel module wasn't loaded before - * X starts. - */ - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] RADEONDRIGetVersion failed because of a version mismatch.\n" - "[dri] This chipset requires a kernel module version of %d.%d.%d,\n" - "[dri] but the kernel reports a version of %d.%d.%d." - "[dri] Make sure your module is loaded prior to starting X, and\n" - "[dri] that this driver was built with support for KMS.\n" - "[dri] Aborting.\n", - req_major, req_minor, req_patch, - info->dri->pKernelDRMVersion->version_major, - info->dri->pKernelDRMVersion->version_minor, - info->dri->pKernelDRMVersion->version_patchlevel); - drmFreeVersion(info->dri->pKernelDRMVersion); - info->dri->pKernelDRMVersion = NULL; - return -1; - } else if (info->dri->pKernelDRMVersion->version_minor < req_minor || - (info->dri->pKernelDRMVersion->version_minor == req_minor && - info->dri->pKernelDRMVersion->version_patchlevel < req_patch)) { + if (info->dri->pKernelDRMVersion->version_major != 1 || + info->dri->pKernelDRMVersion->version_minor < req_minor || + (info->dri->pKernelDRMVersion->version_minor == req_minor && + info->dri->pKernelDRMVersion->version_patchlevel < req_patch)) { /* Incompatible drm version */ - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[dri] RADEONDRIGetVersion failed because of a version mismatch.\n" - "[dri] This chipset requires a kernel module version of %d.%d.%d,\n" - "[dri] but the kernel reports a version of %d.%d.%d." - "[dri] Try upgrading your kernel.\n" - "[dri] Disabling DRI.\n", - req_major, req_minor, req_patch, - info->dri->pKernelDRMVersion->version_major, - info->dri->pKernelDRMVersion->version_minor, - info->dri->pKernelDRMVersion->version_patchlevel); - drmFreeVersion(info->dri->pKernelDRMVersion); - info->dri->pKernelDRMVersion = NULL; - return FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[dri] RADEONDRIGetVersion failed because of a version " + "mismatch.\n" + "[dri] radeon.o kernel module version is %d.%d.%d " + "but version 1.%d.%d or newer is needed.\n" + "[dri] Disabling DRI.\n", + info->dri->pKernelDRMVersion->version_major, + info->dri->pKernelDRMVersion->version_minor, + info->dri->pKernelDRMVersion->version_patchlevel, + req_minor, + req_patch); + drmFreeVersion(info->dri->pKernelDRMVersion); + info->dri->pKernelDRMVersion = NULL; + return FALSE; } return TRUE; @@ -1553,7 +1550,7 @@ Bool RADEONDRIScreenInit(ScreenPtr pScreen) if (xf86LoaderCheckSymbol("DRICreatePCIBusID")) { pDRIInfo->busIdString = DRICreatePCIBusID(info->PciInfo); } else { - pDRIInfo->busIdString = malloc(64); + pDRIInfo->busIdString = xalloc(64); sprintf(pDRIInfo->busIdString, "PCI:%d:%d:%d", PCI_DEV_BUS(info->PciInfo), @@ -1563,7 +1560,7 @@ Bool RADEONDRIScreenInit(ScreenPtr pScreen) pDRIInfo->ddxDriverMajorVersion = info->allowColorTiling ? 5 : 4; pDRIInfo->ddxDriverMinorVersion = 3; pDRIInfo->ddxDriverPatchVersion = 0; - pDRIInfo->frameBufferPhysicalAddress = (void *)(uintptr_t)info->LinearAddr + info->dri->frontOffset; + pDRIInfo->frameBufferPhysicalAddress = (void *)info->LinearAddr + info->dri->frontOffset; pDRIInfo->frameBufferSize = info->FbMapSize - info->FbSecureSize; pDRIInfo->frameBufferStride = (pScrn->displayWidth * info->CurrentLayout.pixel_bytes); @@ -1576,6 +1573,12 @@ Bool RADEONDRIScreenInit(ScreenPtr pScreen) correctly with pageflip + mergedfb/color tiling */ pDRIInfo->wrap.AdjustFrame = NULL; +#ifdef PER_CONTEXT_SAREA + /* This is only here for testing per-context SAREAs. When used, the + magic number below would be properly defined in a header file. */ + info->perctx_sarea_size = 64 * 1024; +#endif + #ifdef NOT_DONE /* FIXME: Need to extend DRI protocol to pass this size back to * client for SAREA mapping that includes a device private record @@ -1594,7 +1597,7 @@ Bool RADEONDRIScreenInit(ScreenPtr pScreen) pDRIInfo->SAREASize = SAREA_MAX; #endif - if (!(pRADEONDRI = (RADEONDRIPtr)calloc(sizeof(RADEONDRIRec),1))) { + if (!(pRADEONDRI = (RADEONDRIPtr)xcalloc(sizeof(RADEONDRIRec),1))) { DRIDestroyInfoRec(info->dri->pDRIInfo); info->dri->pDRIInfo = NULL; return FALSE; @@ -1641,7 +1644,7 @@ Bool RADEONDRIScreenInit(ScreenPtr pScreen) if (!DRIScreenInit(pScreen, pDRIInfo, &info->dri->drmFD)) { xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] DRIScreenInit failed. Disabling DRI.\n"); - free(pDRIInfo->devPrivate); + xfree(pDRIInfo->devPrivate); pDRIInfo->devPrivate = NULL; DRIDestroyInfoRec(pDRIInfo); pDRIInfo = NULL; @@ -1782,6 +1785,11 @@ Bool RADEONDRIFinishScreenInit(ScreenPtr pScreen) pRADEONDRI->sarea_priv_offset = sizeof(XF86DRISAREARec); +#ifdef PER_CONTEXT_SAREA + /* Set per-context SAREA size */ + pRADEONDRI->perctx_sarea_size = info->dri->perctx_sarea_size; +#endif + info->directRenderingInited = TRUE; /* Wrap CloseScreen */ @@ -1920,7 +1928,7 @@ void RADEONDRICloseScreen(ScreenPtr pScreen) } if (info->dri->pciGartBackup) { - free(info->dri->pciGartBackup); + xfree(info->dri->pciGartBackup); info->dri->pciGartBackup = NULL; } @@ -1930,18 +1938,18 @@ void RADEONDRICloseScreen(ScreenPtr pScreen) /* De-allocate all DRI data structures */ if (info->dri->pDRIInfo) { if (info->dri->pDRIInfo->devPrivate) { - free(info->dri->pDRIInfo->devPrivate); + xfree(info->dri->pDRIInfo->devPrivate); info->dri->pDRIInfo->devPrivate = NULL; } DRIDestroyInfoRec(info->dri->pDRIInfo); info->dri->pDRIInfo = NULL; } if (info->dri->pVisualConfigs) { - free(info->dri->pVisualConfigs); + xfree(info->dri->pVisualConfigs); info->dri->pVisualConfigs = NULL; } if (info->dri->pVisualConfigsPriv) { - free(info->dri->pVisualConfigsPriv); + xfree(info->dri->pVisualConfigsPriv); info->dri->pVisualConfigsPriv = NULL; } } diff --git a/driver/xf86-video-ati/src/radeon_dri.h b/driver/xf86-video-ati/src/radeon_dri.h index 15beb5223..6e3ad62a1 100644 --- a/driver/xf86-video-ati/src/radeon_dri.h +++ b/driver/xf86-video-ati/src/radeon_dri.h @@ -86,6 +86,10 @@ typedef struct { int log2GARTTexGran; int gartTexOffset; unsigned int sarea_priv_offset; + +#ifdef PER_CONTEXT_SAREA + drmSize perctx_sarea_size; +#endif } RADEONDRIRec, *RADEONDRIPtr; #endif diff --git a/driver/xf86-video-ati/src/radeon_dri2.c b/driver/xf86-video-ati/src/radeon_dri2.c deleted file mode 100644 index 8789d7359..000000000 --- a/driver/xf86-video-ati/src/radeon_dri2.c +++ /dev/null @@ -1,1428 +0,0 @@ -/* - * Copyright 2008 Kristian Høgsberg - * Copyright 2008 Jérôme Glisse - * - * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include "radeon.h" -#include "radeon_dri2.h" -#include "radeon_version.h" - -#if HAVE_LIST_H -#include "list.h" -#endif - -#ifdef RADEON_DRI2 - -#include "radeon_bo_gem.h" - -#if DRI2INFOREC_VERSION >= 1 -#define USE_DRI2_1_1_0 -#endif - -#if DRI2INFOREC_VERSION >= 4 && HAVE_LIST_H -#define USE_DRI2_SCHEDULING -#endif - -#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,6,99,0, 0) -typedef DRI2BufferPtr BufferPtr; -#else -typedef DRI2Buffer2Ptr BufferPtr; -#endif - -struct dri2_buffer_priv { - PixmapPtr pixmap; - unsigned int attachment; - unsigned int refcnt; -}; - - -#ifndef USE_DRI2_1_1_0 -static BufferPtr -radeon_dri2_create_buffers(DrawablePtr drawable, - unsigned int *attachments, - int count) -{ - ScreenPtr pScreen = drawable->pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - BufferPtr buffers; - struct dri2_buffer_priv *privates; - PixmapPtr pixmap, depth_pixmap; - struct radeon_exa_pixmap_priv *driver_priv; - int i, r, need_enlarge = 0; - int flags = 0; - unsigned front_width; - uint32_t tiling = 0; - - pixmap = screen->GetScreenPixmap(screen); - front_width = pixmap->drawable.width; - - buffers = calloc(count, sizeof *buffers); - if (buffers == NULL) { - return NULL; - } - privates = calloc(count, sizeof(struct dri2_buffer_priv)); - if (privates == NULL) { - free(buffers); - return NULL; - } - - depth_pixmap = NULL; - for (i = 0; i < count; i++) { - if (attachments[i] == DRI2BufferFrontLeft) { - if (drawable->type == DRAWABLE_PIXMAP) { - pixmap = (Pixmap*)drawable; - } else { - pixmap = (*pScreen->GetWindowPixmap)((WindowPtr)drawable); - } - pixmap->refcnt++; - } else if (attachments[i] == DRI2BufferStencil && depth_pixmap) { - pixmap = depth_pixmap; - pixmap->refcnt++; - } else { - /* tile the back buffer */ - switch(attachments[i]) { - case DRI2BufferDepth: - if (info->ChipFamily >= CHIP_FAMILY_R600) - /* macro is the preferred setting, but the 2D detiling for software - * fallbacks in mesa still has issues on some configurations - */ - flags = RADEON_CREATE_PIXMAP_TILING_MICRO; - else - flags = RADEON_CREATE_PIXMAP_TILING_MACRO | RADEON_CREATE_PIXMAP_TILING_MICRO; - break; - case DRI2BufferDepthStencil: - if (info->ChipFamily >= CHIP_FAMILY_R600) { - /* macro is the preferred setting, but the 2D detiling for software - * fallbacks in mesa still has issues on some configurations - */ - flags = RADEON_CREATE_PIXMAP_TILING_MICRO; - if (info->ChipFamily >= CHIP_FAMILY_CEDAR) - need_enlarge = 1; - } else - flags = RADEON_CREATE_PIXMAP_TILING_MACRO | RADEON_CREATE_PIXMAP_TILING_MICRO; - break; - case DRI2BufferBackLeft: - case DRI2BufferBackRight: - case DRI2BufferFakeFrontLeft: - case DRI2BufferFakeFrontRight: - if (info->ChipFamily >= CHIP_FAMILY_R600) - /* macro is the preferred setting, but the 2D detiling for software - * fallbacks in mesa still has issues on some configurations - */ - flags = RADEON_CREATE_PIXMAP_TILING_MICRO; - else - flags = RADEON_CREATE_PIXMAP_TILING_MACRO; - break; - default: - flags = 0; - } - - if (flags & RADEON_CREATE_PIXMAP_TILING_MICRO) - tiling |= RADEON_TILING_MICRO; - if (flags & RADEON_CREATE_PIXMAP_TILING_MACRO) - tiling |= RADEON_TILING_MACRO; - - if (need_enlarge) { - /* evergreen uses separate allocations for depth and stencil - * so we make an extra large depth buffer to cover stencil - * as well. - */ - unsigned aligned_width = drawable->width; - unsigned width_align = drmmode_get_pitch_align(pScrn, drawable->depth / 8, tiling); - unsigned aligned_height; - unsigned height_align = drmmode_get_height_align(pScrn, tiling); - unsigned base_align = drmmode_get_base_align(pScrn, drawable->depth / 8, tiling); - unsigned pitch_bytes; - unsigned size; - - if (aligned_width == front_width) - aligned_width = pScrn->virtualX; - aligned_width = RADEON_ALIGN(aligned_width, width_align); - pitch_bytes = aligned_width * (drawable->depth / 8); - aligned_height = RADEON_ALIGN(drawable->height, height_align); - size = pitch_bytes * aligned_height; - size = RADEON_ALIGN(size, base_align); - /* add additional size for stencil */ - size += aligned_width * aligned_height; - aligned_height = RADEON_ALIGN(size / pitch_bytes, height_align); - - pixmap = (*pScreen->CreatePixmap)(pScreen, - aligned_width, - aligned_height, - drawable->depth, - flags); - - } else { - unsigned aligned_width = drawable->width; - - if (aligned_width == front_width) - aligned_width = pScrn->virtualX; - - pixmap = (*pScreen->CreatePixmap)(pScreen, - aligned_width, - drawable->height, - drawable->depth, - flags); - } - } - - if (attachments[i] == DRI2BufferDepth) { - depth_pixmap = pixmap; - } - info->exa_force_create = TRUE; - exaMoveInPixmap(pixmap); - info->exa_force_create = FALSE; - driver_priv = exaGetPixmapDriverPrivate(pixmap); - if (!driver_priv || - radeon_gem_get_kernel_name(driver_priv->bo, &buffers[i].name) != 0) { - int j; - - for (j = 0; j < i; j++) - (*pScreen->DestroyPixmap)(privates[j].pixmap); - (*pScreen->DestroyPixmap)(pixmap); - free(privates); - free(buffers); - return NULL; - } - - buffers[i].attachment = attachments[i]; - buffers[i].pitch = pixmap->devKind; - buffers[i].cpp = pixmap->drawable.bitsPerPixel / 8; - buffers[i].driverPrivate = &privates[i]; - buffers[i].flags = 0; - privates[i].pixmap = pixmap; - privates[i].attachment = attachments[i]; - } - return buffers; -} -#else -static BufferPtr -radeon_dri2_create_buffer(DrawablePtr drawable, - unsigned int attachment, - unsigned int format) -{ - ScreenPtr pScreen = drawable->pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - BufferPtr buffers; - struct dri2_buffer_priv *privates; - PixmapPtr pixmap, depth_pixmap; - struct radeon_exa_pixmap_priv *driver_priv; - int need_enlarge = 0; - int flags; - unsigned front_width; - uint32_t tiling = 0; - - pixmap = pScreen->GetScreenPixmap(pScreen); - front_width = pixmap->drawable.width; - - pixmap = depth_pixmap = NULL; - - if (attachment == DRI2BufferFrontLeft) { - if (drawable->type == DRAWABLE_PIXMAP) { - pixmap = (PixmapPtr)drawable; - } else { - pixmap = (*pScreen->GetWindowPixmap)((WindowPtr)drawable); - } - pixmap->refcnt++; - } else if (attachment == DRI2BufferStencil && depth_pixmap) { - pixmap = depth_pixmap; - pixmap->refcnt++; - } else { - /* tile the back buffer */ - switch(attachment) { - case DRI2BufferDepth: - /* macro is the preferred setting, but the 2D detiling for software - * fallbacks in mesa still has issues on some configurations - */ - if (info->ChipFamily >= CHIP_FAMILY_R600) - flags = RADEON_CREATE_PIXMAP_TILING_MICRO; - else - flags = RADEON_CREATE_PIXMAP_TILING_MACRO | RADEON_CREATE_PIXMAP_TILING_MICRO; - break; - case DRI2BufferDepthStencil: - /* macro is the preferred setting, but the 2D detiling for software - * fallbacks in mesa still has issues on some configurations - */ - if (info->ChipFamily >= CHIP_FAMILY_R600) { - flags = RADEON_CREATE_PIXMAP_TILING_MICRO; - if (info->ChipFamily >= CHIP_FAMILY_CEDAR) - need_enlarge = 1; - } else - flags = RADEON_CREATE_PIXMAP_TILING_MACRO | RADEON_CREATE_PIXMAP_TILING_MICRO; - break; - case DRI2BufferBackLeft: - case DRI2BufferBackRight: - case DRI2BufferFakeFrontLeft: - case DRI2BufferFakeFrontRight: - if (info->ChipFamily >= CHIP_FAMILY_R600) - /* macro is the preferred setting, but the 2D detiling for software - * fallbacks in mesa still has issues on some configurations - */ - flags = RADEON_CREATE_PIXMAP_TILING_MICRO; - else - flags = RADEON_CREATE_PIXMAP_TILING_MACRO; - break; - default: - flags = 0; - } - - if (flags & RADEON_CREATE_PIXMAP_TILING_MICRO) - tiling |= RADEON_TILING_MICRO; - if (flags & RADEON_CREATE_PIXMAP_TILING_MACRO) - tiling |= RADEON_TILING_MACRO; - - if (need_enlarge) { - /* evergreen uses separate allocations for depth and stencil - * so we make an extra large depth buffer to cover stencil - * as well. - */ - int depth = (format != 0) ? format : drawable->depth; - unsigned aligned_width = drawable->width; - unsigned width_align = drmmode_get_pitch_align(pScrn, drawable->depth / 8, tiling); - unsigned aligned_height; - unsigned height_align = drmmode_get_height_align(pScrn, tiling); - unsigned base_align = drmmode_get_base_align(pScrn, drawable->depth / 8, tiling); - unsigned pitch_bytes; - unsigned size; - - if (aligned_width == front_width) - aligned_width = pScrn->virtualX; - aligned_width = RADEON_ALIGN(aligned_width, width_align); - pitch_bytes = aligned_width * (depth / 8); - aligned_height = RADEON_ALIGN(drawable->height, height_align); - size = pitch_bytes * aligned_height; - size = RADEON_ALIGN(size, base_align); - /* add additional size for stencil */ - size += aligned_width * aligned_height; - aligned_height = RADEON_ALIGN(size / pitch_bytes, height_align); - - pixmap = (*pScreen->CreatePixmap)(pScreen, - aligned_width, - aligned_height, - (format != 0)?format:drawable->depth, - flags); - - } else { - unsigned aligned_width = drawable->width; - - if (aligned_width == front_width) - aligned_width = pScrn->virtualX; - - pixmap = (*pScreen->CreatePixmap)(pScreen, - aligned_width, - drawable->height, - (format != 0)?format:drawable->depth, - flags); - } - } - - if (!pixmap) - return NULL; - - buffers = calloc(1, sizeof *buffers); - if (buffers == NULL) - goto error; - - if (attachment == DRI2BufferDepth) { - depth_pixmap = pixmap; - } - info->exa_force_create = TRUE; - exaMoveInPixmap(pixmap); - info->exa_force_create = FALSE; - driver_priv = exaGetPixmapDriverPrivate(pixmap); - if (!driver_priv || - (radeon_gem_get_kernel_name(driver_priv->bo, &buffers->name) != 0)) - goto error; - - privates = calloc(1, sizeof(struct dri2_buffer_priv)); - if (privates == NULL) - goto error; - - buffers->attachment = attachment; - buffers->pitch = pixmap->devKind; - buffers->cpp = pixmap->drawable.bitsPerPixel / 8; - buffers->driverPrivate = privates; - buffers->format = format; - buffers->flags = 0; /* not tiled */ - privates->pixmap = pixmap; - privates->attachment = attachment; - privates->refcnt = 1; - - return buffers; - -error: - free(buffers); - if (pixmap) - (*pScreen->DestroyPixmap)(pixmap); - return NULL; -} -#endif - -#ifndef USE_DRI2_1_1_0 -static void -radeon_dri2_destroy_buffers(DrawablePtr drawable, - BufferPtr buffers, - int count) -{ - ScreenPtr pScreen = drawable->pScreen; - struct dri2_buffer_priv *private; - int i; - - for (i = 0; i < count; i++) { - private = buffers[i].driverPrivate; - (*pScreen->DestroyPixmap)(private->pixmap); - } - if (buffers) { - free(buffers[0].driverPrivate); - free(buffers); - } -} -#else -static void -radeon_dri2_destroy_buffer(DrawablePtr drawable, BufferPtr buffers) -{ - if(buffers) - { - ScreenPtr pScreen = drawable->pScreen; - struct dri2_buffer_priv *private = buffers->driverPrivate; - - /* Trying to free an already freed buffer is unlikely to end well */ - if (private->refcnt == 0) { - ScrnInfoPtr scrn = xf86Screens[pScreen->myNum]; - - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "Attempted to destroy previously destroyed buffer.\ - This is a programming error\n"); - return; - } - - private->refcnt--; - if (private->refcnt == 0) - { - (*pScreen->DestroyPixmap)(private->pixmap); - - free(buffers->driverPrivate); - free(buffers); - } - } -} -#endif - -static void -radeon_dri2_copy_region(DrawablePtr drawable, - RegionPtr region, - BufferPtr dest_buffer, - BufferPtr src_buffer) -{ - struct dri2_buffer_priv *src_private = src_buffer->driverPrivate; - struct dri2_buffer_priv *dst_private = dest_buffer->driverPrivate; - ScreenPtr pScreen = drawable->pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - DrawablePtr src_drawable; - DrawablePtr dst_drawable; - RegionPtr copy_clip; - GCPtr gc; - RADEONInfoPtr info = RADEONPTR(pScrn); - Bool vsync; - - if (src_private->attachment == DRI2BufferFrontLeft) { - src_drawable = drawable; - } else { - src_drawable = &src_private->pixmap->drawable; - } - if (dst_private->attachment == DRI2BufferFrontLeft) { - dst_drawable = drawable; - } else { - dst_drawable = &dst_private->pixmap->drawable; - } - gc = GetScratchGC(dst_drawable->depth, pScreen); - copy_clip = REGION_CREATE(pScreen, NULL, 0); - REGION_COPY(pScreen, copy_clip, region); - (*gc->funcs->ChangeClip) (gc, CT_REGION, copy_clip, 0); - ValidateGC(dst_drawable, gc); - - /* If this is a full buffer swap or frontbuffer flush, throttle on the - * previous one - */ - if (dst_private->attachment == DRI2BufferFrontLeft) { - if (REGION_NUM_RECTS(region) == 1) { - BoxPtr extents = REGION_EXTENTS(pScreen, region); - - if (extents->x1 == 0 && extents->y1 == 0 && - extents->x2 == drawable->width && - extents->y2 == drawable->height) { - struct radeon_exa_pixmap_priv *exa_priv = - exaGetPixmapDriverPrivate(dst_private->pixmap); - - if (exa_priv && exa_priv->bo) - radeon_bo_wait(exa_priv->bo); - } - } - } - - vsync = info->accel_state->vsync; - - /* Driver option "SwapbuffersWait" defines if we vsync DRI2 copy-swaps. */ - info->accel_state->vsync = info->swapBuffersWait; - - (*gc->ops->CopyArea)(src_drawable, dst_drawable, gc, - 0, 0, drawable->width, drawable->height, 0, 0); - - info->accel_state->vsync = vsync; - - FreeScratchGC(gc); -} - - -#ifdef USE_DRI2_SCHEDULING - -enum DRI2FrameEventType { - DRI2_SWAP, - DRI2_FLIP, - DRI2_WAITMSC, -}; - -typedef struct _DRI2FrameEvent { - XID drawable_id; - ClientPtr client; - enum DRI2FrameEventType type; - int frame; - - /* for swaps & flips only */ - DRI2SwapEventPtr event_complete; - void *event_data; - DRI2BufferPtr front; - DRI2BufferPtr back; - - Bool valid; - - struct list link; -} DRI2FrameEventRec, *DRI2FrameEventPtr; - -typedef struct _DRI2ClientEvents { - struct list reference_list; -} DRI2ClientEventsRec, *DRI2ClientEventsPtr; - -#if HAS_DEVPRIVATEKEYREC - -static DevPrivateKeyRec DRI2ClientEventsPrivateKeyRec; -#define DRI2ClientEventsPrivateKey (&DRI2ClientEventsPrivateKeyRec) - -#else - -static int DRI2ClientEventsPrivateKeyIndex; -DevPrivateKey DRI2ClientEventsPrivateKey = &DRI2ClientEventsPrivateKeyIndex; - -#endif /* HAS_DEVPRIVATEKEYREC */ - -#define GetDRI2ClientEvents(pClient) ((DRI2ClientEventsPtr) \ - dixLookupPrivate(&(pClient)->devPrivates, DRI2ClientEventsPrivateKey)) - -static int -ListAddDRI2ClientEvents(ClientPtr client, struct list *entry) -{ - DRI2ClientEventsPtr pClientPriv; - pClientPriv = GetDRI2ClientEvents(client); - - if (!pClientPriv) { - return BadAlloc; - } - - list_add(entry, &pClientPriv->reference_list); - return 0; -} - -static void -ListDelDRI2ClientEvents(ClientPtr client, struct list *entry) -{ - DRI2ClientEventsPtr pClientPriv; - pClientPriv = GetDRI2ClientEvents(client); - - if (!pClientPriv) { - return; - } - list_del(entry); -} - -static void -radeon_dri2_client_state_changed(CallbackListPtr *ClientStateCallback, pointer data, pointer calldata) -{ - DRI2ClientEventsPtr pClientEventsPriv; - DRI2FrameEventPtr ref; - NewClientInfoRec *clientinfo = calldata; - ClientPtr pClient = clientinfo->client; - pClientEventsPriv = GetDRI2ClientEvents(pClient); - - switch (pClient->clientState) { - case ClientStateInitial: - list_init(&pClientEventsPriv->reference_list); - break; - case ClientStateRunning: - break; - - case ClientStateRetained: - case ClientStateGone: - if (pClientEventsPriv) { - list_for_each_entry(ref, &pClientEventsPriv->reference_list, link) { - ref->valid = FALSE; - } - } - break; - default: - break; - } -} - -static void -radeon_dri2_ref_buffer(BufferPtr buffer) -{ - struct dri2_buffer_priv *private = buffer->driverPrivate; - private->refcnt++; -} - -static void -radeon_dri2_unref_buffer(BufferPtr buffer) -{ - if (buffer) { - struct dri2_buffer_priv *private = buffer->driverPrivate; - radeon_dri2_destroy_buffer(&(private->pixmap->drawable), buffer); - } -} - -static int radeon_dri2_drawable_crtc(DrawablePtr pDraw) -{ - ScreenPtr pScreen = pDraw->pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - xf86CrtcPtr crtc; - int crtc_id = -1; - - crtc = radeon_pick_best_crtc(pScrn, - pDraw->x, - pDraw->x + pDraw->width, - pDraw->y, - pDraw->y + pDraw->height); - - /* Make sure the CRTC is valid and this is the real front buffer */ - if (crtc != NULL && !crtc->rotatedData) { - crtc_id = drmmode_get_crtc_id(crtc); - } - return crtc_id; -} - -static Bool -radeon_dri2_schedule_flip(ScrnInfoPtr scrn, ClientPtr client, - DrawablePtr draw, DRI2BufferPtr front, - DRI2BufferPtr back, DRI2SwapEventPtr func, - void *data, unsigned int target_msc) -{ - struct dri2_buffer_priv *back_priv; - struct radeon_exa_pixmap_priv *exa_priv; - DRI2FrameEventPtr flip_info; - - /* Main crtc for this drawable shall finally deliver pageflip event. */ - int ref_crtc_hw_id = radeon_dri2_drawable_crtc(draw); - - flip_info = calloc(1, sizeof(DRI2FrameEventRec)); - if (!flip_info) - return FALSE; - - flip_info->drawable_id = draw->id; - flip_info->client = client; - flip_info->type = DRI2_SWAP; - flip_info->event_complete = func; - flip_info->event_data = data; - flip_info->frame = target_msc; - - xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "%s:%d fevent[%p]\n", __func__, __LINE__, flip_info); - - /* Page flip the full screen buffer */ - back_priv = back->driverPrivate; - exa_priv = exaGetPixmapDriverPrivate(back_priv->pixmap); - - return radeon_do_pageflip(scrn, exa_priv->bo, flip_info, ref_crtc_hw_id); -} - -static Bool -update_front(DrawablePtr draw, DRI2BufferPtr front) -{ - int r; - PixmapPtr pixmap; - struct dri2_buffer_priv *priv = front->driverPrivate; - struct radeon_exa_pixmap_priv *driver_priv; - - if (draw->type == DRAWABLE_PIXMAP) - pixmap = (PixmapPtr)draw; - else - pixmap = (*draw->pScreen->GetWindowPixmap)((WindowPtr)draw); - - pixmap->refcnt++; - - exaMoveInPixmap(pixmap); - driver_priv = exaGetPixmapDriverPrivate(pixmap); - r = radeon_gem_get_kernel_name(driver_priv->bo, &front->name); - if (r) { - (*draw->pScreen->DestroyPixmap)(pixmap); - return FALSE; - } - (*draw->pScreen->DestroyPixmap)(priv->pixmap); - front->pitch = pixmap->devKind; - front->cpp = pixmap->drawable.bitsPerPixel / 8; - priv->pixmap = pixmap; - - return TRUE; -} - -static Bool -can_exchange(ScrnInfoPtr pScrn, DrawablePtr draw, - DRI2BufferPtr front, DRI2BufferPtr back) -{ - struct dri2_buffer_priv *front_priv = front->driverPrivate; - struct dri2_buffer_priv *back_priv = back->driverPrivate; - PixmapPtr front_pixmap; - PixmapPtr back_pixmap = back_priv->pixmap; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int i; - - for (i = 0; i < xf86_config->num_crtc; i++) { - xf86CrtcPtr crtc = xf86_config->crtc[i]; - if (crtc->enabled && crtc->rotatedData) - return FALSE; - } - - if (!update_front(draw, front)) - return FALSE; - - front_pixmap = front_priv->pixmap; - - if (front_pixmap->drawable.width != back_pixmap->drawable.width) - return FALSE; - - if (front_pixmap->drawable.height != back_pixmap->drawable.height) - return FALSE; - - if (front_pixmap->drawable.bitsPerPixel != back_pixmap->drawable.bitsPerPixel) - return FALSE; - - if (front_pixmap->devKind != back_pixmap->devKind) - return FALSE; - - return TRUE; -} - -static void -radeon_dri2_exchange_buffers(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPtr back) -{ - struct dri2_buffer_priv *front_priv = front->driverPrivate; - struct dri2_buffer_priv *back_priv = back->driverPrivate; - struct radeon_exa_pixmap_priv *front_radeon, *back_radeon; - ScreenPtr screen; - RADEONInfoPtr info; - struct radeon_bo *bo; - int tmp; - - /* Swap BO names so DRI works */ - tmp = front->name; - front->name = back->name; - back->name = tmp; - - /* Swap pixmap bos */ - front_radeon = exaGetPixmapDriverPrivate(front_priv->pixmap); - back_radeon = exaGetPixmapDriverPrivate(back_priv->pixmap); - bo = back_radeon->bo; - back_radeon->bo = front_radeon->bo; - front_radeon->bo = bo; - - /* Do we need to update the Screen? */ - screen = draw->pScreen; - info = RADEONPTR(xf86Screens[screen->myNum]); - if (front_radeon->bo == info->front_bo) { - radeon_bo_unref(info->front_bo); - info->front_bo = back_radeon->bo; - radeon_bo_ref(info->front_bo); - front_radeon = exaGetPixmapDriverPrivate(screen->GetScreenPixmap(screen)); - front_radeon->bo = bo; - } -} - -void radeon_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, void *event_data) -{ - DRI2FrameEventPtr event = event_data; - RADEONInfoPtr info; - DrawablePtr drawable; - ScreenPtr screen; - ScrnInfoPtr scrn; - int status; - int swap_type; - BoxRec box; - RegionRec region; - - if (!event->valid) - goto cleanup; - - status = dixLookupDrawable(&drawable, event->drawable_id, serverClient, - M_ANY, DixWriteAccess); - if (status != Success) - goto cleanup; - - screen = drawable->pScreen; - scrn = xf86Screens[screen->myNum]; - info = RADEONPTR(scrn); - - switch (event->type) { - case DRI2_FLIP: - if (info->allowPageFlip && - DRI2CanFlip(drawable) && - can_exchange(scrn, drawable, event->front, event->back) && - radeon_dri2_schedule_flip(scrn, - event->client, - drawable, - event->front, - event->back, - event->event_complete, - event->event_data, - event->frame)) { - radeon_dri2_exchange_buffers(drawable, event->front, event->back); - break; - } - /* else fall through to exchange/blit */ - case DRI2_SWAP: - if (DRI2CanExchange(drawable) && - can_exchange(scrn, drawable, event->front, event->back)) { - radeon_dri2_exchange_buffers(drawable, event->front, event->back); - swap_type = DRI2_EXCHANGE_COMPLETE; - } else { - box.x1 = 0; - box.y1 = 0; - box.x2 = drawable->width; - box.y2 = drawable->height; - REGION_INIT(pScreen, ®ion, &box, 0); - radeon_dri2_copy_region(drawable, ®ion, event->front, event->back); - swap_type = DRI2_BLIT_COMPLETE; - } - - DRI2SwapComplete(event->client, drawable, frame, tv_sec, tv_usec, - swap_type, event->event_complete, event->event_data); - - break; - case DRI2_WAITMSC: - DRI2WaitMSCComplete(event->client, drawable, frame, tv_sec, tv_usec); - break; - default: - /* Unknown type */ - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "%s: unknown vblank event received\n", __func__); - break; - } - -cleanup: - radeon_dri2_unref_buffer(event->front); - radeon_dri2_unref_buffer(event->back); - if (event->valid) - ListDelDRI2ClientEvents(event->client, &event->link); - free(event); -} - -static drmVBlankSeqType populate_vbl_request_type(RADEONInfoPtr info, int crtc) -{ - drmVBlankSeqType type = 0; - - if (crtc == 1) - type |= DRM_VBLANK_SECONDARY; - else if (crtc > 1) -#ifdef DRM_VBLANK_HIGH_CRTC_SHIFT - type |= (crtc << DRM_VBLANK_HIGH_CRTC_SHIFT) & - DRM_VBLANK_HIGH_CRTC_MASK; -#else - ErrorF("radeon driver bug: %s called for CRTC %d > 1, but " - "DRM_VBLANK_HIGH_CRTC_MASK not defined at build time\n", - __func__, crtc); -#endif - - return type; -} - -/* - * Get current frame count and frame count timestamp, based on drawable's - * crtc. - */ -static int radeon_dri2_get_msc(DrawablePtr draw, CARD64 *ust, CARD64 *msc) -{ - ScreenPtr screen = draw->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; - RADEONInfoPtr info = RADEONPTR(scrn); - drmVBlank vbl; - int ret; - int crtc = radeon_dri2_drawable_crtc(draw); - - /* Drawable not displayed, make up a value */ - if (crtc == -1) { - *ust = 0; - *msc = 0; - return TRUE; - } - vbl.request.type = DRM_VBLANK_RELATIVE; - vbl.request.type |= populate_vbl_request_type(info, crtc); - vbl.request.sequence = 0; - - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); - if (ret) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "get vblank counter failed: %s\n", strerror(errno)); - return FALSE; - } - - *ust = ((CARD64)vbl.reply.tval_sec * 1000000) + vbl.reply.tval_usec; - *msc = vbl.reply.sequence; - - return TRUE; -} - -/* - * Request a DRM event when the requested conditions will be satisfied. - * - * We need to handle the event and ask the server to wake up the client when - * we receive it. - */ -static int radeon_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, - CARD64 target_msc, CARD64 divisor, - CARD64 remainder) -{ - ScreenPtr screen = draw->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; - RADEONInfoPtr info = RADEONPTR(scrn); - DRI2FrameEventPtr wait_info = NULL; - drmVBlank vbl; - int ret, crtc = radeon_dri2_drawable_crtc(draw); - CARD64 current_msc; - - /* Truncate to match kernel interfaces; means occasional overflow - * misses, but that's generally not a big deal */ - target_msc &= 0xffffffff; - divisor &= 0xffffffff; - remainder &= 0xffffffff; - - /* Drawable not visible, return immediately */ - if (crtc == -1) - goto out_complete; - - wait_info = calloc(1, sizeof(DRI2FrameEventRec)); - if (!wait_info) - goto out_complete; - - wait_info->drawable_id = draw->id; - wait_info->client = client; - wait_info->type = DRI2_WAITMSC; - wait_info->valid = TRUE; - - if (ListAddDRI2ClientEvents(client, &wait_info->link)) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "add events to client private failed.\n"); - free(wait_info); - wait_info = NULL; - goto out_complete; - } - - /* Get current count */ - vbl.request.type = DRM_VBLANK_RELATIVE; - vbl.request.type |= populate_vbl_request_type(info, crtc); - vbl.request.sequence = 0; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); - if (ret) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "get vblank counter failed: %s\n", strerror(errno)); - goto out_complete; - } - - current_msc = vbl.reply.sequence; - - /* - * If divisor is zero, or current_msc is smaller than target_msc, - * we just need to make sure target_msc passes before waking up the - * client. - */ - if (divisor == 0 || current_msc < target_msc) { - /* If target_msc already reached or passed, set it to - * current_msc to ensure we return a reasonable value back - * to the caller. This keeps the client from continually - * sending us MSC targets from the past by forcibly updating - * their count on this call. - */ - if (current_msc >= target_msc) - target_msc = current_msc; - vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT; - vbl.request.type |= populate_vbl_request_type(info, crtc); - vbl.request.sequence = target_msc; - vbl.request.signal = (unsigned long)wait_info; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); - if (ret) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "get vblank counter failed: %s\n", strerror(errno)); - goto out_complete; - } - - wait_info->frame = vbl.reply.sequence; - DRI2BlockClient(client, draw); - return TRUE; - } - - /* - * If we get here, target_msc has already passed or we don't have one, - * so we queue an event that will satisfy the divisor/remainder equation. - */ - vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT; - vbl.request.type |= populate_vbl_request_type(info, crtc); - - vbl.request.sequence = current_msc - (current_msc % divisor) + - remainder; - - /* - * If calculated remainder is larger than requested remainder, - * it means we've passed the last point where - * seq % divisor == remainder, so we need to wait for the next time - * that will happen. - */ - if ((current_msc % divisor) >= remainder) - vbl.request.sequence += divisor; - - vbl.request.signal = (unsigned long)wait_info; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); - if (ret) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "get vblank counter failed: %s\n", strerror(errno)); - goto out_complete; - } - - wait_info->frame = vbl.reply.sequence; - DRI2BlockClient(client, draw); - - return TRUE; - -out_complete: - if (wait_info) { - ListDelDRI2ClientEvents(wait_info->client, &wait_info->link); - free(wait_info); - } - DRI2WaitMSCComplete(client, draw, target_msc, 0, 0); - return TRUE; -} - -void radeon_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, void *event_data) -{ - DRI2FrameEventPtr flip = event_data; - DrawablePtr drawable; - ScreenPtr screen; - ScrnInfoPtr scrn; - int status; - PixmapPtr pixmap; - - status = dixLookupDrawable(&drawable, flip->drawable_id, serverClient, - M_ANY, DixWriteAccess); - if (status != Success) { - free(flip); - return; - } - - screen = drawable->pScreen; - scrn = xf86Screens[screen->myNum]; - - pixmap = screen->GetScreenPixmap(screen); - xf86DrvMsgVerb(scrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "%s:%d fevent[%p] width %d pitch %d (/4 %d)\n", - __func__, __LINE__, flip, pixmap->drawable.width, pixmap->devKind, pixmap->devKind/4); - - /* We assume our flips arrive in order, so we don't check the frame */ - switch (flip->type) { - case DRI2_SWAP: - /* Check for too small vblank count of pageflip completion, taking wraparound - * into account. This usually means some defective kms pageflip completion, - * causing wrong (msc, ust) return values and possible visual corruption. - */ - if ((frame < flip->frame) && (flip->frame - frame < 5)) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "%s: Pageflip completion event has impossible msc %d < target_msc %d\n", - __func__, frame, flip->frame); - /* All-Zero values signal failure of (msc, ust) timestamping to client. */ - frame = tv_sec = tv_usec = 0; - } - - DRI2SwapComplete(flip->client, drawable, frame, tv_sec, tv_usec, - DRI2_FLIP_COMPLETE, flip->event_complete, - flip->event_data); - break; - default: - xf86DrvMsg(scrn->scrnIndex, X_WARNING, "%s: unknown vblank event received\n", __func__); - /* Unknown type */ - break; - } - - free(flip); -} - -/* - * ScheduleSwap is responsible for requesting a DRM vblank event for the - * appropriate frame. - * - * In the case of a blit (e.g. for a windowed swap) or buffer exchange, - * the vblank requested can simply be the last queued swap frame + the swap - * interval for the drawable. - * - * In the case of a page flip, we request an event for the last queued swap - * frame + swap interval - 1, since we'll need to queue the flip for the frame - * immediately following the received event. - * - * The client will be blocked if it tries to perform further GL commands - * after queueing a swap, though in the Intel case after queueing a flip, the - * client is free to queue more commands; they'll block in the kernel if - * they access buffers busy with the flip. - * - * When the swap is complete, the driver should call into the server so it - * can send any swap complete events that have been requested. - */ -static int radeon_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, - DRI2BufferPtr front, DRI2BufferPtr back, - CARD64 *target_msc, CARD64 divisor, - CARD64 remainder, DRI2SwapEventPtr func, - void *data) -{ - ScreenPtr screen = draw->pScreen; - ScrnInfoPtr scrn = xf86Screens[screen->myNum]; - RADEONInfoPtr info = RADEONPTR(scrn); - drmVBlank vbl; - int ret, crtc= radeon_dri2_drawable_crtc(draw), flip = 0; - DRI2FrameEventPtr swap_info = NULL; - enum DRI2FrameEventType swap_type = DRI2_SWAP; - CARD64 current_msc; - BoxRec box; - RegionRec region; - - /* Truncate to match kernel interfaces; means occasional overflow - * misses, but that's generally not a big deal */ - *target_msc &= 0xffffffff; - divisor &= 0xffffffff; - remainder &= 0xffffffff; - - /* radeon_dri2_frame_event_handler will get called some unknown time in the - * future with these buffers. Take a reference to ensure that they won't - * get destroyed before then. - */ - radeon_dri2_ref_buffer(front); - radeon_dri2_ref_buffer(back); - - /* Drawable not displayed... just complete the swap */ - if (crtc == -1) - goto blit_fallback; - - swap_info = calloc(1, sizeof(DRI2FrameEventRec)); - if (!swap_info) - goto blit_fallback; - - swap_info->drawable_id = draw->id; - swap_info->client = client; - swap_info->event_complete = func; - swap_info->event_data = data; - swap_info->front = front; - swap_info->back = back; - swap_info->valid = TRUE; - if (ListAddDRI2ClientEvents(client, &swap_info->link)) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "add events to client private failed.\n"); - free(swap_info); - swap_info = NULL; - goto blit_fallback; - } - - /* Get current count */ - vbl.request.type = DRM_VBLANK_RELATIVE; - vbl.request.type |= populate_vbl_request_type(info, crtc); - vbl.request.sequence = 0; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); - if (ret) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "first get vblank counter failed: %s\n", - strerror(errno)); - goto blit_fallback; - } - - current_msc = vbl.reply.sequence; - - /* Flips need to be submitted one frame before */ - if (info->allowPageFlip && - DRI2CanFlip(draw) && - can_exchange(scrn, draw, front, back)) { - swap_type = DRI2_FLIP; - flip = 1; - } - - swap_info->type = swap_type; - - /* Correct target_msc by 'flip' if swap_type == DRI2_FLIP. - * Do it early, so handling of different timing constraints - * for divisor, remainder and msc vs. target_msc works. - */ - if (*target_msc > 0) - *target_msc -= flip; - - /* - * If divisor is zero, or current_msc is smaller than target_msc - * we just need to make sure target_msc passes before initiating - * the swap. - */ - if (divisor == 0 || current_msc < *target_msc) { - vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT; - /* If non-pageflipping, but blitting/exchanging, we need to use - * DRM_VBLANK_NEXTONMISS to avoid unreliable timestamping later - * on. - */ - if (flip == 0) - vbl.request.type |= DRM_VBLANK_NEXTONMISS; - vbl.request.type |= populate_vbl_request_type(info, crtc); - - /* If target_msc already reached or passed, set it to - * current_msc to ensure we return a reasonable value back - * to the caller. This makes swap_interval logic more robust. - */ - if (current_msc >= *target_msc) - *target_msc = current_msc; - - vbl.request.sequence = *target_msc; - vbl.request.signal = (unsigned long)swap_info; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); - if (ret) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "divisor 0 get vblank counter failed: %s\n", - strerror(errno)); - goto blit_fallback; - } - - *target_msc = vbl.reply.sequence + flip; - swap_info->frame = *target_msc; - - return TRUE; - } - - /* - * If we get here, target_msc has already passed or we don't have one, - * and we need to queue an event that will satisfy the divisor/remainder - * equation. - */ - vbl.request.type = DRM_VBLANK_ABSOLUTE | DRM_VBLANK_EVENT; - if (flip == 0) - vbl.request.type |= DRM_VBLANK_NEXTONMISS; - vbl.request.type |= populate_vbl_request_type(info, crtc); - - vbl.request.sequence = current_msc - (current_msc % divisor) + - remainder; - - /* - * If the calculated deadline vbl.request.sequence is smaller than - * or equal to current_msc, it means we've passed the last point - * when effective onset frame seq could satisfy - * seq % divisor == remainder, so we need to wait for the next time - * this will happen. - - * This comparison takes the 1 frame swap delay in pageflipping mode - * into account, as well as a potential DRM_VBLANK_NEXTONMISS delay - * if we are blitting/exchanging instead of flipping. - */ - if (vbl.request.sequence <= current_msc) - vbl.request.sequence += divisor; - - /* Account for 1 frame extra pageflip delay if flip > 0 */ - vbl.request.sequence -= flip; - - vbl.request.signal = (unsigned long)swap_info; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); - if (ret) { - xf86DrvMsg(scrn->scrnIndex, X_WARNING, - "final get vblank counter failed: %s\n", - strerror(errno)); - goto blit_fallback; - } - - /* Adjust returned value for 1 fame pageflip offset of flip > 0 */ - *target_msc = vbl.reply.sequence + flip; - swap_info->frame = *target_msc; - - return TRUE; - -blit_fallback: - box.x1 = 0; - box.y1 = 0; - box.x2 = draw->width; - box.y2 = draw->height; - REGION_INIT(pScreen, ®ion, &box, 0); - - radeon_dri2_copy_region(draw, ®ion, front, back); - - DRI2SwapComplete(client, draw, 0, 0, 0, DRI2_BLIT_COMPLETE, func, data); - if (swap_info) { - ListDelDRI2ClientEvents(swap_info->client, &swap_info->link); - free(swap_info); - } - - radeon_dri2_unref_buffer(front); - radeon_dri2_unref_buffer(back); - - *target_msc = 0; /* offscreen, so zero out target vblank count */ - return TRUE; -} - -#endif /* USE_DRI2_SCHEDULING */ - - -Bool -radeon_dri2_screen_init(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - DRI2InfoRec dri2_info = { 0 }; -#ifdef USE_DRI2_SCHEDULING - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - const char *driverNames[2]; - Bool scheduling_works = TRUE; -#endif - - if (!info->useEXA) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DRI2 requires EXA\n"); - return FALSE; - } - - info->dri2.device_name = drmGetDeviceNameFromFd(info->dri2.drm_fd); - - if ( (info->ChipFamily >= CHIP_FAMILY_R600) ) { - dri2_info.driverName = R600_DRIVER_NAME; - } else if ( (info->ChipFamily >= CHIP_FAMILY_R300) ) { - dri2_info.driverName = R300_DRIVER_NAME; - } else if ( info->ChipFamily >= CHIP_FAMILY_R200 ) { - dri2_info.driverName = R200_DRIVER_NAME; - } else { - dri2_info.driverName = RADEON_DRIVER_NAME; - } - dri2_info.fd = info->dri2.drm_fd; - dri2_info.deviceName = info->dri2.device_name; -#ifndef USE_DRI2_1_1_0 - dri2_info.version = 1; - dri2_info.CreateBuffers = radeon_dri2_create_buffers; - dri2_info.DestroyBuffers = radeon_dri2_destroy_buffers; -#else - dri2_info.version = DRI2INFOREC_VERSION; - dri2_info.CreateBuffer = radeon_dri2_create_buffer; - dri2_info.DestroyBuffer = radeon_dri2_destroy_buffer; -#endif - dri2_info.CopyRegion = radeon_dri2_copy_region; - -#ifdef USE_DRI2_SCHEDULING - if (info->dri->pKernelDRMVersion->version_minor < 4) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "You need a newer kernel for " - "sync extension\n"); - scheduling_works = FALSE; - } - - if (scheduling_works && info->drmmode.mode_res->count_crtcs > 2) { -#ifdef DRM_CAP_VBLANK_HIGH_CRTC - uint64_t cap_value; - - if (drmGetCap(info->dri2.drm_fd, DRM_CAP_VBLANK_HIGH_CRTC, &cap_value)) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "You need a newer kernel " - "for VBLANKs on CRTC > 1\n"); - scheduling_works = FALSE; - } else if (!cap_value) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Your kernel does not " - "handle VBLANKs on CRTC > 1\n"); - scheduling_works = FALSE; - } -#else - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "You need to rebuild against a " - "newer libdrm to handle VBLANKs on CRTC > 1\n"); - scheduling_works = FALSE; -#endif - } - - if (scheduling_works) { - dri2_info.version = 4; - dri2_info.ScheduleSwap = radeon_dri2_schedule_swap; - dri2_info.GetMSC = radeon_dri2_get_msc; - dri2_info.ScheduleWaitMSC = radeon_dri2_schedule_wait_msc; - dri2_info.numDrivers = RADEON_ARRAY_SIZE(driverNames); - dri2_info.driverNames = driverNames; - driverNames[0] = driverNames[1] = dri2_info.driverName; - - if (pRADEONEnt->dri2_info_cnt == 0) { -#if HAS_DIXREGISTERPRIVATEKEY - if (!dixRegisterPrivateKey(DRI2ClientEventsPrivateKey, - PRIVATE_CLIENT, sizeof(DRI2ClientEventsRec))) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DRI2 registering " - "private key to client failed\n"); - return FALSE; - } -#else - if (!dixRequestPrivate(DRI2ClientEventsPrivateKey, - sizeof(DRI2ClientEventsRec))) { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DRI2 requesting " - "private key to client failed\n"); - return FALSE; - } -#endif - - AddCallback(&ClientStateCallback, radeon_dri2_client_state_changed, 0); - } - - pRADEONEnt->dri2_info_cnt++; - } -#endif - - info->dri2.enabled = DRI2ScreenInit(pScreen, &dri2_info); - return info->dri2.enabled; -} - -void radeon_dri2_close_screen(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); -#ifdef USE_DRI2_SCHEDULING - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - - if (--pRADEONEnt->dri2_info_cnt == 0) - DeleteCallback(&ClientStateCallback, radeon_dri2_client_state_changed, 0); -#endif - DRI2CloseScreen(pScreen); - drmFree(info->dri2.device_name); -} - -#endif diff --git a/driver/xf86-video-ati/src/radeon_dri2.h b/driver/xf86-video-ati/src/radeon_dri2.h deleted file mode 100644 index 799528623..000000000 --- a/driver/xf86-video-ati/src/radeon_dri2.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2008 Jerome Glisse - * - * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. - */ -#ifndef RADEON_DRI2_H -#define RADEON_DRI2_H - -struct radeon_dri2 { - int drm_fd; - Bool enabled; - char *device_name; -}; - -#ifdef RADEON_DRI2 -#include "dri2.h" -Bool radeon_dri2_screen_init(ScreenPtr pScreen); -void radeon_dri2_close_screen(ScreenPtr pScreen); -#endif - -int drmmode_get_crtc_id(xf86CrtcPtr crtc); -xf86CrtcPtr radeon_covering_crtc(ScrnInfoPtr pScrn, BoxPtr box, - xf86CrtcPtr desired, BoxPtr crtc_box_ret); -void radeon_dri2_frame_event_handler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, void *event_data); -void radeon_dri2_flip_event_handler(unsigned int frame, unsigned int tv_sec, - unsigned int tv_usec, void *event_data); - -#endif diff --git a/driver/xf86-video-ati/src/radeon_driver.c b/driver/xf86-video-ati/src/radeon_driver.c index 2e2c7932a..58ab7908c 100644 --- a/driver/xf86-video-ati/src/radeon_driver.c +++ b/driver/xf86-video-ati/src/radeon_driver.c @@ -92,9 +92,11 @@ /* X and server generic header files */ #include "xf86.h" #include "xf86_OSproc.h" -#include "xf86RandR12.h" -#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 7 #include "xf86RAC.h" +#endif +#include "xf86RandR12.h" +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 7 #include "xf86Resources.h" #endif #include "xf86cmap.h" @@ -106,14 +108,13 @@ #include "vgaHW.h" #endif -#ifdef HAVE_XEXTPROTO_71 +#ifdef HAVE_X11_EXTENSIONS_DPMSCONST_H #include #else #define DPMS_SERVER #include #endif - #include "atipciids.h" #include "radeon_chipset_gen.h" @@ -125,6 +126,8 @@ static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen); static Bool RADEONSaveScreen(ScreenPtr pScreen, int mode); static void RADEONSave(ScrnInfoPtr pScrn); +static void RADEONSetDynamicClock(ScrnInfoPtr pScrn, int mode); +static void RADEONForceSomeClocks(ScrnInfoPtr pScrn); static void RADEONSaveMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save); static void @@ -161,7 +164,6 @@ static const OptionInfoRec RADEONOptions[] = { #endif #endif { OPTION_IGNORE_EDID, "IgnoreEDID", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_CUSTOM_EDID, "CustomEDID", OPTV_ANYSTR, {0}, FALSE }, { OPTION_DISP_PRIORITY, "DisplayPriority", OPTV_ANYSTR, {0}, FALSE }, { OPTION_PANEL_SIZE, "PanelSize", OPTV_ANYSTR, {0}, FALSE }, { OPTION_MIN_DOTCLOCK, "ForceMinDotClock", OPTV_FREQ, {0}, FALSE }, @@ -181,7 +183,8 @@ static const OptionInfoRec RADEONOptions[] = { { OPTION_RENDER_ACCEL, "RenderAccel", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_SUBPIXEL_ORDER, "SubPixelOrder", OPTV_ANYSTR, {0}, FALSE }, #endif - { OPTION_CLOCK_GATING, "ClockGating", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_SHOWCACHE, "ShowCache", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_DYNAMIC_CLOCKS, "DynamicClocks", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_VGA_ACCESS, "VGAAccess", OPTV_BOOLEAN, {0}, TRUE }, { OPTION_REVERSE_DDC, "ReverseDDC", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_LVDS_PROBE_PLL, "LVDSProbePLL", OPTV_BOOLEAN, {0}, FALSE }, @@ -202,10 +205,6 @@ static const OptionInfoRec RADEONOptions[] = { { OPTION_EXA_VSYNC, "EXAVSync", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_ATOM_TVOUT, "ATOMTVOut", OPTV_BOOLEAN, {0}, FALSE }, { OPTION_R4XX_ATOM, "R4xxATOM", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_FORCE_LOW_POWER, "ForceLowPowerMode", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_DYNAMIC_PM, "DynamicPM", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_NEW_PLL, "NewPLL", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_ZAPHOD_HEADS, "ZaphodHeads", OPTV_STRING, {0}, FALSE }, { -1, NULL, OPTV_NONE, {0}, FALSE } }; @@ -238,7 +237,7 @@ radeonShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode, stride = (pScrn->displayWidth * pScrn->bitsPerPixel) / 8; *size = stride; - return ((uint8_t *)info->FB + pScrn->fbOffset + row * stride + offset); + return ((uint8_t *)info->FB + row * stride + offset); } static Bool RADEONCreateScreenResources (ScreenPtr pScreen) @@ -349,7 +348,7 @@ RADEONPostInt10Check(ScrnInfoPtr pScrn, void *ptr) } /* Allocate our private RADEONInfoRec */ -Bool RADEONGetRec(ScrnInfoPtr pScrn) +static Bool RADEONGetRec(ScrnInfoPtr pScrn) { if (pScrn->driverPrivate) return TRUE; @@ -358,7 +357,7 @@ Bool RADEONGetRec(ScrnInfoPtr pScrn) } /* Free our private RADEONInfoRec */ -void RADEONFreeRec(ScrnInfoPtr pScrn) +static void RADEONFreeRec(ScrnInfoPtr pScrn) { RADEONInfoPtr info; int i; @@ -368,17 +367,17 @@ void RADEONFreeRec(ScrnInfoPtr pScrn) info = RADEONPTR(pScrn); if (info->cp) { - free(info->cp); + xfree(info->cp); info->cp = NULL; } if (info->dri) { - free(info->dri); + xfree(info->dri); info->dri = NULL; } if (info->accel_state) { - free(info->accel_state); + xfree(info->accel_state); info->accel_state = NULL; } @@ -388,15 +387,15 @@ void RADEONFreeRec(ScrnInfoPtr pScrn) if (info->encoders[i]->ref_count != 0) continue; if (info->encoders[i]->dev_priv) { - free(info->encoders[i]->dev_priv); + xfree(info->encoders[i]->dev_priv); info->encoders[i]->dev_priv = NULL; } - free(info->encoders[i]); + xfree(info->encoders[i]); info->encoders[i]= NULL; } } - free(pScrn->driverPrivate); + xfree(pScrn->driverPrivate); pScrn->driverPrivate = NULL; } @@ -405,14 +404,10 @@ void RADEONFreeRec(ScrnInfoPtr pScrn) */ static Bool RADEONMapMMIO(ScrnInfoPtr pScrn) { -#ifdef XSERVER_LIBPCIACCESS - int err; -#endif RADEONInfoPtr info = RADEONPTR(pScrn); RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); if (pRADEONEnt->MMIO) { - pRADEONEnt->MMIO_cnt++; info->MMIO = pRADEONEnt->MMIO; return TRUE; } @@ -425,15 +420,15 @@ static Bool RADEONMapMMIO(ScrnInfoPtr pScrn) info->MMIOAddr, info->MMIOSize); - if (!info->MMIO) - return FALSE; + if (!info->MMIO) return FALSE; #else - err = pci_device_map_range(info->PciInfo, + void** result = (void**)&info->MMIO; + int err = pci_device_map_range(info->PciInfo, info->MMIOAddr, info->MMIOSize, PCI_DEV_MAP_FLAG_WRITABLE, - &info->MMIO); + result); if (err) { xf86DrvMsg (pScrn->scrnIndex, X_ERROR, @@ -445,7 +440,6 @@ static Bool RADEONMapMMIO(ScrnInfoPtr pScrn) #endif pRADEONEnt->MMIO = info->MMIO; - pRADEONEnt->MMIO_cnt = 1; return TRUE; } @@ -457,8 +451,8 @@ static Bool RADEONUnmapMMIO(ScrnInfoPtr pScrn) RADEONInfoPtr info = RADEONPTR(pScrn); RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - /* refcount for zaphod */ - if (--pRADEONEnt->MMIO_cnt != 0) { + if (info->IsPrimary || info->IsSecondary) { + /* never unmap on zaphod */ info->MMIO = NULL; return TRUE; } @@ -481,13 +475,6 @@ static Bool RADEONMapFB(ScrnInfoPtr pScrn) int err; #endif RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - - if (pRADEONEnt->FB) { - pRADEONEnt->FB_cnt++; - info->FB = pRADEONEnt->FB; - return TRUE; - } xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, "Map: 0x%016llx, 0x%08lx\n", info->LinearAddr, info->FbMapSize); @@ -520,8 +507,6 @@ static Bool RADEONMapFB(ScrnInfoPtr pScrn) #endif - pRADEONEnt->FB = info->FB; - pRADEONEnt->FB_cnt = 1; return TRUE; } @@ -529,13 +514,6 @@ static Bool RADEONMapFB(ScrnInfoPtr pScrn) static Bool RADEONUnmapFB(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - - /* refcount for zaphod */ - if (--pRADEONEnt->FB_cnt != 0) { - info->FB = NULL; - return TRUE; - } #ifndef XSERVER_LIBPCIACCESS xf86UnMapVidMem(pScrn->scrnIndex, info->FB, info->FbMapSize); @@ -543,7 +521,6 @@ static Bool RADEONUnmapFB(ScrnInfoPtr pScrn) pci_device_unmap_range(info->PciInfo, info->FB, info->FbMapSize); #endif - pRADEONEnt->FB = NULL; info->FB = NULL; return TRUE; } @@ -650,12 +627,6 @@ unsigned RADEONINMC(ScrnInfoPtr pScrn, int addr) } else if (info->ChipFamily == CHIP_FAMILY_RS600) { OUTREG(RS600_MC_INDEX, ((addr & RS600_MC_ADDR_MASK) | RS600_MC_IND_CITF_ARB0)); data = INREG(RS600_MC_DATA); - } else if ((info->ChipFamily == CHIP_FAMILY_RS780) || - (info->ChipFamily == CHIP_FAMILY_RS880)) { - OUTREG(RS780_MC_INDEX, (addr & RS780_MC_INDEX_MASK)); - data = INREG(RS780_MC_DATA); - } else if (info->ChipFamily >= CHIP_FAMILY_R600) { - data = 0; } else if (IS_AVIVO_VARIANT) { OUTREG(AVIVO_MC_INDEX, (addr & 0xff) | 0x7f0000); (void)INREG(AVIVO_MC_INDEX); @@ -692,13 +663,6 @@ void RADEONOUTMC(ScrnInfoPtr pScrn, int addr, uint32_t data) RS600_MC_IND_CITF_ARB0 | RS600_MC_IND_WR_EN)); OUTREG(RS600_MC_DATA, data); - } else if ((info->ChipFamily == CHIP_FAMILY_RS780) || - (info->ChipFamily == CHIP_FAMILY_RS880)) { - OUTREG(RS780_MC_INDEX, ((addr & RS780_MC_INDEX_MASK) | - RS780_MC_INDEX_WR_EN)); - OUTREG(RS780_MC_DATA, data); - } else if (info->ChipFamily >= CHIP_FAMILY_R600) { - // do nothing } else if (IS_AVIVO_VARIANT) { OUTREG(AVIVO_MC_INDEX, (addr & 0xff) | 0xff0000); (void)INREG(AVIVO_MC_INDEX); @@ -738,40 +702,12 @@ void RADEONOUTPCIE(ScrnInfoPtr pScrn, int addr, uint32_t data) OUTREG(RADEON_PCIE_DATA, data); } -/* Read PCIE PORT register */ -unsigned R600INPCIE_PORT(ScrnInfoPtr pScrn, int addr) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - CARD32 data; - - OUTREG(R600_PCIE_PORT_INDEX, addr & 0xff); - data = INREG(R600_PCIE_PORT_DATA); - - return data; -} - -/* Write PCIE PORT register */ -void R600OUTPCIE_PORT(ScrnInfoPtr pScrn, int addr, uint32_t data) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - - OUTREG(R600_PCIE_PORT_INDEX, ((addr) & 0xff)); - OUTREG(R600_PCIE_PORT_DATA, data); -} - static Bool radeon_get_mc_idle(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - if (info->ChipFamily >= CHIP_FAMILY_CEDAR) { - if (INREG(R600_SRBM_STATUS) & 0x1f00) - return FALSE; - else - return TRUE; - } else if (info->ChipFamily >= CHIP_FAMILY_R600) { + if (info->ChipFamily >= CHIP_FAMILY_R600) { if (INREG(R600_SRBM_STATUS) & 0x3f00) return FALSE; else @@ -797,12 +733,6 @@ static Bool radeon_get_mc_idle(ScrnInfoPtr pScrn) return TRUE; else return FALSE; - } else if ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480)) { - if (INREG(RADEON_MC_STATUS) & RADEON_MC_IDLE) - return TRUE; - else - return FALSE; } else if (IS_R300_VARIANT) { if (INREG(RADEON_MC_STATUS) & R300_MC_IDLE) return TRUE; @@ -823,7 +753,6 @@ static void radeon_write_mc_fb_agp_location(ScrnInfoPtr pScrn, int mask, uint32_ RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - /* evergreen is same as r7xx */ if (info->ChipFamily >= CHIP_FAMILY_RV770) { if (mask & LOC_FB) OUTREG(R700_MC_VM_FB_LOCATION, fb_loc); @@ -874,7 +803,6 @@ static void radeon_read_mc_fb_agp_location(ScrnInfoPtr pScrn, int mask, uint32_t RADEONInfoPtr info = RADEONPTR(pScrn); unsigned char *RADEONMMIO = info->MMIO; - /* evergreen is same as r7xx */ if (info->ChipFamily >= CHIP_FAMILY_RV770) { if (mask & LOC_FB) *fb_loc = INREG(R700_MC_VM_FB_LOCATION); @@ -1215,21 +1143,20 @@ static void RADEONGetClockInfo(ScrnInfoPtr pScrn) if (RADEONGetClockInfoFromBIOS(pScrn)) { if (pll->reference_div < 2) { /* retrive it from register setting for fitting into current PLL algorithm. - We'll probably need a new routine to calculate the best ref_div from BIOS - provided min_input_pll and max_input_pll + We'll probably need a new routine to calculate the best ref_div from BIOS + provided min_input_pll and max_input_pll */ - if (!IS_AVIVO_VARIANT) { - uint32_t tmp; - tmp = INPLL(pScrn, RADEON_PPLL_REF_DIV); - if (IS_R300_VARIANT || - (info->ChipFamily == CHIP_FAMILY_RS300) || - (info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480)) { - pll->reference_div = (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT; - } else { - pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK; - } + uint32_t tmp; + tmp = INPLL(pScrn, RADEON_PPLL_REF_DIV); + if (IS_R300_VARIANT || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_RS400) || + (info->ChipFamily == CHIP_FAMILY_RS480)) { + pll->reference_div = (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT; + } else { + pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK; } + if (pll->reference_div < 2) pll->reference_div = 12; } } else { @@ -1267,13 +1194,9 @@ static void RADEONGetClockInfo(ScrnInfoPtr pScrn) if (IS_AVIVO_VARIANT) { pll->min_post_div = 2; pll->max_post_div = 0x7f; - pll->min_frac_feedback_div = 0; - pll->max_frac_feedback_div = 9; } else { pll->min_post_div = 1; pll->max_post_div = 12; //16 on crtc0 - pll->min_frac_feedback_div = 0; - pll->max_frac_feedback_div = 0; } pll->min_ref_div = 2; pll->max_ref_div = 0x3ff; @@ -1312,7 +1235,7 @@ static void RADEONGetClockInfo(ScrnInfoPtr pScrn) /* This is called by RADEONPreInit to set up the default visual */ -Bool RADEONPreInitVisual(ScrnInfoPtr pScrn) +static Bool RADEONPreInitVisual(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); @@ -1369,7 +1292,7 @@ Bool RADEONPreInitVisual(ScrnInfoPtr pScrn) } /* This is called by RADEONPreInit to handle all color weight issues */ -Bool RADEONPreInitWeight(ScrnInfoPtr pScrn) +static Bool RADEONPreInitWeight(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); @@ -1427,17 +1350,7 @@ static void RADEONInitMemoryMap(ScrnInfoPtr pScrn) /* We shouldn't use info->videoRam here which might have been clipped * but the real video RAM instead */ - if (info->ChipFamily >= CHIP_FAMILY_PALM) { - /* size in bytes on fusion */ - mem_size = INREG(R600_CONFIG_MEMSIZE); - /* size in MB on fusion */ - aper_size = INREG(R600_CONFIG_APER_SIZE) * 1024 * 1024; - } else if (info->ChipFamily >= CHIP_FAMILY_CEDAR) { - /* size in MB on evergreen */ - /* XXX watch for overflow!!! */ - mem_size = INREG(R600_CONFIG_MEMSIZE) * 1024 * 1024; - aper_size = INREG(R600_CONFIG_APER_SIZE) * 1024 * 1024; - } else if (info->ChipFamily >= CHIP_FAMILY_R600) { + if (info->ChipFamily >= CHIP_FAMILY_R600) { mem_size = INREG(R600_CONFIG_MEMSIZE); aper_size = INREG(R600_CONFIG_APER_SIZE); } else { @@ -1453,18 +1366,6 @@ static void RADEONInitMemoryMap(ScrnInfoPtr pScrn) if (aper_size > mem_size) mem_size = aper_size; - /* don't map the whole FB in the internal address space. - * we don't currently use fb space larger than the aperture - * size and on cards with more than 512 MB of vram, this can overflow - * the internal top of gart calculation on some systems. - * Limit it to cards with more than 512 MB as this causes problems - * on some other cards due to the way the ddx and drm set up the - * internal memory map. - * See fdo bug 24301. - */ - if (mem_size > 0x20000000) - mem_size = aper_size; - #ifdef XF86DRI /* Apply memory map limitation if using an old DRI */ if (info->directRenderingEnabled && !info->dri->newMemoryMap) { @@ -1477,10 +1378,7 @@ static void RADEONInitMemoryMap(ScrnInfoPtr pScrn) (info->ChipFamily != CHIP_FAMILY_RS690) && (info->ChipFamily != CHIP_FAMILY_RS740) && (info->ChipFamily != CHIP_FAMILY_RS780) && - (info->ChipFamily != CHIP_FAMILY_RS880) && - (info->ChipFamily != CHIP_FAMILY_PALM) && - (info->ChipFamily != CHIP_FAMILY_SUMO) && - (info->ChipFamily != CHIP_FAMILY_SUMO2)) { + (info->ChipFamily != CHIP_FAMILY_RS880)) { if (info->IsIGP) info->mc_fb_location = INREG(RADEON_NB_TOM); else @@ -1528,9 +1426,9 @@ static void RADEONInitMemoryMap(ScrnInfoPtr pScrn) } } if (info->ChipFamily >= CHIP_FAMILY_R600) { - info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 24; + info->fbLocation = (info->mc_fb_location & 0xffff) << 24; } else { - info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 16; + info->fbLocation = (info->mc_fb_location & 0xffff) << 16; } /* Just disable the damn AGP apertures for now, it may be * re-enabled later by the DRM @@ -1660,10 +1558,7 @@ static uint32_t RADEONGetAccessibleVRAM(ScrnInfoPtr pScrn) uint32_t aper_size; unsigned char byte; - if (info->ChipFamily >= CHIP_FAMILY_CEDAR) - /* size in MB on evergreen and fusion */ - aper_size = INREG(R600_CONFIG_APER_SIZE) * 1024; - else if (info->ChipFamily >= CHIP_FAMILY_R600) + if (info->ChipFamily >= CHIP_FAMILY_R600) aper_size = INREG(R600_CONFIG_APER_SIZE) / 1024; else aper_size = INREG(RADEON_CONFIG_APER_SIZE) / 1024; @@ -1725,7 +1620,7 @@ static uint32_t RADEONGetAccessibleVRAM(ScrnInfoPtr pScrn) */ if (INREG(RADEON_HOST_PATH_CNTL) & RADEON_HDP_APER_CNTL) return aper_size * 2; - + return aper_size; } @@ -1746,14 +1641,7 @@ static Bool RADEONPreInitVRAM(ScrnInfoPtr pScrn) OUTREG(RADEON_CONFIG_MEMSIZE, pScrn->videoRam * 1024); } else { - if (info->ChipFamily >= CHIP_FAMILY_PALM) - /* R600_CONFIG_MEMSIZE is bytes on fusion */ - pScrn->videoRam = INREG(R600_CONFIG_MEMSIZE) / 1024; - else if (info->ChipFamily >= CHIP_FAMILY_CEDAR) - /* R600_CONFIG_MEMSIZE is MB on evergreen */ - /* XXX watch for overflow!!! */ - pScrn->videoRam = INREG(R600_CONFIG_MEMSIZE) * 1024; - else if (info->ChipFamily >= CHIP_FAMILY_R600) + if (info->ChipFamily >= CHIP_FAMILY_R600) pScrn->videoRam = INREG(R600_CONFIG_MEMSIZE) / 1024; else { /* Read VRAM size from card */ @@ -1802,21 +1690,23 @@ static Bool RADEONPreInitVRAM(ScrnInfoPtr pScrn) xf86DrvMsg(pScrn->scrnIndex, from, "Mapped VideoRAM: %d kByte (%d bit %s SDRAM)\n", pScrn->videoRam, info->RamWidth, info->IsDDR?"DDR":"SDR"); - /* Do this before we truncate since we only map fb once */ - info->FbMapSize = (pScrn->videoRam & ~1023) * 1024; - if (info->IsPrimary) { pScrn->videoRam /= 2; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %dk of videoram for primary head\n", pScrn->videoRam); - } else if (info->IsSecondary) { + } + + if (info->IsSecondary) { pScrn->videoRam /= 2; + info->LinearAddr += pScrn->videoRam * 1024; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %dk of videoram for secondary head\n", pScrn->videoRam); } + pScrn->videoRam &= ~1023; + info->FbMapSize = pScrn->videoRam * 1024; /* if the card is PCI Express reserve the last 32k for the gart table */ #ifdef XF86DRI @@ -1899,14 +1789,6 @@ static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn) } } - if (info->ChipFamily >= CHIP_FAMILY_SUMO) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Chipset: \"%s\" (ChipID = 0x%04x) requires KMS\n", - pScrn->chipset, - info->Chipset); - return FALSE; - } - switch (info->Chipset) { case PCI_CHIP_RN50_515E: /* RN50 is based on the RV100 but 3D isn't guaranteed to work. YMMV. */ case PCI_CHIP_RN50_5969: @@ -1917,24 +1799,19 @@ static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn) case PCI_CHIP_RV100_QY: case PCI_CHIP_RV100_QZ: /* DELL triple-head configuration. */ - if (((PCI_SUB_VENDOR_ID(info->PciInfo) == PCI_VENDOR_DELL) && - ((PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016c) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016d) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016e) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016f) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0170) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x017d) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x017e) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0183) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x018a) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x019a) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x01b1) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x01b2) || - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0205))) || - ((PCI_SUB_VENDOR_ID(info->PciInfo) == PCI_VENDOR_HP) && - (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x31fb))) { + if ((PCI_SUB_VENDOR_ID(info->PciInfo) == PCI_VENDOR_DELL) && + ((PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016c) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016d) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016e) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x016f) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0170) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x017d) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x017e) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x0183) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x018a) || + (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x019a))) { info->IsDellServer = TRUE; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DELL/HP server detected, force to special setup\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "DELL server detected, force to special setup\n"); } break; case PCI_CHIP_RS482_5974: @@ -1948,6 +1825,16 @@ static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn) break; } + if (info->ChipFamily >= CHIP_FAMILY_R600) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "R600 support is mostly incomplete and very experimental\n"); + } + + if ((info->ChipFamily >= CHIP_FAMILY_RV515) && (info->ChipFamily < CHIP_FAMILY_R600)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "R500 support is under development. Please report any issues to xorg-driver-ati@lists.x.org\n"); + } + from = X_PROBED; info->LinearAddr = PCI_REGION_BASE(info->PciInfo, 0, REGION_MEM) & ~0x1ffffffULL; pScrn->memPhysBase = info->LinearAddr; @@ -1970,6 +1857,14 @@ static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn) /* BIOS */ from = X_PROBED; info->BIOSAddr = info->PciInfo->biosBase & 0xfffe0000; + if (dev->BiosBase) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "BIOS address override, using 0x%08lx instead of 0x%08lx\n", + (unsigned long)dev->BiosBase, + (unsigned long)info->BIOSAddr); + info->BIOSAddr = dev->BiosBase; + from = X_CONFIG; + } if (info->BIOSAddr) { xf86DrvMsg(pScrn->scrnIndex, from, "BIOS at 0x%08lx\n", (unsigned long)info->BIOSAddr); @@ -2058,6 +1953,7 @@ static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn) } } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s card detected\n", (info->cardType==CARD_PCI) ? "PCI" : (info->cardType==CARD_PCIE) ? "PCIE" : "AGP"); @@ -2066,11 +1962,6 @@ static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn) if (info->cardType == CARD_PCIE && info->IsIGP) info->cardType = CARD_PCI; - /* some rs4xx cards report as agp */ - if ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480)) - info->cardType = CARD_PCI; - if ((info->ChipFamily >= CHIP_FAMILY_R600) && info->IsIGP) info->cardType = CARD_PCIE; @@ -2082,27 +1973,23 @@ static Bool RADEONPreInitChipType(ScrnInfoPtr pScrn) if (strcmp(s, "AGP") == 0) { info->cardType = CARD_AGP; xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into AGP mode\n"); - } else if ((strcmp(s, "PCI") == 0) || - (strcmp(s, "PCIE") == 0)) { - if ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480) || - (info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740)) { - info->cardType = CARD_PCI; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI mode\n"); - } else if (info->ChipFamily >= CHIP_FAMILY_RV380) { - info->cardType = CARD_PCIE; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI Express mode\n"); - } else { - info->cardType = CARD_PCI; - xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI mode\n"); - } + } else if (strcmp(s, "PCI") == 0) { + info->cardType = CARD_PCI; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI mode\n"); + } else if (strcmp(s, "PCIE") == 0) { + info->cardType = CARD_PCIE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Forced into PCI Express mode\n"); } else { xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Invalid BusType option, using detected type\n"); } } #endif + xf86GetOptValBool(info->Options, OPTION_SHOWCACHE, &info->showCache); + if (info->showCache) + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option ShowCache enabled\n"); + #ifdef RENDER info->RenderAccel = xf86ReturnOptValBool(info->Options, OPTION_RENDER_ACCEL, info->Chipset != PCI_CHIP_RN50_515E && @@ -2168,11 +2055,8 @@ static Bool RADEONPreInitAccel(ScrnInfoPtr pScrn) #if defined(USE_EXA) && defined(USE_XAA) char *optstr; #endif -#ifdef XF86DRI /* zaphod FbMapSize is wrong, but no dri then */ - int maxy = info->FbMapSize / (pScrn->displayWidth * info->CurrentLayout.pixel_bytes); -#endif - if (!(info->accel_state = calloc(1, sizeof(struct radeon_accel_state)))) { + if (!(info->accel_state = xcalloc(1, sizeof(struct radeon_accel_state)))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to allocate accel_state rec!\n"); return FALSE; } @@ -2191,22 +2075,13 @@ static Bool RADEONPreInitAccel(ScrnInfoPtr pScrn) info->accel_state->has_tcl = TRUE; } - /* if we have shadow fb bail */ - if (info->r600_shadow_fb) { - info->useEXA = FALSE; - return TRUE; - } + info->useEXA = FALSE; -#ifdef XF86DRI - if ((!info->directRenderingEnabled) || - (maxy <= pScrn->virtualY * 3) || - (pScrn->videoRam <= 32768)) - info->useEXA = FALSE; - else + if (info->ChipFamily >= CHIP_FAMILY_R600) { + xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, + "Will attempt to use R6xx/R7xx EXA support if DRI is enabled.\n"); info->useEXA = TRUE; -#else - info->useEXA = FALSE; -#endif + } if (!xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, FALSE)) { int errmaj = 0, errmin = 0; @@ -2221,23 +2096,16 @@ static Bool RADEONPreInitAccel(ScrnInfoPtr pScrn) info->useEXA = TRUE; } else if (xf86NameCmp(optstr, "XAA") == 0) { from = X_CONFIG; - if (info->ChipFamily < CHIP_FAMILY_R600) - info->useEXA = FALSE; } } #else /* USE_XAA */ info->useEXA = TRUE; #endif /* !USE_XAA */ -#else - info->useEXA = FALSE; #endif /* USE_EXA */ if (info->ChipFamily < CHIP_FAMILY_R600) xf86DrvMsg(pScrn->scrnIndex, from, "Using %s acceleration architecture\n", info->useEXA ? "EXA" : "XAA"); - else - xf86DrvMsg(pScrn->scrnIndex, X_DEFAULT, - "Will attempt to use R6xx/R7xx EXA support if DRI is enabled.\n"); #ifdef USE_EXA if (info->useEXA) { @@ -2273,9 +2141,6 @@ static Bool RADEONPreInitAccel(ScrnInfoPtr pScrn) } } #endif /* USE_XAA */ - } else { - /* NoAccel */ - info->useEXA = FALSE; } return TRUE; @@ -2339,19 +2204,18 @@ static Bool RADEONPreInitInt10(ScrnInfoPtr pScrn, xf86Int10InfoPtr *ppInt10) static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); - Bool ret; MessageType from; char *reason; info->directRenderingEnabled = FALSE; info->directRenderingInited = FALSE; - if (!(info->dri = calloc(1, sizeof(struct radeon_dri)))) { + if (!(info->dri = xcalloc(1, sizeof(struct radeon_dri)))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Unable to allocate dri rec!\n"); return FALSE; } - if (!(info->cp = calloc(1, sizeof(struct radeon_cp)))) { + if (!(info->cp = xcalloc(1, sizeof(struct radeon_cp)))) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Unable to allocate cp rec!\n"); return FALSE; } @@ -2371,12 +2235,6 @@ static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn) if (info->IsSecondary) return FALSE; - if (info->ChipFamily >= CHIP_FAMILY_CEDAR) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "No DRI yet on Evergreen\n"); - return FALSE; - } - if (info->Chipset == PCI_CHIP_RN50_515E || info->Chipset == PCI_CHIP_RN50_5969) { if (xf86ReturnOptValBool(info->Options, OPTION_DRI, FALSE)) { @@ -2391,6 +2249,9 @@ static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn) } } + if (info->ChipFamily == CHIP_FAMILY_RS880) + return FALSE; + if (!xf86ReturnOptValBool(info->Options, OPTION_DRI, TRUE)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering forced off\n"); @@ -2406,9 +2267,8 @@ static Bool RADEONPreInitDRI(ScrnInfoPtr pScrn) info->dri->pLibDRMVersion = NULL; info->dri->pKernelDRMVersion = NULL; - ret = RADEONDRIGetVersion(pScrn); - if (ret <= 0) - return ret; + if (!RADEONDRIGetVersion(pScrn)) + return FALSE; xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] Found DRI library version %d.%d.%d and kernel" @@ -2735,11 +2595,7 @@ static Bool RADEONPreInitXv(ScrnInfoPtr pScrn) switch(info->ChipFamily){ case CHIP_FAMILY_R200: case CHIP_FAMILY_R300: - case CHIP_FAMILY_R350: case CHIP_FAMILY_RV350: - case CHIP_FAMILY_RV380: - case CHIP_FAMILY_R420: - case CHIP_FAMILY_RV410: info->overlay_scaler_buffer_width = 1920; break; default: @@ -2830,61 +2686,19 @@ RADEONPreInitBIOS(ScrnInfoPtr pScrn, xf86Int10InfoPtr pInt10) return TRUE; } -Bool -RADEONZaphodStringMatches(ScrnInfoPtr pScrn, const char *s, char *output_name) -{ - int i = 0; - char s1[20]; - - do { - switch(*s) { - case ',': - s1[i] = '\0'; - i = 0; - if (strcmp(s1, output_name) == 0) - return TRUE; - break; - case ' ': - case '\t': - case '\n': - case '\r': - break; - default: - s1[i] = *s; - i++; - break; - } - } while(*s++); - - s1[i] = '\0'; - if (strcmp(s1, output_name) == 0) - return TRUE; - - return FALSE; -} - static void RADEONFixZaphodOutputs(ScrnInfoPtr pScrn) { RADEONInfoPtr info = RADEONPTR(pScrn); xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); - int o; - char *s; - if ((s = xf86GetOptValString(info->Options, OPTION_ZAPHOD_HEADS))) { - for (o = config->num_output; o > 0; o--) { - if (!RADEONZaphodStringMatches(pScrn, s, config->output[o - 1]->name)) - xf86OutputDestroy(config->output[o - 1]); + if (info->IsPrimary) { + xf86OutputDestroy(config->output[0]); + while(config->num_output > 1) { + xf86OutputDestroy(config->output[1]); } } else { - if (info->IsPrimary) { - xf86OutputDestroy(config->output[0]); - while (config->num_output > 1) { - xf86OutputDestroy(config->output[1]); - } - } else { - while (config->num_output > 1) { - xf86OutputDestroy(config->output[1]); - } + while(config->num_output > 1) { + xf86OutputDestroy(config->output[1]); } } } @@ -2897,21 +2711,18 @@ static Bool RADEONPreInitControllers(ScrnInfoPtr pScrn) int mask; int found = 0; - if (info->IsPrimary) - mask = 1; - else if (info->IsSecondary) - mask = 2; - else + if (!info->IsPrimary && !info->IsSecondary) mask = 3; - + else if (info->IsPrimary) + mask = 1; + else + mask = 2; + if (!RADEONAllocateControllers(pScrn, mask)) return FALSE; RADEONGetClockInfo(pScrn); - if (info->IsAtomBios && info->IsIGP) - RADEONATOMGetIGPInfo(pScrn); - if (!RADEONSetupConnectors(pScrn)) { return FALSE; } @@ -2920,7 +2731,7 @@ static Bool RADEONPreInitControllers(ScrnInfoPtr pScrn) /* fixup outputs for zaphod */ RADEONFixZaphodOutputs(pScrn); } - + RADEONPrintPortMap(pScrn); info->first_load_no_devices = FALSE; @@ -2955,7 +2766,6 @@ RADEONProbeDDC(ScrnInfoPtr pScrn, int indx) if (xf86LoadSubModule(pScrn, "vbe")) { pVbe = VBEInit(NULL,indx); ConfiguredMonitor = vbeDoEDID(pVbe, NULL); - vbeFree(pVbe); } } @@ -2979,6 +2789,7 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) xf86Int10InfoPtr pInt10 = NULL; void *int10_save = NULL; const char *s; + int crtc_max_X, crtc_max_Y; RADEONEntPtr pRADEONEnt; DevUnion* pPriv; @@ -2993,7 +2804,6 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) info->IsSecondary = FALSE; info->IsPrimary = FALSE; - info->kms_enabled = FALSE; info->pEnt = xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]); if (info->pEnt->location.type != BUS_PCI) goto fail; @@ -3083,7 +2893,7 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) PCI_DEV_DEV(info->PciInfo), PCI_DEV_FUNC(info->PciInfo)); -#ifndef XSERVER_LIBPCIACCESS +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 7 if (xf86RegisterResources(info->pEnt->index, 0, ResExclusive)) goto fail; xf86SetOperatingState(resVga, info->pEnt->index, ResUnusedOpr); @@ -3103,7 +2913,7 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) /* We can't do this until we have a pScrn->display. */ xf86CollectOptions(pScrn, NULL); - if (!(info->Options = malloc(sizeof(RADEONOptions)))) + if (!(info->Options = xalloc(sizeof(RADEONOptions)))) goto fail; memcpy(info->Options, RADEONOptions, sizeof(RADEONOptions)); @@ -3170,8 +2980,6 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) * memory map */ info->directRenderingEnabled = RADEONPreInitDRI(pScrn); - if (info->directRenderingEnabled < 0) - goto fail; #endif if (!info->directRenderingEnabled) { if (info->ChipFamily >= CHIP_FAMILY_R600) { @@ -3188,16 +2996,60 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) RADEONPreInitColorTiling(pScrn); - if (IS_AVIVO_VARIANT) - xf86CrtcSetSizeRange (pScrn, 320, 200, 8192, 8192); - else - xf86CrtcSetSizeRange (pScrn, 320, 200, 4096, 4096); + /* we really need an FB manager... */ + if (pScrn->display->virtualX) { + crtc_max_X = pScrn->display->virtualX; + crtc_max_Y = pScrn->display->virtualY; + if (info->allowColorTiling) { + if (crtc_max_X > info->MaxSurfaceWidth || + crtc_max_Y > info->MaxLines) { + info->allowColorTiling = FALSE; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Requested desktop size exceeds surface limts for tiling, ColorTiling disabled\n"); + } + } + if (crtc_max_X > 8192) + crtc_max_X = 8192; + if (crtc_max_Y > 8192) + crtc_max_Y = 8192; + } else { + /* + * note that these aren't really the CRTC limits, they're just + * heuristics until we have a better memory manager. + */ + if (pScrn->videoRam <= 16384) { + crtc_max_X = 1600; + crtc_max_Y = 1200; + } else if (IS_R300_VARIANT) { + crtc_max_X = 2560; + crtc_max_Y = 1200; + } else if (IS_AVIVO_VARIANT) { + crtc_max_X = 2560; + crtc_max_Y = 1600; + } else { + crtc_max_X = 2048; + crtc_max_Y = 1200; + } + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Max desktop size set to %dx%d\n", + crtc_max_X, crtc_max_Y); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "For a larger or smaller max desktop size, add a Virtual line to your xorg.conf\n"); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "If you are having trouble with 3D, " + "reduce the desktop size by adjusting the Virtual line to your xorg.conf\n"); + + /*xf86CrtcSetSizeRange (pScrn, 320, 200, info->MaxSurfaceWidth, info->MaxLines);*/ + xf86CrtcSetSizeRange (pScrn, 320, 200, crtc_max_X, crtc_max_Y); RADEONPreInitDDC(pScrn); if (!RADEONPreInitControllers(pScrn)) goto fail; + + ErrorF("before xf86InitialConfiguration\n"); + if (!xf86InitialConfiguration (pScrn, FALSE)) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes.\n"); @@ -3222,6 +3074,8 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) } } + ErrorF("after xf86InitialConfiguration\n"); + RADEONSetPitch(pScrn); /* Set display resolution */ @@ -3259,6 +3113,10 @@ Bool RADEONPreInit(ScrnInfoPtr pScrn, int flags) if(info->MMIO) RADEONUnmapMMIO(pScrn); info->MMIO = NULL; + xf86DrvMsg(pScrn->scrnIndex, X_NOTICE, + "For information on using the multimedia capabilities\n\tof this" + " adapter, please see http://gatos.sf.net.\n"); + xf86DrvMsg(pScrn->scrnIndex, X_NOTICE, "MergedFB support has been removed and replaced with" " xrandr 1.2 support\n"); @@ -3269,7 +3127,7 @@ fail: /* Pre-init failed. */ /* Free the video bios (if applicable) */ if (info->VBIOS) { - free(info->VBIOS); + xfree(info->VBIOS); info->VBIOS = NULL; } @@ -3393,9 +3251,33 @@ static void RADEONBlockHandler(int i, pointer blockData, #ifdef USE_EXA info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; #endif +} - if (info->pm.dynamic_mode_enabled) - RADEONPMBlockHandler(pScrn); +static void +RADEONPointerMoved(int index, int x, int y) +{ + ScrnInfoPtr pScrn = xf86Screens[index]; + RADEONInfoPtr info = RADEONPTR(pScrn); + int newX = x, newY = y; + + switch (info->rotation) { + case RR_Rotate_0: + break; + case RR_Rotate_90: + newX = y; + newY = pScrn->pScreen->width - x - 1; + break; + case RR_Rotate_180: + newX = pScrn->pScreen->width - x - 1; + newY = pScrn->pScreen->height - y - 1; + break; + case RR_Rotate_270: + newX = pScrn->pScreen->height - y - 1; + newY = x; + break; + } + + (*info->PointerMoved)(index, newX, newY); } static void @@ -3466,8 +3348,7 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, pScrn->fbOffset = info->dri->frontOffset; #endif - if (info->IsSecondary) - pScrn->fbOffset = pScrn->videoRam * 1024; + if (info->IsSecondary) pScrn->fbOffset = pScrn->videoRam * 1024; #ifdef XF86DRI xf86DrvMsg(pScrn->scrnIndex, X_INFO, "RADEONScreenInit %lx %ld %d\n", @@ -3503,7 +3384,21 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, /* blank the outputs/crtcs */ RADEONBlank(pScrn); - RADEONPMInit(pScrn); + if (info->IsMobility && !IS_AVIVO_VARIANT) { + if (xf86ReturnOptValBool(info->Options, OPTION_DYNAMIC_CLOCKS, FALSE)) { + RADEONSetDynamicClock(pScrn, 1); + } else { + RADEONSetDynamicClock(pScrn, 0); + } + } else if (IS_AVIVO_VARIANT) { + if (xf86ReturnOptValBool(info->Options, OPTION_DYNAMIC_CLOCKS, FALSE)) { + atombios_static_pwrmgt_setup(pScrn, 1); + atombios_dyn_clk_setup(pScrn, 1); + } + } + + if (IS_R300_VARIANT || IS_RV100_VARIANT) + RADEONForceSomeClocks(pScrn); if (info->allowColorTiling && (pScrn->virtualX > info->MaxSurfaceWidth)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, @@ -3690,9 +3585,9 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, "Initializing fb layer\n"); if (info->r600_shadow_fb) { - info->fb_shadow = calloc(1, - pScrn->displayWidth * pScrn->virtualY * - ((pScrn->bitsPerPixel + 7) >> 3)); + info->fb_shadow = xcalloc(1, + pScrn->displayWidth * pScrn->virtualY * + ((pScrn->bitsPerPixel + 7) >> 3)); if (info->fb_shadow == NULL) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to allocate shadow framebuffer\n"); @@ -3708,7 +3603,7 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, if (info->r600_shadow_fb == FALSE) { /* Init fb layer */ - if (!fbScreenInit(pScreen, info->FB + pScrn->fbOffset, + if (!fbScreenInit(pScreen, info->FB, pScrn->virtualX, pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth, pScrn->bitsPerPixel)) @@ -3866,9 +3761,9 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, } /* DGA setup */ -#ifdef XFreeXDGA - xf86DiDGAInit(pScreen, info->LinearAddr + pScrn->fbOffset); -#endif + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, + "Initializing DGA\n"); + RADEONDGAInit(pScreen); /* Init Xv */ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, @@ -3884,12 +3779,6 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, /* xf86SetDesiredModes() accesses pScrn->pScreen */ pScrn->pScreen = pScreen; - /* Clear the framebuffer */ - memset(info->FB + pScrn->fbOffset, 0, - pScrn->virtualY * pScrn->displayWidth * info->CurrentLayout.pixel_bytes); - - pScrn->pScreen = pScreen; - /* set the modes with desired rotation, etc. */ if (!xf86SetDesiredModes (pScrn)) return FALSE; @@ -3907,6 +3796,10 @@ Bool RADEONScreenInit(int scrnIndex, ScreenPtr pScreen, if (!xf86CrtcScreenInit (pScreen)) return FALSE; + /* Wrap pointer motion to flip touch screen around */ + info->PointerMoved = pScrn->PointerMoved; + pScrn->PointerMoved = RADEONPointerMoved; + /* Colormap setup */ xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, "Initializing color map\n"); @@ -3954,86 +3847,14 @@ void RADEONRestoreMemMapRegisters(ScrnInfoPtr pScrn, " MC_AGP_LOCATION : 0x%08x\n", (unsigned)restore->mc_agp_location); - if (IS_DCE4_VARIANT) { - if (mc_fb_loc != restore->mc_fb_location || - mc_agp_loc != restore->mc_agp_location) { - uint32_t tmp; + if (IS_AVIVO_VARIANT) { - //XXX - //RADEONWaitForIdleMMIO(pScrn); - - /* disable VGA rendering core */ - OUTREG(AVIVO_VGA_RENDER_CONTROL, INREG(AVIVO_VGA_RENDER_CONTROL) & ~AVIVO_VGA_VSTATUS_CNTL_MASK); - OUTREG(AVIVO_D1VGA_CONTROL, INREG(AVIVO_D1VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); - OUTREG(AVIVO_D2VGA_CONTROL, INREG(AVIVO_D2VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); - OUTREG(EVERGREEN_D3VGA_CONTROL, INREG(EVERGREEN_D3VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); - OUTREG(EVERGREEN_D4VGA_CONTROL, INREG(EVERGREEN_D4VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); - OUTREG(EVERGREEN_D5VGA_CONTROL, INREG(EVERGREEN_D5VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); - OUTREG(EVERGREEN_D6VGA_CONTROL, INREG(EVERGREEN_D6VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); - - /* Stop display & memory access */ - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET); - OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN); - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET); - - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); - OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN); - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET); - - if (!IS_DCE41_VARIANT) { - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET); - OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN); - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET); - - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET); - OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN); - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET); - - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET); - OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN); - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET); - - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); - OUTREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET, tmp & ~EVERGREEN_CRTC_MASTER_EN); - tmp = INREG(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET); - } - - usleep(10000); - timeout = 0; - while (!(radeon_get_mc_idle(pScrn))) { - if (++timeout > 1000000) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Timeout trying to update memory controller settings !\n"); - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "You will probably crash now ... \n"); - /* Nothing we can do except maybe try to kill the server, - * let's wait 2 seconds to leave the above message a chance - * to maybe hit the disk and continue trying to setup despite - * the MC being non-idle - */ - usleep(2000000); - } - usleep(10); - } - - radeon_write_mc_fb_agp_location(pScrn, LOC_FB | LOC_AGP, - restore->mc_fb_location, - restore->mc_agp_location, - restore->mc_agp_location_hi); - - OUTREG(R600_HDP_NONSURFACE_BASE, (restore->mc_fb_location & 0xffff) << 16); - - } - } else if (IS_AVIVO_VARIANT) { if (mc_fb_loc != restore->mc_fb_location || mc_agp_loc != restore->mc_agp_location) { uint32_t tmp; RADEONWaitForIdleMMIO(pScrn); - /* disable VGA rendering core */ - OUTREG(AVIVO_VGA_RENDER_CONTROL, INREG(AVIVO_VGA_RENDER_CONTROL) &~ AVIVO_VGA_VSTATUS_CNTL_MASK); - OUTREG(AVIVO_D1VGA_CONTROL, INREG(AVIVO_D1VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); OUTREG(AVIVO_D2VGA_CONTROL, INREG(AVIVO_D2VGA_CONTROL) & ~AVIVO_DVGA_CONTROL_MODE_ENABLE); @@ -4243,9 +4064,9 @@ static void RADEONAdjustMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) info->mc_fb_location = fb; info->mc_agp_location = agp; if (info->ChipFamily >= CHIP_FAMILY_R600) - info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 24; + info->fbLocation = (info->mc_fb_location & 0xffff) << 24; else - info->fbLocation = ((uint64_t)info->mc_fb_location & 0xffff) << 16; + info->fbLocation = (info->mc_fb_location & 0xffff) << 16; info->accel_state->dst_pitch_offset = (((pScrn->displayWidth * info->CurrentLayout.pixel_bytes / 64) @@ -4320,8 +4141,8 @@ void RADEONChangeSurfaces(ScrnInfoPtr pScrn) int cpp = info->CurrentLayout.pixel_bytes; /* depth/front/back pitch must be identical (and the same as displayWidth) */ int width_bytes = pScrn->displayWidth * cpp; - int bufferSize = RADEON_ALIGN((RADEON_ALIGN(pScrn->virtualY, 16)) * width_bytes, - RADEON_GPU_PAGE_SIZE); + int bufferSize = ((((pScrn->virtualY + 15) & ~15) * width_bytes + + RADEON_BUFFER_ALIGN) & ~RADEON_BUFFER_ALIGN); unsigned int color_pattern, swap_pattern; if (!info->allowColorTiling) @@ -4353,8 +4174,8 @@ void RADEONChangeSurfaces(ScrnInfoPtr pScrn) int retvalue; int depthCpp = (info->dri->depthBits - 8) / 4; int depth_width_bytes = pScrn->displayWidth * depthCpp; - int depthBufferSize = RADEON_ALIGN((RADEON_ALIGN(pScrn->virtualY, 16)) * depth_width_bytes, - RADEON_GPU_PAGE_SIZE); + int depthBufferSize = ((((pScrn->virtualY + 15) & ~15) * depth_width_bytes + + RADEON_BUFFER_ALIGN) & ~RADEON_BUFFER_ALIGN); unsigned int depth_pattern; drmsurffree.address = info->dri->frontOffset; @@ -4477,6 +4298,8 @@ static void RADEONSaveMemMapRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) } } + +#if 0 /* Read palette data */ static void RADEONSavePalette(ScrnInfoPtr pScrn, RADEONSavePtr save) { @@ -4484,424 +4307,19 @@ static void RADEONSavePalette(ScrnInfoPtr pScrn, RADEONSavePtr save) unsigned char *RADEONMMIO = info->MMIO; int i; +#ifdef ENABLE_FLAT_PANEL + /* Select palette 0 (main CRTC) if using FP-enabled chip */ + /* if (info->Port1 == MT_DFP) PAL_SELECT(1); */ +#endif PAL_SELECT(1); INPAL_START(0); - for (i = 0; i < 256; i++) { - save->palette2[i] = INREG(RADEON_PALETTE_30_DATA); - } - + for (i = 0; i < 256; i++) save->palette2[i] = INPAL_NEXT(); PAL_SELECT(0); INPAL_START(0); - for (i = 0; i < 256; i++) { - save->palette[i] = INREG(RADEON_PALETTE_30_DATA); - } -} - -static void RADEONRestorePalette(ScrnInfoPtr pScrn, RADEONSavePtr restore) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i; - - PAL_SELECT(1); - OUTPAL_START(0); - for (i = 0; i < 256; i++) { - OUTREG(RADEON_PALETTE_30_DATA, restore->palette2[i]); - } - - PAL_SELECT(0); - OUTPAL_START(0); - for (i = 0; i < 256; i++) { - OUTREG(RADEON_PALETTE_30_DATA, restore->palette[i]); - } -} - -static void -dce4_save_grph(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - - state->grph.enable = INREG(offset + EVERGREEN_GRPH_ENABLE); - state->grph.control = INREG(offset + EVERGREEN_GRPH_CONTROL); - state->grph.swap_control = INREG(offset + EVERGREEN_GRPH_SWAP_CONTROL); - state->grph.prim_surf_addr = INREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS); - state->grph.sec_surf_addr = INREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS); - state->grph.pitch = INREG(offset + EVERGREEN_GRPH_PITCH); - state->grph.prim_surf_addr_hi = INREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH); - state->grph.sec_surf_addr_hi = INREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH); - state->grph.x_offset = INREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_X); - state->grph.y_offset = INREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_Y); - state->grph.x_start = INREG(offset + EVERGREEN_GRPH_X_START); - state->grph.y_start = INREG(offset + EVERGREEN_GRPH_Y_START); - state->grph.x_end = INREG(offset + EVERGREEN_GRPH_X_END); - state->grph.y_end = INREG(offset + EVERGREEN_GRPH_Y_END); - - state->grph.desktop_height = INREG(offset + EVERGREEN_DESKTOP_HEIGHT); - state->grph.viewport_start = INREG(offset + EVERGREEN_VIEWPORT_START); - state->grph.viewport_size = INREG(offset + EVERGREEN_VIEWPORT_SIZE); - state->grph.mode_data_format = INREG(offset + EVERGREEN_DATA_FORMAT); -} - -static void -dce4_restore_grph(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - - OUTREG(offset + EVERGREEN_GRPH_ENABLE, state->grph.enable); - OUTREG(offset + EVERGREEN_GRPH_CONTROL, state->grph.control); - OUTREG(offset + EVERGREEN_GRPH_SWAP_CONTROL, state->grph.swap_control); - OUTREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS, state->grph.prim_surf_addr); - OUTREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS, state->grph.sec_surf_addr); - OUTREG(offset + EVERGREEN_GRPH_PITCH, state->grph.pitch); - OUTREG(offset + EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH, state->grph.prim_surf_addr_hi); - OUTREG(offset + EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH, state->grph.sec_surf_addr_hi); - OUTREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_X, state->grph.x_offset); - OUTREG(offset + EVERGREEN_GRPH_SURFACE_OFFSET_Y, state->grph.y_offset); - OUTREG(offset + EVERGREEN_GRPH_X_START, state->grph.x_start); - OUTREG(offset + EVERGREEN_GRPH_Y_START, state->grph.y_start); - OUTREG(offset + EVERGREEN_GRPH_X_END, state->grph.x_end); - OUTREG(offset + EVERGREEN_GRPH_Y_END, state->grph.y_end); - - OUTREG(offset + EVERGREEN_DESKTOP_HEIGHT, state->grph.desktop_height); - OUTREG(offset + EVERGREEN_VIEWPORT_START, state->grph.viewport_start); - OUTREG(offset + EVERGREEN_VIEWPORT_SIZE, state->grph.viewport_size); - OUTREG(offset + EVERGREEN_DATA_FORMAT, state->grph.mode_data_format); -} - -static uint32_t dce4_dac_regs[] = { - 0x6690, 0x6694, 0x66b0, 0x66cc, 0x66d0, 0x66d4, 0x66d8 }; - -static uint32_t dce4_scl_regs[] = { - 0x6d08, 0x6d0c, 0x6d14, 0x6d1c }; - -static uint32_t dce4_dig_regs[] = { - 0x7000, 0x7004, 0x7008, 0x700c, 0x7010, 0x7014, - 0x71f0, 0x71f4, 0x71f8, 0x71fc, 0x7200, 0x7204, - 0x7208, 0x720c, 0x7210, 0x7218, 0x721c, 0x7220, - 0x7230}; - -static uint32_t dce4_crtc_regs[] = { - 0x6e00, 0x6e04, 0x6e08, 0x6e0c, 0x6e1c, 0x6e34, 0x6e38, 0x6e3c, 0x6e70, 0x6e74, 0x6e78}; - - -#define DCE4_REG_SCL_NUM (sizeof(dce4_scl_regs)/sizeof(uint32_t)) -#define DCE4_REG_CRTC_NUM (sizeof(dce4_crtc_regs)/sizeof(uint32_t)) -#define DCE4_REG_DIG_NUM (sizeof(dce4_dig_regs)/sizeof(uint32_t)) -#define DCE4_DAC_NUM (sizeof(dce4_dac_regs)/sizeof(uint32_t)) - - -static void -dce4_save_crtc(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i; - - for (i = 0; i < DCE4_REG_CRTC_NUM; i++) - state->crtc[i] = INREG(offset + dce4_crtc_regs[i]); -} - -static void -dce4_restore_crtc(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i; - - for (i = 0; i < DCE4_REG_CRTC_NUM; i++) - OUTREG(offset + dce4_crtc_regs[i], state->crtc[i]); -} - -static void -dce4_save_scl(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i; - - for (i = 0; i < DCE4_REG_SCL_NUM; i++) - state->scl[i] = INREG(offset + dce4_scl_regs[i]); -} - -static void -dce4_restore_scl(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i; - - for (i = 0; i < DCE4_REG_SCL_NUM; i++) - OUTREG(offset + dce4_scl_regs[i], state->scl[i]); -} - - -static void -dce4_save_fmt(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i, index = 0; - - for (i = 0x6fb4; i <= 0x6fd4; i += 4) - state->fmt[index++] = INREG(offset + i); -} - -static void -dce4_restore_fmt(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i, index = 0; - - for (i = 0x6fb4; i <= 0x6fd4; i += 4) - OUTREG(offset + i, state->fmt[index++]); -} - - -static void -dce4_save_dig(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i; - - for (i = 0; i < DCE4_REG_DIG_NUM; i++) - state->dig[i] = INREG(offset + dce4_dig_regs[i]); -} - -static void -dce4_restore_dig(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i; - - for (i = 0; i < DCE4_REG_DIG_NUM; i++) - OUTREG(offset + dce4_dig_regs[i], state->dig[i]); -} - - - -static void dce4_save_block(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - dce4_save_grph(pScrn, state, offset); - dce4_save_crtc(pScrn, state, offset); - dce4_save_scl(pScrn, state, offset); - dce4_save_dig(pScrn, state, offset); - dce4_save_fmt(pScrn, state, offset); -} - -static void dce4_restore_block(ScrnInfoPtr pScrn, struct dce4_main_block_state *state, - uint32_t offset) -{ - dce4_restore_grph(pScrn, state, offset); - dce4_restore_crtc(pScrn, state, offset); - dce4_restore_scl(pScrn, state, offset); - dce4_restore_dig(pScrn, state, offset); - dce4_restore_fmt(pScrn, state, offset); -} - -static void dce4_save_uniphy(ScrnInfoPtr pScrn, struct dce4_state *state, int index) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - uint32_t uniphy_offset[6] = {0x0, 0x30, 0x60, 0x100, 0x130, 0x160 }; - int i, ri = 0; - for (i = 0; i < 0x18; i+=4) - state->uniphy[index][ri++] = INREG(0x6600 + uniphy_offset[index] + i); -} - -static void dce4_restore_uniphy(ScrnInfoPtr pScrn, struct dce4_state *state, int index) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - uint32_t uniphy_offset[6] = {0x0, 0x30, 0x60, 0x100, 0x130, 0x160 }; - int i, ri = 0; - for (i = 0; i <= 0x18; i+=4) - OUTREG(0x6600 + uniphy_offset[index] + i, state->uniphy[index][ri++]); -} - -static void dce4_save_dig_regs(ScrnInfoPtr pScrn, struct dce4_state *state) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i, ri = 0; - - for (i = 0x6578; i <= 0x6598; i += 4) - state->dig[ri++] = INREG(i); - for (i = 0x65ac; i <= 0x65d8; i += 4) - state->dig[ri++] = INREG(i); -} - -static void dce4_restore_dig_regs(ScrnInfoPtr pScrn, struct dce4_state *state) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i, ri = 0; - - for (i = 0x6578; i <= 0x6598; i += 4) - OUTREG(i, state->dig[ri++]); - for (i = 0x65ac; i <= 0x65d8; i += 4) - OUTREG(i, state->dig[ri++]); -} - -static void dce4_save_pll_regs(ScrnInfoPtr pScrn, struct dce4_state *state) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i, ri = 0; - - for (i = 0x360; i <= 0x368; i += 4) - state->vga_pll[0][ri++] = INREG(i); - - ri = 0; - for (i = 0x370; i <= 0x378; i += 4) - state->vga_pll[1][ri++] = INREG(i); - - ri = 0; - for (i = 0x390; i <= 0x398; i += 4) - state->vga_pll[2][ri++] = INREG(i); - - ri = 0; - for (i = 0x400; i <= 0x408; i += 4) - state->pll[0][ri++] = INREG(i); - for (i = 0x410; i <= 0x43c; i += 4) - state->pll[0][ri++] = INREG(i); - - ri = 0; - for (i = 0x440; i <= 0x448; i += 4) - state->pll[1][ri++] = INREG(i); - for (i = 0x450; i <= 0x47c; i += 4) - state->pll[1][ri++] = INREG(i); - - ri = 0; - for (i = 0x500; i <= 0x550; i += 0x10) - state->pll_route[ri++] = INREG(i); -} - -static void dce4_restore_pll_regs(ScrnInfoPtr pScrn, struct dce4_state *state) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - int i, ri = 0; - - for (i = 0x360; i <= 0x368; i += 4) - OUTREG(i, state->vga_pll[0][ri++]); - - ri = 0; - for (i = 0x370; i <= 0x378; i += 4) - OUTREG(i, state->vga_pll[1][ri++]); - - ri = 0; - for (i = 0x390; i <= 0x398; i += 4) - OUTREG(i, state->vga_pll[2][ri++]); - - ri = 0; - for (i = 0x400; i <= 0x408; i += 4) - OUTREG(i, state->pll[0][ri++]); - for (i = 0x410; i <= 0x43c; i += 4) - OUTREG(i, state->pll[0][ri++]); - - ri = 0; - for (i = 0x440; i <= 0x448; i += 4) - OUTREG(i, state->pll[1][ri++]); - for (i = 0x450; i <= 0x47c; i += 4) - OUTREG(i, state->pll[1][ri++]); - - ri = 0; - for (i = 0x500; i <= 0x550; i += 0x10) - OUTREG(i, state->pll_route[ri++]); -} - -static void -dce4_save(ScrnInfoPtr pScrn, RADEONSavePtr save) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - struct dce4_state *state = &save->dce4; - int i, j; - uint32_t crtc_offset[] = {EVERGREEN_CRTC0_REGISTER_OFFSET, - EVERGREEN_CRTC1_REGISTER_OFFSET, - EVERGREEN_CRTC2_REGISTER_OFFSET, - EVERGREEN_CRTC3_REGISTER_OFFSET, - EVERGREEN_CRTC4_REGISTER_OFFSET, - EVERGREEN_CRTC5_REGISTER_OFFSET}; - - state->vga1_cntl = INREG(AVIVO_D1VGA_CONTROL); - state->vga2_cntl = INREG(AVIVO_D2VGA_CONTROL); - state->vga3_cntl = INREG(EVERGREEN_D3VGA_CONTROL); - state->vga4_cntl = INREG(EVERGREEN_D4VGA_CONTROL); - state->vga5_cntl = INREG(EVERGREEN_D5VGA_CONTROL); - state->vga6_cntl = INREG(EVERGREEN_D6VGA_CONTROL); - state->vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL); - - dce4_save_pll_regs(pScrn, state); - dce4_save_dig_regs(pScrn, state); - - for (i = 0; i < 6; i++) - dce4_save_block(pScrn, &state->block[i], crtc_offset[i]); - - for (i = 0; i < 6; i++) - dce4_save_uniphy(pScrn, state, i); - - for (i = 0; i < 2; i++) { - for (j = 0; j < DCE4_DAC_NUM; j++) { - uint32_t offset = i ? 0x100 : 0x0; - state->dac[i][j] = INREG(dce4_dac_regs[j] + offset); - } - } -} - -static void -dce4_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - struct dce4_state *state = &restore->dce4; - int i, j; - uint32_t crtc_offset[] = {EVERGREEN_CRTC0_REGISTER_OFFSET, - EVERGREEN_CRTC1_REGISTER_OFFSET, - EVERGREEN_CRTC2_REGISTER_OFFSET, - EVERGREEN_CRTC3_REGISTER_OFFSET, - EVERGREEN_CRTC4_REGISTER_OFFSET, - EVERGREEN_CRTC5_REGISTER_OFFSET}; - - OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl); - OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl);; - OUTREG(EVERGREEN_D3VGA_CONTROL, state->vga3_cntl); - OUTREG(EVERGREEN_D4VGA_CONTROL, state->vga4_cntl); - OUTREG(EVERGREEN_D5VGA_CONTROL, state->vga5_cntl); - OUTREG(EVERGREEN_D6VGA_CONTROL, state->vga6_cntl); - OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control); - - dce4_restore_dig_regs(pScrn, state); - dce4_restore_pll_regs(pScrn, state); - for (i = 0; i < 6; i++) - dce4_restore_uniphy(pScrn, state, i); - - for (i = 0; i < 6; i++) - dce4_restore_block(pScrn, &state->block[i], crtc_offset[i]); - - for (i = 0; i < 2; i++) { - for (j = 0; j < DCE4_DAC_NUM; j++) { - uint32_t offset = i ? 0x100 : 0x0; - OUTREG(dce4_dac_regs[j] + offset, state->dac[i][j]); - } - } + for (i = 0; i < 256; i++) save->palette[i] = INPAL_NEXT(); + save->palette_valid = TRUE; } +#endif static void avivo_save(ScrnInfoPtr pScrn, RADEONSavePtr save) @@ -4915,29 +4333,28 @@ avivo_save(ScrnInfoPtr pScrn, RADEONSavePtr save) // state->vga_fb_start = INREG(AVIVO_VGA_FB_START); state->vga1_cntl = INREG(AVIVO_D1VGA_CONTROL); state->vga2_cntl = INREG(AVIVO_D2VGA_CONTROL); - state->vga_render_control = INREG(AVIVO_VGA_RENDER_CONTROL); state->crtc_master_en = INREG(AVIVO_DC_CRTC_MASTER_EN); state->crtc_tv_control = INREG(AVIVO_DC_CRTC_TV_CONTROL); state->dc_lb_memory_split = INREG(AVIVO_DC_LB_MEMORY_SPLIT); - state->pll[0].ref_div_src = INREG(AVIVO_EXT1_PPLL_REF_DIV_SRC); - state->pll[0].ref_div = INREG(AVIVO_EXT1_PPLL_REF_DIV); - state->pll[0].fb_div = INREG(AVIVO_EXT1_PPLL_FB_DIV); - state->pll[0].post_div_src = INREG(AVIVO_EXT1_PPLL_POST_DIV_SRC); - state->pll[0].post_div = INREG(AVIVO_EXT1_PPLL_POST_DIV); - state->pll[0].ext_ppll_cntl = INREG(AVIVO_EXT1_PPLL_CNTL); - state->pll[0].pll_cntl = INREG(AVIVO_P1PLL_CNTL); - state->pll[0].int_ss_cntl = INREG(AVIVO_P1PLL_INT_SS_CNTL); + state->pll1.ref_div_src = INREG(AVIVO_EXT1_PPLL_REF_DIV_SRC); + state->pll1.ref_div = INREG(AVIVO_EXT1_PPLL_REF_DIV); + state->pll1.fb_div = INREG(AVIVO_EXT1_PPLL_FB_DIV); + state->pll1.post_div_src = INREG(AVIVO_EXT1_PPLL_POST_DIV_SRC); + state->pll1.post_div = INREG(AVIVO_EXT1_PPLL_POST_DIV); + state->pll1.ext_ppll_cntl = INREG(AVIVO_EXT1_PPLL_CNTL); + state->pll1.pll_cntl = INREG(AVIVO_P1PLL_CNTL); + state->pll1.int_ss_cntl = INREG(AVIVO_P1PLL_INT_SS_CNTL); - state->pll[1].ref_div_src = INREG(AVIVO_EXT1_PPLL_REF_DIV_SRC); - state->pll[1].ref_div = INREG(AVIVO_EXT2_PPLL_REF_DIV); - state->pll[1].fb_div = INREG(AVIVO_EXT2_PPLL_FB_DIV); - state->pll[1].post_div_src = INREG(AVIVO_EXT2_PPLL_POST_DIV_SRC); - state->pll[1].post_div = INREG(AVIVO_EXT2_PPLL_POST_DIV); - state->pll[1].ext_ppll_cntl = INREG(AVIVO_EXT2_PPLL_CNTL); - state->pll[1].pll_cntl = INREG(AVIVO_P2PLL_CNTL); - state->pll[1].int_ss_cntl = INREG(AVIVO_P2PLL_INT_SS_CNTL); + state->pll2.ref_div_src = INREG(AVIVO_EXT1_PPLL_REF_DIV_SRC); + state->pll2.ref_div = INREG(AVIVO_EXT2_PPLL_REF_DIV); + state->pll2.fb_div = INREG(AVIVO_EXT2_PPLL_FB_DIV); + state->pll2.post_div_src = INREG(AVIVO_EXT2_PPLL_POST_DIV_SRC); + state->pll2.post_div = INREG(AVIVO_EXT2_PPLL_POST_DIV); + state->pll2.ext_ppll_cntl = INREG(AVIVO_EXT2_PPLL_CNTL); + state->pll2.pll_cntl = INREG(AVIVO_P2PLL_CNTL); + state->pll2.int_ss_cntl = INREG(AVIVO_P2PLL_INT_SS_CNTL); state->vga25_ppll.ref_div_src = INREG(AVIVO_VGA25_PPLL_REF_DIV_SRC); state->vga25_ppll.ref_div = INREG(AVIVO_VGA25_PPLL_REF_DIV); @@ -4960,87 +4377,87 @@ avivo_save(ScrnInfoPtr pScrn, RADEONSavePtr save) state->vga41_ppll.post_div = INREG(AVIVO_VGA41_PPLL_POST_DIV); state->vga41_ppll.pll_cntl = INREG(AVIVO_VGA41_PPLL_CNTL); - state->crtc[0].pll_source = INREG(AVIVO_PCLK_CRTC1_CNTL); + state->crtc1.pll_source = INREG(AVIVO_PCLK_CRTC1_CNTL); - state->crtc[0].h_total = INREG(AVIVO_D1CRTC_H_TOTAL); - state->crtc[0].h_blank_start_end = INREG(AVIVO_D1CRTC_H_BLANK_START_END); - state->crtc[0].h_sync_a = INREG(AVIVO_D1CRTC_H_SYNC_A); - state->crtc[0].h_sync_a_cntl = INREG(AVIVO_D1CRTC_H_SYNC_A_CNTL); - state->crtc[0].h_sync_b = INREG(AVIVO_D1CRTC_H_SYNC_B); - state->crtc[0].h_sync_b_cntl = INREG(AVIVO_D1CRTC_H_SYNC_B_CNTL); + state->crtc1.h_total = INREG(AVIVO_D1CRTC_H_TOTAL); + state->crtc1.h_blank_start_end = INREG(AVIVO_D1CRTC_H_BLANK_START_END); + state->crtc1.h_sync_a = INREG(AVIVO_D1CRTC_H_SYNC_A); + state->crtc1.h_sync_a_cntl = INREG(AVIVO_D1CRTC_H_SYNC_A_CNTL); + state->crtc1.h_sync_b = INREG(AVIVO_D1CRTC_H_SYNC_B); + state->crtc1.h_sync_b_cntl = INREG(AVIVO_D1CRTC_H_SYNC_B_CNTL); - state->crtc[0].v_total = INREG(AVIVO_D1CRTC_V_TOTAL); - state->crtc[0].v_blank_start_end = INREG(AVIVO_D1CRTC_V_BLANK_START_END); - state->crtc[0].v_sync_a = INREG(AVIVO_D1CRTC_V_SYNC_A); - state->crtc[0].v_sync_a_cntl = INREG(AVIVO_D1CRTC_V_SYNC_A_CNTL); - state->crtc[0].v_sync_b = INREG(AVIVO_D1CRTC_V_SYNC_B); - state->crtc[0].v_sync_b_cntl = INREG(AVIVO_D1CRTC_V_SYNC_B_CNTL); + state->crtc1.v_total = INREG(AVIVO_D1CRTC_V_TOTAL); + state->crtc1.v_blank_start_end = INREG(AVIVO_D1CRTC_V_BLANK_START_END); + state->crtc1.v_sync_a = INREG(AVIVO_D1CRTC_V_SYNC_A); + state->crtc1.v_sync_a_cntl = INREG(AVIVO_D1CRTC_V_SYNC_A_CNTL); + state->crtc1.v_sync_b = INREG(AVIVO_D1CRTC_V_SYNC_B); + state->crtc1.v_sync_b_cntl = INREG(AVIVO_D1CRTC_V_SYNC_B_CNTL); - state->crtc[0].control = INREG(AVIVO_D1CRTC_CONTROL); - state->crtc[0].blank_control = INREG(AVIVO_D1CRTC_BLANK_CONTROL); - state->crtc[0].interlace_control = INREG(AVIVO_D1CRTC_INTERLACE_CONTROL); - state->crtc[0].stereo_control = INREG(AVIVO_D1CRTC_STEREO_CONTROL); + state->crtc1.control = INREG(AVIVO_D1CRTC_CONTROL); + state->crtc1.blank_control = INREG(AVIVO_D1CRTC_BLANK_CONTROL); + state->crtc1.interlace_control = INREG(AVIVO_D1CRTC_INTERLACE_CONTROL); + state->crtc1.stereo_control = INREG(AVIVO_D1CRTC_STEREO_CONTROL); - state->crtc[0].cursor_control = INREG(AVIVO_D1CUR_CONTROL); + state->crtc1.cursor_control = INREG(AVIVO_D1CUR_CONTROL); - state->grph[0].enable = INREG(AVIVO_D1GRPH_ENABLE); - state->grph[0].control = INREG(AVIVO_D1GRPH_CONTROL); - state->grph[0].control = INREG(AVIVO_D1GRPH_CONTROL); - state->grph[0].prim_surf_addr = INREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS); - state->grph[0].sec_surf_addr = INREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS); - state->grph[0].pitch = INREG(AVIVO_D1GRPH_PITCH); - state->grph[0].x_offset = INREG(AVIVO_D1GRPH_SURFACE_OFFSET_X); - state->grph[0].y_offset = INREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y); - state->grph[0].x_start = INREG(AVIVO_D1GRPH_X_START); - state->grph[0].y_start = INREG(AVIVO_D1GRPH_Y_START); - state->grph[0].x_end = INREG(AVIVO_D1GRPH_X_END); - state->grph[0].y_end = INREG(AVIVO_D1GRPH_Y_END); + state->grph1.enable = INREG(AVIVO_D1GRPH_ENABLE); + state->grph1.control = INREG(AVIVO_D1GRPH_CONTROL); + state->grph1.control = INREG(AVIVO_D1GRPH_CONTROL); + state->grph1.prim_surf_addr = INREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS); + state->grph1.sec_surf_addr = INREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS); + state->grph1.pitch = INREG(AVIVO_D1GRPH_PITCH); + state->grph1.x_offset = INREG(AVIVO_D1GRPH_SURFACE_OFFSET_X); + state->grph1.y_offset = INREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y); + state->grph1.x_start = INREG(AVIVO_D1GRPH_X_START); + state->grph1.y_start = INREG(AVIVO_D1GRPH_Y_START); + state->grph1.x_end = INREG(AVIVO_D1GRPH_X_END); + state->grph1.y_end = INREG(AVIVO_D1GRPH_Y_END); - state->grph[0].desktop_height = INREG(AVIVO_D1MODE_DESKTOP_HEIGHT); - state->grph[0].viewport_start = INREG(AVIVO_D1MODE_VIEWPORT_START); - state->grph[0].viewport_size = INREG(AVIVO_D1MODE_VIEWPORT_SIZE); - state->grph[0].mode_data_format = INREG(AVIVO_D1MODE_DATA_FORMAT); + state->grph1.desktop_height = INREG(AVIVO_D1MODE_DESKTOP_HEIGHT); + state->grph1.viewport_start = INREG(AVIVO_D1MODE_VIEWPORT_START); + state->grph1.viewport_size = INREG(AVIVO_D1MODE_VIEWPORT_SIZE); + state->grph1.mode_data_format = INREG(AVIVO_D1MODE_DATA_FORMAT); - state->crtc[1].pll_source = INREG(AVIVO_PCLK_CRTC2_CNTL); + state->crtc2.pll_source = INREG(AVIVO_PCLK_CRTC2_CNTL); - state->crtc[1].h_total = INREG(AVIVO_D2CRTC_H_TOTAL); - state->crtc[1].h_blank_start_end = INREG(AVIVO_D2CRTC_H_BLANK_START_END); - state->crtc[1].h_sync_a = INREG(AVIVO_D2CRTC_H_SYNC_A); - state->crtc[1].h_sync_a_cntl = INREG(AVIVO_D2CRTC_H_SYNC_A_CNTL); - state->crtc[1].h_sync_b = INREG(AVIVO_D2CRTC_H_SYNC_B); - state->crtc[1].h_sync_b_cntl = INREG(AVIVO_D2CRTC_H_SYNC_B_CNTL); + state->crtc2.h_total = INREG(AVIVO_D2CRTC_H_TOTAL); + state->crtc2.h_blank_start_end = INREG(AVIVO_D2CRTC_H_BLANK_START_END); + state->crtc2.h_sync_a = INREG(AVIVO_D2CRTC_H_SYNC_A); + state->crtc2.h_sync_a_cntl = INREG(AVIVO_D2CRTC_H_SYNC_A_CNTL); + state->crtc2.h_sync_b = INREG(AVIVO_D2CRTC_H_SYNC_B); + state->crtc2.h_sync_b_cntl = INREG(AVIVO_D2CRTC_H_SYNC_B_CNTL); - state->crtc[1].v_total = INREG(AVIVO_D2CRTC_V_TOTAL); - state->crtc[1].v_blank_start_end = INREG(AVIVO_D2CRTC_V_BLANK_START_END); - state->crtc[1].v_sync_a = INREG(AVIVO_D2CRTC_V_SYNC_A); - state->crtc[1].v_sync_a_cntl = INREG(AVIVO_D2CRTC_V_SYNC_A_CNTL); - state->crtc[1].v_sync_b = INREG(AVIVO_D2CRTC_V_SYNC_B); - state->crtc[1].v_sync_b_cntl = INREG(AVIVO_D2CRTC_V_SYNC_B_CNTL); + state->crtc2.v_total = INREG(AVIVO_D2CRTC_V_TOTAL); + state->crtc2.v_blank_start_end = INREG(AVIVO_D2CRTC_V_BLANK_START_END); + state->crtc2.v_sync_a = INREG(AVIVO_D2CRTC_V_SYNC_A); + state->crtc2.v_sync_a_cntl = INREG(AVIVO_D2CRTC_V_SYNC_A_CNTL); + state->crtc2.v_sync_b = INREG(AVIVO_D2CRTC_V_SYNC_B); + state->crtc2.v_sync_b_cntl = INREG(AVIVO_D2CRTC_V_SYNC_B_CNTL); - state->crtc[1].control = INREG(AVIVO_D2CRTC_CONTROL); - state->crtc[1].blank_control = INREG(AVIVO_D2CRTC_BLANK_CONTROL); - state->crtc[1].interlace_control = INREG(AVIVO_D2CRTC_INTERLACE_CONTROL); - state->crtc[1].stereo_control = INREG(AVIVO_D2CRTC_STEREO_CONTROL); + state->crtc2.control = INREG(AVIVO_D2CRTC_CONTROL); + state->crtc2.blank_control = INREG(AVIVO_D2CRTC_BLANK_CONTROL); + state->crtc2.interlace_control = INREG(AVIVO_D2CRTC_INTERLACE_CONTROL); + state->crtc2.stereo_control = INREG(AVIVO_D2CRTC_STEREO_CONTROL); - state->crtc[1].cursor_control = INREG(AVIVO_D2CUR_CONTROL); + state->crtc2.cursor_control = INREG(AVIVO_D2CUR_CONTROL); - state->grph[1].enable = INREG(AVIVO_D2GRPH_ENABLE); - state->grph[1].control = INREG(AVIVO_D2GRPH_CONTROL); - state->grph[1].control = INREG(AVIVO_D2GRPH_CONTROL); - state->grph[1].prim_surf_addr = INREG(AVIVO_D2GRPH_PRIMARY_SURFACE_ADDRESS); - state->grph[1].sec_surf_addr = INREG(AVIVO_D2GRPH_SECONDARY_SURFACE_ADDRESS); - state->grph[1].pitch = INREG(AVIVO_D2GRPH_PITCH); - state->grph[1].x_offset = INREG(AVIVO_D2GRPH_SURFACE_OFFSET_X); - state->grph[1].y_offset = INREG(AVIVO_D2GRPH_SURFACE_OFFSET_Y); - state->grph[1].x_start = INREG(AVIVO_D2GRPH_X_START); - state->grph[1].y_start = INREG(AVIVO_D2GRPH_Y_START); - state->grph[1].x_end = INREG(AVIVO_D2GRPH_X_END); - state->grph[1].y_end = INREG(AVIVO_D2GRPH_Y_END); + state->grph2.enable = INREG(AVIVO_D2GRPH_ENABLE); + state->grph2.control = INREG(AVIVO_D2GRPH_CONTROL); + state->grph2.control = INREG(AVIVO_D2GRPH_CONTROL); + state->grph2.prim_surf_addr = INREG(AVIVO_D2GRPH_PRIMARY_SURFACE_ADDRESS); + state->grph2.sec_surf_addr = INREG(AVIVO_D2GRPH_SECONDARY_SURFACE_ADDRESS); + state->grph2.pitch = INREG(AVIVO_D2GRPH_PITCH); + state->grph2.x_offset = INREG(AVIVO_D2GRPH_SURFACE_OFFSET_X); + state->grph2.y_offset = INREG(AVIVO_D2GRPH_SURFACE_OFFSET_Y); + state->grph2.x_start = INREG(AVIVO_D2GRPH_X_START); + state->grph2.y_start = INREG(AVIVO_D2GRPH_Y_START); + state->grph2.x_end = INREG(AVIVO_D2GRPH_X_END); + state->grph2.y_end = INREG(AVIVO_D2GRPH_Y_END); - state->grph[1].desktop_height = INREG(AVIVO_D2MODE_DESKTOP_HEIGHT); - state->grph[1].viewport_start = INREG(AVIVO_D2MODE_VIEWPORT_START); - state->grph[1].viewport_size = INREG(AVIVO_D2MODE_VIEWPORT_SIZE); - state->grph[1].mode_data_format = INREG(AVIVO_D2MODE_DATA_FORMAT); + state->grph2.desktop_height = INREG(AVIVO_D2MODE_DESKTOP_HEIGHT); + state->grph2.viewport_start = INREG(AVIVO_D2MODE_VIEWPORT_START); + state->grph2.viewport_size = INREG(AVIVO_D2MODE_VIEWPORT_SIZE); + state->grph2.mode_data_format = INREG(AVIVO_D2MODE_DATA_FORMAT); if (IS_DCE3_VARIANT) { /* save DVOA regs */ @@ -5253,10 +4670,10 @@ avivo_save(ScrnInfoPtr pScrn, RADEONSavePtr save) state->dxscl[6] = INREG(0x6e30); state->dxscl[7] = INREG(0x6e34); - if (state->crtc[0].control & AVIVO_CRTC_EN) + if (state->crtc1.control & AVIVO_CRTC_EN) info->crtc_on = TRUE; - if (state->crtc[1].control & AVIVO_CRTC_EN) + if (state->crtc2.control & AVIVO_CRTC_EN) info->crtc2_on = TRUE; } @@ -5291,69 +4708,69 @@ avivo_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore) /* Lock graph registers */ OUTREG(AVIVO_D1GRPH_UPDATE, AVIVO_D1GRPH_UPDATE_LOCK); - OUTREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS, state->grph[0].prim_surf_addr); - OUTREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS, state->grph[0].sec_surf_addr); - OUTREG(AVIVO_D1GRPH_CONTROL, state->grph[0].control); - OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_X, state->grph[0].x_offset); - OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y, state->grph[0].y_offset); - OUTREG(AVIVO_D1GRPH_X_START, state->grph[0].x_start); - OUTREG(AVIVO_D1GRPH_Y_START, state->grph[0].y_start); - OUTREG(AVIVO_D1GRPH_X_END, state->grph[0].x_end); - OUTREG(AVIVO_D1GRPH_Y_END, state->grph[0].y_end); - OUTREG(AVIVO_D1GRPH_PITCH, state->grph[0].pitch); - OUTREG(AVIVO_D1GRPH_ENABLE, state->grph[0].enable); + OUTREG(AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS, state->grph1.prim_surf_addr); + OUTREG(AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS, state->grph1.sec_surf_addr); + OUTREG(AVIVO_D1GRPH_CONTROL, state->grph1.control); + OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_X, state->grph1.x_offset); + OUTREG(AVIVO_D1GRPH_SURFACE_OFFSET_Y, state->grph1.y_offset); + OUTREG(AVIVO_D1GRPH_X_START, state->grph1.x_start); + OUTREG(AVIVO_D1GRPH_Y_START, state->grph1.y_start); + OUTREG(AVIVO_D1GRPH_X_END, state->grph1.x_end); + OUTREG(AVIVO_D1GRPH_Y_END, state->grph1.y_end); + OUTREG(AVIVO_D1GRPH_PITCH, state->grph1.pitch); + OUTREG(AVIVO_D1GRPH_ENABLE, state->grph1.enable); OUTREG(AVIVO_D1GRPH_UPDATE, 0); OUTREG(AVIVO_D2GRPH_UPDATE, AVIVO_D1GRPH_UPDATE_LOCK); - OUTREG(AVIVO_D2GRPH_PRIMARY_SURFACE_ADDRESS, state->grph[1].prim_surf_addr); - OUTREG(AVIVO_D2GRPH_SECONDARY_SURFACE_ADDRESS, state->grph[1].sec_surf_addr); - OUTREG(AVIVO_D2GRPH_CONTROL, state->grph[1].control); - OUTREG(AVIVO_D2GRPH_SURFACE_OFFSET_X, state->grph[1].x_offset); - OUTREG(AVIVO_D2GRPH_SURFACE_OFFSET_Y, state->grph[1].y_offset); - OUTREG(AVIVO_D2GRPH_X_START, state->grph[1].x_start); - OUTREG(AVIVO_D2GRPH_Y_START, state->grph[1].y_start); - OUTREG(AVIVO_D2GRPH_X_END, state->grph[1].x_end); - OUTREG(AVIVO_D2GRPH_Y_END, state->grph[1].y_end); - OUTREG(AVIVO_D2GRPH_PITCH, state->grph[1].pitch); - OUTREG(AVIVO_D2GRPH_ENABLE, state->grph[1].enable); + OUTREG(AVIVO_D2GRPH_PRIMARY_SURFACE_ADDRESS, state->grph2.prim_surf_addr); + OUTREG(AVIVO_D2GRPH_SECONDARY_SURFACE_ADDRESS, state->grph2.sec_surf_addr); + OUTREG(AVIVO_D2GRPH_CONTROL, state->grph2.control); + OUTREG(AVIVO_D2GRPH_SURFACE_OFFSET_X, state->grph2.x_offset); + OUTREG(AVIVO_D2GRPH_SURFACE_OFFSET_Y, state->grph2.y_offset); + OUTREG(AVIVO_D2GRPH_X_START, state->grph2.x_start); + OUTREG(AVIVO_D2GRPH_Y_START, state->grph2.y_start); + OUTREG(AVIVO_D2GRPH_X_END, state->grph2.x_end); + OUTREG(AVIVO_D2GRPH_Y_END, state->grph2.y_end); + OUTREG(AVIVO_D2GRPH_PITCH, state->grph2.pitch); + OUTREG(AVIVO_D2GRPH_ENABLE, state->grph2.enable); OUTREG(AVIVO_D2GRPH_UPDATE, 0); /* Whack some mode regs too */ OUTREG(AVIVO_D1SCL_UPDATE, AVIVO_D1SCL_UPDATE_LOCK); - OUTREG(AVIVO_D1MODE_DESKTOP_HEIGHT, state->grph[0].desktop_height); - OUTREG(AVIVO_D1MODE_VIEWPORT_START, state->grph[0].viewport_start); - OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE, state->grph[0].viewport_size); - OUTREG(AVIVO_D1MODE_DATA_FORMAT, state->grph[0].mode_data_format); + OUTREG(AVIVO_D1MODE_DESKTOP_HEIGHT, state->grph1.desktop_height); + OUTREG(AVIVO_D1MODE_VIEWPORT_START, state->grph1.viewport_start); + OUTREG(AVIVO_D1MODE_VIEWPORT_SIZE, state->grph1.viewport_size); + OUTREG(AVIVO_D1MODE_DATA_FORMAT, state->grph1.mode_data_format); OUTREG(AVIVO_D1SCL_UPDATE, 0); OUTREG(AVIVO_D2SCL_UPDATE, AVIVO_D1SCL_UPDATE_LOCK); - OUTREG(AVIVO_D2MODE_DESKTOP_HEIGHT, state->grph[1].desktop_height); - OUTREG(AVIVO_D2MODE_VIEWPORT_START, state->grph[1].viewport_start); - OUTREG(AVIVO_D2MODE_VIEWPORT_SIZE, state->grph[1].viewport_size); - OUTREG(AVIVO_D2MODE_DATA_FORMAT, state->grph[1].mode_data_format); + OUTREG(AVIVO_D2MODE_DESKTOP_HEIGHT, state->grph2.desktop_height); + OUTREG(AVIVO_D2MODE_VIEWPORT_START, state->grph2.viewport_start); + OUTREG(AVIVO_D2MODE_VIEWPORT_SIZE, state->grph2.viewport_size); + OUTREG(AVIVO_D2MODE_DATA_FORMAT, state->grph2.mode_data_format); OUTREG(AVIVO_D2SCL_UPDATE, 0); /* Set the PLL */ - OUTREG(AVIVO_EXT1_PPLL_REF_DIV_SRC, state->pll[0].ref_div_src); - OUTREG(AVIVO_EXT1_PPLL_REF_DIV, state->pll[0].ref_div); - OUTREG(AVIVO_EXT1_PPLL_FB_DIV, state->pll[0].fb_div); - OUTREG(AVIVO_EXT1_PPLL_POST_DIV_SRC, state->pll[0].post_div_src); - OUTREG(AVIVO_EXT1_PPLL_POST_DIV, state->pll[0].post_div); - OUTREG(AVIVO_EXT1_PPLL_CNTL, state->pll[0].ext_ppll_cntl); - OUTREG(AVIVO_P1PLL_CNTL, state->pll[0].pll_cntl); - OUTREG(AVIVO_P1PLL_INT_SS_CNTL, state->pll[0].int_ss_cntl); + OUTREG(AVIVO_EXT1_PPLL_REF_DIV_SRC, state->pll1.ref_div_src); + OUTREG(AVIVO_EXT1_PPLL_REF_DIV, state->pll1.ref_div); + OUTREG(AVIVO_EXT1_PPLL_FB_DIV, state->pll1.fb_div); + OUTREG(AVIVO_EXT1_PPLL_POST_DIV_SRC, state->pll1.post_div_src); + OUTREG(AVIVO_EXT1_PPLL_POST_DIV, state->pll1.post_div); + OUTREG(AVIVO_EXT1_PPLL_CNTL, state->pll1.ext_ppll_cntl); + OUTREG(AVIVO_P1PLL_CNTL, state->pll1.pll_cntl); + OUTREG(AVIVO_P1PLL_INT_SS_CNTL, state->pll1.int_ss_cntl); - OUTREG(AVIVO_EXT2_PPLL_REF_DIV_SRC, state->pll[1].ref_div_src); - OUTREG(AVIVO_EXT2_PPLL_REF_DIV, state->pll[1].ref_div); - OUTREG(AVIVO_EXT2_PPLL_FB_DIV, state->pll[1].fb_div); - OUTREG(AVIVO_EXT2_PPLL_POST_DIV_SRC, state->pll[1].post_div_src); - OUTREG(AVIVO_EXT2_PPLL_POST_DIV, state->pll[1].post_div); - OUTREG(AVIVO_EXT2_PPLL_CNTL, state->pll[1].ext_ppll_cntl); - OUTREG(AVIVO_P2PLL_CNTL, state->pll[1].pll_cntl); - OUTREG(AVIVO_P2PLL_INT_SS_CNTL, state->pll[1].int_ss_cntl); + OUTREG(AVIVO_EXT2_PPLL_REF_DIV_SRC, state->pll2.ref_div_src); + OUTREG(AVIVO_EXT2_PPLL_REF_DIV, state->pll2.ref_div); + OUTREG(AVIVO_EXT2_PPLL_FB_DIV, state->pll2.fb_div); + OUTREG(AVIVO_EXT2_PPLL_POST_DIV_SRC, state->pll2.post_div_src); + OUTREG(AVIVO_EXT2_PPLL_POST_DIV, state->pll2.post_div); + OUTREG(AVIVO_EXT2_PPLL_CNTL, state->pll2.ext_ppll_cntl); + OUTREG(AVIVO_P2PLL_CNTL, state->pll2.pll_cntl); + OUTREG(AVIVO_P2PLL_INT_SS_CNTL, state->pll2.int_ss_cntl); - OUTREG(AVIVO_PCLK_CRTC1_CNTL, state->crtc[0].pll_source); - OUTREG(AVIVO_PCLK_CRTC2_CNTL, state->crtc[1].pll_source); + OUTREG(AVIVO_PCLK_CRTC1_CNTL, state->crtc1.pll_source); + OUTREG(AVIVO_PCLK_CRTC2_CNTL, state->crtc2.pll_source); /* Set the vga PLL */ OUTREG(AVIVO_VGA25_PPLL_REF_DIV_SRC, state->vga25_ppll.ref_div_src); @@ -5378,45 +4795,45 @@ avivo_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore) OUTREG(AVIVO_VGA41_PPLL_CNTL, state->vga41_ppll.pll_cntl); /* Set the CRTC */ - OUTREG(AVIVO_D1CRTC_H_TOTAL, state->crtc[0].h_total); - OUTREG(AVIVO_D1CRTC_H_BLANK_START_END, state->crtc[0].h_blank_start_end); - OUTREG(AVIVO_D1CRTC_H_SYNC_A, state->crtc[0].h_sync_a); - OUTREG(AVIVO_D1CRTC_H_SYNC_A_CNTL, state->crtc[0].h_sync_a_cntl); - OUTREG(AVIVO_D1CRTC_H_SYNC_B, state->crtc[0].h_sync_b); - OUTREG(AVIVO_D1CRTC_H_SYNC_B_CNTL, state->crtc[0].h_sync_b_cntl); + OUTREG(AVIVO_D1CRTC_H_TOTAL, state->crtc1.h_total); + OUTREG(AVIVO_D1CRTC_H_BLANK_START_END, state->crtc1.h_blank_start_end); + OUTREG(AVIVO_D1CRTC_H_SYNC_A, state->crtc1.h_sync_a); + OUTREG(AVIVO_D1CRTC_H_SYNC_A_CNTL, state->crtc1.h_sync_a_cntl); + OUTREG(AVIVO_D1CRTC_H_SYNC_B, state->crtc1.h_sync_b); + OUTREG(AVIVO_D1CRTC_H_SYNC_B_CNTL, state->crtc1.h_sync_b_cntl); - OUTREG(AVIVO_D1CRTC_V_TOTAL, state->crtc[0].v_total); - OUTREG(AVIVO_D1CRTC_V_BLANK_START_END, state->crtc[0].v_blank_start_end); - OUTREG(AVIVO_D1CRTC_V_SYNC_A, state->crtc[0].v_sync_a); - OUTREG(AVIVO_D1CRTC_V_SYNC_A_CNTL, state->crtc[0].v_sync_a_cntl); - OUTREG(AVIVO_D1CRTC_V_SYNC_B, state->crtc[0].v_sync_b); - OUTREG(AVIVO_D1CRTC_V_SYNC_B_CNTL, state->crtc[0].v_sync_b_cntl); + OUTREG(AVIVO_D1CRTC_V_TOTAL, state->crtc1.v_total); + OUTREG(AVIVO_D1CRTC_V_BLANK_START_END, state->crtc1.v_blank_start_end); + OUTREG(AVIVO_D1CRTC_V_SYNC_A, state->crtc1.v_sync_a); + OUTREG(AVIVO_D1CRTC_V_SYNC_A_CNTL, state->crtc1.v_sync_a_cntl); + OUTREG(AVIVO_D1CRTC_V_SYNC_B, state->crtc1.v_sync_b); + OUTREG(AVIVO_D1CRTC_V_SYNC_B_CNTL, state->crtc1.v_sync_b_cntl); - OUTREG(AVIVO_D1CRTC_INTERLACE_CONTROL, state->crtc[0].interlace_control); - OUTREG(AVIVO_D1CRTC_STEREO_CONTROL, state->crtc[0].stereo_control); + OUTREG(AVIVO_D1CRTC_INTERLACE_CONTROL, state->crtc1.interlace_control); + OUTREG(AVIVO_D1CRTC_STEREO_CONTROL, state->crtc1.stereo_control); - OUTREG(AVIVO_D1CUR_CONTROL, state->crtc[0].cursor_control); + OUTREG(AVIVO_D1CUR_CONTROL, state->crtc1.cursor_control); /* XXX Fix scaler */ - OUTREG(AVIVO_D2CRTC_H_TOTAL, state->crtc[1].h_total); - OUTREG(AVIVO_D2CRTC_H_BLANK_START_END, state->crtc[1].h_blank_start_end); - OUTREG(AVIVO_D2CRTC_H_SYNC_A, state->crtc[1].h_sync_a); - OUTREG(AVIVO_D2CRTC_H_SYNC_A_CNTL, state->crtc[1].h_sync_a_cntl); - OUTREG(AVIVO_D2CRTC_H_SYNC_B, state->crtc[1].h_sync_b); - OUTREG(AVIVO_D2CRTC_H_SYNC_B_CNTL, state->crtc[1].h_sync_b_cntl); + OUTREG(AVIVO_D2CRTC_H_TOTAL, state->crtc2.h_total); + OUTREG(AVIVO_D2CRTC_H_BLANK_START_END, state->crtc2.h_blank_start_end); + OUTREG(AVIVO_D2CRTC_H_SYNC_A, state->crtc2.h_sync_a); + OUTREG(AVIVO_D2CRTC_H_SYNC_A_CNTL, state->crtc2.h_sync_a_cntl); + OUTREG(AVIVO_D2CRTC_H_SYNC_B, state->crtc2.h_sync_b); + OUTREG(AVIVO_D2CRTC_H_SYNC_B_CNTL, state->crtc2.h_sync_b_cntl); - OUTREG(AVIVO_D2CRTC_V_TOTAL, state->crtc[1].v_total); - OUTREG(AVIVO_D2CRTC_V_BLANK_START_END, state->crtc[1].v_blank_start_end); - OUTREG(AVIVO_D2CRTC_V_SYNC_A, state->crtc[1].v_sync_a); - OUTREG(AVIVO_D2CRTC_V_SYNC_A_CNTL, state->crtc[1].v_sync_a_cntl); - OUTREG(AVIVO_D2CRTC_V_SYNC_B, state->crtc[1].v_sync_b); - OUTREG(AVIVO_D2CRTC_V_SYNC_B_CNTL, state->crtc[1].v_sync_b_cntl); + OUTREG(AVIVO_D2CRTC_V_TOTAL, state->crtc2.v_total); + OUTREG(AVIVO_D2CRTC_V_BLANK_START_END, state->crtc2.v_blank_start_end); + OUTREG(AVIVO_D2CRTC_V_SYNC_A, state->crtc2.v_sync_a); + OUTREG(AVIVO_D2CRTC_V_SYNC_A_CNTL, state->crtc2.v_sync_a_cntl); + OUTREG(AVIVO_D2CRTC_V_SYNC_B, state->crtc2.v_sync_b); + OUTREG(AVIVO_D2CRTC_V_SYNC_B_CNTL, state->crtc2.v_sync_b_cntl); - OUTREG(AVIVO_D2CRTC_INTERLACE_CONTROL, state->crtc[1].interlace_control); - OUTREG(AVIVO_D2CRTC_STEREO_CONTROL, state->crtc[1].stereo_control); + OUTREG(AVIVO_D2CRTC_INTERLACE_CONTROL, state->crtc2.interlace_control); + OUTREG(AVIVO_D2CRTC_STEREO_CONTROL, state->crtc2.stereo_control); - OUTREG(AVIVO_D2CUR_CONTROL, state->crtc[1].cursor_control); + OUTREG(AVIVO_D2CUR_CONTROL, state->crtc2.cursor_control); if (IS_DCE3_VARIANT) { /* DVOA regs */ @@ -5630,12 +5047,12 @@ avivo_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore) OUTREG(0x6e34, state->dxscl[7]); /* Enable CRTCs */ - if (state->crtc[0].control & 1) { + if (state->crtc1.control & 1) { OUTREG(AVIVO_D1CRTC_CONTROL, 0x01000101); INREG(AVIVO_D1CRTC_CONTROL); OUTREG(AVIVO_D1CRTC_CONTROL, 0x00010101); } - if (state->crtc[1].control & 1) { + if (state->crtc2.control & 1) { OUTREG(AVIVO_D2CRTC_CONTROL, 0x01000101); INREG(AVIVO_D2CRTC_CONTROL); OUTREG(AVIVO_D2CRTC_CONTROL, 0x00010101); @@ -5646,11 +5063,10 @@ avivo_restore(ScrnInfoPtr pScrn, RADEONSavePtr restore) OUTREG(AVIVO_DC_LB_MEMORY_SPLIT, state->dc_lb_memory_split); /* Need fixing too ? */ - OUTREG(AVIVO_D1CRTC_BLANK_CONTROL, state->crtc[0].blank_control); - OUTREG(AVIVO_D2CRTC_BLANK_CONTROL, state->crtc[1].blank_control); + OUTREG(AVIVO_D1CRTC_BLANK_CONTROL, state->crtc1.blank_control); + OUTREG(AVIVO_D2CRTC_BLANK_CONTROL, state->crtc2.blank_control); /* Dbl check */ - OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control); OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl); OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl); @@ -5663,27 +5079,10 @@ static void avivo_restore_vga_regs(ScrnInfoPtr pScrn, RADEONSavePtr restore) unsigned char *RADEONMMIO = info->MMIO; struct avivo_state *state = &restore->avivo; - OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control); OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl); OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl); } -static void dce4_restore_vga_regs(ScrnInfoPtr pScrn, RADEONSavePtr restore) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - struct dce4_state *state = &restore->dce4; - - OUTREG(AVIVO_VGA_RENDER_CONTROL, state->vga_render_control); - OUTREG(AVIVO_D1VGA_CONTROL, state->vga1_cntl); - OUTREG(AVIVO_D2VGA_CONTROL, state->vga2_cntl); - OUTREG(EVERGREEN_D3VGA_CONTROL, state->vga3_cntl); - OUTREG(EVERGREEN_D4VGA_CONTROL, state->vga4_cntl); - OUTREG(EVERGREEN_D5VGA_CONTROL, state->vga5_cntl); - OUTREG(EVERGREEN_D6VGA_CONTROL, state->vga6_cntl); -} - - static void RADEONRestoreBIOSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) { @@ -5772,11 +5171,7 @@ static void RADEONSave(ScrnInfoPtr pScrn) } #endif - if (IS_DCE4_VARIANT) { - RADEONSaveMemMapRegisters(pScrn, save); - dce4_save(pScrn, save); - //XXX - } else if (IS_AVIVO_VARIANT) { + if (IS_AVIVO_VARIANT) { RADEONSaveMemMapRegisters(pScrn, save); avivo_save(pScrn, save); } else { @@ -5791,8 +5186,6 @@ static void RADEONSave(ScrnInfoPtr pScrn) RADEONSaveCrtcRegisters(pScrn, save); RADEONSaveFPRegisters(pScrn, save); RADEONSaveDACRegisters(pScrn, save); - RADEONSavePalette(pScrn, save); - if (pRADEONEnt->HasCRTC2) { RADEONSaveCrtc2Registers(pScrn, save); RADEONSavePLL2Registers(pScrn, save); @@ -5828,11 +5221,7 @@ static void RADEONRestore(ScrnInfoPtr pScrn) RADEONBlank(pScrn); - if (IS_DCE4_VARIANT) { - RADEONRestoreMemMapRegisters(pScrn, restore); - dce4_restore(pScrn, restore); - //XXX - } else if (IS_AVIVO_VARIANT) { + if (IS_AVIVO_VARIANT) { RADEONRestoreMemMapRegisters(pScrn, restore); avivo_restore(pScrn, restore); } else { @@ -5864,9 +5253,6 @@ static void RADEONRestore(ScrnInfoPtr pScrn) OUTREG(RADEON_CLOCK_CNTL_INDEX, restore->clock_cntl_index); RADEONPllErrataAfterIndex(info); - OUTREG(RADEON_CLOCK_CNTL_INDEX, restore->clock_cntl_index); - RADEONPllErrataAfterIndex(info); - RADEONRestoreBIOSRegisters(pScrn, restore); } @@ -5916,19 +5302,27 @@ static void RADEONRestore(ScrnInfoPtr pScrn) /* to restore console mode, DAC registers should be set after every other registers are set, * otherwise,we may get blank screen */ - if (IS_DCE4_VARIANT) - dce4_restore_vga_regs(pScrn, restore); - else if (IS_AVIVO_VARIANT) + if (IS_AVIVO_VARIANT) avivo_restore_vga_regs(pScrn, restore); - else { - RADEONRestorePalette(pScrn, restore); + + if (!IS_AVIVO_VARIANT) RADEONRestoreDACRegisters(pScrn, restore); - } + #if 0 RADEONWaitForVerticalSync(pScrn); #endif } +#if 0 +/* Define initial palette for requested video mode. This doesn't do + * anything for XFree86 4.0. + */ +static void RADEONInitPalette(RADEONSavePtr save) +{ + save->palette_valid = FALSE; +} +#endif + static Bool RADEONSaveScreen(ScreenPtr pScreen, int mode) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; @@ -6091,6 +5485,15 @@ void RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y, Bool crtc2) "RADEONDoAdjustFrame(%d,%d,%d)\n", x, y, clone); #endif + if (info->showCache && y) { + int lastline = info->FbMapSize / + ((pScrn->displayWidth * pScrn->bitsPerPixel) / 8); + + lastline -= pScrn->currentMode->VDisplay; + y += (pScrn->virtualY - 1) * (y / 3 + 1); + if (y > lastline) y = lastline; + } + Base = pScrn->fbOffset; /* note we cannot really simply use the info->ModeReg.crtc_offset_cntl value, since the @@ -6252,17 +5655,27 @@ Bool RADEONEnterVT(int scrnIndex, int flags) /* Makes sure the engine is idle before doing anything */ RADEONWaitForIdleMMIO(pScrn); - RADEONPMEnterVT(pScrn); + if (info->IsMobility && !IS_AVIVO_VARIANT) { + if (xf86ReturnOptValBool(info->Options, OPTION_DYNAMIC_CLOCKS, FALSE)) { + RADEONSetDynamicClock(pScrn, 1); + } else { + RADEONSetDynamicClock(pScrn, 0); + } + } else if (IS_AVIVO_VARIANT) { + if (xf86ReturnOptValBool(info->Options, OPTION_DYNAMIC_CLOCKS, FALSE)) { + atombios_static_pwrmgt_setup(pScrn, 1); + atombios_dyn_clk_setup(pScrn, 1); + } + } + + if (IS_R300_VARIANT || IS_RV100_VARIANT) + RADEONForceSomeClocks(pScrn); for (i = 0; i < config->num_crtc; i++) radeon_crtc_modeset_ioctl(config->crtc[i], TRUE); pScrn->vtSema = TRUE; - /* Clear the framebuffer */ - memset(info->FB + pScrn->fbOffset, 0, - pScrn->virtualY * pScrn->displayWidth * info->CurrentLayout.pixel_bytes); - if (!xf86SetDesiredModes(pScrn)) return FALSE; @@ -6270,7 +5683,7 @@ Bool RADEONEnterVT(int scrnIndex, int flags) RADEONRestoreSurfaces(pScrn, info->ModeReg); #ifdef XF86DRI if (info->directRenderingEnabled) { - if (info->cardType == CARD_PCIE && + if (info->cardType == CARD_PCIE && info->dri->pKernelDRMVersion->version_minor >= 19 && info->FbSecureSize) { #if X_BYTE_ORDER == X_BIG_ENDIAN @@ -6284,7 +5697,7 @@ Bool RADEONEnterVT(int scrnIndex, int flags) #if X_BYTE_ORDER == X_BIG_ENDIAN OUTREG(RADEON_SURFACE_CNTL, sctrl); #endif - } + } /* get the DRI back into shape after resume */ RADEONDRISetVBlankInterrupt (pScrn, TRUE); @@ -6312,8 +5725,6 @@ Bool RADEONEnterVT(int scrnIndex, int flags) DRIUnlock(pScrn->pScreen); } #endif - if (IS_R500_3D || IS_R300_3D) - radeon_load_bicubic_texture(pScrn); return TRUE; } @@ -6393,8 +5804,6 @@ void RADEONLeaveVT(int scrnIndex, int flags) xf86_hide_cursors (pScrn); - RADEONPMLeaveVT(pScrn); - RADEONRestore(pScrn); for (i = 0; i < config->num_crtc; i++) @@ -6418,8 +5827,6 @@ static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen) xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, "RADEONCloseScreen\n"); - RADEONPMFini(pScrn); - /* Mark acceleration as stopped or we might try to access the engine at * wrong times, especially if we had DRI, after DRI has been stopped */ @@ -6462,7 +5869,7 @@ static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen) #ifdef USE_EXA if (info->accel_state->exa) { exaDriverFini(pScreen); - free(info->accel_state->exa); + xfree(info->accel_state->exa); info->accel_state->exa = NULL; } #endif /* USE_EXA */ @@ -6473,7 +5880,7 @@ static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen) info->accel_state->accel = NULL; if (info->accel_state->scratch_save) - free(info->accel_state->scratch_save); + xfree(info->accel_state->scratch_save); info->accel_state->scratch_save = NULL; } #endif /* USE_XAA */ @@ -6483,6 +5890,10 @@ static Bool RADEONCloseScreen(int scrnIndex, ScreenPtr pScreen) if (info->cursor) xf86DestroyCursorInfoRec(info->cursor); info->cursor = NULL; + xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, + "Disposing DGA\n"); + if (info->DGAModes) xfree(info->DGAModes); + info->DGAModes = NULL; xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, "Unmapping memory\n"); RADEONUnmapMem(pScrn); @@ -6513,3 +5924,362 @@ void RADEONFreeScreen(int scrnIndex, int flags) #endif RADEONFreeRec(pScrn); } + +static void RADEONForceSomeClocks(ScrnInfoPtr pScrn) +{ + /* It appears from r300 and rv100 may need some clocks forced-on */ + uint32_t tmp; + + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + tmp |= RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_VIP; + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); +} + +static void RADEONSetDynamicClock(ScrnInfoPtr pScrn, int mode) +{ + RADEONInfoPtr info = RADEONPTR(pScrn); + RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); + unsigned char *RADEONMMIO = info->MMIO; + uint32_t tmp; + switch(mode) { + case 0: /* Turn everything OFF (ForceON to everything)*/ + if ( !pRADEONEnt->HasCRTC2 ) { + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP | + RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP | + RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE | + RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP | + RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB | + RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM | + RADEON_SCLK_FORCE_RB); + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); + } else if (info->ChipFamily == CHIP_FAMILY_RV350) { + /* for RV350/M10, no delays are required. */ + tmp = INPLL(pScrn, R300_SCLK_CNTL2); + tmp |= (R300_SCLK_FORCE_TCL | + R300_SCLK_FORCE_GA | + R300_SCLK_FORCE_CBA); + OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); + + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP | + RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | + RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 | + R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT | + RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR | + R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX | + R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK | + R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0); + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); + tmp |= RADEON_SCLK_MORE_FORCEON; + OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_MCLK_CNTL); + tmp |= (RADEON_FORCEON_MCLKA | + RADEON_FORCEON_MCLKB | + RADEON_FORCEON_YCLKA | + RADEON_FORCEON_YCLKB | + RADEON_FORCEON_MC); + OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); + tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb | + RADEON_PIXCLK_DAC_ALWAYS_ONb | + R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF); + OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); + tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb | + RADEON_PIX2CLK_DAC_ALWAYS_ONb | + RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb | + R300_DVOCLK_ALWAYS_ONb | + RADEON_PIXCLK_BLEND_ALWAYS_ONb | + RADEON_PIXCLK_GV_ALWAYS_ONb | + R300_PIXCLK_DVO_ALWAYS_ONb | + RADEON_PIXCLK_LVDS_ALWAYS_ONb | + RADEON_PIXCLK_TMDS_ALWAYS_ONb | + R300_PIXCLK_TRANS_ALWAYS_ONb | + R300_PIXCLK_TVO_ALWAYS_ONb | + R300_P2G2CLK_ALWAYS_ONb | + R300_P2G2CLK_ALWAYS_ONb | + R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); + OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); + } else { + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2); + tmp |= RADEON_SCLK_FORCE_SE; + + if ( !pRADEONEnt->HasCRTC2 ) { + tmp |= ( RADEON_SCLK_FORCE_RB | + RADEON_SCLK_FORCE_TDM | + RADEON_SCLK_FORCE_TAM | + RADEON_SCLK_FORCE_PB | + RADEON_SCLK_FORCE_RE | + RADEON_SCLK_FORCE_VIP | + RADEON_SCLK_FORCE_IDCT | + RADEON_SCLK_FORCE_TOP | + RADEON_SCLK_FORCE_DISP1 | + RADEON_SCLK_FORCE_DISP2 | + RADEON_SCLK_FORCE_HDP ); + } else if ((info->ChipFamily == CHIP_FAMILY_R300) || + (info->ChipFamily == CHIP_FAMILY_R350)) { + tmp |= ( RADEON_SCLK_FORCE_HDP | + RADEON_SCLK_FORCE_DISP1 | + RADEON_SCLK_FORCE_DISP2 | + RADEON_SCLK_FORCE_TOP | + RADEON_SCLK_FORCE_IDCT | + RADEON_SCLK_FORCE_VIP); + } + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); + + usleep(16000); + + if ((info->ChipFamily == CHIP_FAMILY_R300) || + (info->ChipFamily == CHIP_FAMILY_R350)) { + tmp = INPLL(pScrn, R300_SCLK_CNTL2); + tmp |= ( R300_SCLK_FORCE_TCL | + R300_SCLK_FORCE_GA | + R300_SCLK_FORCE_CBA); + OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); + usleep(16000); + } + + if (info->IsIGP) { + tmp = INPLL(pScrn, RADEON_MCLK_CNTL); + tmp &= ~(RADEON_FORCEON_MCLKA | + RADEON_FORCEON_YCLKA); + OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp); + usleep(16000); + } + + if ((info->ChipFamily == CHIP_FAMILY_RV200) || + (info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280)) { + tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); + tmp |= RADEON_SCLK_MORE_FORCEON; + OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); + usleep(16000); + } + + tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); + tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb | + RADEON_PIX2CLK_DAC_ALWAYS_ONb | + RADEON_PIXCLK_BLEND_ALWAYS_ONb | + RADEON_PIXCLK_GV_ALWAYS_ONb | + RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | + RADEON_PIXCLK_LVDS_ALWAYS_ONb | + RADEON_PIXCLK_TMDS_ALWAYS_ONb); + + OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); + usleep(16000); + + tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); + tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb | + RADEON_PIXCLK_DAC_ALWAYS_ONb); + OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Clock Scaling Disabled\n"); + break; + case 1: + if (!pRADEONEnt->HasCRTC2) { + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + if ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) > + RADEON_CFG_ATI_REV_A13) { + tmp &= ~(RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_RB); + } + tmp &= ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | + RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE | + RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE | + RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM | + RADEON_SCLK_FORCE_TDM); + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); + } else if ((info->ChipFamily == CHIP_FAMILY_R300) || + (info->ChipFamily == CHIP_FAMILY_R350) || + (info->ChipFamily == CHIP_FAMILY_RV350)) { + if (info->ChipFamily == CHIP_FAMILY_RV350) { + tmp = INPLL(pScrn, R300_SCLK_CNTL2); + tmp &= ~(R300_SCLK_FORCE_TCL | + R300_SCLK_FORCE_GA | + R300_SCLK_FORCE_CBA); + tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT | + R300_SCLK_GA_MAX_DYN_STOP_LAT | + R300_SCLK_CBA_MAX_DYN_STOP_LAT); + OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); + + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + tmp &= ~(RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP | + RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | + RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 | + R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT | + RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR | + R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX | + R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK | + R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0); + tmp |= RADEON_DYN_STOP_LAT_MASK; + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); + tmp &= ~RADEON_SCLK_MORE_FORCEON; + tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT; + OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); + tmp |= (RADEON_PIXCLK_ALWAYS_ONb | + RADEON_PIXCLK_DAC_ALWAYS_ONb); + OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); + tmp |= (RADEON_PIX2CLK_ALWAYS_ONb | + RADEON_PIX2CLK_DAC_ALWAYS_ONb | + RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb | + R300_DVOCLK_ALWAYS_ONb | + RADEON_PIXCLK_BLEND_ALWAYS_ONb | + RADEON_PIXCLK_GV_ALWAYS_ONb | + R300_PIXCLK_DVO_ALWAYS_ONb | + RADEON_PIXCLK_LVDS_ALWAYS_ONb | + RADEON_PIXCLK_TMDS_ALWAYS_ONb | + R300_PIXCLK_TRANS_ALWAYS_ONb | + R300_PIXCLK_TVO_ALWAYS_ONb | + R300_P2G2CLK_ALWAYS_ONb | + R300_P2G2CLK_ALWAYS_ONb); + OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); + + tmp = INPLL(pScrn, RADEON_MCLK_MISC); + tmp |= (RADEON_MC_MCLK_DYN_ENABLE | + RADEON_IO_MCLK_DYN_ENABLE); + OUTPLL(pScrn, RADEON_MCLK_MISC, tmp); + + tmp = INPLL(pScrn, RADEON_MCLK_CNTL); + tmp |= (RADEON_FORCEON_MCLKA | + RADEON_FORCEON_MCLKB); + + tmp &= ~(RADEON_FORCEON_YCLKA | + RADEON_FORCEON_YCLKB | + RADEON_FORCEON_MC); + + /* Some releases of vbios have set DISABLE_MC_MCLKA + and DISABLE_MC_MCLKB bits in the vbios table. Setting these + bits will cause H/W hang when reading video memory with dynamic clocking + enabled. */ + if ((tmp & R300_DISABLE_MC_MCLKA) && + (tmp & R300_DISABLE_MC_MCLKB)) { + /* If both bits are set, then check the active channels */ + tmp = INPLL(pScrn, RADEON_MCLK_CNTL); + if (info->RamWidth == 64) { + if (INREG(RADEON_MEM_CNTL) & R300_MEM_USE_CD_CH_ONLY) + tmp &= ~R300_DISABLE_MC_MCLKB; + else + tmp &= ~R300_DISABLE_MC_MCLKA; + } else { + tmp &= ~(R300_DISABLE_MC_MCLKA | + R300_DISABLE_MC_MCLKB); + } + } + + OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp); + } else { + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + tmp &= ~(R300_SCLK_FORCE_VAP); + tmp |= RADEON_SCLK_FORCE_CP; + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); + usleep(15000); + + tmp = INPLL(pScrn, R300_SCLK_CNTL2); + tmp &= ~(R300_SCLK_FORCE_TCL | + R300_SCLK_FORCE_GA | + R300_SCLK_FORCE_CBA); + OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); + } + } else { + tmp = INPLL(pScrn, RADEON_CLK_PWRMGT_CNTL); + + tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK | + RADEON_DISP_DYN_STOP_LAT_MASK | + RADEON_DYN_STOP_MODE_MASK); + + tmp |= (RADEON_ENGIN_DYNCLK_MODE | + (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT)); + OUTPLL(pScrn, RADEON_CLK_PWRMGT_CNTL, tmp); + usleep(15000); + + tmp = INPLL(pScrn, RADEON_CLK_PIN_CNTL); + tmp |= RADEON_SCLK_DYN_START_CNTL; + OUTPLL(pScrn, RADEON_CLK_PIN_CNTL, tmp); + usleep(15000); + + /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200 + to lockup randomly, leave them as set by BIOS. + */ + tmp = INPLL(pScrn, RADEON_SCLK_CNTL); + /*tmp &= RADEON_SCLK_SRC_SEL_MASK;*/ + tmp &= ~RADEON_SCLK_FORCEON_MASK; + + /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/ + if (((info->ChipFamily == CHIP_FAMILY_RV250) && + ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) < + RADEON_CFG_ATI_REV_A13)) || + ((info->ChipFamily == CHIP_FAMILY_RV100) && + ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) <= + RADEON_CFG_ATI_REV_A13))){ + tmp |= RADEON_SCLK_FORCE_CP; + tmp |= RADEON_SCLK_FORCE_VIP; + } + + OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); + + if ((info->ChipFamily == CHIP_FAMILY_RV200) || + (info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280)) { + tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); + tmp &= ~RADEON_SCLK_MORE_FORCEON; + + /* RV200::A11 A12 RV250::A11 A12 */ + if (((info->ChipFamily == CHIP_FAMILY_RV200) || + (info->ChipFamily == CHIP_FAMILY_RV250)) && + ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) < + RADEON_CFG_ATI_REV_A13)) { + tmp |= RADEON_SCLK_MORE_FORCEON; + } + OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); + usleep(15000); + } + + /* RV200::A11 A12, RV250::A11 A12 */ + if (((info->ChipFamily == CHIP_FAMILY_RV200) || + (info->ChipFamily == CHIP_FAMILY_RV250)) && + ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) < + RADEON_CFG_ATI_REV_A13)) { + tmp = INPLL(pScrn, RADEON_PLL_PWRMGT_CNTL); + tmp |= RADEON_TCL_BYPASS_DISABLE; + OUTPLL(pScrn, RADEON_PLL_PWRMGT_CNTL, tmp); + } + usleep(15000); + + /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK)*/ + tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); + tmp |= (RADEON_PIX2CLK_ALWAYS_ONb | + RADEON_PIX2CLK_DAC_ALWAYS_ONb | + RADEON_PIXCLK_BLEND_ALWAYS_ONb | + RADEON_PIXCLK_GV_ALWAYS_ONb | + RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | + RADEON_PIXCLK_LVDS_ALWAYS_ONb | + RADEON_PIXCLK_TMDS_ALWAYS_ONb); + + OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); + usleep(15000); + + tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); + tmp |= (RADEON_PIXCLK_ALWAYS_ONb | + RADEON_PIXCLK_DAC_ALWAYS_ONb); + + OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); + usleep(15000); + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Clock Scaling Enabled\n"); + break; + default: + break; + } +} diff --git a/driver/xf86-video-ati/src/radeon_drm.h b/driver/xf86-video-ati/src/radeon_drm.h index 49a5f81a5..54bc2345f 100644 --- a/driver/xf86-video-ati/src/radeon_drm.h +++ b/driver/xf86-video-ati/src/radeon_drm.h @@ -493,18 +493,6 @@ typedef struct { #define DRM_RADEON_SETPARAM 0x19 #define DRM_RADEON_SURF_ALLOC 0x1a #define DRM_RADEON_SURF_FREE 0x1b -/* KMS ioctl */ -#define DRM_RADEON_GEM_INFO 0x1c -#define DRM_RADEON_GEM_CREATE 0x1d -#define DRM_RADEON_GEM_MMAP 0x1e -#define DRM_RADEON_GEM_PREAD 0x21 -#define DRM_RADEON_GEM_PWRITE 0x22 -#define DRM_RADEON_GEM_SET_DOMAIN 0x23 -#define DRM_RADEON_GEM_WAIT_IDLE 0x24 -#define DRM_RADEON_CS 0x26 -#define DRM_RADEON_INFO 0x27 -#define DRM_RADEON_GEM_SET_TILING 0x28 -#define DRM_RADEON_GEM_GET_TILING 0x29 #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) @@ -533,18 +521,6 @@ typedef struct { #define DRM_IOCTL_RADEON_SETPARAM DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SETPARAM, drm_radeon_setparam_t) #define DRM_IOCTL_RADEON_SURF_ALLOC DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_ALLOC, drm_radeon_surface_alloc_t) #define DRM_IOCTL_RADEON_SURF_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_FREE, drm_radeon_surface_free_t) -/* KMS */ -#define DRM_IOCTL_RADEON_GEM_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_INFO, struct drm_radeon_gem_info) -#define DRM_IOCTL_RADEON_GEM_CREATE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_CREATE, struct drm_radeon_gem_create) -#define DRM_IOCTL_RADEON_GEM_MMAP DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_MMAP, struct drm_radeon_gem_mmap) -#define DRM_IOCTL_RADEON_GEM_PREAD DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PREAD, struct drm_radeon_gem_pread) -#define DRM_IOCTL_RADEON_GEM_PWRITE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_PWRITE, struct drm_radeon_gem_pwrite) -#define DRM_IOCTL_RADEON_GEM_SET_DOMAIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_DOMAIN, struct drm_radeon_gem_set_domain) -#define DRM_IOCTL_RADEON_GEM_WAIT_IDLE DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_GEM_WAIT_IDLE, struct drm_radeon_gem_wait_idle) -#define DRM_IOCTL_RADEON_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs) -#define DRM_IOCTL_RADEON_INFO DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INFO, struct drm_radeon_info) -#define DRM_IOCTL_RADEON_SET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_TILING, struct drm_radeon_gem_set_tiling) -#define DRM_IOCTL_RADEON_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling) typedef struct drm_radeon_init { enum { @@ -552,7 +528,7 @@ typedef struct drm_radeon_init { RADEON_CLEANUP_CP = 0x02, RADEON_INIT_R200_CP = 0x03, RADEON_INIT_R300_CP = 0x04, - RADEON_INIT_R600_CP = 0x05 + RADEON_INIT_R600_CP = 0x05, } func; unsigned long sarea_priv_offset; int is_pci; /* for overriding only */ @@ -777,131 +753,4 @@ typedef struct drm_radeon_surface_free { #define DRM_RADEON_VBLANK_CRTC1 1 #define DRM_RADEON_VBLANK_CRTC2 2 -/* - * Kernel modesetting world below. - */ -#define RADEON_GEM_DOMAIN_CPU 0x1 -#define RADEON_GEM_DOMAIN_GTT 0x2 -#define RADEON_GEM_DOMAIN_VRAM 0x4 - -struct drm_radeon_gem_info { - uint64_t gart_size; - uint64_t vram_size; - uint64_t vram_visible; -}; - -#define RADEON_GEM_NO_BACKING_STORE 1 - -struct drm_radeon_gem_create { - uint64_t size; - uint64_t alignment; - uint32_t handle; - uint32_t initial_domain; - uint32_t flags; -}; - -#define RADEON_TILING_MACRO 0x1 -#define RADEON_TILING_MICRO 0x2 -#define RADEON_TILING_SWAP_16BIT 0x4 -#define RADEON_TILING_SWAP_32BIT 0x8 -#define RADEON_TILING_SURFACE 0x10 /* this object requires a surface - * when mapped - i.e. front buffer */ - -struct drm_radeon_gem_set_tiling { - uint32_t handle; - uint32_t tiling_flags; - uint32_t pitch; -}; - -struct drm_radeon_gem_get_tiling { - uint32_t handle; - uint32_t tiling_flags; - uint32_t pitch; -}; - -struct drm_radeon_gem_mmap { - uint32_t handle; - uint32_t pad; - uint64_t offset; - uint64_t size; - uint64_t addr_ptr; -}; - -struct drm_radeon_gem_set_domain { - uint32_t handle; - uint32_t read_domains; - uint32_t write_domain; -}; - -struct drm_radeon_gem_wait_idle { - uint32_t handle; - uint32_t pad; -}; - -struct drm_radeon_gem_busy { - uint32_t handle; - uint32_t busy; -}; - -struct drm_radeon_gem_pread { - /** Handle for the object being read. */ - uint32_t handle; - uint32_t pad; - /** Offset into the object to read from */ - uint64_t offset; - /** Length of data to read */ - uint64_t size; - /** Pointer to write the data into. */ - /* void *, but pointers are not 32/64 compatible */ - uint64_t data_ptr; -}; - -struct drm_radeon_gem_pwrite { - /** Handle for the object being written to. */ - uint32_t handle; - uint32_t pad; - /** Offset into the object to write to */ - uint64_t offset; - /** Length of data to write */ - uint64_t size; - /** Pointer to read the data from. */ - /* void *, but pointers are not 32/64 compatible */ - uint64_t data_ptr; -}; - -#define RADEON_CHUNK_ID_RELOCS 0x01 -#define RADEON_CHUNK_ID_IB 0x02 - -struct drm_radeon_cs_chunk { - uint32_t chunk_id; - uint32_t length_dw; - uint64_t chunk_data; -}; - -struct drm_radeon_cs_reloc { - uint32_t handle; - uint32_t read_domains; - uint32_t write_domain; - uint32_t flags; -}; - -struct drm_radeon_cs { - uint32_t num_chunks; - uint32_t cs_id; - /* this points to uint64_t * which point to cs chunks */ - uint64_t chunks; - /* updates to the limits after this CS ioctl */ - uint64_t gart_limit; - uint64_t vram_limit; -}; - -#define RADEON_INFO_DEVICE_ID 0x00 -#define RADEON_INFO_NUM_GB_PIPES 0x01 - -struct drm_radeon_info { - uint32_t request; - uint32_t pad; - uint64_t value; -}; - #endif diff --git a/driver/xf86-video-ati/src/radeon_dummy_bufmgr.h b/driver/xf86-video-ati/src/radeon_dummy_bufmgr.h deleted file mode 100644 index e08e65691..000000000 --- a/driver/xf86-video-ati/src/radeon_dummy_bufmgr.h +++ /dev/null @@ -1,62 +0,0 @@ - -#ifndef RADEON_DUMMY_BUFMGR_H -#define RADEON_DUMMY_BUFMGR_H -/* when we don't have modesetting but we still need these functions */ - -struct radeon_bo { - int dummy; - void *ptr; -}; - -static inline int radeon_cs_begin(Bool dummy, int d2, const char *file, - const char *func, int line) -{ - return 0; -} - -static inline int radeon_cs_end(Bool dummy, const char *file, - const char *func, int line) -{ - return 0; -} - -static inline void radeon_cs_write_dword(Bool cs, uint32_t dword) -{ -} - -static inline int radeon_cs_write_reloc(Bool cs, - struct radeon_bo *bo, - uint32_t read_domain, - uint32_t write_domain, - uint32_t flags) -{ - return 0; -} - -static inline int radeon_bo_map(struct radeon_bo *bo, int write) {return 0;} -static inline void radeon_bo_ref(struct radeon_bo *bo) {return;} -static inline struct radeon_bo *radeon_bo_unref(struct radeon_bo *bo) {return NULL;} -static inline void radeon_bo_unmap(struct radeon_bo *bo) {return;} -static inline int radeon_bo_wait(struct radeon_bo *bo) {return 0;} - -static inline int radeon_cs_space_add_persistent_bo(Bool cs, struct radeon_bo *bo, - uint32_t read_domains, uint32_t write_domain) -{ - return 0; -} - -static inline int radeon_cs_space_check(Bool cs) -{ - return 0; -} - -static inline void radeon_cs_flush_indirect(ScrnInfoPtr pScrn) -{ -} - -static inline void radeon_ddx_cs_start(ScrnInfoPtr pScrn, int n, - const char *file, const char *func, int line) -{ -} - -#endif diff --git a/driver/xf86-video-ati/src/radeon_exa.c b/driver/xf86-video-ati/src/radeon_exa.c index f3daec045..ae6814621 100644 --- a/driver/xf86-video-ati/src/radeon_exa.c +++ b/driver/xf86-video-ati/src/radeon_exa.c @@ -42,7 +42,6 @@ #include "radeon_macros.h" #include "radeon_probe.h" #include "radeon_version.h" -#include "radeon_exa_shared.h" #include "xf86.h" @@ -51,6 +50,26 @@ #define RINFO_FROM_SCREEN(pScr) ScrnInfoPtr pScrn = xf86Screens[pScr->myNum]; \ RADEONInfoPtr info = RADEONPTR(pScrn) +#define RADEON_TRACE_FALL 0 +#define RADEON_TRACE_DRAW 0 + +#if RADEON_TRACE_FALL +#define RADEON_FALLBACK(x) \ +do { \ + ErrorF("%s: ", __FUNCTION__); \ + ErrorF x; \ + return FALSE; \ +} while (0) +#else +#define RADEON_FALLBACK(x) return FALSE +#endif + +#if RADEON_TRACE_DRAW +#define TRACE do { ErrorF("TRACE: %s\n", __FUNCTION__); } while(0) +#else +#define TRACE +#endif + static struct { int rop; int pattern; @@ -101,7 +120,6 @@ static __inline__ uint32_t F_TO_DW(float val) return tmp.l; } - /* Assumes that depth 15 and 16 can be used as depth 16, which is okay since we * require src and dest datatypes to be equal. */ @@ -130,13 +148,6 @@ static Bool RADEONPixmapIsColortiled(PixmapPtr pPix) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); -#ifdef XF86DRM_MODE - if (info->cs) { - /* Taken care of by the kernel relocation handling */ - return FALSE; - } -#endif - /* This doesn't account for the back buffer, which we may want to wrap in * a pixmap at some point for the purposes of DRI buffer moves. */ @@ -168,6 +179,7 @@ static Bool RADEONGetOffsetPitch(PixmapPtr pPix, int bpp, uint32_t *pitch_offset Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, uint32_t *pitch_offset) { + RINFO_FROM_SCREEN(pPix->drawable.pScreen); uint32_t pitch, offset; int bpp; @@ -175,30 +187,44 @@ Bool RADEONGetPixmapOffsetPitch(PixmapPtr pPix, uint32_t *pitch_offset) if (bpp == 24) bpp = 8; - offset = radeonGetPixmapOffset(pPix); + offset = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; pitch = exaGetPixmapPitch(pPix); return RADEONGetOffsetPitch(pPix, bpp, pitch_offset, offset, pitch); } -/** - * Returns whether the provided transform is affine. - * - * transform may be null. +/* + * Used for vblank render stalling. + * Ideally we'd have one pixmap per crtc. + * syncing per-blit is unrealistic so, + * we sync to whichever crtc has a larger area. */ -Bool radeon_transform_is_affine_or_scaled(PictTransformPtr t) +int RADEONBiggerCrtcArea(PixmapPtr pPix) { - if (t == NULL) - return TRUE; - /* the shaders don't handle scaling either */ - return t->matrix[2][0] == 0 && t->matrix[2][1] == 0 && t->matrix[2][2] == IntToxFixed(1); + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + int c, crtc_num = -1, area = 0; + + for (c = 0; c < xf86_config->num_crtc; c++) { + xf86CrtcPtr crtc = xf86_config->crtc[c]; + + if (!crtc->enabled) + continue; + + if ((crtc->mode.HDisplay * crtc->mode.VDisplay) > area) { + area = crtc->mode.HDisplay * crtc->mode.VDisplay; + crtc_num = c; + } + } + + return crtc_num; } #if X_BYTE_ORDER == X_BIG_ENDIAN static unsigned long swapper_surfaces[6]; -static Bool RADEONPrepareAccess_BE(PixmapPtr pPix, int index) +static Bool RADEONPrepareAccess(PixmapPtr pPix, int index) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); unsigned char *RADEONMMIO = info->MMIO; @@ -221,7 +247,7 @@ static Bool RADEONPrepareAccess_BE(PixmapPtr pPix, int index) * surface. We need to align the size first */ size = exaGetPixmapSize(pPix); - size = RADEON_ALIGN(size, RADEON_GPU_PAGE_SIZE); + size = (size + RADEON_BUFFER_ALIGN) & ~(RADEON_BUFFER_ALIGN); /* Set surface to tiling disabled with appropriate swapper */ switch (bpp) { @@ -264,7 +290,7 @@ static Bool RADEONPrepareAccess_BE(PixmapPtr pPix, int index) return TRUE; } -static void RADEONFinishAccess_BE(PixmapPtr pPix, int index) +static void RADEONFinishAccess(PixmapPtr pPix, int index) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); unsigned char *RADEONMMIO = info->MMIO; @@ -297,280 +323,6 @@ static void RADEONFinishAccess_BE(PixmapPtr pPix, int index) #endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ -#ifdef XF86DRM_MODE -Bool RADEONPrepareAccess_CS(PixmapPtr pPix, int index) -{ - ScreenPtr pScreen = pPix->drawable.pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_exa_pixmap_priv *driver_priv; - uint32_t possible_domains = ~0U; - uint32_t current_domain = 0; -#ifdef EXA_MIXED_PIXMAPS - Bool can_fail = !(pPix->drawable.bitsPerPixel < 8) && - pPix != pScreen->GetScreenPixmap(pScreen) && - (info->accel_state->exa->flags & EXA_MIXED_PIXMAPS); -#else - Bool can_fail = FALSE; -#endif - Bool flush = FALSE; - int ret; - -#if X_BYTE_ORDER == X_BIG_ENDIAN - /* May need to handle byte swapping in DownloadFrom/UploadToScreen */ - if (can_fail && pPix->drawable.bitsPerPixel > 8) - return FALSE; -#endif - - driver_priv = exaGetPixmapDriverPrivate(pPix); - if (!driver_priv) - return FALSE; - - /* untile in DFS/UTS */ - if (driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO)) - return FALSE; - - /* if we have more refs than just the BO then flush */ - if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) { - flush = TRUE; - - if (can_fail) { - possible_domains = radeon_bo_get_src_domain(driver_priv->bo); - if (possible_domains == RADEON_GEM_DOMAIN_VRAM) - return FALSE; /* use DownloadFromScreen */ - } - } - - /* if the BO might end up in VRAM, prefer DownloadFromScreen */ - if (can_fail && (possible_domains & RADEON_GEM_DOMAIN_VRAM)) { - radeon_bo_is_busy(driver_priv->bo, ¤t_domain); - - if (current_domain & possible_domains) { - if (current_domain == RADEON_GEM_DOMAIN_VRAM) - return FALSE; - } else if (possible_domains & RADEON_GEM_DOMAIN_VRAM) - return FALSE; - } - - if (flush) - radeon_cs_flush_indirect(pScrn); - - /* flush IB */ - ret = radeon_bo_map(driver_priv->bo, 1); - if (ret) { - FatalError("failed to map pixmap %d\n", ret); - return FALSE; - } - driver_priv->bo_mapped = TRUE; - - pPix->devPrivate.ptr = driver_priv->bo->ptr; - - return TRUE; -} - -void RADEONFinishAccess_CS(PixmapPtr pPix, int index) -{ - struct radeon_exa_pixmap_priv *driver_priv; - - driver_priv = exaGetPixmapDriverPrivate(pPix); - if (!driver_priv || !driver_priv->bo_mapped) - return; - - radeon_bo_unmap(driver_priv->bo); - driver_priv->bo_mapped = FALSE; - pPix->devPrivate.ptr = NULL; -} - - -void *RADEONEXACreatePixmap(ScreenPtr pScreen, int size, int align) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_exa_pixmap_priv *new_priv; - -#ifdef EXA_MIXED_PIXMAPS - if (info->accel_state->exa->flags & EXA_MIXED_PIXMAPS) { - if (size != 0 && !info->exa_force_create && - info->exa_pixmaps == FALSE) - return NULL; - } -#endif - - new_priv = calloc(1, sizeof(struct radeon_exa_pixmap_priv)); - if (!new_priv) - return NULL; - - if (size == 0) - return new_priv; - - new_priv->bo = radeon_bo_open(info->bufmgr, 0, size, align, - RADEON_GEM_DOMAIN_VRAM, 0); - if (!new_priv->bo) { - free(new_priv); - ErrorF("Failed to alloc memory\n"); - return NULL; - } - - return new_priv; - -} - -static const unsigned MicroBlockTable[5][3][2] = { - /*linear tiled square-tiled */ - {{32, 1}, {8, 4}, {0, 0}}, /* 8 bits per pixel */ - {{16, 1}, {8, 2}, {4, 4}}, /* 16 bits per pixel */ - {{ 8, 1}, {4, 2}, {0, 0}}, /* 32 bits per pixel */ - {{ 4, 1}, {0, 0}, {2, 2}}, /* 64 bits per pixel */ - {{ 2, 1}, {0, 0}, {0, 0}} /* 128 bits per pixel */ -}; - -/* Return true if macrotiling can be enabled */ -static Bool RADEONMacroSwitch(int width, int height, int bpp, - uint32_t flags, Bool rv350_mode) -{ - unsigned tilew, tileh, microtiled, logbpp; - - logbpp = RADEONLog2(bpp / 8); - if (logbpp > 4) - return 0; - - microtiled = !!(flags & RADEON_TILING_MICRO); - tilew = MicroBlockTable[logbpp][microtiled][0] * 8; - tileh = MicroBlockTable[logbpp][microtiled][1] * 8; - - /* See TX_FILTER1_n.MACRO_SWITCH. */ - if (rv350_mode) { - return width >= tilew && height >= tileh; - } else { - return width > tilew && height > tileh; - } -} - -void *RADEONEXACreatePixmap2(ScreenPtr pScreen, int width, int height, - int depth, int usage_hint, int bitsPerPixel, - int *new_pitch) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_exa_pixmap_priv *new_priv; - int pitch, base_align; - uint32_t size; - uint32_t tiling = 0; - int cpp = bitsPerPixel / 8; - -#ifdef EXA_MIXED_PIXMAPS - if (info->accel_state->exa->flags & EXA_MIXED_PIXMAPS) { - if (width != 0 && height != 0 && !info->exa_force_create && - info->exa_pixmaps == FALSE) - return NULL; - } -#endif - - if (usage_hint) { - if (info->allowColorTiling) { - if (usage_hint & RADEON_CREATE_PIXMAP_TILING_MACRO) - tiling |= RADEON_TILING_MACRO; - if (usage_hint & RADEON_CREATE_PIXMAP_TILING_MICRO) - tiling |= RADEON_TILING_MICRO; - } - } - - /* Small pixmaps must not be macrotiled on R300, hw cannot sample them - * correctly because samplers automatically switch to macrolinear. */ - if (info->ChipFamily >= CHIP_FAMILY_R300 && - info->ChipFamily <= CHIP_FAMILY_RS740 && - (tiling & RADEON_TILING_MACRO) && - !RADEONMacroSwitch(width, height, bitsPerPixel, tiling, - info->ChipFamily >= CHIP_FAMILY_RV350)) { - tiling &= ~RADEON_TILING_MACRO; - } - - height = RADEON_ALIGN(height, drmmode_get_height_align(pScrn, tiling)); - pitch = RADEON_ALIGN(width, drmmode_get_pitch_align(pScrn, cpp, tiling)) * cpp; - base_align = drmmode_get_base_align(pScrn, cpp, tiling); - size = RADEON_ALIGN(height * pitch, RADEON_GPU_PAGE_SIZE); - - new_priv = calloc(1, sizeof(struct radeon_exa_pixmap_priv)); - if (!new_priv) - return NULL; - - if (size == 0) - return new_priv; - - *new_pitch = pitch; - - new_priv->bo = radeon_bo_open(info->bufmgr, 0, size, base_align, - RADEON_GEM_DOMAIN_VRAM, 0); - if (!new_priv->bo) { - free(new_priv); - ErrorF("Failed to alloc memory\n"); - return NULL; - } - - if (tiling && !radeon_bo_set_tiling(new_priv->bo, tiling, *new_pitch)) - new_priv->tiling_flags = tiling; - - return new_priv; -} - -void RADEONEXADestroyPixmap(ScreenPtr pScreen, void *driverPriv) -{ - struct radeon_exa_pixmap_priv *driver_priv = driverPriv; - - if (!driverPriv) - return; - - if (driver_priv->bo) - radeon_bo_unref(driver_priv->bo); - free(driverPriv); -} - -struct radeon_bo *radeon_get_pixmap_bo(PixmapPtr pPix) -{ - struct radeon_exa_pixmap_priv *driver_priv; - driver_priv = exaGetPixmapDriverPrivate(pPix); - return driver_priv->bo; -} - -uint32_t radeon_get_pixmap_tiling(PixmapPtr pPix) -{ - struct radeon_exa_pixmap_priv *driver_priv; - driver_priv = exaGetPixmapDriverPrivate(pPix); - return driver_priv->tiling_flags; -} - -void radeon_set_pixmap_bo(PixmapPtr pPix, struct radeon_bo *bo) -{ - struct radeon_exa_pixmap_priv *driver_priv; - - driver_priv = exaGetPixmapDriverPrivate(pPix); - if (driver_priv) { - uint32_t pitch; - - if (driver_priv->bo) - radeon_bo_unref(driver_priv->bo); - - radeon_bo_ref(bo); - driver_priv->bo = bo; - - radeon_bo_get_tiling(bo, &driver_priv->tiling_flags, &pitch); - } -} - -Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix) -{ - struct radeon_exa_pixmap_priv *driver_priv; - - driver_priv = exaGetPixmapDriverPrivate(pPix); - - if (!driver_priv) - return FALSE; - if (driver_priv->bo) - return TRUE; - return FALSE; -} -#endif - #define ENTER_DRAW(x) TRACE #define LEAVE_DRAW(x) TRACE /***********************************************************************/ @@ -580,7 +332,6 @@ Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix) #define BEGIN_ACCEL(n) RADEONWaitForFifo(pScrn, (n)) #define OUT_ACCEL_REG(reg, val) OUTREG(reg, val) #define OUT_ACCEL_REG_F(reg, val) OUTREG(reg, F_TO_DW(val)) -#define OUT_RELOC(x, read, write) do {} while(0) #define FINISH_ACCEL() #ifdef RENDER @@ -594,7 +345,6 @@ Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix) #undef OUT_ACCEL_REG #undef OUT_ACCEL_REG_F #undef FINISH_ACCEL -#undef OUT_RELOC #ifdef XF86DRI @@ -605,7 +355,6 @@ Bool RADEONEXAPixmapIsOffscreen(PixmapPtr pPix) #define BEGIN_ACCEL(n) BEGIN_RING(2*(n)) #define OUT_ACCEL_REG(reg, val) OUT_RING_REG(reg, val) #define FINISH_ACCEL() ADVANCE_RING() -#define OUT_RELOC(x, read, write) OUT_RING_RELOC(x, read, write) #define OUT_RING_F(x) OUT_RING(F_TO_DW(x)) @@ -706,7 +455,7 @@ Bool RADEONSetupMemEXA (ScreenPtr pScreen) * offscreen locations does. */ info->dri->backPitch = pScrn->displayWidth; - next = RADEON_ALIGN(info->accel_state->exa->offScreenBase, RADEON_GPU_PAGE_SIZE); + next = RADEON_ALIGN(info->accel_state->exa->offScreenBase, RADEON_BUFFER_ALIGN); if (!info->dri->noBackBuffer && next + screen_size <= info->accel_state->exa->memorySize) { @@ -722,7 +471,7 @@ Bool RADEONSetupMemEXA (ScreenPtr pScreen) */ info->dri->depthPitch = RADEON_ALIGN(pScrn->displayWidth, 32); depth_size = RADEON_ALIGN(pScrn->virtualY, 16) * info->dri->depthPitch * depthCpp; - next = RADEON_ALIGN(info->accel_state->exa->offScreenBase, RADEON_GPU_PAGE_SIZE); + next = RADEON_ALIGN(info->accel_state->exa->offScreenBase, RADEON_BUFFER_ALIGN); if (next + depth_size <= info->accel_state->exa->memorySize) { info->dri->depthOffset = next; @@ -774,10 +523,6 @@ RADEONTexOffsetStart(PixmapPtr pPix) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); unsigned long long offset; - - if (exaGetPixmapDriverPrivate(pPix)) - return -1; - exaMoveInPixmap(pPix); ExaOffscreenMarkUsed(pPix); diff --git a/driver/xf86-video-ati/src/radeon_exa_funcs.c b/driver/xf86-video-ati/src/radeon_exa_funcs.c index 058a547b8..59cb46fcf 100644 --- a/driver/xf86-video-ati/src/radeon_exa_funcs.c +++ b/driver/xf86-video-ati/src/radeon_exa_funcs.c @@ -27,7 +27,7 @@ * Eric Anholt * Zack Rusin * Benjamin Herrenschmidt - * Michel Dänzer + * Michel Dänzer * */ @@ -74,9 +74,6 @@ FUNC_NAME(RADEONSync)(ScreenPtr pScreen, int marker) ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); - if (info->cs) - return; - TRACE; if (info->accel_state->exaMarkerSynced != marker) { @@ -87,79 +84,12 @@ FUNC_NAME(RADEONSync)(ScreenPtr pScreen, int marker) RADEONPTR(pScrn)->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; } -static void FUNC_NAME(Emit2DState)(ScrnInfoPtr pScrn, int op) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - int has_src; - ACCEL_PREAMBLE(); - - /* don't emit if no operation in progress */ - if (info->state_2d.op == 0 && op == 0) - return; - - has_src = info->state_2d.src_pitch_offset || (info->cs && info->state_2d.src_bo); - - if (has_src) { - BEGIN_ACCEL_RELOC(10, 2); - } else { - BEGIN_ACCEL_RELOC(9, 1); - } - OUT_ACCEL_REG(RADEON_DEFAULT_SC_BOTTOM_RIGHT, info->state_2d.default_sc_bottom_right); - OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, info->state_2d.dp_gui_master_cntl); - OUT_ACCEL_REG(RADEON_DP_BRUSH_FRGD_CLR, info->state_2d.dp_brush_frgd_clr); - OUT_ACCEL_REG(RADEON_DP_BRUSH_BKGD_CLR, info->state_2d.dp_brush_bkgd_clr); - OUT_ACCEL_REG(RADEON_DP_SRC_FRGD_CLR, info->state_2d.dp_src_frgd_clr); - OUT_ACCEL_REG(RADEON_DP_SRC_BKGD_CLR, info->state_2d.dp_src_bkgd_clr); - OUT_ACCEL_REG(RADEON_DP_WRITE_MASK, info->state_2d.dp_write_mask); - OUT_ACCEL_REG(RADEON_DP_CNTL, info->state_2d.dp_cntl); - - OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, info->state_2d.dst_pitch_offset); - if (info->cs) - OUT_RELOC(info->state_2d.dst_bo, 0, RADEON_GEM_DOMAIN_VRAM); - - if (has_src) { - OUT_ACCEL_REG(RADEON_SRC_PITCH_OFFSET, info->state_2d.src_pitch_offset); - if (info->cs) - OUT_RELOC(info->state_2d.src_bo, RADEON_GEM_DOMAIN_GTT|RADEON_GEM_DOMAIN_VRAM, 0); - - } - FINISH_ACCEL(); - - if (op) - info->state_2d.op = op; - if (info->cs) - info->reemit_current2d = FUNC_NAME(Emit2DState); -} - -static void -FUNC_NAME(RADEONFlush2D)(PixmapPtr pPix) -{ - RINFO_FROM_SCREEN(pPix->drawable.pScreen); - ACCEL_PREAMBLE(); - - TRACE; - - BEGIN_ACCEL(2); - OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); - FINISH_ACCEL(); -} - -static void -FUNC_NAME(RADEONDone2D)(PixmapPtr pPix) -{ - RINFO_FROM_SCREEN(pPix->drawable.pScreen); - info->state_2d.op = 0; - - FUNC_NAME(RADEONFlush2D)(pPix); -} - static Bool FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); uint32_t datatype, dst_pitch_offset; + ACCEL_PREAMBLE(); TRACE; @@ -172,47 +102,20 @@ FUNC_NAME(RADEONPrepareSolid)(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) RADEON_SWITCH_TO_2D(); -#ifdef XF86DRM_MODE - if (info->cs) { - struct radeon_exa_pixmap_priv *driver_priv; - int ret; - - radeon_cs_space_reset_bos(info->cs); - - driver_priv = exaGetPixmapDriverPrivate(pPix); - radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); - - ret = radeon_cs_space_check(info->cs); - if (ret) - RADEON_FALLBACK(("Not enough RAM to hw accel solid operation\n")); - - driver_priv = exaGetPixmapDriverPrivate(pPix); - if (driver_priv) - info->state_2d.dst_bo = driver_priv->bo; - } -#endif - - info->state_2d.default_sc_bottom_right = (RADEON_DEFAULT_SC_RIGHT_MAX | - RADEON_DEFAULT_SC_BOTTOM_MAX); - info->state_2d.dp_brush_bkgd_clr = 0x00000000; - info->state_2d.dp_src_frgd_clr = 0xffffffff; - info->state_2d.dp_src_bkgd_clr = 0x00000000; - info->state_2d.dp_gui_master_cntl = (RADEON_GMC_DST_PITCH_OFFSET_CNTL | - RADEON_GMC_BRUSH_SOLID_COLOR | - (datatype << 8) | - RADEON_GMC_SRC_DATATYPE_COLOR | - RADEON_ROP[alu].pattern | - RADEON_GMC_CLR_CMP_CNTL_DIS); - info->state_2d.dp_brush_frgd_clr = fg; - info->state_2d.dp_cntl = (RADEON_DST_X_LEFT_TO_RIGHT | RADEON_DST_Y_TOP_TO_BOTTOM); - info->state_2d.dp_write_mask = pm; - info->state_2d.dst_pitch_offset = dst_pitch_offset; - info->state_2d.src_pitch_offset = 0; - info->state_2d.src_bo = NULL; - - info->accel_state->dst_pix = pPix; - - FUNC_NAME(Emit2DState)(pScrn, RADEON_2D_EXA_SOLID); + BEGIN_ACCEL(5); + OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, + RADEON_GMC_DST_PITCH_OFFSET_CNTL | + RADEON_GMC_BRUSH_SOLID_COLOR | + (datatype << 8) | + RADEON_GMC_SRC_DATATYPE_COLOR | + RADEON_ROP[alu].pattern | + RADEON_GMC_CLR_CMP_CNTL_DIS); + OUT_ACCEL_REG(RADEON_DP_BRUSH_FRGD_CLR, fg); + OUT_ACCEL_REG(RADEON_DP_WRITE_MASK, pm); + OUT_ACCEL_REG(RADEON_DP_CNTL, + (RADEON_DST_X_LEFT_TO_RIGHT | RADEON_DST_Y_TOP_TO_BOTTOM)); + OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, dst_pitch_offset); + FINISH_ACCEL(); return TRUE; } @@ -226,17 +129,8 @@ FUNC_NAME(RADEONSolid)(PixmapPtr pPix, int x1, int y1, int x2, int y2) TRACE; -#if defined(ACCEL_CP) && defined(XF86DRM_MODE) - if (info->cs && CS_FULL(info->cs)) { - FUNC_NAME(RADEONFlush2D)(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - } -#endif - if (info->accel_state->vsync) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pPix, - radeon_pick_best_crtc(pScrn, x1, x2, y1, y2), - y1, y2); + FUNC_NAME(RADEONWaitForVLine)(pScrn, pPix, RADEONBiggerCrtcArea(pPix), y1, y2); BEGIN_ACCEL(2); OUT_ACCEL_REG(RADEON_DST_Y_X, (y1 << 16) | x1); @@ -244,35 +138,48 @@ FUNC_NAME(RADEONSolid)(PixmapPtr pPix, int x1, int y1, int x2, int y2) FINISH_ACCEL(); } +static void +FUNC_NAME(RADEONDoneSolid)(PixmapPtr pPix) +{ + RINFO_FROM_SCREEN(pPix->drawable.pScreen); + ACCEL_PREAMBLE(); + + TRACE; + + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); +} + void FUNC_NAME(RADEONDoPrepareCopy)(ScrnInfoPtr pScrn, uint32_t src_pitch_offset, uint32_t dst_pitch_offset, uint32_t datatype, int rop, Pixel planemask) { RADEONInfoPtr info = RADEONPTR(pScrn); + ACCEL_PREAMBLE(); - /* setup 2D state */ - info->state_2d.dp_gui_master_cntl = (RADEON_GMC_DST_PITCH_OFFSET_CNTL | - RADEON_GMC_SRC_PITCH_OFFSET_CNTL | - RADEON_GMC_BRUSH_NONE | - (datatype << 8) | - RADEON_GMC_SRC_DATATYPE_COLOR | - RADEON_ROP[rop].rop | - RADEON_DP_SRC_SOURCE_MEMORY | - RADEON_GMC_CLR_CMP_CNTL_DIS); - info->state_2d.dp_cntl = ((info->accel_state->xdir >= 0 ? RADEON_DST_X_LEFT_TO_RIGHT : 0) | - (info->accel_state->ydir >= 0 ? RADEON_DST_Y_TOP_TO_BOTTOM : 0)); - info->state_2d.dp_brush_frgd_clr = 0xffffffff; - info->state_2d.dp_brush_bkgd_clr = 0x00000000; - info->state_2d.dp_src_frgd_clr = 0xffffffff; - info->state_2d.dp_src_bkgd_clr = 0x00000000; - info->state_2d.dp_write_mask = planemask; - info->state_2d.dst_pitch_offset = dst_pitch_offset; - info->state_2d.src_pitch_offset = src_pitch_offset; - info->state_2d.default_sc_bottom_right = (RADEON_DEFAULT_SC_RIGHT_MAX - | RADEON_DEFAULT_SC_BOTTOM_MAX); + RADEON_SWITCH_TO_2D(); - FUNC_NAME(Emit2DState)(pScrn, RADEON_2D_EXA_COPY); + BEGIN_ACCEL(5); + OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, + RADEON_GMC_DST_PITCH_OFFSET_CNTL | + RADEON_GMC_SRC_PITCH_OFFSET_CNTL | + RADEON_GMC_BRUSH_NONE | + (datatype << 8) | + RADEON_GMC_SRC_DATATYPE_COLOR | + RADEON_ROP[rop].rop | + RADEON_DP_SRC_SOURCE_MEMORY | + RADEON_GMC_CLR_CMP_CNTL_DIS); + OUT_ACCEL_REG(RADEON_DP_WRITE_MASK, planemask); + OUT_ACCEL_REG(RADEON_DP_CNTL, + ((info->accel_state->xdir >= 0 ? RADEON_DST_X_LEFT_TO_RIGHT : 0) | + (info->accel_state->ydir >= 0 ? RADEON_DST_Y_TOP_TO_BOTTOM : 0))); + OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, dst_pitch_offset); + OUT_ACCEL_REG(RADEON_SRC_PITCH_OFFSET, src_pitch_offset); + FINISH_ACCEL(); } static Bool @@ -283,8 +190,12 @@ FUNC_NAME(RADEONPrepareCopy)(PixmapPtr pSrc, PixmapPtr pDst, { RINFO_FROM_SCREEN(pDst->drawable.pScreen); uint32_t datatype, src_pitch_offset, dst_pitch_offset; + TRACE; + info->accel_state->xdir = xdir; + info->accel_state->ydir = ydir; + if (pDst->drawable.bitsPerPixel == 24) RADEON_FALLBACK(("24bpp unsupported")); if (!RADEONGetDatatypeBpp(pDst->drawable.bitsPerPixel, &datatype)) @@ -294,33 +205,6 @@ FUNC_NAME(RADEONPrepareCopy)(PixmapPtr pSrc, PixmapPtr pDst, if (!RADEONGetPixmapOffsetPitch(pDst, &dst_pitch_offset)) RADEON_FALLBACK(("RADEONGetPixmapOffsetPitch dest failed\n")); - RADEON_SWITCH_TO_2D(); - -#ifdef XF86DRM_MODE - if (info->cs) { - struct radeon_exa_pixmap_priv *driver_priv; - int ret; - - radeon_cs_space_reset_bos(info->cs); - - driver_priv = exaGetPixmapDriverPrivate(pSrc); - radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - info->state_2d.src_bo = driver_priv->bo; - - driver_priv = exaGetPixmapDriverPrivate(pDst); - radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); - info->state_2d.dst_bo = driver_priv->bo; - - ret = radeon_cs_space_check(info->cs); - if (ret) - RADEON_FALLBACK(("Not enough RAM to hw accel copy operation\n")); - } -#endif - - info->accel_state->xdir = xdir; - info->accel_state->ydir = ydir; - info->accel_state->dst_pix = pDst; - FUNC_NAME(RADEONDoPrepareCopy)(pScrn, src_pitch_offset, dst_pitch_offset, datatype, rop, planemask); @@ -338,13 +222,6 @@ FUNC_NAME(RADEONCopy)(PixmapPtr pDst, TRACE; -#if defined(ACCEL_CP) && defined(XF86DRM_MODE) - if (info->cs && CS_FULL(info->cs)) { - FUNC_NAME(RADEONFlush2D)(info->accel_state->dst_pix); - radeon_cs_flush_indirect(pScrn); - } -#endif - if (info->accel_state->xdir < 0) { srcX += w - 1; dstX += w - 1; @@ -354,10 +231,8 @@ FUNC_NAME(RADEONCopy)(PixmapPtr pDst, dstY += h - 1; } - if (info->accel_state->vsync) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pDst, - radeon_pick_best_crtc(pScrn, dstX, dstX + w, dstY, dstY + h), - dstY, dstY + h); + if (info->accel_state->vsync) + FUNC_NAME(RADEONWaitForVLine)(pScrn, pDst, RADEONBiggerCrtcArea(pDst), dstY, dstY + h); BEGIN_ACCEL(3); @@ -368,6 +243,22 @@ FUNC_NAME(RADEONCopy)(PixmapPtr pDst, FINISH_ACCEL(); } +static void +FUNC_NAME(RADEONDoneCopy)(PixmapPtr pDst) +{ + RINFO_FROM_SCREEN(pDst->drawable.pScreen); + ACCEL_PREAMBLE(); + + TRACE; + + BEGIN_ACCEL(2); + OUT_ACCEL_REG(RADEON_DSTCACHE_CTLSTAT, RADEON_RB2D_DC_FLUSH_ALL); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); +} + + #ifdef ACCEL_CP static Bool @@ -393,9 +284,7 @@ RADEONUploadToScreenCP(PixmapPtr pDst, int x, int y, int w, int h, RADEON_SWITCH_TO_2D(); if (info->accel_state->vsync) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pDst, - radeon_pick_best_crtc(pScrn, x, x + w, y, y + h), - y, y + h); + FUNC_NAME(RADEONWaitForVLine)(pScrn, pDst, RADEONBiggerCrtcArea(pDst), y, y + h); while ((buf = RADEONHostDataBlit(pScrn, cpp, w, dst_pitch_off, &buf_pitch, @@ -414,22 +303,14 @@ RADEONUploadToScreenCP(PixmapPtr pDst, int x, int y, int w, int h, /* Emit blit with arbitrary source and destination offsets and pitches */ static void -RADEONBlitChunk(ScrnInfoPtr pScrn, struct radeon_bo *src_bo, - struct radeon_bo *dst_bo, uint32_t datatype, - uint32_t src_pitch_offset, uint32_t dst_pitch_offset, - int srcX, int srcY, int dstX, int dstY, int w, int h, - uint32_t src_domain, uint32_t dst_domain) +RADEONBlitChunk(ScrnInfoPtr pScrn, uint32_t datatype, uint32_t src_pitch_offset, + uint32_t dst_pitch_offset, int srcX, int srcY, int dstX, int dstY, + int w, int h) { RADEONInfoPtr info = RADEONPTR(pScrn); ACCEL_PREAMBLE(); - if (src_bo && dst_bo) { - BEGIN_ACCEL_RELOC(6, 2); - } else if (src_bo && dst_bo == NULL) { - BEGIN_ACCEL_RELOC(6, 1); - } else { - BEGIN_ACCEL(6); - } + BEGIN_ACCEL(6); OUT_ACCEL_REG(RADEON_DP_GUI_MASTER_CNTL, RADEON_GMC_DST_PITCH_OFFSET_CNTL | RADEON_GMC_SRC_PITCH_OFFSET_CNTL | @@ -441,13 +322,7 @@ RADEONBlitChunk(ScrnInfoPtr pScrn, struct radeon_bo *src_bo, RADEON_GMC_CLR_CMP_CNTL_DIS | RADEON_GMC_WR_MSK_DIS); OUT_ACCEL_REG(RADEON_SRC_PITCH_OFFSET, src_pitch_offset); - if (src_bo) { - OUT_RELOC(src_bo, src_domain, 0); - } OUT_ACCEL_REG(RADEON_DST_PITCH_OFFSET, dst_pitch_offset); - if (dst_bo) { - OUT_RELOC(dst_bo, 0, dst_domain); - } OUT_ACCEL_REG(RADEON_SRC_Y_X, (srcY << 16) | srcX); OUT_ACCEL_REG(RADEON_DST_Y_X, (dstY << 16) | dstX); OUT_ACCEL_REG(RADEON_DST_HEIGHT_WIDTH, (h << 16) | w); @@ -459,220 +334,6 @@ RADEONBlitChunk(ScrnInfoPtr pScrn, struct radeon_bo *src_bo, FINISH_ACCEL(); } -#if defined(XF86DRM_MODE) -static Bool -RADEONUploadToScreenCS(PixmapPtr pDst, int x, int y, int w, int h, - char *src, int src_pitch) -{ - ScreenPtr pScreen = pDst->drawable.pScreen; - RINFO_FROM_SCREEN(pScreen); - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *scratch = NULL; - struct radeon_bo *copy_dst; - unsigned char *dst; - unsigned size; - uint32_t datatype = 0; - uint32_t dst_domain; - uint32_t dst_pitch_offset; - unsigned bpp = pDst->drawable.bitsPerPixel; - uint32_t scratch_pitch = RADEON_ALIGN(w * bpp / 8, 64); - uint32_t copy_pitch; - uint32_t swap = RADEON_HOST_DATA_SWAP_NONE; - int ret; - Bool flush = TRUE; - Bool r; - int i; - - if (bpp < 8) - return FALSE; - - driver_priv = exaGetPixmapDriverPrivate(pDst); - if (!driver_priv || !driver_priv->bo) - return FALSE; - -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (bpp) { - case 32: - swap = RADEON_HOST_DATA_SWAP_32BIT; - break; - case 16: - swap = RADEON_HOST_DATA_SWAP_16BIT; - break; - } -#endif - - /* If we know the BO won't be busy, don't bother with a scratch */ - copy_dst = driver_priv->bo; - copy_pitch = pDst->devKind; - if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) { - if (!radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) { - flush = FALSE; - if (!radeon_bo_is_busy(driver_priv->bo, &dst_domain)) - goto copy; - } - } - - size = scratch_pitch * h; - scratch = radeon_bo_open(info->bufmgr, 0, size, 0, RADEON_GEM_DOMAIN_GTT, 0); - if (scratch == NULL) { - goto copy; - } - radeon_cs_space_reset_bos(info->cs); - radeon_add_pixmap(info->cs, pDst, 0, RADEON_GEM_DOMAIN_VRAM); - radeon_cs_space_add_persistent_bo(info->cs, scratch, RADEON_GEM_DOMAIN_GTT, 0); - ret = radeon_cs_space_check(info->cs); - if (ret) { - goto copy; - } - copy_dst = scratch; - copy_pitch = scratch_pitch; - flush = FALSE; - -copy: - if (flush) - radeon_cs_flush_indirect(pScrn); - - ret = radeon_bo_map(copy_dst, 0); - if (ret) { - r = FALSE; - goto out; - } - r = TRUE; - size = w * bpp / 8; - dst = copy_dst->ptr; - if (copy_dst == driver_priv->bo) - dst += y * copy_pitch + x * bpp / 8; - for (i = 0; i < h; i++) { - RADEONCopySwap(dst + i * copy_pitch, (uint8_t*)src, size, swap); - src += src_pitch; - } - radeon_bo_unmap(copy_dst); - - if (copy_dst == scratch) { - RADEONGetDatatypeBpp(pDst->drawable.bitsPerPixel, &datatype); - RADEONGetPixmapOffsetPitch(pDst, &dst_pitch_offset); - ACCEL_PREAMBLE(); - RADEON_SWITCH_TO_2D(); - RADEONBlitChunk(pScrn, scratch, driver_priv->bo, datatype, scratch_pitch << 16, - dst_pitch_offset, 0, 0, x, y, w, h, - RADEON_GEM_DOMAIN_GTT, RADEON_GEM_DOMAIN_VRAM); - } - -out: - if (scratch) - radeon_bo_unref(scratch); - return r; -} - -static Bool -RADEONDownloadFromScreenCS(PixmapPtr pSrc, int x, int y, int w, - int h, char *dst, int dst_pitch) -{ - RINFO_FROM_SCREEN(pSrc->drawable.pScreen); - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *scratch = NULL; - struct radeon_bo *copy_src; - unsigned size; - uint32_t datatype = 0; - uint32_t src_domain = 0; - uint32_t src_pitch_offset; - unsigned bpp = pSrc->drawable.bitsPerPixel; - uint32_t scratch_pitch = RADEON_ALIGN(w * bpp / 8, 64); - uint32_t copy_pitch; - uint32_t swap = RADEON_HOST_DATA_SWAP_NONE; - int ret; - Bool flush = FALSE; - Bool r; - - if (bpp < 8) - return FALSE; - - driver_priv = exaGetPixmapDriverPrivate(pSrc); - if (!driver_priv || !driver_priv->bo) - return FALSE; - -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (bpp) { - case 32: - swap = RADEON_HOST_DATA_SWAP_32BIT; - break; - case 16: - swap = RADEON_HOST_DATA_SWAP_16BIT; - break; - } -#endif - - /* If we know the BO won't end up in VRAM anyway, don't bother with a scratch */ - copy_src = driver_priv->bo; - copy_pitch = pSrc->devKind; - if (!(driver_priv->tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) { - if (radeon_bo_is_referenced_by_cs(driver_priv->bo, info->cs)) { - src_domain = radeon_bo_get_src_domain(driver_priv->bo); - if ((src_domain & (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) == - (RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM)) - src_domain = 0; - else /* A write may be scheduled */ - flush = TRUE; - } - - if (!src_domain) - radeon_bo_is_busy(driver_priv->bo, &src_domain); - - if (src_domain & ~(uint32_t)RADEON_GEM_DOMAIN_VRAM) - goto copy; - } - size = scratch_pitch * h; - scratch = radeon_bo_open(info->bufmgr, 0, size, 0, RADEON_GEM_DOMAIN_GTT, 0); - if (scratch == NULL) { - goto copy; - } - radeon_cs_space_reset_bos(info->cs); - radeon_add_pixmap(info->cs, pSrc, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - radeon_cs_space_add_persistent_bo(info->cs, scratch, 0, RADEON_GEM_DOMAIN_GTT); - ret = radeon_cs_space_check(info->cs); - if (ret) { - goto copy; - } - RADEONGetDatatypeBpp(pSrc->drawable.bitsPerPixel, &datatype); - RADEONGetPixmapOffsetPitch(pSrc, &src_pitch_offset); - ACCEL_PREAMBLE(); - RADEON_SWITCH_TO_2D(); - RADEONBlitChunk(pScrn, driver_priv->bo, scratch, datatype, src_pitch_offset, - scratch_pitch << 16, x, y, 0, 0, w, h, - RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, - RADEON_GEM_DOMAIN_GTT); - copy_src = scratch; - copy_pitch = scratch_pitch; - flush = TRUE; - -copy: - if (flush) - FLUSH_RING(); - - ret = radeon_bo_map(copy_src, 0); - if (ret) { - ErrorF("failed to map pixmap: %d\n", ret); - r = FALSE; - goto out; - } - r = TRUE; - w *= bpp / 8; - if (copy_src == driver_priv->bo) - size = y * copy_pitch + x * bpp / 8; - else - size = 0; - while (h--) { - RADEONCopySwap((uint8_t*)dst, copy_src->ptr + size, w, swap); - size += copy_pitch; - dst += dst_pitch; - } - radeon_bo_unmap(copy_src); -out: - if (scratch) - radeon_bo_unref(scratch); - return r; -} -#endif static Bool RADEONDownloadFromScreenCP(PixmapPtr pSrc, int x, int y, int w, int h, @@ -681,7 +342,7 @@ RADEONDownloadFromScreenCP(PixmapPtr pSrc, int x, int y, int w, int h, RINFO_FROM_SCREEN(pSrc->drawable.pScreen); uint8_t *src = info->FB + exaGetPixmapOffset(pSrc); int bpp = pSrc->drawable.bitsPerPixel; - uint32_t datatype, src_pitch_offset, scratch_pitch = RADEON_ALIGN(w * bpp / 8, 64), scratch_off = 0; + uint32_t datatype, src_pitch_offset, scratch_pitch = (w * bpp/8 + 63) & ~63, scratch_off = 0; drmBufPtr scratch; TRACE; @@ -706,8 +367,8 @@ RADEONDownloadFromScreenCP(PixmapPtr pSrc, int x, int y, int w, int h, RADEON_SWITCH_TO_2D(); /* Kick the first blit as early as possible */ - RADEONBlitChunk(pScrn, NULL, NULL, datatype, src_pitch_offset, - scratch_pitch_offset, x, y, 0, 0, w, hpass, 0, 0); + RADEONBlitChunk(pScrn, datatype, src_pitch_offset, scratch_pitch_offset, + x, y, 0, 0, w, hpass); FLUSH_RING(); #if X_BYTE_ORDER == X_BIG_ENDIAN @@ -733,9 +394,8 @@ RADEONDownloadFromScreenCP(PixmapPtr pSrc, int x, int y, int w, int h, /* Prepare next blit if anything's left */ if (hpass) { scratch_off = scratch->total/2 - scratch_off; - RADEONBlitChunk(pScrn, NULL, NULL, datatype, src_pitch_offset, - scratch_pitch_offset + (scratch_off >> 10), - x, y, 0, 0, w, hpass, 0, 0); + RADEONBlitChunk(pScrn, datatype, src_pitch_offset, scratch_pitch_offset + (scratch_off >> 10), + x, y, 0, 0, w, hpass); } /* @@ -799,56 +459,38 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen) info->accel_state->exa->PrepareSolid = FUNC_NAME(RADEONPrepareSolid); info->accel_state->exa->Solid = FUNC_NAME(RADEONSolid); - info->accel_state->exa->DoneSolid = FUNC_NAME(RADEONDone2D); + info->accel_state->exa->DoneSolid = FUNC_NAME(RADEONDoneSolid); info->accel_state->exa->PrepareCopy = FUNC_NAME(RADEONPrepareCopy); info->accel_state->exa->Copy = FUNC_NAME(RADEONCopy); - info->accel_state->exa->DoneCopy = FUNC_NAME(RADEONDone2D); + info->accel_state->exa->DoneCopy = FUNC_NAME(RADEONDoneCopy); info->accel_state->exa->MarkSync = FUNC_NAME(RADEONMarkSync); info->accel_state->exa->WaitMarker = FUNC_NAME(RADEONSync); #ifdef ACCEL_CP - if (!info->kms_enabled) { - info->accel_state->exa->UploadToScreen = RADEONUploadToScreenCP; - if (info->accelDFS) - info->accel_state->exa->DownloadFromScreen = RADEONDownloadFromScreenCP; - } -# if defined(XF86DRM_MODE) - else { - info->accel_state->exa->UploadToScreen = &RADEONUploadToScreenCS; - info->accel_state->exa->DownloadFromScreen = &RADEONDownloadFromScreenCS; - } -# endif + info->accel_state->exa->UploadToScreen = RADEONUploadToScreenCP; + if (info->accelDFS) + info->accel_state->exa->DownloadFromScreen = RADEONDownloadFromScreenCP; #endif #if X_BYTE_ORDER == X_BIG_ENDIAN - info->accel_state->exa->PrepareAccess = RADEONPrepareAccess_BE; - info->accel_state->exa->FinishAccess = RADEONFinishAccess_BE; -#endif + info->accel_state->exa->PrepareAccess = RADEONPrepareAccess; + info->accel_state->exa->FinishAccess = RADEONFinishAccess; +#endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ info->accel_state->exa->flags = EXA_OFFSCREEN_PIXMAPS; #ifdef EXA_SUPPORTS_PREPARE_AUX info->accel_state->exa->flags |= EXA_SUPPORTS_PREPARE_AUX; #endif -#ifdef EXA_SUPPORTS_OFFSCREEN_OVERLAPS - /* The 2D engine supports overlapping memory areas */ - info->accel_state->exa->flags |= EXA_SUPPORTS_OFFSCREEN_OVERLAPS; -#endif - info->accel_state->exa->pixmapOffsetAlign = RADEON_GPU_PAGE_SIZE; + info->accel_state->exa->pixmapOffsetAlign = RADEON_BUFFER_ALIGN + 1; info->accel_state->exa->pixmapPitchAlign = 64; -#ifdef EXA_HANDLES_PIXMAPS - if (info->cs) { - info->accel_state->exa->flags |= EXA_HANDLES_PIXMAPS; -#ifdef EXA_MIXED_PIXMAPS - info->accel_state->exa->flags |= EXA_MIXED_PIXMAPS; -#endif - } -#endif - #ifdef RENDER if (info->RenderAccel) { - if (IS_R300_3D || IS_R500_3D) { + if (info->ChipFamily >= CHIP_FAMILY_R600) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Render acceleration " + "unsupported on R600 and newer cards.\n"); + else if (IS_R300_3D || IS_R500_3D) { if ((info->ChipFamily < CHIP_FAMILY_RS400) #ifdef XF86DRI || (info->directRenderingEnabled) @@ -863,7 +505,10 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen) info->accel_state->exa->DoneComposite = FUNC_NAME(RadeonDoneComposite); } else xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EXA Composite requires CP on R5xx/IGP\n"); - } else if (IS_R200_3D) { + } else if ((info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280) || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_R200)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Render acceleration " "enabled for R200 type cards.\n"); info->accel_state->exa->CheckComposite = R200CheckComposite; @@ -883,31 +528,15 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen) } #endif -#ifdef XF86DRM_MODE -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 4) - if (info->cs) { - info->accel_state->exa->CreatePixmap = RADEONEXACreatePixmap; - info->accel_state->exa->DestroyPixmap = RADEONEXADestroyPixmap; - info->accel_state->exa->PixmapIsOffscreen = RADEONEXAPixmapIsOffscreen; - info->accel_state->exa->PrepareAccess = RADEONPrepareAccess_CS; - info->accel_state->exa->FinishAccess = RADEONFinishAccess_CS; -#if (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 5) - info->accel_state->exa->CreatePixmap2 = RADEONEXACreatePixmap2; -#endif - } -#endif -#endif - - #if EXA_VERSION_MAJOR > 2 || (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 3) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting EXA maxPitchBytes\n"); info->accel_state->exa->maxPitchBytes = 16320; - info->accel_state->exa->maxX = 8191; + info->accel_state->exa->maxX = 8192; #else info->accel_state->exa->maxX = 16320 / 4; #endif - info->accel_state->exa->maxY = 8191; + info->accel_state->exa->maxY = 8192; if (xf86ReturnOptValBool(info->Options, OPTION_EXA_VSYNC, FALSE)) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EXA VSync enabled\n"); @@ -918,7 +547,7 @@ Bool FUNC_NAME(RADEONDrawInit)(ScreenPtr pScreen) RADEONEngineInit(pScrn); if (!exaDriverInit(pScreen, info->accel_state->exa)) { - free(info->accel_state->exa); + xfree(info->accel_state->exa); return FALSE; } exaMarkSync(pScreen); diff --git a/driver/xf86-video-ati/src/radeon_exa_render.c b/driver/xf86-video-ati/src/radeon_exa_render.c index 01012a15e..dea8c0067 100644 --- a/driver/xf86-video-ati/src/radeon_exa_render.c +++ b/driver/xf86-video-ati/src/radeon_exa_render.c @@ -125,10 +125,6 @@ static struct formatinfo R300TexFormats[] = { {PICT_x8r8g8b8, R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8)}, {PICT_a8b8g8r8, R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)}, {PICT_x8b8g8r8, R300_EASY_TX_FORMAT(Z, Y, X, ONE, W8Z8Y8X8)}, -#ifdef PICT_TYPE_BGRA - {PICT_b8g8r8a8, R300_EASY_TX_FORMAT(W, Z, Y, X, W8Z8Y8X8)}, - {PICT_b8g8r8x8, R300_EASY_TX_FORMAT(W, Z, Y, ONE, W8Z8Y8X8)}, -#endif {PICT_r5g6b5, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)}, {PICT_a1r5g5b5, R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)}, {PICT_x1r5g5b5, R300_EASY_TX_FORMAT(X, Y, Z, ONE, W1Z5Y5X5)}, @@ -167,12 +163,6 @@ static Bool R300GetDestFormat(PicturePtr pDstPicture, uint32_t *dst_format) switch (pDstPicture->format) { case PICT_a8r8g8b8: case PICT_x8r8g8b8: - case PICT_a8b8g8r8: - case PICT_x8b8g8r8: -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - case PICT_b8g8r8x8: -#endif *dst_format = R300_COLORFORMAT_ARGB8888; break; case PICT_r5g6b5: @@ -243,11 +233,10 @@ static Bool RADEONCheckTexturePOT(PicturePtr pPict, Bool canTile) { int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; - if ((repeatType == RepeatNormal || repeatType == RepeatReflect) && + if (pPict->repeat && pPict->repeatType != RepeatPad && ((w & (w - 1)) != 0 || (h & (h - 1)) != 0) && - !(repeatType == RepeatNormal && !pPict->transform && canTile)) + !(pPict->repeatType == RepeatNormal && !pPict->transform && canTile)) RADEON_FALLBACK(("NPOT repeating %s unsupported (%dx%d), transform=%d\n", canTile ? "source" : "mask", w, h, pPict->transform != 0)); @@ -263,7 +252,7 @@ static Bool RADEONPitchMatches(PixmapPtr pPix) int h = pPix->drawable.height; uint32_t txpitch = exaGetPixmapPitch(pPix); - if (h > 1 && (RADEON_ALIGN(w * pPix->drawable.bitsPerPixel / 8, 32)) != txpitch) + if (h > 1 && ((w * pPix->drawable.bitsPerPixel / 8 + 31) & ~31) != txpitch) return FALSE; return TRUE; @@ -291,12 +280,11 @@ static Bool RADEONSetupSourceTile(PicturePtr pPict, Bool needMatchingPitch) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; info->accel_state->need_src_tile_x = info->accel_state->need_src_tile_y = FALSE; info->accel_state->src_tile_width = info->accel_state->src_tile_height = 65536; /* "infinite" */ - if (repeatType == RepeatNormal || repeatType == RepeatReflect) { + if (pPict->repeat && pPict->repeatType != RepeatPad) { Bool badPitch = needMatchingPitch && !RADEONPitchMatches(pPix); int w = pPict->pDrawable->width; @@ -312,7 +300,7 @@ static Bool RADEONSetupSourceTile(PicturePtr pPict, if ((info->accel_state->need_src_tile_x || info->accel_state->need_src_tile_y) && - repeatType != RepeatNormal) + pPict->repeatType != RepeatNormal) RADEON_FALLBACK(("Can only tile RepeatNormal at this time\n")); if (!canTile1d) @@ -332,12 +320,8 @@ static Bool RADEONSetupSourceTile(PicturePtr pPict, /* R100-specific code */ -static Bool R100CheckCompositeTexture(PicturePtr pPict, - PicturePtr pDstPict, - int op, - int unit) +static Bool R100CheckCompositeTexture(PicturePtr pPict, int unit) { - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; int i; @@ -366,22 +350,6 @@ static Bool R100CheckCompositeTexture(PicturePtr pPict, RADEON_FALLBACK(("Unsupported filter 0x%x\n", pPict->filter)); } - /* for REPEAT_NONE, Render semantics are that sampling outside the source - * picture results in alpha=0 pixels. We can implement this with a border color - * *if* our source texture has an alpha channel, otherwise we need to fall - * back. If we're not transformed then we hope that upper layers have clipped - * rendering to the bounds of the source drawable, in which case it doesn't - * matter. I have not, however, verified that the X server always does such - * clipping. - */ - if (pPict->transform != 0 && repeatType == RepeatNone && PICT_FORMAT_A(pPict->format) == 0) { - if (!(((op == PictOpSrc) || (op == PictOpClear)) && (PICT_FORMAT_A(pDstPict->format) == 0))) - RADEON_FALLBACK(("REPEAT_NONE unsupported for transformed xRGB source\n")); - } - - if (!radeon_transform_is_affine_or_scaled(pPict->transform)) - RADEON_FALLBACK(("non-affine transforms not supported\n")); - return TRUE; } @@ -394,18 +362,16 @@ static Bool FUNC_NAME(R100TextureSetup)(PicturePtr pPict, PixmapPtr pPix, uint32_t txfilter, txformat, txoffset, txpitch; int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; - Bool repeat = (repeatType == RepeatNormal || repeatType == RepeatReflect) && + Bool repeat = pPict->repeat && pPict->repeatType != RepeatPad && !(unit == 0 && (info->accel_state->need_src_tile_x || info->accel_state->need_src_tile_y)); int i; - struct radeon_exa_pixmap_priv *driver_priv; ACCEL_PREAMBLE(); txpitch = exaGetPixmapPitch(pPix); - txoffset = 0; - - CHECK_OFFSET(pPix, 0x1f, "texture"); + txoffset = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; + if ((txoffset & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture offset 0x%x\n", (int)txoffset)); if ((txpitch & 0x1f) != 0) RADEON_FALLBACK(("Bad texture pitch 0x%x\n", (int)txpitch)); @@ -429,8 +395,8 @@ static Bool FUNC_NAME(R100TextureSetup)(PicturePtr pPict, PixmapPtr pPix, txformat |= RADEON_TXFORMAT_NON_POWER2; txformat |= unit << 24; /* RADEON_TXFORMAT_ST_ROUTE_STQX */ - info->accel_state->texW[unit] = w; - info->accel_state->texH[unit] = h; + info->accel_state->texW[unit] = 1; + info->accel_state->texH[unit] = 1; switch (pPict->filter) { case PictFilterNearest: @@ -443,12 +409,10 @@ static Bool FUNC_NAME(R100TextureSetup)(PicturePtr pPict, PixmapPtr pPix, RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); } - switch (repeatType) { + if (repeat) { + switch (pPict->repeatType) { case RepeatNormal: - if (txformat & RADEON_TXFORMAT_NON_POWER2) - txfilter |= RADEON_CLAMP_S_CLAMP_LAST | RADEON_CLAMP_T_CLAMP_LAST; - else - txfilter |= RADEON_CLAMP_S_WRAP | RADEON_CLAMP_T_WRAP; + txfilter |= RADEON_CLAMP_S_WRAP | RADEON_CLAMP_T_WRAP; break; case RepeatPad: txfilter |= RADEON_CLAMP_S_CLAMP_LAST | RADEON_CLAMP_T_CLAMP_LAST; @@ -457,33 +421,28 @@ static Bool FUNC_NAME(R100TextureSetup)(PicturePtr pPict, PixmapPtr pPix, txfilter |= RADEON_CLAMP_S_MIRROR | RADEON_CLAMP_T_MIRROR; break; case RepeatNone: - /* don't set an illegal clamp mode for rects */ - if (txformat & RADEON_TXFORMAT_NON_POWER2) - txfilter |= RADEON_CLAMP_S_CLAMP_LAST | RADEON_CLAMP_T_CLAMP_LAST; + /* Nothing to do */ break; + } } - BEGIN_ACCEL_RELOC(5, 1); + BEGIN_ACCEL(5); if (unit == 0) { OUT_ACCEL_REG(RADEON_PP_TXFILTER_0, txfilter); OUT_ACCEL_REG(RADEON_PP_TXFORMAT_0, txformat); + OUT_ACCEL_REG(RADEON_PP_TXOFFSET_0, txoffset); OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_0, (pPix->drawable.width - 1) | ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_0, txpitch - 32); - - EMIT_READ_OFFSET(RADEON_PP_TXOFFSET_0, txoffset, pPix); - /* emit a texture relocation */ } else { OUT_ACCEL_REG(RADEON_PP_TXFILTER_1, txfilter); OUT_ACCEL_REG(RADEON_PP_TXFORMAT_1, txformat); - + OUT_ACCEL_REG(RADEON_PP_TXOFFSET_1, txoffset); OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_1, (pPix->drawable.width - 1) | ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_1, txpitch - 32); - EMIT_READ_OFFSET(RADEON_PP_TXOFFSET_1, txoffset, pPix); - /* emit a texture relocation */ } FINISH_ACCEL(); @@ -499,6 +458,14 @@ static Bool FUNC_NAME(R100TextureSetup)(PicturePtr pPict, PixmapPtr pPix, #ifdef ONLY_ONCE +PixmapPtr +RADEONGetDrawablePixmap(DrawablePtr pDrawable) +{ + if (pDrawable->type == DRAWABLE_WINDOW) + return pDrawable->pScreen->GetWindowPixmap((WindowPtr)pDrawable); + else + return (PixmapPtr)pDrawable; +} static Bool R100CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, PicturePtr pDstPicture) @@ -563,11 +530,11 @@ static Bool R100CheckComposite(int op, PicturePtr pSrcPicture, } } - if (!R100CheckCompositeTexture(pMaskPicture, pDstPicture, op, 1)) + if (!R100CheckCompositeTexture(pMaskPicture, 1)) return FALSE; } - if (!R100CheckCompositeTexture(pSrcPicture, pDstPicture, op, 0)) + if (!R100CheckCompositeTexture(pSrcPicture, 0)) return FALSE; if (!RADEONGetDestFormat(pDstPicture, &tmp1)) @@ -575,45 +542,6 @@ static Bool R100CheckComposite(int op, PicturePtr pSrcPicture, return TRUE; } - -static Bool -RADEONPrepareCompositeCS(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, - PicturePtr pDstPicture, PixmapPtr pSrc, PixmapPtr pMask, - PixmapPtr pDst) -{ - RINFO_FROM_SCREEN(pDst->drawable.pScreen); - - info->accel_state->composite_op = op; - info->accel_state->dst_pic = pDstPicture; - info->accel_state->msk_pic = pMaskPicture; - info->accel_state->src_pic = pSrcPicture; - info->accel_state->dst_pix = pDst; - info->accel_state->msk_pix = pMask; - info->accel_state->src_pix = pSrc; - -#ifdef XF86DRM_MODE - if (info->cs) { - int ret; - - radeon_cs_space_reset_bos(info->cs); - - radeon_add_pixmap(info->cs, pSrc, - RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - if (pMask) - radeon_add_pixmap(info->cs, pMask, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - radeon_add_pixmap(info->cs, pDst, 0, RADEON_GEM_DOMAIN_VRAM); - - ret = radeon_cs_space_check(info->cs); - if (ret) - RADEON_FALLBACK(("Not enough RAM to hw accel composite operation\n")); - } -#endif - - return TRUE; -} - #endif /* ONLY_ONCE */ static Bool FUNC_NAME(R100PrepareComposite)(int op, @@ -625,10 +553,9 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op, PixmapPtr pDst) { RINFO_FROM_SCREEN(pDst->drawable.pScreen); - uint32_t dst_format, dst_pitch, colorpitch; + uint32_t dst_format, dst_offset, dst_pitch, colorpitch; uint32_t pp_cntl, blendcntl, cblend, ablend; int pixel_shift; - struct radeon_exa_pixmap_priv *driver_priv; ACCEL_PREAMBLE(); TRACE; @@ -639,25 +566,29 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op, if (pDstPicture->format == PICT_a8 && RadeonBlendOp[op].dst_alpha) RADEON_FALLBACK(("Can't dst alpha blend A8\n")); + if (pMask) + info->accel_state->has_mask = TRUE; + else + info->accel_state->has_mask = FALSE; + pixel_shift = pDst->drawable.bitsPerPixel >> 4; + dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pDst); colorpitch = dst_pitch >> pixel_shift; if (RADEONPixmapIsColortiled(pDst)) colorpitch |= RADEON_COLOR_TILE_ENABLE; - CHECK_OFFSET(pDst, 0x0f, "destination"); - + dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; + dst_pitch = exaGetPixmapPitch(pDst); + if ((dst_offset & 0x0f) != 0) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)dst_offset)); if (((dst_pitch >> pixel_shift) & 0x7) != 0) RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch)); if (!RADEONSetupSourceTile(pSrcPicture, pSrc, FALSE, TRUE)) return FALSE; - RADEONPrepareCompositeCS(op, pSrcPicture, pMaskPicture, pDstPicture, - pSrc, pMask, pDst); - - /* switch to 3D after doing buffer space checks as the latter may flush */ RADEON_SWITCH_TO_3D(); if (!FUNC_NAME(R100TextureSetup)(pSrcPicture, pSrc, 0)) @@ -672,11 +603,11 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op, info->accel_state->is_transform[1] = FALSE; } - BEGIN_ACCEL_RELOC(10, 2); + BEGIN_ACCEL(8); OUT_ACCEL_REG(RADEON_PP_CNTL, pp_cntl); OUT_ACCEL_REG(RADEON_RB3D_CNTL, dst_format | RADEON_ALPHA_BLEND_ENABLE); - EMIT_WRITE_OFFSET(RADEON_RB3D_COLOROFFSET, 0, pDst); - EMIT_COLORPITCH(RADEON_RB3D_COLORPITCH, colorpitch, pDst); + OUT_ACCEL_REG(RADEON_RB3D_COLOROFFSET, dst_offset); + OUT_ACCEL_REG(RADEON_RB3D_COLORPITCH, colorpitch); /* IN operator: Multiply src by mask components or mask alpha. * BLEND_CTL_ADD is A * B + C. @@ -724,10 +655,6 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op, blendcntl = RADEONGetBlendCntl(op, pMaskPicture, pDstPicture->format); OUT_ACCEL_REG(RADEON_RB3D_BLENDCNTL, blendcntl); - - OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0); - OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, (((pDst->drawable.width) << RADEON_RE_WIDTH_SHIFT) | - ((pDst->drawable.height) << RADEON_RE_HEIGHT_SHIFT))); FINISH_ACCEL(); return TRUE; @@ -735,12 +662,8 @@ static Bool FUNC_NAME(R100PrepareComposite)(int op, #ifdef ONLY_ONCE -static Bool R200CheckCompositeTexture(PicturePtr pPict, - PicturePtr pDstPict, - int op, - int unit) +static Bool R200CheckCompositeTexture(PicturePtr pPict, int unit) { - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; int i; @@ -768,22 +691,6 @@ static Bool R200CheckCompositeTexture(PicturePtr pPict, pPict->filter != PictFilterBilinear) RADEON_FALLBACK(("Unsupported filter 0x%x\n", pPict->filter)); - /* for REPEAT_NONE, Render semantics are that sampling outside the source - * picture results in alpha=0 pixels. We can implement this with a border color - * *if* our source texture has an alpha channel, otherwise we need to fall - * back. If we're not transformed then we hope that upper layers have clipped - * rendering to the bounds of the source drawable, in which case it doesn't - * matter. I have not, however, verified that the X server always does such - * clipping. - */ - if (pPict->transform != 0 && repeatType == RepeatNone && PICT_FORMAT_A(pPict->format) == 0) { - if (!(((op == PictOpSrc) || (op == PictOpClear)) && (PICT_FORMAT_A(pDstPict->format) == 0))) - RADEON_FALLBACK(("REPEAT_NONE unsupported for transformed xRGB source\n")); - } - - if (!radeon_transform_is_affine_or_scaled(pPict->transform)) - RADEON_FALLBACK(("non-affine transforms not supported\n")); - return TRUE; } @@ -796,18 +703,16 @@ static Bool FUNC_NAME(R200TextureSetup)(PicturePtr pPict, PixmapPtr pPix, uint32_t txfilter, txformat, txoffset, txpitch; int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; - Bool repeat = (repeatType == RepeatNormal || repeatType == RepeatReflect) && + Bool repeat = pPict->repeat && pPict->repeatType != RepeatPad && !(unit == 0 && (info->accel_state->need_src_tile_x || info->accel_state->need_src_tile_y)); int i; - struct radeon_exa_pixmap_priv *driver_priv; ACCEL_PREAMBLE(); txpitch = exaGetPixmapPitch(pPix); + txoffset = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; - txoffset = 0; - CHECK_OFFSET(pPix, 0x1f, "texture"); - + if ((txoffset & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture offset 0x%x\n", (int)txoffset)); if ((txpitch & 0x1f) != 0) RADEON_FALLBACK(("Bad texture pitch 0x%x\n", (int)txpitch)); @@ -847,12 +752,10 @@ static Bool FUNC_NAME(R200TextureSetup)(PicturePtr pPict, PixmapPtr pPix, RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); } - switch (repeatType) { + if (repeat) { + switch (pPict->repeatType) { case RepeatNormal: - if (txformat & R200_TXFORMAT_NON_POWER2) - txfilter |= R200_CLAMP_S_CLAMP_LAST | R200_CLAMP_T_CLAMP_LAST; - else - txfilter |= R200_CLAMP_S_WRAP | R200_CLAMP_T_WRAP; + txfilter |= R200_CLAMP_S_WRAP | R200_CLAMP_T_WRAP; break; case RepeatPad: txfilter |= R200_CLAMP_S_CLAMP_LAST | R200_CLAMP_T_CLAMP_LAST; @@ -861,13 +764,12 @@ static Bool FUNC_NAME(R200TextureSetup)(PicturePtr pPict, PixmapPtr pPix, txfilter |= R200_CLAMP_S_MIRROR | R200_CLAMP_T_MIRROR; break; case RepeatNone: - /* don't set an illegal clamp mode for rect textures */ - if (txformat & R200_TXFORMAT_NON_POWER2) - txfilter |= R200_CLAMP_S_CLAMP_LAST | R200_CLAMP_T_CLAMP_LAST; + /* Nothing to do */ break; + } } - BEGIN_ACCEL_RELOC(6, 1); + BEGIN_ACCEL(6); if (unit == 0) { OUT_ACCEL_REG(R200_PP_TXFILTER_0, txfilter); OUT_ACCEL_REG(R200_PP_TXFORMAT_0, txformat); @@ -875,7 +777,7 @@ static Bool FUNC_NAME(R200TextureSetup)(PicturePtr pPict, PixmapPtr pPix, OUT_ACCEL_REG(R200_PP_TXSIZE_0, (pPix->drawable.width - 1) | ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); OUT_ACCEL_REG(R200_PP_TXPITCH_0, txpitch - 32); - EMIT_READ_OFFSET(R200_PP_TXOFFSET_0, txoffset, pPix); + OUT_ACCEL_REG(R200_PP_TXOFFSET_0, txoffset); } else { OUT_ACCEL_REG(R200_PP_TXFILTER_1, txfilter); OUT_ACCEL_REG(R200_PP_TXFORMAT_1, txformat); @@ -883,8 +785,7 @@ static Bool FUNC_NAME(R200TextureSetup)(PicturePtr pPict, PixmapPtr pPix, OUT_ACCEL_REG(R200_PP_TXSIZE_1, (pPix->drawable.width - 1) | ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); OUT_ACCEL_REG(R200_PP_TXPITCH_1, txpitch - 32); - EMIT_READ_OFFSET(R200_PP_TXOFFSET_1, txoffset, pPix); - /* emit a texture relocation */ + OUT_ACCEL_REG(R200_PP_TXOFFSET_1, txoffset); } FINISH_ACCEL(); @@ -907,10 +808,6 @@ static Bool R200CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP TRACE; - /* Check for unsupported compositing operations. */ - if (op >= sizeof(RadeonBlendOp) / sizeof(RadeonBlendOp[0])) - RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op)); - if (!pSrcPicture->pDrawable) RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); @@ -964,11 +861,11 @@ static Bool R200CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP } } - if (!R200CheckCompositeTexture(pMaskPicture, pDstPicture, op, 1)) + if (!R200CheckCompositeTexture(pMaskPicture, 1)) return FALSE; } - if (!R200CheckCompositeTexture(pSrcPicture, pDstPicture, op, 0)) + if (!R200CheckCompositeTexture(pSrcPicture, 0)) return FALSE; if (!RADEONGetDestFormat(pDstPicture, &tmp1)) @@ -983,10 +880,9 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) { RINFO_FROM_SCREEN(pDst->drawable.pScreen); - uint32_t dst_format, dst_pitch; + uint32_t dst_format, dst_offset, dst_pitch; uint32_t pp_cntl, blendcntl, cblend, ablend, colorpitch; int pixel_shift; - struct radeon_exa_pixmap_priv *driver_priv; ACCEL_PREAMBLE(); TRACE; @@ -997,25 +893,27 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture, if (pDstPicture->format == PICT_a8 && RadeonBlendOp[op].dst_alpha) RADEON_FALLBACK(("Can't dst alpha blend A8\n")); + if (pMask) + info->accel_state->has_mask = TRUE; + else + info->accel_state->has_mask = FALSE; + pixel_shift = pDst->drawable.bitsPerPixel >> 4; + dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pDst); colorpitch = dst_pitch >> pixel_shift; if (RADEONPixmapIsColortiled(pDst)) colorpitch |= RADEON_COLOR_TILE_ENABLE; - CHECK_OFFSET(pDst, 0xf, "destination"); - + if ((dst_offset & 0x0f) != 0) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)dst_offset)); if (((dst_pitch >> pixel_shift) & 0x7) != 0) RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch)); if (!RADEONSetupSourceTile(pSrcPicture, pSrc, FALSE, TRUE)) return FALSE; - RADEONPrepareCompositeCS(op, pSrcPicture, pMaskPicture, pDstPicture, - pSrc, pMask, pDst); - - /* switch to 3D after doing buffer space checks as it may flush */ RADEON_SWITCH_TO_3D(); if (!FUNC_NAME(R200TextureSetup)(pSrcPicture, pSrc, 0)) @@ -1030,13 +928,11 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture, info->accel_state->is_transform[1] = FALSE; } - BEGIN_ACCEL_RELOC(12, 2); + BEGIN_ACCEL(11); OUT_ACCEL_REG(RADEON_PP_CNTL, pp_cntl); OUT_ACCEL_REG(RADEON_RB3D_CNTL, dst_format | RADEON_ALPHA_BLEND_ENABLE); - - EMIT_WRITE_OFFSET(RADEON_RB3D_COLOROFFSET, 0, pDst); - EMIT_COLORPITCH(RADEON_RB3D_COLORPITCH, colorpitch, pDst); + OUT_ACCEL_REG(RADEON_RB3D_COLOROFFSET, dst_offset); OUT_ACCEL_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); if (pMask) @@ -1047,7 +943,7 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture, OUT_ACCEL_REG(R200_SE_VTX_FMT_1, (2 << R200_VTX_TEX0_COMP_CNT_SHIFT)); - + OUT_ACCEL_REG(RADEON_RB3D_COLORPITCH, colorpitch); /* IN operator: Multiply src by mask components or mask alpha. * BLEND_CTL_ADD is A * B + C. @@ -1092,10 +988,6 @@ static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture, /* Op operator. */ blendcntl = RADEONGetBlendCntl(op, pMaskPicture, pDstPicture->format); OUT_ACCEL_REG(RADEON_RB3D_BLENDCNTL, blendcntl); - - OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, (((pDst->drawable.width) << RADEON_RE_WIDTH_SHIFT) | - ((pDst->drawable.height) << RADEON_RE_HEIGHT_SHIFT))); - FINISH_ACCEL(); return TRUE; @@ -1109,11 +1001,6 @@ static Bool R300CheckCompositeTexture(PicturePtr pPict, int unit, Bool is_r500) { - ScreenPtr pScreen = pDstPict->pDrawable->pScreen; - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; int i; @@ -1139,17 +1026,8 @@ static Bool R300CheckCompositeTexture(PicturePtr pPict, RADEON_FALLBACK(("Unsupported picture format 0x%x\n", (int)pPict->format)); - if (!RADEONCheckTexturePOT(pPict, unit == 0)) { - if (info->cs) { - struct radeon_exa_pixmap_priv *driver_priv; - PixmapPtr pPix; - - pPix = RADEONGetDrawablePixmap(pPict->pDrawable); - driver_priv = exaGetPixmapDriverPrivate(pPix); - //TODOradeon_bufmgr_gem_force_gtt(driver_priv->bo); - } + if (!RADEONCheckTexturePOT(pPict, unit == 0)) return FALSE; - } if (pPict->filter != PictFilterNearest && pPict->filter != PictFilterBilinear) @@ -1163,14 +1041,11 @@ static Bool R300CheckCompositeTexture(PicturePtr pPict, * matter. I have not, however, verified that the X server always does such * clipping. */ - if (pPict->transform != 0 && repeatType == RepeatNone && PICT_FORMAT_A(pPict->format) == 0) { + if (pPict->transform != 0 && !pPict->repeat && PICT_FORMAT_A(pPict->format) == 0) { if (!(((op == PictOpSrc) || (op == PictOpClear)) && (PICT_FORMAT_A(pDstPict->format) == 0))) RADEON_FALLBACK(("REPEAT_NONE unsupported for transformed xRGB source\n")); } - if (!radeon_transform_is_affine_or_scaled(pPict->transform)) - RADEON_FALLBACK(("non-affine transforms not supported\n")); - return TRUE; } @@ -1180,21 +1055,19 @@ static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix, int unit) { RINFO_FROM_SCREEN(pPix->drawable.pScreen); - uint32_t txfilter, txformat0, txformat1, txoffset, txpitch, us_format = 0; + uint32_t txfilter, txformat0, txformat1, txoffset, txpitch; int w = pPict->pDrawable->width; int h = pPict->pDrawable->height; - int i, pixel_shift, out_size = 6; - unsigned int repeatType = pPict->repeat ? pPict->repeatType : RepeatNone; - struct radeon_exa_pixmap_priv *driver_priv; + int i, pixel_shift; ACCEL_PREAMBLE(); TRACE; txpitch = exaGetPixmapPitch(pPix); - txoffset = 0; - - CHECK_OFFSET(pPix, 0x1f, "texture"); + txoffset = exaGetPixmapOffset(pPix) + info->fbLocation + pScrn->fbOffset; + if ((txoffset & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture offset 0x%x\n", (int)txoffset)); if ((txpitch & 0x1f) != 0) RADEON_FALLBACK(("Bad texture pitch 0x%x\n", (int)txpitch)); @@ -1214,13 +1087,6 @@ static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix, txformat1 = R300TexFormats[i].card_fmt; - if (IS_R300_3D) { - if ((unit == 0) && info->accel_state->msk_pic) - txformat1 |= R300_TX_FORMAT_CACHE_HALF_REGION_0; - else if (unit == 1) - txformat1 |= R300_TX_FORMAT_CACHE_HALF_REGION_1; - } - txformat0 = ((((w - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | (((h - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT)); @@ -1230,60 +1096,47 @@ static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix, if (IS_R500_3D && ((h - 1) & 0x800)) txpitch |= R500_TXHEIGHT_11; - if (info->ChipFamily == CHIP_FAMILY_R520) { - unsigned us_width = (w - 1) & 0x7ff; - unsigned us_height = (h - 1) & 0x7ff; - unsigned us_depth = 0; - - if (w > 2048) { - us_width = (0x7ff + us_width) >> 1; - us_depth |= 0x0d; - } - if (h > 2048) { - us_height = (0x7ff + us_height) >> 1; - us_depth |= 0x0e; - } - - us_format = (us_width << R300_TXWIDTH_SHIFT) | - (us_height << R300_TXHEIGHT_SHIFT) | - (us_depth << R300_TXDEPTH_SHIFT); - out_size++; - } - /* Use TXPITCH instead of TXWIDTH for address computations: we could * omit this if there is no padding, but there is no apparent advantage * in doing so. */ txformat0 |= R300_TXPITCH_EN; + info->accel_state->texW[unit] = w; + info->accel_state->texH[unit] = h; + txfilter = (unit << R300_TX_ID_SHIFT); - switch (repeatType) { - case RepeatNormal: - if (unit != 0 || !info->accel_state->need_src_tile_x) - txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_WRAP); - else - txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_GL); - - if (unit != 0 || !info->accel_state->need_src_tile_y) - txfilter |= R300_TX_CLAMP_T(R300_TX_CLAMP_WRAP); - else - txfilter |= R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_GL); + if (pPict->repeat) { + switch (pPict->repeatType) { + case RepeatNormal: + if (unit != 0 || !info->accel_state->need_src_tile_x) + txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_WRAP); + else + txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_GL); - break; - case RepeatPad: - txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | - R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST); - break; - case RepeatReflect: - txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_MIRROR) | - R300_TX_CLAMP_T(R300_TX_CLAMP_MIRROR); - break; - case RepeatNone: + if (unit != 0 || !info->accel_state->need_src_tile_y) + txfilter |= R300_TX_CLAMP_T(R300_TX_CLAMP_WRAP); + else + txfilter |= R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_GL); + + break; + case RepeatPad: + txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | + R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST); + break; + case RepeatReflect: + txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_MIRROR) | + R300_TX_CLAMP_T(R300_TX_CLAMP_MIRROR); + break; + case RepeatNone: + txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_GL) | + R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_GL); + break; + } + } else txfilter |= R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_GL) | - R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_GL); - break; - } + R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_GL); switch (pPict->filter) { case PictFilterNearest: @@ -1296,81 +1149,22 @@ static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix, RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); } - if (repeatType == RepeatNone) - out_size++; - BEGIN_ACCEL_RELOC(out_size, 1); + BEGIN_ACCEL(pPict->repeat ? 6 : 7); OUT_ACCEL_REG(R300_TX_FILTER0_0 + (unit * 4), txfilter); OUT_ACCEL_REG(R300_TX_FILTER1_0 + (unit * 4), 0); OUT_ACCEL_REG(R300_TX_FORMAT0_0 + (unit * 4), txformat0); OUT_ACCEL_REG(R300_TX_FORMAT1_0 + (unit * 4), txformat1); OUT_ACCEL_REG(R300_TX_FORMAT2_0 + (unit * 4), txpitch); - - EMIT_READ_OFFSET((R300_TX_OFFSET_0 + (unit * 4)), txoffset, pPix); - - if (repeatType == RepeatNone) + OUT_ACCEL_REG(R300_TX_OFFSET_0 + (unit * 4), txoffset); + if (!pPict->repeat) OUT_ACCEL_REG(R300_TX_BORDER_COLOR_0 + (unit * 4), 0); - if (info->ChipFamily == CHIP_FAMILY_R520) - OUT_ACCEL_REG(R500_US_FORMAT0_0 + (unit * 4), us_format); FINISH_ACCEL(); if (pPict->transform != 0) { info->accel_state->is_transform[unit] = TRUE; info->accel_state->transform[unit] = pPict->transform; - - /* setup the PVS consts */ - if (info->accel_state->has_tcl) { - info->accel_state->texW[unit] = 1; - info->accel_state->texH[unit] = 1; - BEGIN_ACCEL(9); - if (IS_R300_3D) - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, R300_PVS_VECTOR_CONST_INDEX(unit * 2)); - else - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, R500_PVS_VECTOR_CONST_INDEX(unit * 2)); - - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(xFixedToFloat(pPict->transform->matrix[0][0]))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(xFixedToFloat(pPict->transform->matrix[0][1]))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(xFixedToFloat(pPict->transform->matrix[0][2]))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(1.0/w)); - - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(xFixedToFloat(pPict->transform->matrix[1][0]))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(xFixedToFloat(pPict->transform->matrix[1][1]))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(xFixedToFloat(pPict->transform->matrix[1][2]))); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(1.0/h)); - - FINISH_ACCEL(); - } else { - info->accel_state->texW[unit] = w; - info->accel_state->texH[unit] = h; - } } else { info->accel_state->is_transform[unit] = FALSE; - - /* setup the PVS consts */ - if (info->accel_state->has_tcl) { - info->accel_state->texW[unit] = 1; - info->accel_state->texH[unit] = 1; - - BEGIN_ACCEL(9); - if (IS_R300_3D) - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, R300_PVS_VECTOR_CONST_INDEX(unit * 2)); - else - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, R500_PVS_VECTOR_CONST_INDEX(unit * 2)); - - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(1.0)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(0.0)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(0.0)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(1.0/w)); - - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(0.0)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(1.0)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(0.0)); - OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, F_TO_DW(1.0/h)); - - FINISH_ACCEL(); - } else { - info->accel_state->texW[unit] = w; - info->accel_state->texH[unit] = h; - } } return TRUE; @@ -1397,9 +1191,6 @@ static Bool R300CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP if (!pSrcPicture->pDrawable) RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); - if (!pSrcPicture->pDrawable) - RADEON_FALLBACK(("Solid or gradient pictures not supported yet\n")); - pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); if (IS_R500_3D) { @@ -1410,13 +1201,8 @@ static Bool R300CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskP } else { max_tex_w = 2048; max_tex_h = 2048; - if (IS_R400_3D) { - max_dst_w = 4021; - max_dst_h = 4021; - } else { - max_dst_w = 2560; - max_dst_h = 2560; - } + max_dst_w = 2560; + max_dst_h = 2560; } if (pSrcPixmap->drawable.width > max_tex_w || @@ -1483,21 +1269,25 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) { RINFO_FROM_SCREEN(pDst->drawable.pScreen); - uint32_t dst_format, dst_pitch; + uint32_t dst_format, dst_offset, dst_pitch; uint32_t txenable, colorpitch; - uint32_t blendcntl, output_fmt; - uint32_t src_color, src_alpha; - uint32_t mask_color, mask_alpha; + uint32_t blendcntl; int pixel_shift; - struct radeon_exa_pixmap_priv *driver_priv; ACCEL_PREAMBLE(); + TRACE; if (!R300GetDestFormat(pDstPicture, &dst_format)) return FALSE; + if (pMask) + info->accel_state->has_mask = TRUE; + else + info->accel_state->has_mask = FALSE; + pixel_shift = pDst->drawable.bitsPerPixel >> 4; + dst_offset = exaGetPixmapOffset(pDst) + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pDst); colorpitch = dst_pitch >> pixel_shift; @@ -1506,18 +1296,14 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, colorpitch |= dst_format; - CHECK_OFFSET(pDst, 0x0f, "destination"); - + if ((dst_offset & 0x0f) != 0) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)dst_offset)); if (((dst_pitch >> pixel_shift) & 0x7) != 0) RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch)); if (!RADEONSetupSourceTile(pSrcPicture, pSrc, TRUE, FALSE)) return FALSE; - RADEONPrepareCompositeCS(op, pSrcPicture, pMaskPicture, pDstPicture, - pSrc, pMask, pDst); - - /* have to execute switch after doing buffer sizing check as the latter flushes */ RADEON_SWITCH_TO_3D(); if (!FUNC_NAME(R300TextureSetup)(pSrcPicture, pSrc, 0)) @@ -1535,10 +1321,9 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, /* setup the VAP */ if (info->accel_state->has_tcl) { if (pMask) - BEGIN_ACCEL(10); + BEGIN_ACCEL(8); else - BEGIN_ACCEL(9); - OUT_ACCEL_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0); + BEGIN_ACCEL(7); } else { if (pMask) BEGIN_ACCEL(6); @@ -1589,28 +1374,22 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, /* load the vertex shader * We pre-load vertex programs in RADEONInit3DEngine(): - * - exa + * - exa no mask + * - exa mask * - Xv - * - Xv bicubic * Here we select the offset of the vertex program we want to use */ if (info->accel_state->has_tcl) { if (pMask) { - /* consts used by vertex shaders */ - OUT_ACCEL_REG(R300_VAP_PVS_CONST_CNTL, (R300_PVS_CONST_BASE_OFFSET(0) | - R300_PVS_MAX_CONST_ADDR(3))); OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, ((0 << R300_PVS_FIRST_INST_SHIFT) | - (8 << R300_PVS_XYZW_VALID_INST_SHIFT) | - (8 << R300_PVS_LAST_INST_SHIFT))); + (2 << R300_PVS_XYZW_VALID_INST_SHIFT) | + (2 << R300_PVS_LAST_INST_SHIFT))); OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, - (8 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + (2 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); } else { - /* consts used by vertex shaders */ - OUT_ACCEL_REG(R300_VAP_PVS_CONST_CNTL, (R300_PVS_CONST_BASE_OFFSET(0) | - R300_PVS_MAX_CONST_ADDR(3))); OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, - ((0 << R300_PVS_FIRST_INST_SHIFT) | + ((3 << R300_PVS_FIRST_INST_SHIFT) | (4 << R300_PVS_XYZW_VALID_INST_SHIFT) | (4 << R300_PVS_LAST_INST_SHIFT))); OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, @@ -1632,43 +1411,12 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, OUT_ACCEL_REG(R300_TX_ENABLE, txenable); FINISH_ACCEL(); - /* shader output swizzling */ - switch (pDstPicture->format) { - case PICT_a8r8g8b8: - case PICT_x8r8g8b8: - default: - output_fmt = (R300_OUT_FMT_C4_8 | - R300_OUT_FMT_C0_SEL_BLUE | - R300_OUT_FMT_C1_SEL_GREEN | - R300_OUT_FMT_C2_SEL_RED | - R300_OUT_FMT_C3_SEL_ALPHA); - break; - case PICT_a8b8g8r8: - case PICT_x8b8g8r8: - output_fmt = (R300_OUT_FMT_C4_8 | - R300_OUT_FMT_C0_SEL_RED | - R300_OUT_FMT_C1_SEL_GREEN | - R300_OUT_FMT_C2_SEL_BLUE | - R300_OUT_FMT_C3_SEL_ALPHA); - break; -#ifdef PICT_TYPE_BGRA - case PICT_b8g8r8a8: - case PICT_b8g8r8x8: - output_fmt = (R300_OUT_FMT_C4_8 | - R300_OUT_FMT_C0_SEL_ALPHA | - R300_OUT_FMT_C1_SEL_RED | - R300_OUT_FMT_C2_SEL_GREEN | - R300_OUT_FMT_C3_SEL_BLUE); - break; -#endif - case PICT_a8: - output_fmt = (R300_OUT_FMT_C4_8 | - R300_OUT_FMT_C0_SEL_ALPHA); - break; - } - /* setup pixel shader */ if (IS_R300_3D) { + uint32_t output_fmt; + int src_color, src_alpha; + int mask_color, mask_alpha; + if (PICT_FORMAT_RGB(pSrcPicture->format) == 0) src_color = R300_ALU_RGB_0_0; else @@ -1679,22 +1427,45 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, else src_alpha = R300_ALU_ALPHA_SRC0_A; - if (pMask) { - if (pMaskPicture->componentAlpha) { - if (RadeonBlendOp[op].src_alpha) { - if (PICT_FORMAT_A(pSrcPicture->format) == 0) - src_color = R300_ALU_RGB_1_0; - else - src_color = R300_ALU_RGB_SRC0_AAA; - } else - src_color = R300_ALU_RGB_SRC0_RGB; + if (pMask && pMaskPicture->componentAlpha) { + if (RadeonBlendOp[op].src_alpha) { + if (PICT_FORMAT_A(pSrcPicture->format) == 0) { + src_color = R300_ALU_RGB_1_0; + src_alpha = R300_ALU_ALPHA_1_0; + } else { + src_color = R300_ALU_RGB_SRC0_AAA; + src_alpha = R300_ALU_ALPHA_SRC0_A; + } + mask_color = R300_ALU_RGB_SRC1_RGB; - } else { + if (PICT_FORMAT_A(pMaskPicture->format) == 0) - mask_color = R300_ALU_RGB_1_0; + mask_alpha = R300_ALU_ALPHA_1_0; else - mask_color = R300_ALU_RGB_SRC1_AAA; + mask_alpha = R300_ALU_ALPHA_SRC1_A; + + } else { + src_color = R300_ALU_RGB_SRC0_RGB; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + src_alpha = R300_ALU_ALPHA_1_0; + else + src_alpha = R300_ALU_ALPHA_SRC0_A; + + mask_color = R300_ALU_RGB_SRC1_RGB; + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R300_ALU_ALPHA_1_0; + else + mask_alpha = R300_ALU_ALPHA_SRC1_A; + } + } else if (pMask) { + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_color = R300_ALU_RGB_1_0; + else + mask_color = R300_ALU_RGB_SRC1_AAA; + if (PICT_FORMAT_A(pMaskPicture->format) == 0) mask_alpha = R300_ALU_ALPHA_1_0; else @@ -1704,6 +1475,32 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, mask_alpha = R300_ALU_ALPHA_1_0; } + /* shader output swizzling */ + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + default: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_RED | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_BLUE | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_ALPHA); + break; + } + + /* setup the rasterizer, load FS */ if (pMask) { BEGIN_ACCEL(16); @@ -1713,7 +1510,7 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_RS_COUNT_HIRES_EN)); /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1)); + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1) | R300_TX_OFFSET_RS(6)); OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | R300_ALU_CODE_SIZE(0) | @@ -1735,7 +1532,7 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | R300_RS_COUNT_HIRES_EN)); - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0) | R300_TX_OFFSET_RS(6)); OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | R300_ALU_CODE_SIZE(0) | @@ -1847,6 +1644,10 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_ALU_ALPHA_CLAMP)); FINISH_ACCEL(); } else { + uint32_t output_fmt; + uint32_t src_color, src_alpha; + uint32_t mask_color, mask_alpha; + if (PICT_FORMAT_RGB(pSrcPicture->format) == 0) src_color = (R500_ALU_RGB_R_SWIZ_A_0 | R500_ALU_RGB_G_SWIZ_A_0 | @@ -1861,35 +1662,59 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, else src_alpha = R500_ALPHA_SWIZ_A_A; - if (pMask) { - if (pMaskPicture->componentAlpha) { - if (RadeonBlendOp[op].src_alpha) { - if (PICT_FORMAT_A(pSrcPicture->format) == 0) - src_color = (R500_ALU_RGB_R_SWIZ_A_1 | - R500_ALU_RGB_G_SWIZ_A_1 | - R500_ALU_RGB_B_SWIZ_A_1); - else - src_color = (R500_ALU_RGB_R_SWIZ_A_A | - R500_ALU_RGB_G_SWIZ_A_A | - R500_ALU_RGB_B_SWIZ_A_A); - } else - src_color = (R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_B); + if (pMask && pMaskPicture->componentAlpha) { + if (RadeonBlendOp[op].src_alpha) { + if (PICT_FORMAT_A(pSrcPicture->format) == 0) { + src_color = (R500_ALU_RGB_R_SWIZ_A_1 | + R500_ALU_RGB_G_SWIZ_A_1 | + R500_ALU_RGB_B_SWIZ_A_1); + src_alpha = R500_ALPHA_SWIZ_A_1; + } else { + src_color = (R500_ALU_RGB_R_SWIZ_A_A | + R500_ALU_RGB_G_SWIZ_A_A | + R500_ALU_RGB_B_SWIZ_A_A); + src_alpha = R500_ALPHA_SWIZ_A_A; + } mask_color = (R500_ALU_RGB_R_SWIZ_B_R | R500_ALU_RGB_G_SWIZ_B_G | R500_ALU_RGB_B_SWIZ_B_B); - } else { + if (PICT_FORMAT_A(pMaskPicture->format) == 0) - mask_color = (R500_ALU_RGB_R_SWIZ_B_1 | - R500_ALU_RGB_G_SWIZ_B_1 | - R500_ALU_RGB_B_SWIZ_B_1); + mask_alpha = R500_ALPHA_SWIZ_B_1; else - mask_color = (R500_ALU_RGB_R_SWIZ_B_A | - R500_ALU_RGB_G_SWIZ_B_A | - R500_ALU_RGB_B_SWIZ_B_A); + mask_alpha = R500_ALPHA_SWIZ_B_A; + + } else { + src_color = (R500_ALU_RGB_R_SWIZ_A_R | + R500_ALU_RGB_G_SWIZ_A_G | + R500_ALU_RGB_B_SWIZ_A_B); + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + src_alpha = R500_ALPHA_SWIZ_A_1; + else + src_alpha = R500_ALPHA_SWIZ_A_A; + + mask_color = (R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B); + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R500_ALPHA_SWIZ_B_1; + else + mask_alpha = R500_ALPHA_SWIZ_B_A; + } + } else if (pMask) { + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_color = (R500_ALU_RGB_R_SWIZ_B_1 | + R500_ALU_RGB_G_SWIZ_B_1 | + R500_ALU_RGB_B_SWIZ_B_1); + else + mask_color = (R500_ALU_RGB_R_SWIZ_B_A | + R500_ALU_RGB_G_SWIZ_B_A | + R500_ALU_RGB_B_SWIZ_B_A); + if (PICT_FORMAT_A(pMaskPicture->format) == 0) mask_alpha = R500_ALPHA_SWIZ_B_1; else @@ -1901,6 +1726,31 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, mask_alpha = R500_ALPHA_SWIZ_B_1; } + /* shader output swizzling */ + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + default: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_RED | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_BLUE | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_ALPHA); + break; + } + BEGIN_ACCEL(7); if (pMask) { /* 4 components: 2 for tex0, 2 for tex1 */ @@ -1909,7 +1759,7 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, R300_RS_COUNT_HIRES_EN)); /* 2 RS instructions: 1 for tex0 (src), 1 for tex1 (mask) */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1)); + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1) | R300_TX_OFFSET_RS(6)); OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(2))); @@ -1921,7 +1771,7 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | R300_RS_COUNT_HIRES_EN)); - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0) | R300_TX_OFFSET_RS(6)); OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | R500_US_CODE_END_ADDR(1))); @@ -2101,24 +1951,16 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, /* Clear out scissoring */ BEGIN_ACCEL(2); - if (IS_R300_3D) { - OUT_ACCEL_REG(R300_SC_SCISSOR0, ((1440 << R300_SCISSOR_X_SHIFT) | - (1440 << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, (((pDst->drawable.width + 1440 - 1) << R300_SCISSOR_X_SHIFT) | - ((pDst->drawable.height + 1440 - 1) << R300_SCISSOR_Y_SHIFT))); - - } else { - OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) | - (0 << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, (((pDst->drawable.width - 1) << R300_SCISSOR_X_SHIFT) | - ((pDst->drawable.height - 1) << R300_SCISSOR_Y_SHIFT))); - } + OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) | + (0 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, ((8191 << R300_SCISSOR_X_SHIFT) | + (8191 << R300_SCISSOR_Y_SHIFT))); FINISH_ACCEL(); - - BEGIN_ACCEL_RELOC(3, 2); - EMIT_WRITE_OFFSET(R300_RB3D_COLOROFFSET0, 0, pDst); - EMIT_COLORPITCH(R300_RB3D_COLORPITCH0, colorpitch, pDst); + BEGIN_ACCEL(3); + + OUT_ACCEL_REG(R300_RB3D_COLOROFFSET0, dst_offset); + OUT_ACCEL_REG(R300_RB3D_COLORPITCH0, colorpitch); blendcntl = RADEONGetBlendCntl(op, pMaskPicture, pDstPicture->format); OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, blendcntl | R300_ALPHA_BLEND_ENABLE | R300_READ_ENABLE); @@ -2126,7 +1968,7 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, FINISH_ACCEL(); BEGIN_ACCEL(1); - if (pMask) + if (info->accel_state->has_mask) OUT_ACCEL_REG(R300_VAP_VTX_SIZE, 6); else OUT_ACCEL_REG(R300_VAP_VTX_SIZE, 4); @@ -2135,53 +1977,6 @@ static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, return TRUE; } -static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst) -{ - RINFO_FROM_SCREEN(pDst->drawable.pScreen); - ACCEL_PREAMBLE(); - - ENTER_DRAW(0); - - if (info->accel_state->draw_header) { - if (info->ChipFamily < CHIP_FAMILY_R200) { - info->accel_state->draw_header[0] = CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD, - info->accel_state->num_vtx * - info->accel_state->vtx_count + 1); - info->accel_state->draw_header[2] = (RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - RADEON_CP_VC_CNTL_MAOS_ENABLE | - RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | - (info->accel_state->num_vtx << RADEON_CP_VC_CNTL_NUM_SHIFT)); - } else if (IS_R300_3D || IS_R500_3D) { - info->accel_state->draw_header[0] = CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - info->accel_state->num_vtx * - info->accel_state->vtx_count); - info->accel_state->draw_header[1] = (RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (info->accel_state->num_vtx << RADEON_CP_VC_CNTL_NUM_SHIFT)); - } else { - info->accel_state->draw_header[0] = CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - info->accel_state->num_vtx * - info->accel_state->vtx_count); - info->accel_state->draw_header[1] = (RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (info->accel_state->num_vtx << RADEON_CP_VC_CNTL_NUM_SHIFT)); - } - info->accel_state->draw_header = NULL; - } - - if (IS_R300_3D || IS_R500_3D) { - BEGIN_ACCEL(3); - OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA); - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); - } else - BEGIN_ACCEL(1); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); - FINISH_ACCEL(); - - LEAVE_DRAW(0); -} - #ifdef ACCEL_CP @@ -2256,25 +2051,6 @@ static void FUNC_NAME(RadeonCompositeTile)(ScrnInfoPtr pScrn, /* ErrorF("RadeonComposite (%d,%d) (%d,%d) (%d,%d) (%d,%d)\n", srcX, srcY, maskX, maskY,dstX, dstY, w, h); */ -#if defined(ACCEL_CP) - if ((info->cs && CS_FULL(info->cs)) || - (!info->cs && (info->cp->indirectBuffer->used + 4 * 32) > - info->cp->indirectBuffer->total)) { - FUNC_NAME(RadeonDoneComposite)(info->accel_state->dst_pix); - if (info->cs) - radeon_cs_flush_indirect(pScrn); - else - RADEONCPFlushIndirect(pScrn, 1); - info->accel_state->exa->PrepareComposite(info->accel_state->composite_op, - info->accel_state->src_pic, - info->accel_state->msk_pic, - info->accel_state->dst_pic, - info->accel_state->src_pix, - info->accel_state->msk_pix, - info->accel_state->dst_pix); - } -#endif - srcTopLeft.x = IntToxFixed(srcX); srcTopLeft.y = IntToxFixed(srcY); srcTopRight.x = IntToxFixed(srcX + w); @@ -2285,15 +2061,13 @@ static void FUNC_NAME(RadeonCompositeTile)(ScrnInfoPtr pScrn, srcBottomRight.y = IntToxFixed(srcY + h); if (info->accel_state->is_transform[0]) { - if ((info->ChipFamily < CHIP_FAMILY_R300) || !info->accel_state->has_tcl) { - transformPoint(info->accel_state->transform[0], &srcTopLeft); - transformPoint(info->accel_state->transform[0], &srcTopRight); - transformPoint(info->accel_state->transform[0], &srcBottomLeft); - transformPoint(info->accel_state->transform[0], &srcBottomRight); - } + transformPoint(info->accel_state->transform[0], &srcTopLeft); + transformPoint(info->accel_state->transform[0], &srcTopRight); + transformPoint(info->accel_state->transform[0], &srcBottomLeft); + transformPoint(info->accel_state->transform[0], &srcBottomRight); } - if (info->accel_state->msk_pic) { + if (info->accel_state->has_mask) { maskTopLeft.x = IntToxFixed(maskX); maskTopLeft.y = IntToxFixed(maskY); maskTopRight.x = IntToxFixed(maskX + w); @@ -2304,12 +2078,10 @@ static void FUNC_NAME(RadeonCompositeTile)(ScrnInfoPtr pScrn, maskBottomRight.y = IntToxFixed(maskY + h); if (info->accel_state->is_transform[1]) { - if ((info->ChipFamily < CHIP_FAMILY_R300) || !info->accel_state->has_tcl) { - transformPoint(info->accel_state->transform[1], &maskTopLeft); - transformPoint(info->accel_state->transform[1], &maskTopRight); - transformPoint(info->accel_state->transform[1], &maskBottomLeft); - transformPoint(info->accel_state->transform[1], &maskBottomRight); - } + transformPoint(info->accel_state->transform[1], &maskTopLeft); + transformPoint(info->accel_state->transform[1], &maskTopRight); + transformPoint(info->accel_state->transform[1], &maskBottomLeft); + transformPoint(info->accel_state->transform[1], &maskBottomRight); } vtx_count = 6; @@ -2317,89 +2089,39 @@ static void FUNC_NAME(RadeonCompositeTile)(ScrnInfoPtr pScrn, vtx_count = 4; if (info->accel_state->vsync) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pDst, - radeon_pick_best_crtc(pScrn, dstX, dstX + w, dstY, dstY + h), - dstY, dstY + h); + FUNC_NAME(RADEONWaitForVLine)(pScrn, pDst, RADEONBiggerCrtcArea(pDst), dstY, dstY + h); #ifdef ACCEL_CP if (info->ChipFamily < CHIP_FAMILY_R200) { - if (!info->accel_state->draw_header) { - BEGIN_RING(3); - -#ifdef XF86DRM_MODE - if (info->cs) - info->accel_state->draw_header = info->cs->packets + info->cs->cdw; - else -#endif - info->accel_state->draw_header = __head; - info->accel_state->num_vtx = 0; - info->accel_state->vtx_count = vtx_count; - - OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD, - 3 * vtx_count + 1)); - if (info->accel_state->msk_pic) - OUT_RING(RADEON_CP_VC_FRMT_XY | - RADEON_CP_VC_FRMT_ST0 | - RADEON_CP_VC_FRMT_ST1); - else - OUT_RING(RADEON_CP_VC_FRMT_XY | - RADEON_CP_VC_FRMT_ST0); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - RADEON_CP_VC_CNTL_MAOS_ENABLE | - RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | - (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); - ADVANCE_RING(); - } - - info->accel_state->num_vtx += 3; - BEGIN_RING(3 * vtx_count); + BEGIN_RING(3 * vtx_count + 3); + OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD, + 3 * vtx_count + 1)); + if (info->accel_state->has_mask) + OUT_RING(RADEON_CP_VC_FRMT_XY | + RADEON_CP_VC_FRMT_ST0 | + RADEON_CP_VC_FRMT_ST1); + else + OUT_RING(RADEON_CP_VC_FRMT_XY | + RADEON_CP_VC_FRMT_ST0); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + RADEON_CP_VC_CNTL_MAOS_ENABLE | + RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | + (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); } else if (IS_R300_3D || IS_R500_3D) { - if (!info->accel_state->draw_header) { - BEGIN_RING(2); - -#ifdef XF86DRM_MODE - if (info->cs) - info->accel_state->draw_header = info->cs->packets + info->cs->cdw; - else -#endif - info->accel_state->draw_header = __head; - info->accel_state->num_vtx = 0; - info->accel_state->vtx_count = vtx_count; - - OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - 4 * vtx_count)); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); - ADVANCE_RING(); - } - - info->accel_state->num_vtx += 4; - BEGIN_RING(4 * vtx_count); + BEGIN_RING(4 * vtx_count + 4); + OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, + 4 * vtx_count)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); } else { - if (!info->accel_state->draw_header) { - BEGIN_RING(2); - -#ifdef XF86DRM_MODE - if (info->cs) - info->accel_state->draw_header = info->cs->packets + info->cs->cdw; - else -#endif - info->accel_state->draw_header = __head; - info->accel_state->num_vtx = 0; - info->accel_state->vtx_count = vtx_count; - - OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - 3 * vtx_count)); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); - ADVANCE_RING(); - } - - info->accel_state->num_vtx += 3; - BEGIN_RING(3 * vtx_count); + BEGIN_RING(3 * vtx_count + 2); + OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, + 3 * vtx_count)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); } #else /* ACCEL_CP */ @@ -2424,7 +2146,7 @@ static void FUNC_NAME(RadeonCompositeTile)(ScrnInfoPtr pScrn, #endif - if (info->accel_state->msk_pic) { + if (info->accel_state->has_mask) { if (IS_R300_3D || IS_R500_3D) { VTX_OUT_MASK((float)dstX, (float)dstY, xFixedToFloat(srcTopLeft.x) / info->accel_state->texW[0], xFixedToFloat(srcTopLeft.y) / info->accel_state->texH[0], @@ -2452,6 +2174,10 @@ static void FUNC_NAME(RadeonCompositeTile)(ScrnInfoPtr pScrn, xFixedToFloat(srcTopRight.x) / info->accel_state->texW[0], xFixedToFloat(srcTopRight.y) / info->accel_state->texH[0]); } + if (IS_R300_3D || IS_R500_3D) + /* flushing is pipelined, free/finish is not */ + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); + #ifdef ACCEL_CP ADVANCE_RING(); #else @@ -2528,5 +2254,24 @@ static void FUNC_NAME(RadeonComposite)(PixmapPtr pDst, } } +static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst) +{ + RINFO_FROM_SCREEN(pDst->drawable.pScreen); + ACCEL_PREAMBLE(); + + ENTER_DRAW(0); + + if (IS_R300_3D || IS_R500_3D) { + BEGIN_ACCEL(3); + OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); + } else + BEGIN_ACCEL(1); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); + FINISH_ACCEL(); + + LEAVE_DRAW(0); +} + #undef ONLY_ONCE #undef FUNC_NAME diff --git a/driver/xf86-video-ati/src/radeon_exa_shared.c b/driver/xf86-video-ati/src/radeon_exa_shared.c deleted file mode 100644 index be1d2fafe..000000000 --- a/driver/xf86-video-ati/src/radeon_exa_shared.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Copyright 2005 Eric Anholt - * Copyright 2005 Benjamin Herrenschmidt - * Copyright 2008 Advanced Micro Devices, Inc. - * 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 - * 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 (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 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. - * - * Authors: - * Eric Anholt - * Zack Rusin - * Benjamin Herrenschmidt - * Alex Deucher - * Matthias Hopf - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "radeon.h" -#ifdef XF86DRI -#include "radeon_drm.h" -#endif -#include "radeon_macros.h" -#include "radeon_probe.h" -#include "radeon_version.h" -#include "radeon_vbo.h" - -PixmapPtr -RADEONGetDrawablePixmap(DrawablePtr pDrawable) -{ - if (pDrawable->type == DRAWABLE_WINDOW) - return pDrawable->pScreen->GetWindowPixmap((WindowPtr)pDrawable); - else - return (PixmapPtr)pDrawable; -} - -void RADEONVlineHelperClear(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - accel_state->vline_crtc = NULL; - accel_state->vline_y1 = -1; - accel_state->vline_y2 = 0; -} - -void RADEONVlineHelperSet(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - accel_state->vline_crtc = radeon_pick_best_crtc(pScrn, x1, x2, y1, y2); - if (accel_state->vline_y1 == -1) - accel_state->vline_y1 = y1; - if (y1 < accel_state->vline_y1) - accel_state->vline_y1 = y1; - if (y2 > accel_state->vline_y2) - accel_state->vline_y2 = y2; -} - -Bool RADEONValidPM(uint32_t pm, int bpp) -{ - uint8_t r, g, b, a; - Bool ret = FALSE; - - switch (bpp) { - case 8: - a = pm & 0xff; - if ((a == 0) || (a == 0xff)) - ret = TRUE; - break; - case 16: - r = (pm >> 11) & 0x1f; - g = (pm >> 5) & 0x3f; - b = (pm >> 0) & 0x1f; - if (((r == 0) || (r == 0x1f)) && - ((g == 0) || (g == 0x3f)) && - ((b == 0) || (b == 0x1f))) - ret = TRUE; - break; - case 32: - a = (pm >> 24) & 0xff; - r = (pm >> 16) & 0xff; - g = (pm >> 8) & 0xff; - b = (pm >> 0) & 0xff; - if (((a == 0) || (a == 0xff)) && - ((r == 0) || (r == 0xff)) && - ((g == 0) || (g == 0xff)) && - ((b == 0) || (b == 0xff))) - ret = TRUE; - break; - default: - break; - } - return ret; -} - -Bool RADEONCheckBPP(int bpp) -{ - switch (bpp) { - case 8: - case 16: - case 32: - return TRUE; - default: - break; - } - return FALSE; -} - -static Bool radeon_vb_get(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - accel_state->vbo.vb_mc_addr = info->gartLocation + info->dri->bufStart + - (accel_state->ib->idx*accel_state->ib->total)+ - (accel_state->ib->total / 2); - accel_state->vbo.vb_total = (accel_state->ib->total / 2); - accel_state->vbo.vb_ptr = (pointer)((char*)accel_state->ib->address + - (accel_state->ib->total / 2)); - accel_state->vbo.vb_offset = 0; - return TRUE; -} - -int radeon_cp_start(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - -#if defined(XF86DRM_MODE) - if (info->cs) { - if (CS_FULL(info->cs)) { - radeon_cs_flush_indirect(pScrn); - } - accel_state->ib_reset_op = info->cs->cdw; - } else -#endif - { - accel_state->ib = RADEONCPGetBuffer(pScrn); - if (!radeon_vb_get(pScrn)) { - return -1; - } - } - accel_state->vbo.vb_start_op = accel_state->vbo.vb_offset; - accel_state->cbuf.vb_start_op = accel_state->cbuf.vb_offset; - return 0; -} - -void radeon_vb_no_space(ScrnInfoPtr pScrn, - struct radeon_vbo_object *vbo, - int vert_size) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - -#if defined(XF86DRM_MODE) - if (info->cs) { - if (vbo->vb_bo) { - if (vbo->vb_start_op != vbo->vb_offset) { - accel_state->finish_op(pScrn, vert_size); - accel_state->ib_reset_op = info->cs->cdw; - } - - /* release the current VBO */ - radeon_vbo_put(pScrn, vbo); - } - /* get a new one */ - radeon_vbo_get(pScrn, vbo); - return; - } -#endif - if (vbo->vb_start_op != -1) { - accel_state->finish_op(pScrn, vert_size); - radeon_cp_start(pScrn); - } - return; -} - -#if defined(XF86DRM_MODE) -void radeon_ib_discard(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - int ret; - - if (info->accel_state->ib_reset_op) { - /* if we have data just reset the CS and ignore the operation */ - info->cs->cdw = info->accel_state->ib_reset_op; - info->accel_state->ib_reset_op = 0; - goto out; - } - - info->accel_state->vbo.vb_offset = 0; - info->accel_state->vbo.vb_start_op = -1; - info->accel_state->cbuf.vb_offset = 0; - info->accel_state->cbuf.vb_start_op = -1; - - if (CS_FULL(info->cs)) { - radeon_cs_flush_indirect(pScrn); - return; - } - radeon_cs_erase(info->cs); - ret = radeon_cs_space_check_with_bo(info->cs, - info->accel_state->vbo.vb_bo, - RADEON_GEM_DOMAIN_GTT, 0); - if (ret) - ErrorF("space check failed in flush\n"); - - if (info->accel_state->cbuf.vb_bo) { - ret = radeon_cs_space_check_with_bo(info->cs, - info->accel_state->cbuf.vb_bo, - RADEON_GEM_DOMAIN_GTT, 0); - if (ret) - ErrorF("space check failed in flush\n"); - } - - out: - if (info->dri2.enabled) { - info->accel_state->XInited3D = FALSE; - info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; - } - -} -#endif diff --git a/driver/xf86-video-ati/src/radeon_exa_shared.h b/driver/xf86-video-ati/src/radeon_exa_shared.h deleted file mode 100644 index 7b8b5cae1..000000000 --- a/driver/xf86-video-ati/src/radeon_exa_shared.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 2005 Eric Anholt - * Copyright 2005 Benjamin Herrenschmidt - * Copyright 2008 Advanced Micro Devices, Inc. - * 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 - * 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 (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 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. - * - * Authors: - * Eric Anholt - * Zack Rusin - * Benjamin Herrenschmidt - * Alex Deucher - * Matthias Hopf - */ -#ifndef RADEON_EXA_SHARED_H - -#define RADEON_EXA_SHARED_H - -extern PixmapPtr RADEONGetDrawablePixmap(DrawablePtr pDrawable); - -extern void RADEONVlineHelperClear(ScrnInfoPtr pScrn); -extern void RADEONVlineHelperSet(ScrnInfoPtr pScrn, int x1, int y1, int x2, int y2); -extern Bool RADEONValidPM(uint32_t pm, int bpp); -extern Bool RADEONCheckBPP(int bpp); - -#define RADEON_TRACE_FALL 0 -#define RADEON_TRACE_DRAW 0 - -#if RADEON_TRACE_FALL -#define RADEON_FALLBACK(x) \ -do { \ - ErrorF("%s: ", __FUNCTION__); \ - ErrorF x; \ - return FALSE; \ -} while (0) -#else -#define RADEON_FALLBACK(x) return FALSE -#endif - -#if RADEON_TRACE_DRAW -#define TRACE do { ErrorF("TRACE: %s\n", __FUNCTION__); } while(0) -#else -#define TRACE -#endif - -#ifdef XF86DRM_MODE -static inline void radeon_add_pixmap(struct radeon_cs *cs, PixmapPtr pPix, int read_domains, int write_domain) -{ - struct radeon_exa_pixmap_priv *driver_priv = exaGetPixmapDriverPrivate(pPix); - - radeon_cs_space_add_persistent_bo(cs, driver_priv->bo, read_domains, write_domain); -} - -extern void radeon_ib_discard(ScrnInfoPtr pScrn); -#endif /* XF86DRM_MODE */ - -extern int radeon_cp_start(ScrnInfoPtr pScrn); -extern void radeon_vb_no_space(ScrnInfoPtr pScrn, struct radeon_vbo_object *vbo, int vert_size); -extern void radeon_vbo_done_composite(PixmapPtr pDst); - -#endif diff --git a/driver/xf86-video-ati/src/radeon_kms.c b/driver/xf86-video-ati/src/radeon_kms.c deleted file mode 100644 index 32065fb96..000000000 --- a/driver/xf86-video-ati/src/radeon_kms.c +++ /dev/null @@ -1,1311 +0,0 @@ -/* - * Copyright © 2009 Red Hat, 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 (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 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. - * - * Authors: - * Dave Airlie - * - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -/* Driver data structures */ -#include "radeon.h" -#include "radeon_reg.h" -#include "radeon_probe.h" -#include "micmap.h" - -#include "shadow.h" - -#include "atipciids.h" - - -#ifdef XF86DRM_MODE - -#include "radeon_chipset_gen.h" -#include "radeon_chipinfo_gen.h" - -#define CURSOR_WIDTH 64 -#define CURSOR_HEIGHT 64 - -#include "radeon_bo_gem.h" -#include "radeon_cs_gem.h" -#include "radeon_vbo.h" - -static Bool radeon_setup_kernel_mem(ScreenPtr pScreen); - -const OptionInfoRec RADEONOptions_KMS[] = { - { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_PAGE_FLIP, "EnablePageFlip", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_ACCEL_DFS, "AccelDFS", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_IGNORE_EDID, "IgnoreEDID", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_COLOR_TILING, "ColorTiling", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_RENDER_ACCEL, "RenderAccel", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_SUBPIXEL_ORDER, "SubPixelOrder", OPTV_ANYSTR, {0}, FALSE }, - { OPTION_ACCELMETHOD, "AccelMethod", OPTV_STRING, {0}, FALSE }, - { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_TVSTD, "TVStandard", OPTV_STRING, {0}, FALSE }, - { OPTION_EXA_VSYNC, "EXAVSync", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_EXA_PIXMAPS, "EXAPixmaps", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_ZAPHOD_HEADS, "ZaphodHeads", OPTV_STRING, {0}, FALSE }, - { OPTION_PAGE_FLIP, "EnablePageFlip", OPTV_BOOLEAN, {0}, FALSE }, - { OPTION_SWAPBUFFERS_WAIT,"SwapbuffersWait", OPTV_BOOLEAN, {0}, FALSE }, - { -1, NULL, OPTV_NONE, {0}, FALSE } -}; - -void radeon_cs_flush_indirect(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - int ret; - - if (!info->cs->cdw) - return; - - /* release the current VBO so we don't block on mapping it later */ - if (info->accel_state->vbo.vb_offset && info->accel_state->vbo.vb_bo) { - radeon_vbo_put(pScrn, &info->accel_state->vbo); - info->accel_state->vbo.vb_start_op = -1; - } - - /* release the current VBO so we don't block on mapping it later */ - if (info->accel_state->cbuf.vb_bo) { - radeon_vbo_put(pScrn, &info->accel_state->cbuf); - info->accel_state->cbuf.vb_start_op = -1; - } - - radeon_cs_emit(info->cs); - radeon_cs_erase(info->cs); - - if (accel_state->use_vbos) - radeon_vbo_flush_bos(pScrn); - - ret = radeon_cs_space_check_with_bo(info->cs, - accel_state->vbo.vb_bo, - RADEON_GEM_DOMAIN_GTT, 0); - if (ret) - ErrorF("space check failed in flush\n"); - - if (info->reemit_current2d && info->state_2d.op) - info->reemit_current2d(pScrn, info->state_2d.op); - - if (info->dri2.enabled) { - info->accel_state->XInited3D = FALSE; - info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; - } - -} - -void radeon_ddx_cs_start(ScrnInfoPtr pScrn, - int n, const char *file, - const char *func, int line) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (info->cs->cdw + n > info->cs->ndw) { - radeon_cs_flush_indirect(pScrn); - - } - radeon_cs_begin(info->cs, n, file, func, line); -} - - -extern _X_EXPORT int gRADEONEntityIndex; - -static int getRADEONEntityIndex(void) -{ - return gRADEONEntityIndex; -} - -static void * -radeonShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, int mode, - CARD32 *size, void *closure) -{ - ScrnInfoPtr pScrn = xf86Screens[screen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - int stride; - - stride = (pScrn->displayWidth * pScrn->bitsPerPixel) / 8; - *size = stride; - - return ((uint8_t *)info->front_bo->ptr + row * stride + offset); -} - -static Bool RADEONCreateScreenResources_KMS(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pixmap; - - pScreen->CreateScreenResources = info->CreateScreenResources; - if (!(*pScreen->CreateScreenResources)(pScreen)) - return FALSE; - pScreen->CreateScreenResources = RADEONCreateScreenResources_KMS; - - if (!drmmode_set_desired_modes(pScrn, &info->drmmode)) - return FALSE; - - drmmode_uevent_init(pScrn, &info->drmmode); - - if (info->r600_shadow_fb) { - pixmap = pScreen->GetScreenPixmap(pScreen); - - if (!shadowAdd(pScreen, pixmap, shadowUpdatePackedWeak(), - radeonShadowWindow, 0, NULL)) - return FALSE; - } - - if (info->dri2.enabled) { - if (info->front_bo) { - PixmapPtr pPix = pScreen->GetScreenPixmap(pScreen); - radeon_set_pixmap_bo(pPix, info->front_bo); - } - } - return TRUE; -} - -static void RADEONBlockHandler_KMS(int i, pointer blockData, - pointer pTimeout, pointer pReadmask) -{ - ScreenPtr pScreen = screenInfo.screens[i]; - ScrnInfoPtr pScrn = xf86Screens[i]; - RADEONInfoPtr info = RADEONPTR(pScrn); - - pScreen->BlockHandler = info->BlockHandler; - (*pScreen->BlockHandler) (i, blockData, pTimeout, pReadmask); - pScreen->BlockHandler = RADEONBlockHandler_KMS; - - if (info->VideoTimerCallback) - (*info->VideoTimerCallback)(pScrn, currentTime.milliseconds); - radeon_cs_flush_indirect(pScrn); -} - -static void -radeon_flush_callback(CallbackListPtr *list, - pointer user_data, pointer call_data) -{ - ScrnInfoPtr pScrn = user_data; - - if (pScrn->vtSema) { - radeon_cs_flush_indirect(pScrn); - } -} - -static Bool RADEONIsFusionGARTWorking(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct drm_radeon_info ginfo; - int r; - uint32_t tmp; - -#ifndef RADEON_INFO_FUSION_GART_WORKING -#define RADEON_INFO_FUSION_GART_WORKING 0x0c -#endif - memset(&ginfo, 0, sizeof(ginfo)); - ginfo.request = RADEON_INFO_FUSION_GART_WORKING; - ginfo.value = (uintptr_t)&tmp; - r = drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_INFO, &ginfo, sizeof(ginfo)); - if (r) { - return FALSE; - } - if (tmp == 1) - return TRUE; - return FALSE; -} - -static Bool RADEONIsAccelWorking(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct drm_radeon_info ginfo; - int r; - uint32_t tmp; - -#ifndef RADEON_INFO_ACCEL_WORKING -#define RADEON_INFO_ACCEL_WORKING 0x03 -#endif -#ifndef RADEON_INFO_ACCEL_WORKING2 -#define RADEON_INFO_ACCEL_WORKING2 0x05 -#endif - - memset(&ginfo, 0, sizeof(ginfo)); - if (info->dri->pKernelDRMVersion->version_minor >= 5) - ginfo.request = RADEON_INFO_ACCEL_WORKING2; - else - ginfo.request = RADEON_INFO_ACCEL_WORKING; - ginfo.value = (uintptr_t)&tmp; - r = drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_INFO, &ginfo, sizeof(ginfo)); - if (r) { - /* If kernel is too old before 2.6.32 than assume accel is working */ - if (r == -EINVAL) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Kernel too old missing accel " - "information, assuming accel is working\n"); - return TRUE; - } - return FALSE; - } - if (tmp) - return TRUE; - return FALSE; -} - -static Bool RADEONPreInitAccel_KMS(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (!(info->accel_state = calloc(1, sizeof(struct radeon_accel_state)))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Unable to allocate accel_state rec!\n"); - return FALSE; - } - - if (xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, FALSE) || - (!RADEONIsAccelWorking(pScrn))) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "GPU accel disabled or not working, using shadowfb for KMS\n"); - info->r600_shadow_fb = TRUE; - if (!xf86LoadSubModule(pScrn, "shadow")) - info->r600_shadow_fb = FALSE; - return TRUE; - } - - if (info->ChipFamily == CHIP_FAMILY_PALM) { - info->accel_state->allowHWDFS = RADEONIsFusionGARTWorking(pScrn); - } else - info->accel_state->allowHWDFS = TRUE; - - if ((info->ChipFamily == CHIP_FAMILY_RS100) || - (info->ChipFamily == CHIP_FAMILY_RS200) || - (info->ChipFamily == CHIP_FAMILY_RS300) || - (info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480) || - (info->ChipFamily == CHIP_FAMILY_RS600) || - (info->ChipFamily == CHIP_FAMILY_RS690) || - (info->ChipFamily == CHIP_FAMILY_RS740)) - info->accel_state->has_tcl = FALSE; - else { - info->accel_state->has_tcl = TRUE; - } - - info->useEXA = TRUE; - - if (info->useEXA) { - int errmaj = 0, errmin = 0; - info->exaReq.majorversion = EXA_VERSION_MAJOR; - info->exaReq.minorversion = EXA_VERSION_MINOR; - if (!LoadSubModule(pScrn->module, "exa", NULL, NULL, NULL, - &info->exaReq, &errmaj, &errmin)) { - LoaderErrorMsg(NULL, "exa", errmaj, errmin); - return FALSE; - } - } - - return TRUE; -} - -static Bool RADEONPreInitChipType_KMS(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t cmd_stat; - int i; - - info->Chipset = PCI_DEV_DEVICE_ID(info->PciInfo); - pScrn->chipset = (char *)xf86TokenToString(RADEONChipsets, info->Chipset); - if (!pScrn->chipset) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "ChipID 0x%04x is not recognized\n", info->Chipset); - return FALSE; - } - - if (info->Chipset < 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Chipset \"%s\" is not recognized\n", pScrn->chipset); - return FALSE; - } - xf86DrvMsg(pScrn->scrnIndex, X_PROBED, - "Chipset: \"%s\" (ChipID = 0x%04x)\n", - pScrn->chipset, - info->Chipset); - - for (i = 0; i < sizeof(RADEONCards) / sizeof(RADEONCardInfo); i++) { - if (info->Chipset == RADEONCards[i].pci_device_id) { - RADEONCardInfo *card = &RADEONCards[i]; - info->ChipFamily = card->chip_family; - info->IsMobility = card->mobility; - info->IsIGP = card->igp; - break; - } - } - - info->cardType = CARD_PCI; - - PCI_READ_LONG(info->PciInfo, &cmd_stat, PCI_CMD_STAT_REG); - if (cmd_stat & RADEON_CAP_LIST) { - uint32_t cap_ptr, cap_id; - - PCI_READ_LONG(info->PciInfo, &cap_ptr, RADEON_CAPABILITIES_PTR_PCI_CONFIG); - cap_ptr &= RADEON_CAP_PTR_MASK; - - while(cap_ptr != RADEON_CAP_ID_NULL) { - PCI_READ_LONG(info->PciInfo, &cap_id, cap_ptr); - if ((cap_id & 0xff)== RADEON_CAP_ID_AGP) { - info->cardType = CARD_AGP; - break; - } - if ((cap_id & 0xff)== RADEON_CAP_ID_EXP) { - info->cardType = CARD_PCIE; - break; - } - cap_ptr = (cap_id >> 8) & RADEON_CAP_PTR_MASK; - } - } - - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s card detected\n", - (info->cardType==CARD_PCI) ? "PCI" : - (info->cardType==CARD_PCIE) ? "PCIE" : "AGP"); - - /* treat PCIE IGP cards as PCI */ - if (info->cardType == CARD_PCIE && info->IsIGP) - info->cardType = CARD_PCI; - - if ((info->ChipFamily >= CHIP_FAMILY_R600) && info->IsIGP) - info->cardType = CARD_PCIE; - - /* not sure about gart table requirements */ - if ((info->ChipFamily == CHIP_FAMILY_RS600) && info->IsIGP) - info->cardType = CARD_PCIE; - -#ifdef RENDER - info->RenderAccel = xf86ReturnOptValBool(info->Options, OPTION_RENDER_ACCEL, - info->Chipset != PCI_CHIP_RN50_515E && - info->Chipset != PCI_CHIP_RN50_5969); -#endif - return TRUE; -} - -static Bool radeon_alloc_dri(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - if (!(info->dri = calloc(1, sizeof(struct radeon_dri)))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Unable to allocate dri rec!\n"); - return FALSE; - } - - if (!(info->cp = calloc(1, sizeof(struct radeon_cp)))) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR,"Unable to allocate cp rec!\n"); - return FALSE; - } - return TRUE; -} - -static Bool radeon_open_drm_master(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - struct pci_device *dev = info->PciInfo; - char *busid; - drmSetVersion sv; - int err; - - if (pRADEONEnt->fd) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - " reusing fd for second head\n"); - - info->dri2.drm_fd = pRADEONEnt->fd; - goto out; - } - -#if XORG_VERSION_CURRENT >= XORG_VERSION_NUMERIC(1,9,99,901,0) - XNFasprintf(&busid, "pci:%04x:%02x:%02x.%d", - dev->domain, dev->bus, dev->dev, dev->func); -#else - busid = XNFprintf("pci:%04x:%02x:%02x.%d", - dev->domain, dev->bus, dev->dev, dev->func); -#endif - - info->dri2.drm_fd = drmOpen("radeon", busid); - if (info->dri2.drm_fd == -1) { - - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] Failed to open DRM device for %s: %s\n", - busid, strerror(errno)); - free(busid); - return FALSE; - } - free(busid); - - /* Check that what we opened was a master or a master-capable FD, - * by setting the version of the interface we'll use to talk to it. - * (see DRIOpenDRMMaster() in DRI1) - */ - sv.drm_di_major = 1; - sv.drm_di_minor = 1; - sv.drm_dd_major = -1; - sv.drm_dd_minor = -1; - err = drmSetInterfaceVersion(info->dri2.drm_fd, &sv); - if (err != 0) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "[drm] failed to set drm interface version.\n"); - drmClose(info->dri2.drm_fd); - info->dri2.drm_fd = -1; - - return FALSE; - } - - pRADEONEnt->fd = info->dri2.drm_fd; - out: - info->drmmode.fd = info->dri2.drm_fd; - info->dri->drmFD = info->dri2.drm_fd; - return TRUE; -} - -#ifdef EXA_MIXED_PIXMAPS - -static Bool r600_get_tile_config(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct drm_radeon_info ginfo; - int r; - uint32_t tmp; - - if (info->ChipFamily < CHIP_FAMILY_R600) - return FALSE; - -#ifndef RADEON_INFO_TILING_CONFIG -#define RADEON_INFO_TILING_CONFIG 0x6 -#endif - - memset(&ginfo, 0, sizeof(ginfo)); - ginfo.request = RADEON_INFO_TILING_CONFIG; - ginfo.value = (uintptr_t)&tmp; - r = drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_INFO, &ginfo, sizeof(ginfo)); - if (r) - return FALSE; - - info->tile_config = tmp; - info->r7xx_bank_op = 0; - if (info->ChipFamily >= CHIP_FAMILY_CEDAR) { - if (info->dri->pKernelDRMVersion->version_minor >= 7) { - switch (info->tile_config & 0xf) { - case 0: - info->num_channels = 1; - break; - case 1: - info->num_channels = 2; - break; - case 2: - info->num_channels = 4; - break; - case 3: - info->num_channels = 8; - break; - default: - return FALSE; - } - - switch((info->tile_config & 0xf0) >> 4) { - case 0: - info->num_banks = 4; - break; - case 1: - info->num_banks = 8; - break; - case 2: - info->num_banks = 16; - break; - default: - return FALSE; - } - - switch ((info->tile_config & 0xf00) >> 8) { - case 0: - info->group_bytes = 256; - break; - case 1: - info->group_bytes = 512; - break; - default: - return FALSE; - } - } else - return FALSE; - } else { - switch((info->tile_config & 0xe) >> 1) { - case 0: - info->num_channels = 1; - break; - case 1: - info->num_channels = 2; - break; - case 2: - info->num_channels = 4; - break; - case 3: - info->num_channels = 8; - break; - default: - return FALSE; - } - switch((info->tile_config & 0x30) >> 4) { - case 0: - info->num_banks = 4; - break; - case 1: - info->num_banks = 8; - break; - default: - return FALSE; - } - switch((info->tile_config & 0xc0) >> 6) { - case 0: - info->group_bytes = 256; - break; - case 1: - info->group_bytes = 512; - break; - default: - return FALSE; - } - } - - info->have_tiling_info = TRUE; - return TRUE; -} - -#endif /* EXA_MIXED_PIXMAPS */ - -Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags) -{ - RADEONInfoPtr info; - RADEONEntPtr pRADEONEnt; - DevUnion* pPriv; - Gamma zeros = { 0.0, 0.0, 0.0 }; - uint32_t tiling = 0; - int cpp; - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "RADEONPreInit_KMS\n"); - if (pScrn->numEntities != 1) return FALSE; - if (!RADEONGetRec(pScrn)) return FALSE; - - info = RADEONPTR(pScrn); - info->MMIO = NULL; - info->IsSecondary = FALSE; - info->IsPrimary = FALSE; - info->kms_enabled = TRUE; - info->pEnt = xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]); - if (info->pEnt->location.type != BUS_PCI) goto fail; - - pPriv = xf86GetEntityPrivate(pScrn->entityList[0], - getRADEONEntityIndex()); - pRADEONEnt = pPriv->ptr; - - if(xf86IsEntityShared(pScrn->entityList[0])) - { - if(xf86IsPrimInitDone(pScrn->entityList[0])) - { - info->IsSecondary = TRUE; - pRADEONEnt->pSecondaryScrn = pScrn; - } - else - { - info->IsPrimary = TRUE; - xf86SetPrimInitDone(pScrn->entityList[0]); - pRADEONEnt->pPrimaryScrn = pScrn; - pRADEONEnt->HasSecondary = FALSE; - } - } - - info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index); - pScrn->monitor = pScrn->confScreen->monitor; - - if (!RADEONPreInitVisual(pScrn)) - goto fail; - - xf86CollectOptions(pScrn, NULL); - if (!(info->Options = malloc(sizeof(RADEONOptions_KMS)))) - goto fail; - - memcpy(info->Options, RADEONOptions_KMS, sizeof(RADEONOptions_KMS)); - xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, info->Options); - - if (!RADEONPreInitWeight(pScrn)) - goto fail; - - if (!RADEONPreInitChipType_KMS(pScrn)) - goto fail; - - if (!radeon_alloc_dri(pScrn)) - return FALSE; - - if (radeon_open_drm_master(pScrn) == FALSE) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Kernel modesetting setup failed\n"); - goto fail; - } - - info->dri2.enabled = FALSE; - info->dri->pKernelDRMVersion = drmGetVersion(info->dri->drmFD); - if (info->dri->pKernelDRMVersion == NULL) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "RADEONDRIGetVersion failed to get the DRM version\n"); - goto fail; - } - - if (!RADEONPreInitAccel_KMS(pScrn)) goto fail; - -#ifdef EXA_MIXED_PIXMAPS - /* don't enable tiling if accel is not enabled */ - if (!info->r600_shadow_fb) { - Bool colorTilingDefault = info->ChipFamily >= CHIP_FAMILY_R300 && - info->ChipFamily <= CHIP_FAMILY_CAYMAN; - - if (info->ChipFamily >= CHIP_FAMILY_R600) { - /* set default group bytes, overridden by kernel info below */ - info->group_bytes = 256; - info->have_tiling_info = FALSE; - if (info->dri->pKernelDRMVersion->version_minor >= 6) { - if (r600_get_tile_config(pScrn)) { - info->allowColorTiling = xf86ReturnOptValBool(info->Options, - OPTION_COLOR_TILING, colorTilingDefault); - /* need working DFS for tiling */ - if ((info->ChipFamily == CHIP_FAMILY_PALM) && - (!info->accel_state->allowHWDFS)) - info->allowColorTiling = FALSE; - } else - info->allowColorTiling = FALSE; - } else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "R6xx+ KMS Color Tiling requires radeon drm 2.6.0 or newer\n"); - } else - info->allowColorTiling = xf86ReturnOptValBool(info->Options, - OPTION_COLOR_TILING, colorTilingDefault); - } else -#else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "KMS Color Tiling requires xserver which supports EXA_MIXED_PIXMAPS\n"); -#endif - info->allowColorTiling = FALSE; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "KMS Color Tiling: %sabled\n", info->allowColorTiling ? "en" : "dis"); - - if (info->dri->pKernelDRMVersion->version_minor >= 8) { - info->allowPageFlip = xf86ReturnOptValBool(info->Options, - OPTION_PAGE_FLIP, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "KMS Pageflipping: %sabled\n", info->allowPageFlip ? "en" : "dis"); - } - - info->swapBuffersWait = xf86ReturnOptValBool(info->Options, - OPTION_SWAPBUFFERS_WAIT, TRUE); - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "SwapBuffers wait for vsync: %sabled\n", info->swapBuffersWait ? "en" : "dis"); - - if (drmmode_pre_init(pScrn, &info->drmmode, pScrn->bitsPerPixel / 8) == FALSE) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Kernel modesetting setup failed\n"); - goto fail; - } - - if (info->drmmode.mode_res->count_crtcs == 1) - pRADEONEnt->HasCRTC2 = FALSE; - else - pRADEONEnt->HasCRTC2 = TRUE; - - - /* fix up cloning on rn50 cards - * since they only have one crtc sometimes the xserver doesn't assign - * a crtc to one of the outputs even though both outputs have common modes - * which results in only one monitor being enabled. Assign a crtc here so - * that both outputs light up. - */ - if (info->ChipFamily == CHIP_FAMILY_RV100 && !pRADEONEnt->HasCRTC2) { - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int i; - - for (i = 0; i < xf86_config->num_output; i++) { - xf86OutputPtr output = xf86_config->output[i]; - - /* XXX: double check crtc mode */ - if ((output->probed_modes != NULL) && (output->crtc == NULL)) - output->crtc = xf86_config->crtc[0]; - } - } - - { - struct drm_radeon_gem_info mminfo; - - if (!drmCommandWriteRead(info->dri->drmFD, DRM_RADEON_GEM_INFO, &mminfo, sizeof(mminfo))) - { - info->vram_size = mminfo.vram_visible; - info->gart_size = mminfo.gart_size; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "mem size init: gart size :%llx vram size: s:%llx visible:%llx\n", - (unsigned long long)mminfo.gart_size, - (unsigned long long)mminfo.vram_size, - (unsigned long long)mminfo.vram_visible); - } - } - - info->exa_pixmaps = xf86ReturnOptValBool(info->Options, - OPTION_EXA_PIXMAPS, - ((info->vram_size > (32 * 1024 * 1024) && - info->RenderAccel))); - if (info->exa_pixmaps) - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "EXA: Driver will allow EXA pixmaps in VRAM\n"); - else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "EXA: Driver will not allow EXA pixmaps in VRAM\n"); - - /* no tiled scanout on r6xx+ yet */ - if (info->allowColorTiling) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - tiling |= RADEON_TILING_MICRO; - else - tiling |= RADEON_TILING_MACRO; - } - cpp = pScrn->bitsPerPixel / 8; - pScrn->displayWidth = - RADEON_ALIGN(pScrn->virtualX, drmmode_get_pitch_align(pScrn, cpp, tiling)); - info->CurrentLayout.displayWidth = pScrn->displayWidth; - - /* Set display resolution */ - xf86SetDpi(pScrn, 0, 0); - - /* Get ScreenInit function */ - if (!xf86LoadSubModule(pScrn, "fb")) return FALSE; - - if (!xf86SetGamma(pScrn, zeros)) return FALSE; - - if (!xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) { - if (!xf86LoadSubModule(pScrn, "ramdac")) return FALSE; - } - - if (pScrn->modes == NULL) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No modes.\n"); - goto fail; - } - - return TRUE; - fail: - RADEONFreeRec(pScrn); - return FALSE; - -} - -static Bool RADEONCursorInit_KMS(ScreenPtr pScreen) -{ - return xf86_cursors_init (pScreen, CURSOR_WIDTH, CURSOR_HEIGHT, - (HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | - HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | - HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1 | - HARDWARE_CURSOR_UPDATE_UNHIDDEN | - HARDWARE_CURSOR_ARGB)); -} - -static Bool RADEONSaveScreen_KMS(ScreenPtr pScreen, int mode) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - Bool unblank; - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "RADEONSaveScreen(%d)\n", mode); - - unblank = xf86IsUnblank(mode); - if (unblank) SetTimeSinceLastInputEvent(); - - if ((pScrn != NULL) && pScrn->vtSema) { - if (unblank) - RADEONUnblank(pScrn); - else - RADEONBlank(pScrn); - } - return TRUE; -} - -/* Called at the end of each server generation. Restore the original - * text mode, unmap video memory, and unwrap and call the saved - * CloseScreen function. - */ -static Bool RADEONCloseScreen_KMS(int scrnIndex, ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "RADEONCloseScreen\n"); - - drmmode_uevent_fini(pScrn, &info->drmmode); - if (info->cs) - radeon_cs_flush_indirect(pScrn); - - DeleteCallback(&FlushCallback, radeon_flush_callback, pScrn); - - if (info->accel_state->exa) { - exaDriverFini(pScreen); - free(info->accel_state->exa); - info->accel_state->exa = NULL; - } - - if (info->accel_state->use_vbos) - radeon_vbo_free_lists(pScrn); - - drmDropMaster(info->dri->drmFD); - - if (info->cursor) xf86DestroyCursorInfoRec(info->cursor); - info->cursor = NULL; - - if (info->dri2.enabled) - radeon_dri2_close_screen(pScreen); - - pScrn->vtSema = FALSE; - xf86ClearPrimInitDone(info->pEnt->index); - pScreen->BlockHandler = info->BlockHandler; - pScreen->CloseScreen = info->CloseScreen; - return (*pScreen->CloseScreen)(scrnIndex, pScreen); -} - - -void RADEONFreeScreen_KMS(int scrnIndex, int flags) -{ - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "RADEONFreeScreen\n"); - - /* when server quits at PreInit, we don't need do this anymore*/ - if (!info) return; - - RADEONFreeRec(pScrn); -} - -Bool RADEONScreenInit_KMS(int scrnIndex, ScreenPtr pScreen, - int argc, char **argv) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - int subPixelOrder = SubPixelUnknown; - char* s; - void *front_ptr; - int ret; - - pScrn->fbOffset = 0; - - miClearVisualTypes(); - if (!miSetVisualTypes(pScrn->depth, - miGetDefaultVisualMask(pScrn->depth), - pScrn->rgbBits, - pScrn->defaultVisual)) return FALSE; - miSetPixmapDepths (); - - ret = drmSetMaster(info->dri->drmFD); - if (ret) { - ErrorF("Unable to retrieve master\n"); - return FALSE; - } - info->directRenderingEnabled = FALSE; - if (info->r600_shadow_fb == FALSE) - info->directRenderingEnabled = radeon_dri2_screen_init(pScreen); - - front_ptr = info->FB; - - if (!info->bufmgr) - info->bufmgr = radeon_bo_manager_gem_ctor(info->dri->drmFD); - if (!info->bufmgr) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "failed to initialise GEM buffer manager"); - return FALSE; - } - drmmode_set_bufmgr(pScrn, &info->drmmode, info->bufmgr); - - if (!info->csm) - info->csm = radeon_cs_manager_gem_ctor(info->dri->drmFD); - if (!info->csm) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "failed to initialise command submission manager"); - return FALSE; - } - - if (!info->cs) - info->cs = radeon_cs_create(info->csm, RADEON_BUFFER_SIZE/4); - if (!info->cs) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "failed to initialise command submission buffer"); - return FALSE; - } - - radeon_cs_set_limit(info->cs, RADEON_GEM_DOMAIN_GTT, info->gart_size); - radeon_cs_space_set_flush(info->cs, (void(*)(void *))radeon_cs_flush_indirect, pScrn); - - radeon_setup_kernel_mem(pScreen); - front_ptr = info->front_bo->ptr; - - if (info->r600_shadow_fb) { - info->fb_shadow = calloc(1, - pScrn->displayWidth * pScrn->virtualY * - ((pScrn->bitsPerPixel + 7) >> 3)); - if (info->fb_shadow == NULL) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to allocate shadow framebuffer\n"); - info->r600_shadow_fb = FALSE; - } else { - if (!fbScreenInit(pScreen, info->fb_shadow, - pScrn->virtualX, pScrn->virtualY, - pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth, - pScrn->bitsPerPixel)) - return FALSE; - } - } - - if (info->r600_shadow_fb == FALSE) { - /* Init fb layer */ - if (!fbScreenInit(pScreen, front_ptr, - pScrn->virtualX, pScrn->virtualY, - pScrn->xDpi, pScrn->yDpi, pScrn->displayWidth, - pScrn->bitsPerPixel)) - return FALSE; - } - - xf86SetBlackWhitePixels(pScreen); - - if (pScrn->bitsPerPixel > 8) { - VisualPtr visual; - - visual = pScreen->visuals + pScreen->numVisuals; - while (--visual >= pScreen->visuals) { - if ((visual->class | DynamicClass) == DirectColor) { - visual->offsetRed = pScrn->offset.red; - visual->offsetGreen = pScrn->offset.green; - visual->offsetBlue = pScrn->offset.blue; - visual->redMask = pScrn->mask.red; - visual->greenMask = pScrn->mask.green; - visual->blueMask = pScrn->mask.blue; - } - } - } - - /* Must be after RGB order fixed */ - fbPictureInit (pScreen, 0, 0); - -#ifdef RENDER - if ((s = xf86GetOptValString(info->Options, OPTION_SUBPIXEL_ORDER))) { - if (strcmp(s, "RGB") == 0) subPixelOrder = SubPixelHorizontalRGB; - else if (strcmp(s, "BGR") == 0) subPixelOrder = SubPixelHorizontalBGR; - else if (strcmp(s, "NONE") == 0) subPixelOrder = SubPixelNone; - PictureSetSubpixelOrder (pScreen, subPixelOrder); - } -#endif - - pScrn->vtSema = TRUE; - /* Backing store setup */ - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "Initializing backing store\n"); - miInitializeBackingStore(pScreen); - xf86SetBackingStore(pScreen); - - - if (info->directRenderingEnabled) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n"); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Direct rendering disabled\n"); - } - - if (info->r600_shadow_fb) { - xf86DrvMsg(scrnIndex, X_INFO, "Acceleration disabled\n"); - info->accelOn = FALSE; - } else { - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "Initializing Acceleration\n"); - if (RADEONAccelInit(pScreen)) { - xf86DrvMsg(scrnIndex, X_INFO, "Acceleration enabled\n"); - info->accelOn = TRUE; - } else { - xf86DrvMsg(scrnIndex, X_ERROR, - "Acceleration initialization failed\n"); - xf86DrvMsg(scrnIndex, X_INFO, "Acceleration disabled\n"); - info->accelOn = FALSE; - } - } - - /* Init DPMS */ - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "Initializing DPMS\n"); - xf86DPMSInit(pScreen, xf86DPMSSet, 0); - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "Initializing Cursor\n"); - - /* Set Silken Mouse */ - xf86SetSilkenMouse(pScreen); - - /* Cursor setup */ - miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); - - if (!xf86ReturnOptValBool(info->Options, OPTION_SW_CURSOR, FALSE)) { - if (RADEONCursorInit_KMS(pScreen)) { - } - } - - /* DGA setup */ -#ifdef XFreeXDGA - /* DGA is dangerous on kms as the base and framebuffer location may change: - * http://lists.freedesktop.org/archives/xorg-devel/2009-September/002113.html - */ - /* xf86DiDGAInit(pScreen, info->LinearAddr + pScrn->fbOffset); */ -#endif - if (info->r600_shadow_fb == FALSE) { - /* Init Xv */ - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "Initializing Xv\n"); - RADEONInitVideo(pScreen); - } - - if (info->r600_shadow_fb == TRUE) { - if (!shadowSetup(pScreen)) { - xf86DrvMsg(scrnIndex, X_ERROR, - "Shadowfb initialization failed\n"); - return FALSE; - } - } - pScrn->pScreen = pScreen; - - /* Provide SaveScreen & wrap BlockHandler and CloseScreen */ - /* Wrap CloseScreen */ - info->CloseScreen = pScreen->CloseScreen; - pScreen->CloseScreen = RADEONCloseScreen_KMS; - pScreen->SaveScreen = RADEONSaveScreen_KMS; - info->BlockHandler = pScreen->BlockHandler; - pScreen->BlockHandler = RADEONBlockHandler_KMS; - - if (!AddCallback(&FlushCallback, radeon_flush_callback, pScrn)) - return FALSE; - - info->CreateScreenResources = pScreen->CreateScreenResources; - pScreen->CreateScreenResources = RADEONCreateScreenResources_KMS; - - if (!xf86CrtcScreenInit (pScreen)) - return FALSE; - - /* Wrap pointer motion to flip touch screen around */ -// info->PointerMoved = pScrn->PointerMoved; -// pScrn->PointerMoved = RADEONPointerMoved; - - if (!drmmode_setup_colormap(pScreen, pScrn)) - return FALSE; - - /* Note unused options */ - if (serverGeneration == 1) - xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "RADEONScreenInit finished\n"); - - info->accel_state->XInited3D = FALSE; - info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; - - return TRUE; -} - -Bool RADEONEnterVT_KMS(int scrnIndex, int flags) -{ - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - int ret; - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "RADEONEnterVT_KMS\n"); - - - ret = drmSetMaster(info->dri->drmFD); - if (ret) - ErrorF("Unable to retrieve master\n"); - info->accel_state->XInited3D = FALSE; - info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; - - pScrn->vtSema = TRUE; - - if (!drmmode_set_desired_modes(pScrn, &info->drmmode)) - return FALSE; - - if (info->adaptor) - RADEONResetVideo(pScrn); - - return TRUE; -} - - -void RADEONLeaveVT_KMS(int scrnIndex, int flags) -{ - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "RADEONLeaveVT_KMS\n"); - - drmDropMaster(info->dri->drmFD); - -#ifdef HAVE_FREE_SHADOW - xf86RotateFreeShadow(pScrn); -#endif - - xf86_hide_cursors (pScrn); - info->accel_state->XInited3D = FALSE; - info->accel_state->engineMode = EXA_ENGINEMODE_UNKNOWN; - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, - "Ok, leaving now...\n"); -} - - -Bool RADEONSwitchMode_KMS(int scrnIndex, DisplayModePtr mode, int flags) -{ - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - Bool ret; - ret = xf86SetSingleMode (pScrn, mode, RR_Rotate_0); - return ret; - -} - -void RADEONAdjustFrame_KMS(int scrnIndex, int x, int y, int flags) -{ - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - RADEONInfoPtr info = RADEONPTR(pScrn); - drmmode_adjust_frame(pScrn, &info->drmmode, x, y, flags); - return; -} - -static Bool radeon_setup_kernel_mem(ScreenPtr pScreen) -{ - ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; - RADEONInfoPtr info = RADEONPTR(pScrn); - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - int cpp = info->CurrentLayout.pixel_bytes; - int screen_size; - int pitch, base_align; - int total_size_bytes = 0; - uint32_t tiling_flags = 0; - - if (info->accel_state->exa != NULL) { - xf86DrvMsg(pScreen->myNum, X_ERROR, "Memory map already initialized\n"); - return FALSE; - } - if (info->r600_shadow_fb == FALSE) { - info->accel_state->exa = exaDriverAlloc(); - if (info->accel_state->exa == NULL) - return FALSE; - } - - if (info->allowColorTiling) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - tiling_flags |= RADEON_TILING_MICRO; - else - tiling_flags |= RADEON_TILING_MACRO; - } - pitch = RADEON_ALIGN(pScrn->displayWidth, drmmode_get_pitch_align(pScrn, cpp, tiling_flags)) * cpp; - screen_size = RADEON_ALIGN(pScrn->virtualY, drmmode_get_height_align(pScrn, tiling_flags)) * pitch; - base_align = drmmode_get_base_align(pScrn, cpp, tiling_flags); - { - int cursor_size = 64 * 4 * 64; - int c; - - cursor_size = RADEON_ALIGN(cursor_size, RADEON_GPU_PAGE_SIZE); - for (c = 0; c < xf86_config->num_crtc; c++) { - /* cursor objects */ - if (info->cursor_bo[c] == NULL) { - info->cursor_bo[c] = radeon_bo_open(info->bufmgr, 0, - cursor_size, 0, - RADEON_GEM_DOMAIN_VRAM, 0); - if (!info->cursor_bo[c]) { - return FALSE; - } - - if (radeon_bo_map(info->cursor_bo[c], 1)) { - ErrorF("Failed to map cursor buffer memory\n"); - } - - drmmode_set_cursor(pScrn, &info->drmmode, c, info->cursor_bo[c]); - total_size_bytes += cursor_size; - } - } - } - - screen_size = RADEON_ALIGN(screen_size, RADEON_GPU_PAGE_SIZE); - /* keep area front front buffer - but don't allocate it yet */ - total_size_bytes += screen_size; - - info->dri->textureSize = 0; - - if (info->front_bo == NULL) { - info->front_bo = radeon_bo_open(info->bufmgr, 0, screen_size, - base_align, RADEON_GEM_DOMAIN_VRAM, 0); - if (info->r600_shadow_fb == TRUE) { - if (radeon_bo_map(info->front_bo, 1)) { - ErrorF("Failed to map cursor buffer memory\n"); - } - } -#if X_BYTE_ORDER == X_BIG_ENDIAN - switch (cpp) { - case 4: - tiling_flags |= RADEON_TILING_SWAP_32BIT; - break; - case 2: - tiling_flags |= RADEON_TILING_SWAP_16BIT; - break; - } -#endif - if (tiling_flags) - radeon_bo_set_tiling(info->front_bo, tiling_flags, pitch); - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Front buffer size: %dK\n", info->front_bo->size/1024); - radeon_kms_update_vram_limit(pScrn, screen_size); - return TRUE; -} - -void radeon_kms_update_vram_limit(ScrnInfoPtr pScrn, int new_fb_size) -{ - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - RADEONInfoPtr info = RADEONPTR(pScrn); - int remain_size_bytes; - int total_size_bytes; - int c; - - for (c = 0; c < xf86_config->num_crtc; c++) { - if (info->cursor_bo[c] != NULL) { - total_size_bytes += (64 * 4 * 64); - } - } - - total_size_bytes += new_fb_size; - remain_size_bytes = info->vram_size - new_fb_size; - remain_size_bytes = (remain_size_bytes / 10) * 9; - radeon_cs_set_limit(info->cs, RADEON_GEM_DOMAIN_VRAM, remain_size_bytes); - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VRAM usage limit set to %dK\n", remain_size_bytes / 1024); -} - - -#endif diff --git a/driver/xf86-video-ati/src/radeon_legacy_memory.c b/driver/xf86-video-ati/src/radeon_legacy_memory.c index 5d66c920d..861fd979c 100644 --- a/driver/xf86-video-ati/src/radeon_legacy_memory.c +++ b/driver/xf86-video-ati/src/radeon_legacy_memory.c @@ -15,30 +15,12 @@ uint32_t radeon_legacy_allocate_memory(ScrnInfoPtr pScrn, void **mem_struct, int size, - int align, - int domain) + int align) { ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex]; RADEONInfoPtr info = RADEONPTR(pScrn); uint32_t offset = 0; -#ifdef XF86DRM_MODE - if (info->cs) { - struct radeon_bo *video_bo; - - if (*mem_struct) - radeon_legacy_free_memory(pScrn, *mem_struct); - - video_bo = radeon_bo_open(info->bufmgr, 0, size, align, domain, 0); - - *mem_struct = video_bo; - - if (!video_bo) - return 0; - - return (uint32_t)-1; - } -#endif #ifdef USE_EXA if (info->useEXA) { ExaOffscreenArea *area = *mem_struct; @@ -112,14 +94,6 @@ radeon_legacy_free_memory(ScrnInfoPtr pScrn, void *mem_struct) { RADEONInfoPtr info = RADEONPTR(pScrn); - -#ifdef XF86DRM_MODE - if (info->cs) { - struct radeon_bo *bo = mem_struct; - radeon_bo_unref(bo); - return; - } -#endif #ifdef USE_EXA ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex]; diff --git a/driver/xf86-video-ati/src/radeon_macros.h b/driver/xf86-video-ati/src/radeon_macros.h index 26d98250e..19307c832 100644 --- a/driver/xf86-video-ati/src/radeon_macros.h +++ b/driver/xf86-video-ati/src/radeon_macros.h @@ -157,53 +157,4 @@ do { \ #define INPCIE(pScrn, addr) RADEONINPCIE(pScrn, addr) #define OUTPCIE(pScrn, addr, val) RADEONOUTPCIE(pScrn, addr, val) -#define INPCIE_P(pScrn, addr) R600INPCIE_PORT(pScrn, addr) -#define OUTPCIE_P(pScrn, addr, val) R600OUTPCIE_PORT(pScrn, addr, val) - -#define BEGIN_ACCEL_RELOC(n, r) do { \ - int _nqw = (n) + (info->cs ? (r) : 0); \ - BEGIN_ACCEL(_nqw); \ - } while (0) - -#define CHECK_OFFSET(pPix, mask, type) do { \ - if (!info->cs) { \ - uint32_t _pix_offset = radeonGetPixmapOffset(pPix); \ - if ((_pix_offset & mask) != 0) \ - RADEON_FALLBACK(("Bad %s offset 0x%x\n", type, (int)_pix_offset)); \ - } \ - } while(0) - -#define EMIT_OFFSET(reg, value, pPix, rd, wd) do { \ - if (info->cs) { \ - driver_priv = exaGetPixmapDriverPrivate(pPix); \ - OUT_ACCEL_REG((reg), (value)); \ - OUT_RELOC(driver_priv->bo, (rd), (wd)); \ - } else { \ - uint32_t _pix_offset; \ - _pix_offset = radeonGetPixmapOffset(pPix); \ - OUT_ACCEL_REG((reg), _pix_offset | value); \ - } \ - } while(0) - -#define EMIT_READ_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, (RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT), 0) -#define EMIT_WRITE_OFFSET(reg, value, pPix) EMIT_OFFSET(reg, value, pPix, 0, RADEON_GEM_DOMAIN_VRAM) - -#define OUT_TEXTURE_REG(reg, offset, bo) do { \ - if (info->cs) { \ - OUT_ACCEL_REG((reg), (offset)); \ - OUT_RELOC((bo), RADEON_GEM_DOMAIN_VRAM | RADEON_GEM_DOMAIN_GTT, 0); \ - } else { \ - OUT_ACCEL_REG((reg), (offset) + info->fbLocation + pScrn->fbOffset);} \ - } while(0) - -#define EMIT_COLORPITCH(reg, value, pPix) do { \ - if (info->cs) { \ - driver_priv = exaGetPixmapDriverPrivate(pPix); \ - OUT_ACCEL_REG((reg), value); \ - OUT_RELOC(driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); \ - } else { \ - OUT_ACCEL_REG((reg), value); \ - } \ -}while(0) - #endif diff --git a/driver/xf86-video-ati/src/radeon_modes.c b/driver/xf86-video-ati/src/radeon_modes.c index d5635c969..ec60cc9b4 100644 --- a/driver/xf86-video-ati/src/radeon_modes.c +++ b/driver/xf86-video-ati/src/radeon_modes.c @@ -67,18 +67,18 @@ void RADEONSetPitch (ScrnInfoPtr pScrn) /* FIXME: May need to validate line pitch here */ if (info->ChipFamily < CHIP_FAMILY_R600) { switch (pScrn->depth / 8) { - case 1: pitch_mask = align_large ? 256 : 128; + case 1: pitch_mask = align_large ? 255 : 127; break; - case 2: pitch_mask = align_large ? 128 : 32; + case 2: pitch_mask = align_large ? 127 : 31; break; case 3: - case 4: pitch_mask = align_large ? 64 : 16; + case 4: pitch_mask = align_large ? 63 : 15; break; } } else - pitch_mask = 256; /* r6xx/r7xx need 256B alignment for accel */ + pitch_mask = 255; /* r6xx/r7xx need 256B alignment for accel */ - dummy = RADEON_ALIGN(pScrn->virtualX, pitch_mask); + dummy = (pScrn->virtualX + pitch_mask) & ~pitch_mask; pScrn->displayWidth = dummy; info->CurrentLayout.displayWidth = pScrn->displayWidth; @@ -158,7 +158,7 @@ static DisplayModePtr RADEONFPNativeMode(xf86OutputPtr output) new->VSyncEnd = new->VSyncStart + native_mode->VSyncWidth; new->Clock = native_mode->DotClock; - new->Flags = native_mode->Flags; + new->Flags = 0; if (new) { new->type = M_T_DRIVER | M_T_PREFERRED; @@ -169,20 +169,6 @@ static DisplayModePtr RADEONFPNativeMode(xf86OutputPtr output) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added native panel mode: %dx%d\n", native_mode->PanelXRes, native_mode->PanelYRes); - } else if (native_mode->PanelXRes != 0 && - native_mode->PanelYRes != 0) { - - new = xf86CVTMode(native_mode->PanelXRes, native_mode->PanelYRes, 60.0, TRUE, FALSE); - - if (new) { - new->type = M_T_DRIVER | M_T_PREFERRED; - - new->next = NULL; - new->prev = NULL; - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Added native panel mode using CVT: %dx%d\n", - native_mode->PanelXRes, native_mode->PanelYRes); } return new; diff --git a/driver/xf86-video-ati/src/radeon_output.c b/driver/xf86-video-ati/src/radeon_output.c index ccde346ec..06f07245d 100644 --- a/driver/xf86-video-ati/src/radeon_output.c +++ b/driver/xf86-video-ati/src/radeon_output.c @@ -32,7 +32,6 @@ #include #include -#include /* X and server generic header files */ #include "xf86.h" @@ -86,7 +85,7 @@ const char *encoder_name[34] = { "INTERNAL_UNIPHY2", }; -const char *ConnectorTypeName[18] = { +const char *ConnectorTypeName[17] = { "None", "VGA", "DVI-I", @@ -103,7 +102,6 @@ const char *ConnectorTypeName[18] = { "Unsupported", "DIN", "DisplayPort", - "eDP", "Unsupported" }; @@ -120,8 +118,6 @@ static void radeon_bios_output_crtc(xf86OutputPtr output); static void radeon_bios_output_lock(xf86OutputPtr output, Bool lock); -extern void -atombios_pick_dig_encoder(xf86OutputPtr output); void RADEONPrintPortMap(ScrnInfoPtr pScrn) { @@ -157,7 +153,7 @@ void RADEONPrintPortMap(ScrnInfoPtr pScrn) if (radeon_output->devices & ATOM_DEVICE_TV1_SUPPORT) ErrorF(" TV1: %s\n", encoder_name[info->encoders[ATOM_DEVICE_TV1_INDEX]->encoder_id]); if (radeon_output->devices & ATOM_DEVICE_CV_SUPPORT) - ErrorF(" CV: %s\n", encoder_name[info->encoders[ATOM_DEVICE_CV_INDEX]->encoder_id]); + ErrorF(" CV: %s\n", encoder_name[info->encoders[ATOM_DEVICE_CRT1_INDEX]->encoder_id]); ErrorF(" DDC reg: 0x%x\n",(unsigned int)radeon_output->ddc_i2c.mask_clk_reg); } @@ -183,10 +179,6 @@ radeon_set_active_device(xf86OutputPtr output) radeon_output->active_device = ATOM_DEVICE_DFP4_SUPPORT; else if (radeon_output->devices & ATOM_DEVICE_DFP5_SUPPORT) radeon_output->active_device = ATOM_DEVICE_DFP5_SUPPORT; - else if (radeon_output->devices & ATOM_DEVICE_LCD1_SUPPORT) - radeon_output->active_device = ATOM_DEVICE_LCD1_SUPPORT; - else if (radeon_output->devices & ATOM_DEVICE_LCD2_SUPPORT) - radeon_output->active_device = ATOM_DEVICE_LCD2_SUPPORT; break; case MT_CRT: if (radeon_output->devices & ATOM_DEVICE_CRT1_SUPPORT) @@ -217,89 +209,6 @@ radeon_set_active_device(xf86OutputPtr output) } } -static Bool -monitor_is_digital(xf86MonPtr MonInfo) -{ - return (MonInfo->rawData[0x14] & 0x80) != 0; -} - -static void -RADEONGetHardCodedEDIDFromFile(xf86OutputPtr output) -{ - ScrnInfoPtr pScrn = output->scrn; - RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONOutputPrivatePtr radeon_output = output->driver_private; - char *EDIDlist = (char *)xf86GetOptValString(info->Options, OPTION_CUSTOM_EDID); - - radeon_output->custom_edid = FALSE; - radeon_output->custom_mon = NULL; - - if (EDIDlist != NULL) { - unsigned char* edid = xnfcalloc(128, 1); - char *name = output->name; - char *outputEDID = strstr(EDIDlist, name); - - if (outputEDID != NULL) { - char *end; - char *colon; - char *command = NULL; - int fd; - - outputEDID += strlen(name) + 1; - end = strstr(outputEDID, ";"); - if (end != NULL) - *end = 0; - - colon = strstr(outputEDID, ":"); - if (colon != NULL) { - *colon = 0; - command = colon + 1; - } - - fd = open (outputEDID, O_RDONLY); - if (fd >= 0) { - read(fd, edid, 128); - close(fd); - if (edid[1] == 0xff) { - radeon_output->custom_mon = xf86InterpretEDID(output->scrn->scrnIndex, edid); - radeon_output->custom_edid = TRUE; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Successfully read Custom EDID data for output %s from %s.\n", - name, outputEDID); - if (command != NULL) { - if (!strcmp(command, "digital")) { - radeon_output->custom_mon->rawData[0x14] |= 0x80; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Forcing digital output for output %s.\n", name); - } else if (!strcmp(command, "analog")) { - radeon_output->custom_mon->rawData[0x14] &= ~0x80; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Forcing analog output for output %s.\n", name); - } else { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Unknown custom EDID command: '%s'.\n", - command); - } - } - } else { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Custom EDID data for %s read from %s was invalid.\n", - name, outputEDID); - } - } else { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Could not read custom EDID for output %s from file %s.\n", - name, outputEDID); - } - } else { - xf86DrvMsg(pScrn->scrnIndex, X_WARNING, - "Could not find EDID file name for output %s; using auto detection.\n", - name); - } - } -} - - static RADEONMonitorType radeon_ddc_connected(xf86OutputPtr output) { @@ -308,32 +217,26 @@ radeon_ddc_connected(xf86OutputPtr output) RADEONMonitorType MonType = MT_NONE; xf86MonPtr MonInfo = NULL; RADEONOutputPrivatePtr radeon_output = output->driver_private; - int ret; - if (radeon_output->custom_edid) { - MonInfo = xnfcalloc(sizeof(xf86Monitor), 1); - *MonInfo = *radeon_output->custom_mon; - } else if ((radeon_output->ConnectorType == CONNECTOR_DISPLAY_PORT) || - (radeon_output->ConnectorType == CONNECTOR_EDP)) { - ret = RADEON_DP_GetSinkType(output); - if (ret == CONNECTOR_OBJECT_ID_DISPLAYPORT || - ret == CONNECTOR_OBJECT_ID_eDP) { - MonInfo = xf86OutputGetEDID(output, radeon_output->dp_pI2CBus); - } - if (MonInfo == NULL) { - if (radeon_output->pI2CBus) { - RADEONI2CDoLock(output, radeon_output->pI2CBus, TRUE); - MonInfo = xf86OutputGetEDID(output, radeon_output->pI2CBus); - RADEONI2CDoLock(output, radeon_output->pI2CBus, FALSE); - } - } - } else if (radeon_output->pI2CBus) { - if (info->get_hardcoded_edid_from_bios) + if (radeon_output->pI2CBus) { + /* RV410 RADEON_GPIO_VGA_DDC seems to only work via hw i2c + * We may want to extend this to other cases if the need arises... + */ + if ((info->ChipFamily == CHIP_FAMILY_RV410) && + (radeon_output->ddc_i2c.mask_clk_reg == RADEON_GPIO_VGA_DDC) && + info->IsAtomBios) + MonInfo = radeon_atom_get_edid(output); + else if (info->get_hardcoded_edid_from_bios) { MonInfo = RADEONGetHardCodedEDIDFromBIOS(output); - if (MonInfo == NULL) { - RADEONI2CDoLock(output, radeon_output->pI2CBus, TRUE); + if (MonInfo == NULL) { + RADEONI2CDoLock(output, TRUE); + MonInfo = xf86OutputGetEDID(output, radeon_output->pI2CBus); + RADEONI2CDoLock(output, FALSE); + } + } else { + RADEONI2CDoLock(output, TRUE); MonInfo = xf86OutputGetEDID(output, radeon_output->pI2CBus); - RADEONI2CDoLock(output, radeon_output->pI2CBus, FALSE); + RADEONI2CDoLock(output, FALSE); } } if (MonInfo) { @@ -343,62 +246,23 @@ radeon_ddc_connected(xf86OutputPtr output) break; case CONNECTOR_DVI_D: case CONNECTOR_HDMI_TYPE_A: + case CONNECTOR_HDMI_TYPE_B: if (radeon_output->shared_ddc) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn); - int i; - - if (monitor_is_digital(MonInfo)) + if (MonInfo->rawData[0x14] & 0x80) /* if it's digital and DVI/HDMI/etc. */ MonType = MT_DFP; else MonType = MT_NONE; - - for (i = 0; i < config->num_output; i++) { - if (output != config->output[i]) { - RADEONOutputPrivatePtr other_radeon_output = - config->output[i]->driver_private; - if (radeon_output->devices & other_radeon_output->devices) { -#ifndef EDID_COMPLETE_RAWDATA - if (radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) { - MonType = MT_NONE; - break; - } -#else - if (xf86MonitorIsHDMI(MonInfo)) { - if (radeon_output->ConnectorType == CONNECTOR_DVI_D) { - MonType = MT_NONE; - break; - } - } else { - if (radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) { - MonType = MT_NONE; - break; - } - } -#endif - } - } - } } else MonType = MT_DFP; break; case CONNECTOR_DISPLAY_PORT: - case CONNECTOR_EDP: /* * XXX wrong. need to infer based on whether we got DDC from I2C * or AUXCH. */ - ret = RADEON_DP_GetSinkType(output); - - if ((ret == CONNECTOR_OBJECT_ID_DISPLAYPORT) || - (ret == CONNECTOR_OBJECT_ID_eDP)) { - MonType = MT_DP; - RADEON_DP_GetDPCD(output); - } else - MonType = MT_DFP; - break; - case CONNECTOR_HDMI_TYPE_B: + MonType = MT_DFP; case CONNECTOR_DVI_I: - if (monitor_is_digital(MonInfo)) + if (MonInfo->rawData[0x14] & 0x80) /* if it's digital and DVI */ MonType = MT_DFP; else MonType = MT_CRT; @@ -407,7 +271,7 @@ radeon_ddc_connected(xf86OutputPtr output) case CONNECTOR_DVI_A: default: if (radeon_output->shared_ddc) { - if (monitor_is_digital(MonInfo)) + if (MonInfo->rawData[0x14] & 0x80) /* if it's digital and VGA */ MonType = MT_NONE; else MonType = MT_CRT; @@ -416,14 +280,15 @@ radeon_ddc_connected(xf86OutputPtr output) break; } - if (MonType != MT_NONE) { + if (MonType != MT_NONE) if (!xf86ReturnOptValBool(info->Options, OPTION_IGNORE_EDID, FALSE)) xf86OutputSetEDID(output, MonInfo); - } else - free(MonInfo); } else MonType = MT_NONE; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Output: %s, Detected Monitor Type: %d\n", output->name, MonType); + return MonType; } @@ -482,22 +347,6 @@ radeon_dpms(xf86OutputPtr output, int mode) if ((mode == DPMSModeOn) && radeon_output->enabled) return; - if ((mode != DPMSModeOn) && radeon_output->shared_ddc) { - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn); - int i; - - for (i = 0; i < config->num_output; i++) { - if (output != config->output[i]) { - RADEONOutputPrivatePtr other_radeon_output = - config->output[i]->driver_private; - if (radeon_output->devices & other_radeon_output->devices) { - if (output->status == XF86OutputStatusDisconnected) - return; - } - } - } - } - if (IS_AVIVO_VARIANT || info->r4xx_atom) { atombios_output_dpms(output, mode); } else { @@ -555,21 +404,12 @@ radeon_mode_valid(xf86OutputPtr output, DisplayModePtr pMode) } } - /* clocks over 135 MHz have heat issues with DVI on RV100 */ - if ((radeon_output->MonType == MT_DFP) && - (info->ChipFamily == CHIP_FAMILY_RV100) && - (pMode->Clock > 135000)) - return MODE_CLOCK_HIGH; - /* single link DVI check */ if (pMode->Clock > 165000 && radeon_output->MonType == MT_DFP) { /* DP->DVI converter */ if (radeon_output->ConnectorType == CONNECTOR_DISPLAY_PORT) return MODE_CLOCK_HIGH; - if (radeon_output->ConnectorType == CONNECTOR_EDP) - return MODE_CLOCK_HIGH; - /* XXX some HDMI can do better than 165MHz on a link */ if (radeon_output->ConnectorType == CONNECTOR_HDMI_TYPE_A) return MODE_CLOCK_HIGH; @@ -602,11 +442,8 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, RADEONInfoPtr info = RADEONPTR(output->scrn); RADEONOutputPrivatePtr radeon_output = output->driver_private; radeon_native_mode_ptr native_mode = &radeon_output->native_mode; - xf86CrtcPtr crtc = output->crtc; - RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; radeon_output->Flags &= ~RADEON_USE_RMX; - radeon_crtc->scaler_enabled = FALSE; /* * Refresh the Crtc values without INTERLACE_HALVE_V @@ -617,15 +454,14 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, /* decide if we are using RMX */ if ((radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT | ATOM_DEVICE_DFP_SUPPORT)) && radeon_output->rmx_type != RMX_OFF) { + xf86CrtcPtr crtc = output->crtc; + RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; if (IS_AVIVO_VARIANT || radeon_crtc->crtc_id == 0) { if (mode->HDisplay < native_mode->PanelXRes || mode->VDisplay < native_mode->PanelYRes) { radeon_output->Flags |= RADEON_USE_RMX; - radeon_crtc->scaler_enabled = TRUE; if (IS_AVIVO_VARIANT) { - radeon_crtc->hsc = (float)mode->HDisplay / (float)native_mode->PanelXRes; - radeon_crtc->vsc = (float)mode->VDisplay / (float)native_mode->PanelYRes; /* set to the panel's native mode */ adjusted_mode->HDisplay = native_mode->PanelXRes; adjusted_mode->VDisplay = native_mode->PanelYRes; @@ -671,13 +507,6 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, } } - /* FIXME: vsc/hsc */ - if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT | ATOM_DEVICE_CV_SUPPORT)) { - radeon_crtc->scaler_enabled = TRUE; - radeon_crtc->hsc = (float)mode->HDisplay / (float)640; - radeon_crtc->vsc = (float)mode->VDisplay / (float)480; - } - if (IS_AVIVO_VARIANT) { /* hw bug */ if ((mode->Flags & V_INTERLACE) @@ -685,62 +514,14 @@ radeon_mode_fixup(xf86OutputPtr output, DisplayModePtr mode, adjusted_mode->CrtcVSyncStart = adjusted_mode->CrtcVDisplay + 2; } - if (IS_AVIVO_VARIANT || info->r4xx_atom) { - if (radeon_output->MonType == MT_STV || radeon_output->MonType == MT_CTV) { - radeon_tvout_ptr tvout = &radeon_output->tvout; - ScrnInfoPtr pScrn = output->scrn; - - if (tvout->tvStd == TV_STD_NTSC || - tvout->tvStd == TV_STD_NTSC_J || - tvout->tvStd == TV_STD_PAL_M) - RADEONATOMGetTVTimings(pScrn, 0, adjusted_mode); - else - RADEONATOMGetTVTimings(pScrn, 1, adjusted_mode); - } - } - - if (((radeon_output->ConnectorType == CONNECTOR_DISPLAY_PORT) || - (radeon_output->ConnectorType == CONNECTOR_EDP)) && - (radeon_output->MonType == MT_DP)) { - radeon_dp_mode_fixup(output, mode, adjusted_mode); - } return TRUE; } static void radeon_mode_prepare(xf86OutputPtr output) { - RADEONInfoPtr info = RADEONPTR(output->scrn); - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn); - int o; - - for (o = 0; o < config->num_output; o++) { - xf86OutputPtr loop_output = config->output[o]; - if (loop_output == output) - continue; - else if (loop_output->crtc) { - xf86CrtcPtr other_crtc = loop_output->crtc; - RADEONCrtcPrivatePtr other_radeon_crtc = other_crtc->driver_private; - if (other_crtc->enabled) { - if (other_radeon_crtc->initialized) { - radeon_crtc_dpms(other_crtc, DPMSModeOff); - if (IS_AVIVO_VARIANT || info->r4xx_atom) - atombios_lock_crtc(info->atomBIOS, other_radeon_crtc->crtc_id, 1); - radeon_dpms(loop_output, DPMSModeOff); - } - } - } - } - radeon_bios_output_lock(output, TRUE); - if (IS_AVIVO_VARIANT) - atombios_pick_dig_encoder(output); radeon_dpms(output, DPMSModeOff); - radeon_crtc_dpms(output->crtc, DPMSModeOff); - - if (IS_AVIVO_VARIANT || info->r4xx_atom) - atombios_set_output_crtc_source(output); - } static void @@ -760,30 +541,7 @@ radeon_mode_set(xf86OutputPtr output, DisplayModePtr mode, static void radeon_mode_commit(xf86OutputPtr output) { - RADEONInfoPtr info = RADEONPTR(output->scrn); - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR (output->scrn); - int o; - - for (o = 0; o < config->num_output; o++) { - xf86OutputPtr loop_output = config->output[o]; - if (loop_output == output) - continue; - else if (loop_output->crtc) { - xf86CrtcPtr other_crtc = loop_output->crtc; - RADEONCrtcPrivatePtr other_radeon_crtc = other_crtc->driver_private; - if (other_crtc->enabled) { - if (other_radeon_crtc->initialized) { - radeon_crtc_dpms(other_crtc, DPMSModeOn); - if (IS_AVIVO_VARIANT || info->r4xx_atom) - atombios_lock_crtc(info->atomBIOS, other_radeon_crtc->crtc_id, 0); - radeon_dpms(loop_output, DPMSModeOn); - } - } - } - } - radeon_dpms(output, DPMSModeOn); - radeon_crtc_dpms(output->crtc, DPMSModeOn); radeon_bios_output_lock(output, FALSE); } @@ -933,10 +691,6 @@ radeon_bios_output_crtc(xf86OutputPtr output) xf86CrtcPtr crtc = output->crtc; RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; - /* no need to update crtc routing scratch regs on DCE4 */ - if (IS_DCE4_VARIANT) - return; - if (info->IsAtomBios) { if (radeon_output->active_device & ATOM_DEVICE_TV1_SUPPORT) { save->bios_3_scratch &= ~ATOM_S3_TV1_CRTC_ACTIVE; @@ -1206,8 +960,6 @@ radeon_detect(xf86OutputPtr output) } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, - "Output: %s, Detected Monitor Type: %d\n", output->name, radeon_output->MonType); if (output->MonInfo) { xf86DrvMsg(pScrn->scrnIndex, X_INFO, "EDID data from the display on output: %s ----------------------\n", output->name); @@ -1271,7 +1023,6 @@ radeon_detect(xf86OutputPtr output) radeon_output->MonType = MT_CV; break; case CONNECTOR_DISPLAY_PORT: - case CONNECTOR_EDP: radeon_output->MonType = MT_DP; break; } @@ -1302,7 +1053,7 @@ static void radeon_destroy (xf86OutputPtr output) { if (output->driver_private) - free(output->driver_private); + xfree(output->driver_private); } static void @@ -1423,7 +1174,7 @@ radeon_create_resources(xf86OutputPtr output) } } - if ((!IS_AVIVO_VARIANT) && (radeon_output->devices & (ATOM_DEVICE_DFP1_SUPPORT))) { + if ((!IS_AVIVO_VARIANT) && (radeon_output->devices & (ATOM_DEVICE_DFP2_SUPPORT))) { tmds_pll_atom = MAKE_ATOM("tmds_pll"); err = RRConfigureOutputProperty(output->randr_output, tmds_pll_atom, @@ -1622,25 +1373,10 @@ radeon_set_mode_for_property(xf86OutputPtr output) xf86CrtcPtr crtc = output->crtc; if (crtc->enabled) { -#ifdef RANDR_14_INTERFACE - xf86CrtcSetRec crtc_set_rec; - - crtc_set_rec.flags = (XF86CrtcSetMode | - XF86CrtcSetOutput | - XF86CrtcSetOrigin | - XF86CrtcSetRotation); - crtc_set_rec.mode = &crtc->desiredMode; - crtc_set_rec.rotation = crtc->desiredRotation; - crtc_set_rec.transform = NULL; - crtc_set_rec.x = crtc->desiredX; - crtc_set_rec.y = crtc->desiredY; - if (!xf86CrtcSet(crtc, &crtc_set_rec)) { -#else if (!xf86CrtcSetMode(crtc, &crtc->desiredMode, crtc->desiredRotation, crtc->desiredX, crtc->desiredY)) { -#endif xf86DrvMsg(pScrn->scrnIndex, X_ERROR, - "Failed to set mode after property change!\n"); + "Failed to set mode after propery change!\n"); return FALSE; } } @@ -1872,35 +1608,16 @@ static const xf86OutputFuncsRec radeon_output_funcs = { }; Bool -RADEONI2CDoLock(xf86OutputPtr output, I2CBusPtr b, int lock_state) +RADEONI2CDoLock(xf86OutputPtr output, int lock_state) { ScrnInfoPtr pScrn = output->scrn; RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONI2CBusPtr pRADEONI2CBus = b->DriverPrivate.ptr; + RADEONOutputPrivatePtr radeon_output = output->driver_private; + RADEONI2CBusPtr pRADEONI2CBus = radeon_output->pI2CBus->DriverPrivate.ptr; unsigned char *RADEONMMIO = info->MMIO; uint32_t temp; if (lock_state) { - /* RV410 appears to have a bug where the hw i2c in reset - * holds the i2c port in a bad state - switch hw i2c away before - * doing DDC - do this for all r200s/r300s for safety sakes */ - if ((info->ChipFamily >= CHIP_FAMILY_R200) && (!IS_AVIVO_VARIANT)) { - if (pRADEONI2CBus->mask_clk_reg == RADEON_GPIO_MONID) - OUTREG(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST | - R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1))); - else - OUTREG(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST | - R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3))); - } - - /* set the pad in ddc mode */ - if (IS_DCE3_VARIANT && - pRADEONI2CBus->hw_capable) { - temp = INREG(pRADEONI2CBus->mask_clk_reg); - temp &= ~(1 << 16); - OUTREG(pRADEONI2CBus->mask_clk_reg, temp); - } - temp = INREG(pRADEONI2CBus->a_clk_reg); temp &= ~(pRADEONI2CBus->a_clk_mask); OUTREG(pRADEONI2CBus->a_clk_reg, temp); @@ -2130,6 +1847,10 @@ void RADEONInitConnector(xf86OutputPtr output) else radeon_output->rmx_type = RMX_OFF; + /* dce 3.2 chips have problems with low dot clocks, so use the scaler */ + if (IS_DCE32_VARIANT && (radeon_output->devices & (ATOM_DEVICE_DFP_SUPPORT))) + radeon_output->rmx_type = RMX_FULL; + if (!IS_AVIVO_VARIANT) { if (radeon_output->devices & (ATOM_DEVICE_CRT2_SUPPORT)) { if (xf86ReturnOptValBool(info->Options, OPTION_TVDAC_LOAD_DETECT, FALSE)) @@ -2143,20 +1864,6 @@ void RADEONInitConnector(xf86OutputPtr output) if (radeon_output->devices & (ATOM_DEVICE_DFP_SUPPORT)) radeon_output->coherent_mode = TRUE; - if (radeon_output->ConnectorType == CONNECTOR_DISPLAY_PORT) { - strcpy(radeon_output->dp_bus_name, output->name); - strcat(radeon_output->dp_bus_name, "-DP"); - RADEON_DP_I2CInit(pScrn, &radeon_output->dp_pI2CBus, radeon_output->dp_bus_name, output); - RADEON_DP_GetSinkType(output); - } - - if (radeon_output->ConnectorType == CONNECTOR_EDP) { - strcpy(radeon_output->dp_bus_name, output->name); - strcat(radeon_output->dp_bus_name, "-eDP"); - RADEON_DP_I2CInit(pScrn, &radeon_output->dp_pI2CBus, radeon_output->dp_bus_name, output); - RADEON_DP_GetSinkType(output); - } - if (radeon_output->ddc_i2c.valid) RADEONI2CInit(pScrn, &radeon_output->pI2CBus, output->name, &radeon_output->ddc_i2c); @@ -2761,7 +2468,7 @@ static RADEONMacModel RADEONDetectMacModel(ScrnInfoPtr pScrn) ret = RADEON_MAC_POWERBOOK_EXTERNAL; /* dual or single link */ } - if (strcmp(model, "PowerBook5,7") || + if (strcmp(model, "PowerBook5,7") == 0 || strcmp(model, "PowerBook5,8") == 0 || strcmp(model, "PowerBook5,9") == 0) { ret = RADEON_MAC_POWERBOOK_EXTERNAL; /* dual link */ @@ -2839,26 +2546,17 @@ radeon_output_clones (ScrnInfoPtr pScrn, xf86OutputPtr output) int o; int index_mask = 0; - /* no cloning with zaphod */ - if (info->IsPrimary || info->IsSecondary) - return index_mask; - /* DIG routing gets problematic */ - if (info->ChipFamily >= CHIP_FAMILY_R600) + if (IS_DCE32_VARIANT) return index_mask; /* LVDS is too wacky */ if (radeon_output->devices & (ATOM_DEVICE_LCD_SUPPORT)) return index_mask; - /* TV requires very specific timing */ if (radeon_output->devices & (ATOM_DEVICE_TV_SUPPORT)) return index_mask; - /* DVO requires 2x ppll clocks depending on the tmds chip */ - if (radeon_output->devices & (ATOM_DEVICE_DFP2_SUPPORT)) - return index_mask; - for (o = 0; o < config->num_output; o++) { xf86OutputPtr clone = config->output[o]; RADEONOutputPrivatePtr radeon_clone = clone->driver_private; @@ -2897,7 +2595,6 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) int num_dvi = 0; int num_hdmi = 0; int num_dp = 0; - int num_edp = 0; /* We first get the information about all connectors from BIOS. * This is how the card is phyiscally wired up. @@ -3037,17 +2734,15 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) RADEONConnectorType conntype = info->BiosConnector[i].ConnectorType; if ((conntype == CONNECTOR_DVI_D) || (conntype == CONNECTOR_DVI_I) || - (conntype == CONNECTOR_DVI_A) || - (conntype == CONNECTOR_HDMI_TYPE_B)) { + (conntype == CONNECTOR_DVI_A)) { num_dvi++; } else if (conntype == CONNECTOR_VGA) { num_vga++; - } else if (conntype == CONNECTOR_HDMI_TYPE_A) { + } else if ((conntype == CONNECTOR_HDMI_TYPE_A) || + (conntype == CONNECTOR_HDMI_TYPE_B)) { num_hdmi++; } else if (conntype == CONNECTOR_DISPLAY_PORT) { num_dp++; - } else if (conntype == CONNECTOR_EDP) { - num_edp++; } } } @@ -3072,29 +2767,19 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) radeon_output->shared_ddc = info->BiosConnector[i].shared_ddc; radeon_output->load_detection = info->BiosConnector[i].load_detection; radeon_output->linkb = info->BiosConnector[i].linkb; - radeon_output->dig_encoder = -1; radeon_output->connector_id = info->BiosConnector[i].connector_object; - radeon_output->connector_object_id = info->BiosConnector[i].connector_object_id; - radeon_output->ucI2cId = info->BiosConnector[i].ucI2cId; - radeon_output->hpd_id = info->BiosConnector[i].hpd_id; - /* Technically HDMI-B is a glorfied DL DVI so the bios is correct, - * but this can be confusing to users when it comes to output names, - * so call it DVI - */ if ((conntype == CONNECTOR_DVI_D) || (conntype == CONNECTOR_DVI_I) || - (conntype == CONNECTOR_DVI_A) || - (conntype == CONNECTOR_HDMI_TYPE_B)) { + (conntype == CONNECTOR_DVI_A)) { output = RADEONOutputCreate(pScrn, "DVI-%d", --num_dvi); } else if (conntype == CONNECTOR_VGA) { output = RADEONOutputCreate(pScrn, "VGA-%d", --num_vga); - } else if (conntype == CONNECTOR_HDMI_TYPE_A) { + } else if ((conntype == CONNECTOR_HDMI_TYPE_A) || + (conntype == CONNECTOR_HDMI_TYPE_B)) { output = RADEONOutputCreate(pScrn, "HDMI-%d", --num_hdmi); } else if (conntype == CONNECTOR_DISPLAY_PORT) { output = RADEONOutputCreate(pScrn, "DisplayPort-%d", --num_dp); - } else if (conntype == CONNECTOR_EDP) { - output = RADEONOutputCreate(pScrn, "eDP-%d", --num_edp); } else { output = RADEONOutputCreate(pScrn, ConnectorTypeName[conntype], 0); @@ -3103,17 +2788,11 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) if (!output) { return FALSE; } - output->interlaceAllowed = TRUE; - output->doubleScanAllowed = TRUE; output->driver_private = radeon_output; - if (IS_DCE4_VARIANT) { - output->possible_crtcs = 0x3f; - } else { - output->possible_crtcs = 1; - /* crtc2 can drive LVDS, it just doesn't have RMX */ - if (!(radeon_output->devices & (ATOM_DEVICE_LCD_SUPPORT))) - output->possible_crtcs |= 2; - } + output->possible_crtcs = 1; + /* crtc2 can drive LVDS, it just doesn't have RMX */ + if (!(radeon_output->devices & (ATOM_DEVICE_LCD_SUPPORT))) + output->possible_crtcs |= 2; /* we can clone the DACs, and probably TV-out, but I'm not sure it's worth the trouble */ @@ -3127,7 +2806,6 @@ Bool RADEONSetupConnectors(ScrnInfoPtr pScrn) xf86OutputPtr output = xf86_config->output[i]; output->possible_clones = radeon_output_clones(pScrn, output); - RADEONGetHardCodedEDIDFromFile(output); } return TRUE; diff --git a/driver/xf86-video-ati/src/radeon_pci_chipset_gen.h b/driver/xf86-video-ati/src/radeon_pci_chipset_gen.h index 549eaca0d..d61c57d47 100644 --- a/driver/xf86-video-ati/src/radeon_pci_chipset_gen.h +++ b/driver/xf86-video-ati/src/radeon_pci_chipset_gen.h @@ -4,7 +4,6 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RV380_3151, PCI_CHIP_RV380_3151, RES_SHARED_VGA }, { PCI_CHIP_RV380_3152, PCI_CHIP_RV380_3152, RES_SHARED_VGA }, { PCI_CHIP_RV380_3154, PCI_CHIP_RV380_3154, RES_SHARED_VGA }, - { PCI_CHIP_RV380_3155, PCI_CHIP_RV380_3155, RES_SHARED_VGA }, { PCI_CHIP_RV380_3E50, PCI_CHIP_RV380_3E50, RES_SHARED_VGA }, { PCI_CHIP_RV380_3E54, PCI_CHIP_RV380_3E54, RES_SHARED_VGA }, { PCI_CHIP_RS100_4136, PCI_CHIP_RS100_4136, RES_SHARED_VGA }, @@ -26,6 +25,7 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RV350_AV, PCI_CHIP_RV350_AV, RES_SHARED_VGA }, { PCI_CHIP_RS250_4237, PCI_CHIP_RS250_4237, RES_SHARED_VGA }, { PCI_CHIP_R200_BB, PCI_CHIP_R200_BB, RES_SHARED_VGA }, + { PCI_CHIP_R200_BC, PCI_CHIP_R200_BC, RES_SHARED_VGA }, { PCI_CHIP_RS100_4336, PCI_CHIP_RS100_4336, RES_SHARED_VGA }, { PCI_CHIP_RS200_4337, PCI_CHIP_RS200_4337, RES_SHARED_VGA }, { PCI_CHIP_RS250_4437, PCI_CHIP_RS250_4437, RES_SHARED_VGA }, @@ -40,8 +40,6 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_R420_JN, PCI_CHIP_R420_JN, RES_SHARED_VGA }, { PCI_CHIP_R420_4A4F, PCI_CHIP_R420_4A4F, RES_SHARED_VGA }, { PCI_CHIP_R420_JP, PCI_CHIP_R420_JP, RES_SHARED_VGA }, - { PCI_CHIP_R420_JT, PCI_CHIP_R420_JT, RES_SHARED_VGA }, - { PCI_CHIP_R481_4B48, PCI_CHIP_R481_4B48, RES_SHARED_VGA }, { PCI_CHIP_R481_4B49, PCI_CHIP_R481_4B49, RES_SHARED_VGA }, { PCI_CHIP_R481_4B4A, PCI_CHIP_R481_4B4A, RES_SHARED_VGA }, { PCI_CHIP_R481_4B4B, PCI_CHIP_R481_4B4B, RES_SHARED_VGA }, @@ -256,7 +254,6 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RV770_9440, PCI_CHIP_RV770_9440, RES_SHARED_VGA }, { PCI_CHIP_RV770_9441, PCI_CHIP_RV770_9441, RES_SHARED_VGA }, { PCI_CHIP_RV770_9442, PCI_CHIP_RV770_9442, RES_SHARED_VGA }, - { PCI_CHIP_RV770_9443, PCI_CHIP_RV770_9443, RES_SHARED_VGA }, { PCI_CHIP_RV770_9444, PCI_CHIP_RV770_9444, RES_SHARED_VGA }, { PCI_CHIP_RV770_9446, PCI_CHIP_RV770_9446, RES_SHARED_VGA }, { PCI_CHIP_RV770_944A, PCI_CHIP_RV770_944A, RES_SHARED_VGA }, @@ -268,34 +265,21 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RV770_9456, PCI_CHIP_RV770_9456, RES_SHARED_VGA }, { PCI_CHIP_RV770_945A, PCI_CHIP_RV770_945A, RES_SHARED_VGA }, { PCI_CHIP_RV770_945B, PCI_CHIP_RV770_945B, RES_SHARED_VGA }, - { PCI_CHIP_RV770_945E, PCI_CHIP_RV770_945E, RES_SHARED_VGA }, { PCI_CHIP_RV790_9460, PCI_CHIP_RV790_9460, RES_SHARED_VGA }, { PCI_CHIP_RV790_9462, PCI_CHIP_RV790_9462, RES_SHARED_VGA }, { PCI_CHIP_RV770_946A, PCI_CHIP_RV770_946A, RES_SHARED_VGA }, { PCI_CHIP_RV770_946B, PCI_CHIP_RV770_946B, RES_SHARED_VGA }, { PCI_CHIP_RV770_947A, PCI_CHIP_RV770_947A, RES_SHARED_VGA }, { PCI_CHIP_RV770_947B, PCI_CHIP_RV770_947B, RES_SHARED_VGA }, - { PCI_CHIP_RV730_9480, PCI_CHIP_RV730_9480, RES_SHARED_VGA }, { PCI_CHIP_RV730_9487, PCI_CHIP_RV730_9487, RES_SHARED_VGA }, - { PCI_CHIP_RV730_9488, PCI_CHIP_RV730_9488, RES_SHARED_VGA }, { PCI_CHIP_RV730_9489, PCI_CHIP_RV730_9489, RES_SHARED_VGA }, - { PCI_CHIP_RV730_948A, PCI_CHIP_RV730_948A, RES_SHARED_VGA }, { PCI_CHIP_RV730_948F, PCI_CHIP_RV730_948F, RES_SHARED_VGA }, { PCI_CHIP_RV730_9490, PCI_CHIP_RV730_9490, RES_SHARED_VGA }, { PCI_CHIP_RV730_9491, PCI_CHIP_RV730_9491, RES_SHARED_VGA }, - { PCI_CHIP_RV730_9495, PCI_CHIP_RV730_9495, RES_SHARED_VGA }, { PCI_CHIP_RV730_9498, PCI_CHIP_RV730_9498, RES_SHARED_VGA }, { PCI_CHIP_RV730_949C, PCI_CHIP_RV730_949C, RES_SHARED_VGA }, { PCI_CHIP_RV730_949E, PCI_CHIP_RV730_949E, RES_SHARED_VGA }, { PCI_CHIP_RV730_949F, PCI_CHIP_RV730_949F, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94A0, PCI_CHIP_RV740_94A0, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94A1, PCI_CHIP_RV740_94A1, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94A3, PCI_CHIP_RV740_94A3, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94B1, PCI_CHIP_RV740_94B1, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94B3, PCI_CHIP_RV740_94B3, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94B4, PCI_CHIP_RV740_94B4, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94B5, PCI_CHIP_RV740_94B5, RES_SHARED_VGA }, - { PCI_CHIP_RV740_94B9, PCI_CHIP_RV740_94B9, RES_SHARED_VGA }, { PCI_CHIP_RV610_94C0, PCI_CHIP_RV610_94C0, RES_SHARED_VGA }, { PCI_CHIP_RV610_94C1, PCI_CHIP_RV610_94C1, RES_SHARED_VGA }, { PCI_CHIP_RV610_94C3, PCI_CHIP_RV610_94C3, RES_SHARED_VGA }, @@ -323,14 +307,11 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RV670_9519, PCI_CHIP_RV670_9519, RES_SHARED_VGA }, { PCI_CHIP_RV710_9540, PCI_CHIP_RV710_9540, RES_SHARED_VGA }, { PCI_CHIP_RV710_9541, PCI_CHIP_RV710_9541, RES_SHARED_VGA }, - { PCI_CHIP_RV710_9542, PCI_CHIP_RV710_9542, RES_SHARED_VGA }, { PCI_CHIP_RV710_954E, PCI_CHIP_RV710_954E, RES_SHARED_VGA }, { PCI_CHIP_RV710_954F, PCI_CHIP_RV710_954F, RES_SHARED_VGA }, { PCI_CHIP_RV710_9552, PCI_CHIP_RV710_9552, RES_SHARED_VGA }, { PCI_CHIP_RV710_9553, PCI_CHIP_RV710_9553, RES_SHARED_VGA }, { PCI_CHIP_RV710_9555, PCI_CHIP_RV710_9555, RES_SHARED_VGA }, - { PCI_CHIP_RV710_9557, PCI_CHIP_RV710_9557, RES_SHARED_VGA }, - { PCI_CHIP_RV710_955F, PCI_CHIP_RV710_955F, RES_SHARED_VGA }, { PCI_CHIP_RV630_9580, PCI_CHIP_RV630_9580, RES_SHARED_VGA }, { PCI_CHIP_RV630_9581, PCI_CHIP_RV630_9581, RES_SHARED_VGA }, { PCI_CHIP_RV630_9583, PCI_CHIP_RV630_9583, RES_SHARED_VGA }, @@ -344,6 +325,7 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RV630_958D, PCI_CHIP_RV630_958D, RES_SHARED_VGA }, { PCI_CHIP_RV630_958E, PCI_CHIP_RV630_958E, RES_SHARED_VGA }, { PCI_CHIP_RV630_958F, PCI_CHIP_RV630_958F, RES_SHARED_VGA }, + { PCI_CHIP_RV710_9542, PCI_CHIP_RV710_9542, RES_SHARED_VGA }, { PCI_CHIP_RV620_95C0, PCI_CHIP_RV620_95C0, RES_SHARED_VGA }, { PCI_CHIP_RV620_95C2, PCI_CHIP_RV620_95C2, RES_SHARED_VGA }, { PCI_CHIP_RV620_95C4, PCI_CHIP_RV620_95C4, RES_SHARED_VGA }, @@ -371,124 +353,10 @@ PciChipsets RADEONPciChipsets[] = { { PCI_CHIP_RS780_9614, PCI_CHIP_RS780_9614, RES_SHARED_VGA }, { PCI_CHIP_RS780_9615, PCI_CHIP_RS780_9615, RES_SHARED_VGA }, { PCI_CHIP_RS780_9616, PCI_CHIP_RS780_9616, RES_SHARED_VGA }, - { PCI_CHIP_SUMO_9640, PCI_CHIP_SUMO_9640, RES_SHARED_VGA }, - { PCI_CHIP_SUMO_9641, PCI_CHIP_SUMO_9641, RES_SHARED_VGA }, - { PCI_CHIP_SUMO2_9642, PCI_CHIP_SUMO2_9642, RES_SHARED_VGA }, - { PCI_CHIP_SUMO2_9643, PCI_CHIP_SUMO2_9643, RES_SHARED_VGA }, - { PCI_CHIP_SUMO2_9644, PCI_CHIP_SUMO2_9644, RES_SHARED_VGA }, - { PCI_CHIP_SUMO2_9645, PCI_CHIP_SUMO2_9645, RES_SHARED_VGA }, - { PCI_CHIP_SUMO_9647, PCI_CHIP_SUMO_9647, RES_SHARED_VGA }, - { PCI_CHIP_SUMO_9648, PCI_CHIP_SUMO_9648, RES_SHARED_VGA }, - { PCI_CHIP_SUMO_964A, PCI_CHIP_SUMO_964A, RES_SHARED_VGA }, - { PCI_CHIP_SUMO_964E, PCI_CHIP_SUMO_964E, RES_SHARED_VGA }, - { PCI_CHIP_SUMO_964F, PCI_CHIP_SUMO_964F, RES_SHARED_VGA }, { PCI_CHIP_RS880_9710, PCI_CHIP_RS880_9710, RES_SHARED_VGA }, { PCI_CHIP_RS880_9711, PCI_CHIP_RS880_9711, RES_SHARED_VGA }, { PCI_CHIP_RS880_9712, PCI_CHIP_RS880_9712, RES_SHARED_VGA }, { PCI_CHIP_RS880_9713, PCI_CHIP_RS880_9713, RES_SHARED_VGA }, { PCI_CHIP_RS880_9714, PCI_CHIP_RS880_9714, RES_SHARED_VGA }, - { PCI_CHIP_RS880_9715, PCI_CHIP_RS880_9715, RES_SHARED_VGA }, - { PCI_CHIP_PALM_9802, PCI_CHIP_PALM_9802, RES_SHARED_VGA }, - { PCI_CHIP_PALM_9803, PCI_CHIP_PALM_9803, RES_SHARED_VGA }, - { PCI_CHIP_PALM_9804, PCI_CHIP_PALM_9804, RES_SHARED_VGA }, - { PCI_CHIP_PALM_9805, PCI_CHIP_PALM_9805, RES_SHARED_VGA }, - { PCI_CHIP_PALM_9806, PCI_CHIP_PALM_9806, RES_SHARED_VGA }, - { PCI_CHIP_PALM_9807, PCI_CHIP_PALM_9807, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_6880, PCI_CHIP_CYPRESS_6880, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_6888, PCI_CHIP_CYPRESS_6888, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_6889, PCI_CHIP_CYPRESS_6889, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_688A, PCI_CHIP_CYPRESS_688A, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_688C, PCI_CHIP_CYPRESS_688C, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_688D, PCI_CHIP_CYPRESS_688D, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_6898, PCI_CHIP_CYPRESS_6898, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_6899, PCI_CHIP_CYPRESS_6899, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_689B, PCI_CHIP_CYPRESS_689B, RES_SHARED_VGA }, - { PCI_CHIP_CYPRESS_689E, PCI_CHIP_CYPRESS_689E, RES_SHARED_VGA }, - { PCI_CHIP_HEMLOCK_689C, PCI_CHIP_HEMLOCK_689C, RES_SHARED_VGA }, - { PCI_CHIP_HEMLOCK_689D, PCI_CHIP_HEMLOCK_689D, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68A0, PCI_CHIP_JUNIPER_68A0, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68A1, PCI_CHIP_JUNIPER_68A1, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68A8, PCI_CHIP_JUNIPER_68A8, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68A9, PCI_CHIP_JUNIPER_68A9, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68B0, PCI_CHIP_JUNIPER_68B0, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68B8, PCI_CHIP_JUNIPER_68B8, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68B9, PCI_CHIP_JUNIPER_68B9, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68BA, PCI_CHIP_JUNIPER_68BA, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68BE, PCI_CHIP_JUNIPER_68BE, RES_SHARED_VGA }, - { PCI_CHIP_JUNIPER_68BF, PCI_CHIP_JUNIPER_68BF, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68C0, PCI_CHIP_REDWOOD_68C0, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68C1, PCI_CHIP_REDWOOD_68C1, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68C7, PCI_CHIP_REDWOOD_68C7, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68C8, PCI_CHIP_REDWOOD_68C8, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68C9, PCI_CHIP_REDWOOD_68C9, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68D8, PCI_CHIP_REDWOOD_68D8, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68D9, PCI_CHIP_REDWOOD_68D9, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68DA, PCI_CHIP_REDWOOD_68DA, RES_SHARED_VGA }, - { PCI_CHIP_REDWOOD_68DE, PCI_CHIP_REDWOOD_68DE, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68E0, PCI_CHIP_CEDAR_68E0, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68E1, PCI_CHIP_CEDAR_68E1, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68E4, PCI_CHIP_CEDAR_68E4, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68E5, PCI_CHIP_CEDAR_68E5, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68E8, PCI_CHIP_CEDAR_68E8, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68E9, PCI_CHIP_CEDAR_68E9, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68F1, PCI_CHIP_CEDAR_68F1, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68F2, PCI_CHIP_CEDAR_68F2, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68F8, PCI_CHIP_CEDAR_68F8, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68F9, PCI_CHIP_CEDAR_68F9, RES_SHARED_VGA }, - { PCI_CHIP_CEDAR_68FE, PCI_CHIP_CEDAR_68FE, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6700, PCI_CHIP_CAYMAN_6700, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6701, PCI_CHIP_CAYMAN_6701, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6702, PCI_CHIP_CAYMAN_6702, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6703, PCI_CHIP_CAYMAN_6703, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6704, PCI_CHIP_CAYMAN_6704, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6705, PCI_CHIP_CAYMAN_6705, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6706, PCI_CHIP_CAYMAN_6706, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6707, PCI_CHIP_CAYMAN_6707, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6708, PCI_CHIP_CAYMAN_6708, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6709, PCI_CHIP_CAYMAN_6709, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6718, PCI_CHIP_CAYMAN_6718, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_6719, PCI_CHIP_CAYMAN_6719, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_671C, PCI_CHIP_CAYMAN_671C, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_671D, PCI_CHIP_CAYMAN_671D, RES_SHARED_VGA }, - { PCI_CHIP_CAYMAN_671F, PCI_CHIP_CAYMAN_671F, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6720, PCI_CHIP_BARTS_6720, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6721, PCI_CHIP_BARTS_6721, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6722, PCI_CHIP_BARTS_6722, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6723, PCI_CHIP_BARTS_6723, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6724, PCI_CHIP_BARTS_6724, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6725, PCI_CHIP_BARTS_6725, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6726, PCI_CHIP_BARTS_6726, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6727, PCI_CHIP_BARTS_6727, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6728, PCI_CHIP_BARTS_6728, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6729, PCI_CHIP_BARTS_6729, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6738, PCI_CHIP_BARTS_6738, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_6739, PCI_CHIP_BARTS_6739, RES_SHARED_VGA }, - { PCI_CHIP_BARTS_673E, PCI_CHIP_BARTS_673E, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6740, PCI_CHIP_TURKS_6740, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6741, PCI_CHIP_TURKS_6741, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6742, PCI_CHIP_TURKS_6742, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6743, PCI_CHIP_TURKS_6743, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6744, PCI_CHIP_TURKS_6744, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6745, PCI_CHIP_TURKS_6745, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6746, PCI_CHIP_TURKS_6746, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6747, PCI_CHIP_TURKS_6747, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6748, PCI_CHIP_TURKS_6748, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6749, PCI_CHIP_TURKS_6749, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6750, PCI_CHIP_TURKS_6750, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6758, PCI_CHIP_TURKS_6758, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_6759, PCI_CHIP_TURKS_6759, RES_SHARED_VGA }, - { PCI_CHIP_TURKS_675F, PCI_CHIP_TURKS_675F, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6760, PCI_CHIP_CAICOS_6760, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6761, PCI_CHIP_CAICOS_6761, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6762, PCI_CHIP_CAICOS_6762, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6763, PCI_CHIP_CAICOS_6763, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6764, PCI_CHIP_CAICOS_6764, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6765, PCI_CHIP_CAICOS_6765, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6766, PCI_CHIP_CAICOS_6766, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6767, PCI_CHIP_CAICOS_6767, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6768, PCI_CHIP_CAICOS_6768, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6770, PCI_CHIP_CAICOS_6770, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6778, PCI_CHIP_CAICOS_6778, RES_SHARED_VGA }, - { PCI_CHIP_CAICOS_6779, PCI_CHIP_CAICOS_6779, RES_SHARED_VGA }, { -1, -1, RES_UNDEFINED } }; diff --git a/driver/xf86-video-ati/src/radeon_pci_device_match_gen.h b/driver/xf86-video-ati/src/radeon_pci_device_match_gen.h index 0739f81d1..a06b4a64e 100644 --- a/driver/xf86-video-ati/src/radeon_pci_device_match_gen.h +++ b/driver/xf86-video-ati/src/radeon_pci_device_match_gen.h @@ -4,7 +4,6 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_RV380_3151, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV380_3152, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV380_3154, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV380_3155, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV380_3E50, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV380_3E54, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS100_4136, 0 ), @@ -26,6 +25,7 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_RV350_AV, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS250_4237, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_R200_BB, 0 ), + ATI_DEVICE_MATCH( PCI_CHIP_R200_BC, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS100_4336, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS200_4337, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS250_4437, 0 ), @@ -40,8 +40,6 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_R420_JN, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_R420_4A4F, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_R420_JP, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_R420_JT, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_R481_4B48, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_R481_4B49, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_R481_4B4A, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_R481_4B4B, 0 ), @@ -256,7 +254,6 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_RV770_9440, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_9441, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_9442, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV770_9443, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_9444, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_9446, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_944A, 0 ), @@ -268,34 +265,21 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_RV770_9456, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_945A, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_945B, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV770_945E, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV790_9460, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV790_9462, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_946A, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_946B, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_947A, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV770_947B, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV730_9480, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_9487, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV730_9488, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_9489, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV730_948A, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_948F, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_9490, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_9491, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV730_9495, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_9498, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_949C, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_949E, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV730_949F, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94A0, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94A1, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94A3, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94B1, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94B3, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94B4, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94B5, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV740_94B9, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV610_94C0, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV610_94C1, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV610_94C3, 0 ), @@ -323,14 +307,11 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_RV670_9519, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV710_9540, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV710_9541, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV710_9542, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV710_954E, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV710_954F, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV710_9552, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV710_9553, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV710_9555, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV710_9557, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RV710_955F, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV630_9580, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV630_9581, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV630_9583, 0 ), @@ -344,6 +325,7 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_RV630_958D, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV630_958E, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV630_958F, 0 ), + ATI_DEVICE_MATCH( PCI_CHIP_RV710_9542, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV620_95C0, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV620_95C2, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RV620_95C4, 0 ), @@ -371,124 +353,10 @@ static const struct pci_id_match radeon_device_match[] = { ATI_DEVICE_MATCH( PCI_CHIP_RS780_9614, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS780_9615, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS780_9616, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO_9640, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO_9641, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO2_9642, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO2_9643, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO2_9644, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO2_9645, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO_9647, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO_9648, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO_964A, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO_964E, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_SUMO_964F, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS880_9710, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS880_9711, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS880_9712, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS880_9713, 0 ), ATI_DEVICE_MATCH( PCI_CHIP_RS880_9714, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_RS880_9715, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_PALM_9802, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_PALM_9803, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_PALM_9804, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_PALM_9805, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_PALM_9806, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_PALM_9807, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6880, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6888, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6889, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_688A, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_688C, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_688D, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6898, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_6899, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_689B, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CYPRESS_689E, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_HEMLOCK_689C, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_HEMLOCK_689D, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A0, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A1, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A8, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68A9, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68B0, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68B8, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68B9, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68BA, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68BE, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_JUNIPER_68BF, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C0, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C1, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C7, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C8, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68C9, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68D8, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68D9, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68DA, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_REDWOOD_68DE, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E0, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E1, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E4, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E5, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E8, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68E9, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68F1, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68F2, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68F8, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68F9, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CEDAR_68FE, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6700, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6701, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6702, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6703, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6704, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6705, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6706, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6707, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6708, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6709, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6718, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_6719, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_671C, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_671D, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAYMAN_671F, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6720, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6721, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6722, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6723, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6724, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6725, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6726, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6727, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6728, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6729, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6738, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_6739, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_BARTS_673E, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6740, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6741, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6742, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6743, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6744, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6745, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6746, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6747, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6748, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6749, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6750, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6758, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_6759, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_TURKS_675F, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6760, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6761, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6762, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6763, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6764, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6765, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6766, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6767, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6768, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6770, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6778, 0 ), - ATI_DEVICE_MATCH( PCI_CHIP_CAICOS_6779, 0 ), { 0, 0, 0 } }; diff --git a/driver/xf86-video-ati/src/radeon_pm.c b/driver/xf86-video-ati/src/radeon_pm.c deleted file mode 100644 index d5152c80d..000000000 --- a/driver/xf86-video-ati/src/radeon_pm.c +++ /dev/null @@ -1,886 +0,0 @@ -/* - * Copyright 2009 Advanced Micro Devices, Inc. - * - * 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, 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 (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 THE COPYRIGHT HOLDER(S) OR - * AUTHOR(S) 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. - * - * Author: Alex Deucher - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - - /* Driver data structures */ -#include "radeon.h" -#include "radeon_reg.h" -#include "radeon_macros.h" -#include "radeon_atombios.h" - -#include "ati_pciids_gen.h" - -/* 10 khz */ -static uint32_t calc_eng_mem_clock(ScrnInfoPtr pScrn, - uint32_t req_clock, - int ref_div, - int *fb_div, - int *post_div) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONPLLPtr pll = &info->pll; - - if (req_clock < 15000) { - *post_div = 8; - req_clock *= 8; - } else if (req_clock < 30000) { - *post_div = 4; - req_clock *= 4; - } else if (req_clock < 60000) { - *post_div = 2; - req_clock *= 2; - } else - *post_div = 1; - - req_clock *= ref_div; - req_clock += pll->reference_freq; - req_clock /= (2 * pll->reference_freq); - - *fb_div = req_clock & 0xff; - - req_clock = (req_clock & 0xffff) << 1; - req_clock *= pll->reference_freq; - req_clock /= ref_div; - req_clock /= *post_div; - - return req_clock; - -} - -static void -RADEONSetEngineClock(ScrnInfoPtr pScrn, uint32_t eng_clock) -{ - uint32_t tmp; - int ref_div, fb_div, post_div; - - RADEONWaitForIdleMMIO(pScrn); - - tmp = INPLL(pScrn, RADEON_M_SPLL_REF_FB_DIV); - ref_div = tmp & RADEON_M_SPLL_REF_DIV_MASK; - - eng_clock = calc_eng_mem_clock(pScrn, eng_clock, ref_div, &fb_div, &post_div); - - tmp = INPLL(pScrn, RADEON_CLK_PIN_CNTL); - tmp &= ~RADEON_DONT_USE_XTALIN; - OUTPLL(pScrn, RADEON_CLK_PIN_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp &= ~RADEON_SCLK_SRC_SEL_MASK; - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - usleep(10); - - tmp = INPLL(pScrn, RADEON_SPLL_CNTL); - tmp |= RADEON_SPLL_SLEEP; - OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp); - - usleep(2); - - tmp = INPLL(pScrn, RADEON_SPLL_CNTL); - tmp |= RADEON_SPLL_RESET; - OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp); - - usleep(200); - - tmp = INPLL(pScrn, RADEON_M_SPLL_REF_FB_DIV); - tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT); - tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT; - OUTPLL(pScrn, RADEON_M_SPLL_REF_FB_DIV, tmp); - - /* XXX: verify on different asics */ - tmp = INPLL(pScrn, RADEON_SPLL_CNTL); - tmp &= ~RADEON_SPLL_PVG_MASK; - if ((eng_clock * post_div) >= 90000) - tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT); - else - tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT); - OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_SPLL_CNTL); - tmp &= ~RADEON_SPLL_SLEEP; - OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp); - - usleep(2); - - tmp = INPLL(pScrn, RADEON_SPLL_CNTL); - tmp &= ~RADEON_SPLL_RESET; - OUTPLL(pScrn, RADEON_SPLL_CNTL, tmp); - - usleep(200); - - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp &= ~RADEON_SCLK_SRC_SEL_MASK; - switch (post_div) { - case 1: - default: - tmp |= 1; - break; - case 2: - tmp |= 2; - break; - case 4: - tmp |= 3; - break; - case 8: - tmp |= 4; - break; - } - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - usleep(20); - - tmp = INPLL(pScrn, RADEON_CLK_PIN_CNTL); - tmp |= RADEON_DONT_USE_XTALIN; - OUTPLL(pScrn, RADEON_CLK_PIN_CNTL, tmp); - - usleep(10); - -} - -static void LegacySetClockGating(ScrnInfoPtr pScrn, Bool enable) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - uint32_t tmp; - - if (enable) { - if (!pRADEONEnt->HasCRTC2) { - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - if ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) > - RADEON_CFG_ATI_REV_A13) { - tmp &= ~(RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_RB); - } - tmp &= ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | - RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE | - RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE | - RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM | - RADEON_SCLK_FORCE_TDM); - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - } else if (IS_R300_VARIANT) { - if ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480)) { - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp &= ~(RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP | - RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | - RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 | - R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT | - RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR | - R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX | - R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK | - R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0); - tmp |= RADEON_DYN_STOP_LAT_MASK; - tmp |= RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_VIP; - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); - tmp &= ~RADEON_SCLK_MORE_FORCEON; - tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT; - OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); - tmp |= (RADEON_PIXCLK_ALWAYS_ONb | - RADEON_PIXCLK_DAC_ALWAYS_ONb); - OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); - tmp |= (RADEON_PIX2CLK_ALWAYS_ONb | - RADEON_PIX2CLK_DAC_ALWAYS_ONb | - RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb | - R300_DVOCLK_ALWAYS_ONb | - RADEON_PIXCLK_BLEND_ALWAYS_ONb | - RADEON_PIXCLK_GV_ALWAYS_ONb | - R300_PIXCLK_DVO_ALWAYS_ONb | - RADEON_PIXCLK_LVDS_ALWAYS_ONb | - RADEON_PIXCLK_TMDS_ALWAYS_ONb | - R300_PIXCLK_TRANS_ALWAYS_ONb | - R300_PIXCLK_TVO_ALWAYS_ONb | - R300_P2G2CLK_ALWAYS_ONb | - R300_P2G2CLK_DAC_ALWAYS_ONb); - OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); - } else if (info->ChipFamily >= CHIP_FAMILY_RV350) { - tmp = INPLL(pScrn, R300_SCLK_CNTL2); - tmp &= ~(R300_SCLK_FORCE_TCL | - R300_SCLK_FORCE_GA | - R300_SCLK_FORCE_CBA); - tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT | - R300_SCLK_GA_MAX_DYN_STOP_LAT | - R300_SCLK_CBA_MAX_DYN_STOP_LAT); - OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); - - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp &= ~(RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP | - RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | - RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 | - R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT | - RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR | - R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX | - R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK | - R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0); - tmp |= RADEON_DYN_STOP_LAT_MASK; - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); - tmp &= ~RADEON_SCLK_MORE_FORCEON; - tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT; - OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); - tmp |= (RADEON_PIXCLK_ALWAYS_ONb | - RADEON_PIXCLK_DAC_ALWAYS_ONb); - OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); - tmp |= (RADEON_PIX2CLK_ALWAYS_ONb | - RADEON_PIX2CLK_DAC_ALWAYS_ONb | - RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb | - R300_DVOCLK_ALWAYS_ONb | - RADEON_PIXCLK_BLEND_ALWAYS_ONb | - RADEON_PIXCLK_GV_ALWAYS_ONb | - R300_PIXCLK_DVO_ALWAYS_ONb | - RADEON_PIXCLK_LVDS_ALWAYS_ONb | - RADEON_PIXCLK_TMDS_ALWAYS_ONb | - R300_PIXCLK_TRANS_ALWAYS_ONb | - R300_PIXCLK_TVO_ALWAYS_ONb | - R300_P2G2CLK_ALWAYS_ONb | - R300_P2G2CLK_DAC_ALWAYS_ONb); - OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_MCLK_MISC); - tmp |= (RADEON_MC_MCLK_DYN_ENABLE | - RADEON_IO_MCLK_DYN_ENABLE); - OUTPLL(pScrn, RADEON_MCLK_MISC, tmp); - - tmp = INPLL(pScrn, RADEON_MCLK_CNTL); - tmp |= (RADEON_FORCEON_MCLKA | - RADEON_FORCEON_MCLKB); - - tmp &= ~(RADEON_FORCEON_YCLKA | - RADEON_FORCEON_YCLKB | - RADEON_FORCEON_MC); - - /* Some releases of vbios have set DISABLE_MC_MCLKA - and DISABLE_MC_MCLKB bits in the vbios table. Setting these - bits will cause H/W hang when reading video memory with dynamic clocking - enabled. */ - if ((tmp & R300_DISABLE_MC_MCLKA) && - (tmp & R300_DISABLE_MC_MCLKB)) { - /* If both bits are set, then check the active channels */ - tmp = INPLL(pScrn, RADEON_MCLK_CNTL); - if (info->RamWidth == 64) { - if (INREG(RADEON_MEM_CNTL) & R300_MEM_USE_CD_CH_ONLY) - tmp &= ~R300_DISABLE_MC_MCLKB; - else - tmp &= ~R300_DISABLE_MC_MCLKA; - } else { - tmp &= ~(R300_DISABLE_MC_MCLKA | - R300_DISABLE_MC_MCLKB); - } - } - - OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp); - } else { - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp &= ~(R300_SCLK_FORCE_VAP); - tmp |= RADEON_SCLK_FORCE_CP; - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - usleep(15000); - - tmp = INPLL(pScrn, R300_SCLK_CNTL2); - tmp &= ~(R300_SCLK_FORCE_TCL | - R300_SCLK_FORCE_GA | - R300_SCLK_FORCE_CBA); - OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); - } - } else { - tmp = INPLL(pScrn, RADEON_CLK_PWRMGT_CNTL); - - tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK | - RADEON_DISP_DYN_STOP_LAT_MASK | - RADEON_DYN_STOP_MODE_MASK); - - tmp |= (RADEON_ENGIN_DYNCLK_MODE | - (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT)); - OUTPLL(pScrn, RADEON_CLK_PWRMGT_CNTL, tmp); - usleep(15000); - - tmp = INPLL(pScrn, RADEON_CLK_PIN_CNTL); - tmp |= RADEON_SCLK_DYN_START_CNTL; - OUTPLL(pScrn, RADEON_CLK_PIN_CNTL, tmp); - usleep(15000); - - /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200 - to lockup randomly, leave them as set by BIOS. - */ - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - /*tmp &= RADEON_SCLK_SRC_SEL_MASK;*/ - tmp &= ~RADEON_SCLK_FORCEON_MASK; - - /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300*/ - if (((info->ChipFamily == CHIP_FAMILY_RV250) && - ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) < - RADEON_CFG_ATI_REV_A13)) || - ((info->ChipFamily == CHIP_FAMILY_RV100) && - ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) <= - RADEON_CFG_ATI_REV_A13))) { - tmp |= RADEON_SCLK_FORCE_CP; - tmp |= RADEON_SCLK_FORCE_VIP; - } - - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - if ((info->ChipFamily == CHIP_FAMILY_RV200) || - (info->ChipFamily == CHIP_FAMILY_RV250) || - (info->ChipFamily == CHIP_FAMILY_RV280)) { - tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); - tmp &= ~RADEON_SCLK_MORE_FORCEON; - - /* RV200::A11 A12 RV250::A11 A12 */ - if (((info->ChipFamily == CHIP_FAMILY_RV200) || - (info->ChipFamily == CHIP_FAMILY_RV250)) && - ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) < - RADEON_CFG_ATI_REV_A13)) { - tmp |= RADEON_SCLK_MORE_FORCEON; - } - OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); - usleep(15000); - } - - /* RV200::A11 A12, RV250::A11 A12 */ - if (((info->ChipFamily == CHIP_FAMILY_RV200) || - (info->ChipFamily == CHIP_FAMILY_RV250)) && - ((INREG(RADEON_CONFIG_CNTL) & RADEON_CFG_ATI_REV_ID_MASK) < - RADEON_CFG_ATI_REV_A13)) { - tmp = INPLL(pScrn, RADEON_PLL_PWRMGT_CNTL); - tmp |= RADEON_TCL_BYPASS_DISABLE; - OUTPLL(pScrn, RADEON_PLL_PWRMGT_CNTL, tmp); - } - usleep(15000); - - /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK)*/ - tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); - tmp |= (RADEON_PIX2CLK_ALWAYS_ONb | - RADEON_PIX2CLK_DAC_ALWAYS_ONb | - RADEON_PIXCLK_BLEND_ALWAYS_ONb | - RADEON_PIXCLK_GV_ALWAYS_ONb | - RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | - RADEON_PIXCLK_LVDS_ALWAYS_ONb | - RADEON_PIXCLK_TMDS_ALWAYS_ONb); - - OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); - usleep(15000); - - tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); - tmp |= (RADEON_PIXCLK_ALWAYS_ONb | - RADEON_PIXCLK_DAC_ALWAYS_ONb); - - OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); - usleep(15000); - } - } else { - /* Turn everything OFF (ForceON to everything)*/ - if ( !pRADEONEnt->HasCRTC2 ) { - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP | - RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP | - RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE | - RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP | - RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB | - RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM | - RADEON_SCLK_FORCE_RB); - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - } else if ((info->ChipFamily == CHIP_FAMILY_RS400) || - (info->ChipFamily == CHIP_FAMILY_RS480)) { - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP | - RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | - RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 | - R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT | - RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR | - R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX | - R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK | - R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0); - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); - tmp |= RADEON_SCLK_MORE_FORCEON; - OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); - tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb | - RADEON_PIXCLK_DAC_ALWAYS_ONb | - R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF); - OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); - tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb | - RADEON_PIX2CLK_DAC_ALWAYS_ONb | - RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb | - R300_DVOCLK_ALWAYS_ONb | - RADEON_PIXCLK_BLEND_ALWAYS_ONb | - RADEON_PIXCLK_GV_ALWAYS_ONb | - R300_PIXCLK_DVO_ALWAYS_ONb | - RADEON_PIXCLK_LVDS_ALWAYS_ONb | - RADEON_PIXCLK_TMDS_ALWAYS_ONb | - R300_PIXCLK_TRANS_ALWAYS_ONb | - R300_PIXCLK_TVO_ALWAYS_ONb | - R300_P2G2CLK_ALWAYS_ONb | - R300_P2G2CLK_DAC_ALWAYS_ONb | - R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); - OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); - } else if (info->ChipFamily >= CHIP_FAMILY_RV350) { - /* for RV350/M10, no delays are required. */ - tmp = INPLL(pScrn, R300_SCLK_CNTL2); - tmp |= (R300_SCLK_FORCE_TCL | - R300_SCLK_FORCE_GA | - R300_SCLK_FORCE_CBA); - OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); - - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP | - RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 | - RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 | - R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT | - RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR | - R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX | - R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK | - R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0); - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); - tmp |= RADEON_SCLK_MORE_FORCEON; - OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_MCLK_CNTL); - tmp |= (RADEON_FORCEON_MCLKA | - RADEON_FORCEON_MCLKB | - RADEON_FORCEON_YCLKA | - RADEON_FORCEON_YCLKB | - RADEON_FORCEON_MC); - OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); - tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb | - RADEON_PIXCLK_DAC_ALWAYS_ONb | - R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF); - OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); - - tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); - tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb | - RADEON_PIX2CLK_DAC_ALWAYS_ONb | - RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb | - R300_DVOCLK_ALWAYS_ONb | - RADEON_PIXCLK_BLEND_ALWAYS_ONb | - RADEON_PIXCLK_GV_ALWAYS_ONb | - R300_PIXCLK_DVO_ALWAYS_ONb | - RADEON_PIXCLK_LVDS_ALWAYS_ONb | - RADEON_PIXCLK_TMDS_ALWAYS_ONb | - R300_PIXCLK_TRANS_ALWAYS_ONb | - R300_PIXCLK_TVO_ALWAYS_ONb | - R300_P2G2CLK_ALWAYS_ONb | - R300_P2G2CLK_DAC_ALWAYS_ONb | - R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF); - OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); - } else { - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2); - tmp |= RADEON_SCLK_FORCE_SE; - - if ( !pRADEONEnt->HasCRTC2 ) { - tmp |= ( RADEON_SCLK_FORCE_RB | - RADEON_SCLK_FORCE_TDM | - RADEON_SCLK_FORCE_TAM | - RADEON_SCLK_FORCE_PB | - RADEON_SCLK_FORCE_RE | - RADEON_SCLK_FORCE_VIP | - RADEON_SCLK_FORCE_IDCT | - RADEON_SCLK_FORCE_TOP | - RADEON_SCLK_FORCE_DISP1 | - RADEON_SCLK_FORCE_DISP2 | - RADEON_SCLK_FORCE_HDP ); - } else if ((info->ChipFamily == CHIP_FAMILY_R300) || - (info->ChipFamily == CHIP_FAMILY_R350)) { - tmp |= ( RADEON_SCLK_FORCE_HDP | - RADEON_SCLK_FORCE_DISP1 | - RADEON_SCLK_FORCE_DISP2 | - RADEON_SCLK_FORCE_TOP | - RADEON_SCLK_FORCE_IDCT | - RADEON_SCLK_FORCE_VIP); - } - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - - usleep(16000); - - if ((info->ChipFamily == CHIP_FAMILY_R300) || - (info->ChipFamily == CHIP_FAMILY_R350)) { - tmp = INPLL(pScrn, R300_SCLK_CNTL2); - tmp |= ( R300_SCLK_FORCE_TCL | - R300_SCLK_FORCE_GA | - R300_SCLK_FORCE_CBA); - OUTPLL(pScrn, R300_SCLK_CNTL2, tmp); - usleep(16000); - } - - if (info->IsIGP) { - tmp = INPLL(pScrn, RADEON_MCLK_CNTL); - tmp &= ~(RADEON_FORCEON_MCLKA | - RADEON_FORCEON_YCLKA); - OUTPLL(pScrn, RADEON_MCLK_CNTL, tmp); - usleep(16000); - } - - if ((info->ChipFamily == CHIP_FAMILY_RV200) || - (info->ChipFamily == CHIP_FAMILY_RV250) || - (info->ChipFamily == CHIP_FAMILY_RV280)) { - tmp = INPLL(pScrn, RADEON_SCLK_MORE_CNTL); - tmp |= RADEON_SCLK_MORE_FORCEON; - OUTPLL(pScrn, RADEON_SCLK_MORE_CNTL, tmp); - usleep(16000); - } - - tmp = INPLL(pScrn, RADEON_PIXCLKS_CNTL); - tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb | - RADEON_PIX2CLK_DAC_ALWAYS_ONb | - RADEON_PIXCLK_BLEND_ALWAYS_ONb | - RADEON_PIXCLK_GV_ALWAYS_ONb | - RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb | - RADEON_PIXCLK_LVDS_ALWAYS_ONb | - RADEON_PIXCLK_TMDS_ALWAYS_ONb); - - OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); - usleep(16000); - - tmp = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); - tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb | - RADEON_PIXCLK_DAC_ALWAYS_ONb); - OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); - } - } -} - -static void RADEONPMQuirks(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - uint32_t tmp; - - RADEONWaitForIdleMMIO(pScrn); - - if (info->ChipFamily < CHIP_FAMILY_RV515) { - tmp = INPLL(pScrn, RADEON_SCLK_CNTL); - if (IS_R300_VARIANT || IS_RV100_VARIANT) - tmp |= RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_VIP; - if ((info->ChipFamily == CHIP_FAMILY_RV250) || (info->ChipFamily == CHIP_FAMILY_RV280)) - tmp |= RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_DISP2; - if ((info->ChipFamily == CHIP_FAMILY_RV350) || (info->ChipFamily == CHIP_FAMILY_RV380)) - tmp |= R300_SCLK_FORCE_VAP; - if (info->ChipFamily == CHIP_FAMILY_R420) - tmp |= R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX; - OUTPLL(pScrn, RADEON_SCLK_CNTL, tmp); - } else if (info->ChipFamily < CHIP_FAMILY_R600) { - tmp = INPLL(pScrn, AVIVO_CP_DYN_CNTL); - tmp |= AVIVO_CP_FORCEON; - OUTPLL(pScrn, AVIVO_CP_DYN_CNTL, tmp); - - tmp = INPLL(pScrn, AVIVO_E2_DYN_CNTL); - tmp |= AVIVO_E2_FORCEON; - OUTPLL(pScrn, AVIVO_E2_DYN_CNTL, tmp); - - tmp = INPLL(pScrn, AVIVO_IDCT_DYN_CNTL); - tmp |= AVIVO_IDCT_FORCEON; - OUTPLL(pScrn, AVIVO_IDCT_DYN_CNTL, tmp); - } -} - -static void -RADEONSetPCIELanes(ScrnInfoPtr pScrn, int lanes) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - unsigned char *RADEONMMIO = info->MMIO; - uint32_t link_width_cntl, mask, target_reg; - - if (info->IsIGP) - return; - - /* don't change lanes on multi-gpu cards for now */ - if ((info->Chipset == PCI_CHIP_RV770_9441) || - (info->Chipset == PCI_CHIP_RV770_9443) || - (info->Chipset == PCI_CHIP_RV770_944B) || - (info->Chipset == PCI_CHIP_RV670_9506) || - (info->Chipset == PCI_CHIP_RV670_9509) || - (info->Chipset == PCI_CHIP_RV670_950F)) - return; - - RADEONWaitForIdleMMIO(pScrn); - - switch (lanes) { - case 0: - mask = RADEON_PCIE_LC_LINK_WIDTH_X0; - break; - case 1: - mask = RADEON_PCIE_LC_LINK_WIDTH_X1; - break; - case 2: - mask = RADEON_PCIE_LC_LINK_WIDTH_X2; - break; - case 4: - mask = RADEON_PCIE_LC_LINK_WIDTH_X4; - break; - case 8: - mask = RADEON_PCIE_LC_LINK_WIDTH_X8; - break; - case 12: - mask = RADEON_PCIE_LC_LINK_WIDTH_X12; - break; - case 16: - default: - mask = RADEON_PCIE_LC_LINK_WIDTH_X16; - break; - } - - if (info->ChipFamily >= CHIP_FAMILY_R600) { - link_width_cntl = INPCIE_P(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL); - - if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) == - (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT)) - return; - - link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK | - RADEON_PCIE_LC_RECONFIG_NOW | - R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE | - R600_PCIE_LC_SHORT_RECONFIG_EN | - R600_PCIE_LC_RENEGOTIATE_EN); - link_width_cntl |= mask; - -#if 0 - /* some northbridges can renegotiate the link rather than requiring - * a complete re-config. - * e.g., AMD 780/790 northbridges (pci ids: 0x5956, 0x5957, 0x5958, etc.) - */ - if (northbridge can renegotiate) - link_width_cntl |= R600_PCIE_LC_RENEGOTIATE_EN; - else -#endif - link_width_cntl |= R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE; - - OUTPCIE_P(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); - OUTPCIE_P(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl | RADEON_PCIE_LC_RECONFIG_NOW); - - if (info->ChipFamily >= CHIP_FAMILY_RV770) - target_reg = R700_TARGET_AND_CURRENT_PROFILE_INDEX; - else - target_reg = R600_TARGET_AND_CURRENT_PROFILE_INDEX; - - /* wait for lane set to complete */ - link_width_cntl = INREG(target_reg); - while (link_width_cntl == 0xffffffff) - link_width_cntl = INREG(target_reg); - - } else { - link_width_cntl = INPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL); - - if ((link_width_cntl & RADEON_PCIE_LC_LINK_WIDTH_RD_MASK) == - (mask << RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT)) - return; - - link_width_cntl &= ~(RADEON_PCIE_LC_LINK_WIDTH_MASK | - RADEON_PCIE_LC_RECONFIG_NOW | - RADEON_PCIE_LC_RECONFIG_LATER | - RADEON_PCIE_LC_SHORT_RECONFIG_EN); - link_width_cntl |= mask; - OUTPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl); - OUTPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL, link_width_cntl | RADEON_PCIE_LC_RECONFIG_NOW); - - /* wait for lane set to complete */ - link_width_cntl = INPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL); - while (link_width_cntl == 0xffffffff) - link_width_cntl = INPCIE(pScrn, RADEON_PCIE_LC_LINK_WIDTH_CNTL); - - } - -} - -static void -RADEONSetClockGating(ScrnInfoPtr pScrn, Bool enable) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - RADEONWaitForIdleMMIO(pScrn); - - if (info->ChipFamily >= CHIP_FAMILY_R600) - atombios_static_pwrmgt_setup(pScrn, enable); - else { - if (info->IsAtomBios) { - atombios_static_pwrmgt_setup(pScrn, enable); - atombios_clk_gating_setup(pScrn, enable); - } else if (info->IsMobility) - LegacySetClockGating(pScrn, enable); - } - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Clock Gating %sabled\n", - enable ? "En" : "Dis"); -} - -static void RADEONSetStaticPowerMode(ScrnInfoPtr pScrn, RADEONPMType type) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - int i; - - for (i = 0; i < info->pm.num_modes; i++) { - if (info->pm.mode[i].type == type) - break; - } - - if (i == info->pm.num_modes) - return; - - if (i == info->pm.current_mode) - return; - - RADEONWaitForIdleMMIO(pScrn); - - if (info->IsAtomBios) - atombios_set_engine_clock(pScrn, info->pm.mode[i].sclk); - else - RADEONSetEngineClock(pScrn, info->pm.mode[i].sclk); - - if (info->cardType == CARD_PCIE) - RADEONSetPCIELanes(pScrn, info->pm.mode[i].pcie_lanes); - - info->pm.current_mode = i; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Power Mode Switch\n"); -} - - -void RADEONPMInit(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (xf86ReturnOptValBool(info->Options, OPTION_CLOCK_GATING, FALSE)) { - info->pm.clock_gating_enabled = TRUE; - RADEONSetClockGating(pScrn, info->pm.clock_gating_enabled); - } else - info->pm.clock_gating_enabled = FALSE; - - info->pm.mode[0].type = POWER_DEFAULT; - info->pm.mode[0].sclk = (uint32_t)info->sclk * 100; /* 10 khz */ - info->pm.mode[0].mclk = (uint32_t)info->mclk * 100; /* 10 khz */ - info->pm.mode[0].pcie_lanes = 16; /* XXX: read back current lane config */ - info->pm.current_mode = 0; - info->pm.num_modes = 1; - - if (xf86ReturnOptValBool(info->Options, OPTION_DYNAMIC_PM, FALSE)) { - info->pm.dynamic_mode_enabled = TRUE; - info->pm.mode[1].type = POWER_LOW; - info->pm.mode[1].sclk = info->pm.mode[0].sclk / 4; - info->pm.mode[1].mclk = info->pm.mode[0].mclk / 4; - info->pm.mode[1].pcie_lanes = 1; - - info->pm.mode[2].type = POWER_HIGH; - info->pm.mode[2].sclk = info->pm.mode[0].sclk; - info->pm.mode[2].mclk = info->pm.mode[0].mclk; - info->pm.mode[2].pcie_lanes = 16; - - info->pm.num_modes += 2; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Power Management Enabled\n"); - } else { - info->pm.dynamic_mode_enabled = FALSE; - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Dynamic Power Management Disabled\n"); - } - - if (xf86ReturnOptValBool(info->Options, OPTION_FORCE_LOW_POWER, FALSE)) { - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Force Low Power Mode Enabled\n"); - info->pm.force_low_power_enabled = TRUE; - if (info->pm.dynamic_mode_enabled) { - info->pm.mode[2].type = POWER_HIGH; - info->pm.mode[2].sclk = info->pm.mode[0].sclk / 2; - info->pm.mode[2].mclk = info->pm.mode[0].mclk / 2; - info->pm.mode[2].pcie_lanes = 4; - } else { - info->pm.mode[1].type = POWER_HIGH; - info->pm.mode[1].sclk = info->pm.mode[0].sclk / 2; - info->pm.mode[1].mclk = info->pm.mode[0].mclk / 2; - info->pm.mode[1].pcie_lanes = 4; - info->pm.num_modes += 1; - } - RADEONSetStaticPowerMode(pScrn, POWER_HIGH); - } else - info->pm.force_low_power_enabled = FALSE; - - RADEONPMQuirks(pScrn); -} - -void RADEONPMEnterVT(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (info->pm.clock_gating_enabled) - RADEONSetClockGating(pScrn, info->pm.clock_gating_enabled); - RADEONPMQuirks(pScrn); - if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled) - RADEONSetStaticPowerMode(pScrn, POWER_HIGH); -} - -void RADEONPMLeaveVT(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (info->pm.clock_gating_enabled) - RADEONSetClockGating(pScrn, FALSE); - if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled) - RADEONSetStaticPowerMode(pScrn, POWER_DEFAULT); -} - -void RADEONPMFini(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (info->pm.clock_gating_enabled) - RADEONSetClockGating(pScrn, FALSE); - if (info->pm.force_low_power_enabled || info->pm.dynamic_mode_enabled) - RADEONSetStaticPowerMode(pScrn, POWER_DEFAULT); -} - -void RADEONPMBlockHandler(ScrnInfoPtr pScrn) -{ - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); - - if ((!pRADEONEnt->Controller[0]->enabled) && - (!pRADEONEnt->Controller[1]->enabled)) - RADEONSetStaticPowerMode(pScrn, POWER_LOW); - else - RADEONSetStaticPowerMode(pScrn, POWER_HIGH); - -} - diff --git a/driver/xf86-video-ati/src/radeon_probe.c b/driver/xf86-video-ati/src/radeon_probe.c index 26dec285e..25d3bcfd4 100644 --- a/driver/xf86-video-ati/src/radeon_probe.c +++ b/driver/xf86-video-ati/src/radeon_probe.c @@ -31,13 +31,11 @@ #endif #include -#include /* * Authors: * Kevin E. Martin * Rickard E. Faith - * KMS support - Dave Airlie */ #include "radeon_probe.h" @@ -46,44 +44,16 @@ #include "atipcirename.h" #include "xf86.h" -#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 7 #include "xf86Resources.h" #endif -#ifdef XF86DRM_MODE -#include "xf86drmMode.h" -#include "dri.h" -#endif - #include "radeon_chipset_gen.h" #include "radeon_pci_chipset_gen.h" -#include "radeon_chipinfo_gen.h" - #ifdef XSERVER_LIBPCIACCESS #include "radeon_pci_device_match_gen.h" - -static Bool radeon_ums_supported(ScrnInfoPtr pScrn, struct pci_device *pci_dev) -{ - unsigned family = 0, i; - - for (i = 0; i < sizeof(RADEONCards) / sizeof(RADEONCardInfo); i++) { - if (pci_dev->device_id == RADEONCards[i].pci_device_id) { - family = RADEONCards[i].chip_family; - break; - } - } - - if (family >= CHIP_FAMILY_SUMO) { - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, - "GPU only supported with KMS, using vesa instead.\n"); - return FALSE; - } - return TRUE; -} -#else -#define radeon_ums_supported(x, y) TRUE #endif #ifndef XSERVER_LIBPCIACCESS @@ -108,42 +78,11 @@ RADEONIdentify(int flags) RADEONChipsets); } - -#ifdef XF86DRM_MODE -static Bool radeon_kernel_mode_enabled(ScrnInfoPtr pScrn, struct pci_device *pci_dev) -{ - char *busIdString; - int ret; - - if (!xf86LoaderCheckSymbol("DRICreatePCIBusID")) { - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, - "[KMS] No DRICreatePCIBusID symbol, no kernel modesetting.\n"); - return FALSE; - } - - busIdString = DRICreatePCIBusID(pci_dev); - ret = drmCheckModesettingSupported(busIdString); - free(busIdString); - if (ret) { - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, - "[KMS] drm report modesetting isn't supported.\n"); - return FALSE; - } - - xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 0, - "[KMS] Kernel modesetting enabled.\n"); - return TRUE; -} -#else -#define radeon_kernel_mode_enabled(x, y) FALSE -#endif - static Bool -radeon_get_scrninfo(int entity_num, void *pci_dev) +radeon_get_scrninfo(int entity_num) { ScrnInfoPtr pScrn = NULL; EntityInfoPtr pEnt; - int kms = 0; pScrn = xf86ConfigPciEntity(pScrn, 0, entity_num, RADEONPciChipsets, NULL, @@ -152,16 +91,6 @@ radeon_get_scrninfo(int entity_num, void *pci_dev) if (!pScrn) return FALSE; - if (pci_dev) { - if (radeon_kernel_mode_enabled(pScrn, pci_dev)) { - kms = 1; - } else { - if (!radeon_ums_supported(pScrn, pci_dev)) { - return FALSE; - } - } - } - pScrn->driverVersion = RADEON_VERSION_CURRENT; pScrn->driverName = RADEON_DRIVER_NAME; pScrn->name = RADEON_NAME; @@ -170,29 +99,14 @@ radeon_get_scrninfo(int entity_num, void *pci_dev) #else pScrn->Probe = RADEONProbe; #endif - -#ifdef XF86DRM_MODE - if (kms == 1) { - pScrn->PreInit = RADEONPreInit_KMS; - pScrn->ScreenInit = RADEONScreenInit_KMS; - pScrn->SwitchMode = RADEONSwitchMode_KMS; - pScrn->AdjustFrame = RADEONAdjustFrame_KMS; - pScrn->EnterVT = RADEONEnterVT_KMS; - pScrn->LeaveVT = RADEONLeaveVT_KMS; - pScrn->FreeScreen = RADEONFreeScreen_KMS; - pScrn->ValidMode = RADEONValidMode; - } else -#endif - { - pScrn->PreInit = RADEONPreInit; - pScrn->ScreenInit = RADEONScreenInit; - pScrn->SwitchMode = RADEONSwitchMode; - pScrn->AdjustFrame = RADEONAdjustFrame; - pScrn->EnterVT = RADEONEnterVT; - pScrn->LeaveVT = RADEONLeaveVT; - pScrn->FreeScreen = RADEONFreeScreen; - pScrn->ValidMode = RADEONValidMode; - } + pScrn->PreInit = RADEONPreInit; + pScrn->ScreenInit = RADEONScreenInit; + pScrn->SwitchMode = RADEONSwitchMode; + pScrn->AdjustFrame = RADEONAdjustFrame; + pScrn->EnterVT = RADEONEnterVT; + pScrn->LeaveVT = RADEONLeaveVT; + pScrn->FreeScreen = RADEONFreeScreen; + pScrn->ValidMode = RADEONValidMode; pEnt = xf86GetEntityInfo(entity_num); @@ -211,9 +125,13 @@ radeon_get_scrninfo(int entity_num, void *pci_dev) pPriv = xf86GetEntityPrivate(pEnt->index, gRADEONEntityIndex); - xf86SetEntityInstanceForScreen(pScrn, pEnt->index, xf86GetNumEntityInstances(pEnt->index) - 1); - if (!pPriv->ptr) { + int j; + int instance = xf86GetNumEntityInstances(pEnt->index); + + for (j = 0; j < instance; j++) + xf86SetEntityInstanceForScreen(pScrn, pEnt->index, j); + pPriv->ptr = xnfcalloc(sizeof(RADEONEntRec), 1); pRADEONEnt = pPriv->ptr; pRADEONEnt->HasSecondary = FALSE; @@ -223,7 +141,7 @@ radeon_get_scrninfo(int entity_num, void *pci_dev) } } - free(pEnt); + xfree(pEnt); return TRUE; } @@ -262,13 +180,13 @@ RADEONProbe(DriverPtr drv, int flags) foundScreen = TRUE; } else { for (i = 0; i < numUsed; i++) { - if (radeon_get_scrninfo(usedChips[i], NULL)) + if (radeon_get_scrninfo(usedChips[i])) foundScreen = TRUE; } } - free(usedChips); - free(devSections); + xfree(usedChips); + xfree(devSections); return foundScreen; } @@ -283,7 +201,7 @@ radeon_pci_probe( intptr_t match_data ) { - return radeon_get_scrninfo(entity_num, (void *)device); + return radeon_get_scrninfo(entity_num); } #endif /* XSERVER_LIBPCIACCESS */ diff --git a/driver/xf86-video-ati/src/radeon_probe.h b/driver/xf86-video-ati/src/radeon_probe.h index ca73d34e6..0dd34cfcf 100644 --- a/driver/xf86-video-ati/src/radeon_probe.h +++ b/driver/xf86-video-ati/src/radeon_probe.h @@ -52,75 +52,9 @@ extern DriverRec RADEON; -#define RADEON_MAX_CRTC 6 +#define RADEON_MAX_CRTC 2 #define RADEON_MAX_BIOS_CONNECTOR 16 -typedef enum { - CHIP_FAMILY_UNKNOW, - CHIP_FAMILY_LEGACY, - CHIP_FAMILY_RADEON, - CHIP_FAMILY_RV100, - CHIP_FAMILY_RS100, /* U1 (IGP320M) or A3 (IGP320)*/ - CHIP_FAMILY_RV200, - CHIP_FAMILY_RS200, /* U2 (IGP330M/340M/350M) or A4 (IGP330/340/345/350), RS250 (IGP 7000) */ - CHIP_FAMILY_R200, - CHIP_FAMILY_RV250, - CHIP_FAMILY_RS300, /* RS300/RS350 */ - CHIP_FAMILY_RV280, - CHIP_FAMILY_R300, - CHIP_FAMILY_R350, - CHIP_FAMILY_RV350, - CHIP_FAMILY_RV380, /* RV370/RV380/M22/M24 */ - CHIP_FAMILY_R420, /* R420/R423/M18 */ - CHIP_FAMILY_RV410, /* RV410, M26 */ - CHIP_FAMILY_RS400, /* xpress 200, 200m (RS400) Intel */ - CHIP_FAMILY_RS480, /* xpress 200, 200m (RS410/480/482/485) AMD */ - CHIP_FAMILY_RV515, /* rv515 */ - CHIP_FAMILY_R520, /* r520 */ - CHIP_FAMILY_RV530, /* rv530 */ - CHIP_FAMILY_R580, /* r580 */ - CHIP_FAMILY_RV560, /* rv560 */ - CHIP_FAMILY_RV570, /* rv570 */ - CHIP_FAMILY_RS600, - CHIP_FAMILY_RS690, - CHIP_FAMILY_RS740, - CHIP_FAMILY_R600, /* r600 */ - CHIP_FAMILY_RV610, - CHIP_FAMILY_RV630, - CHIP_FAMILY_RV670, - CHIP_FAMILY_RV620, - CHIP_FAMILY_RV635, - CHIP_FAMILY_RS780, - CHIP_FAMILY_RS880, - CHIP_FAMILY_RV770, /* r700 */ - CHIP_FAMILY_RV730, - CHIP_FAMILY_RV710, - CHIP_FAMILY_RV740, - CHIP_FAMILY_CEDAR, /* evergreen */ - CHIP_FAMILY_REDWOOD, - CHIP_FAMILY_JUNIPER, - CHIP_FAMILY_CYPRESS, - CHIP_FAMILY_HEMLOCK, - CHIP_FAMILY_PALM, - CHIP_FAMILY_SUMO, - CHIP_FAMILY_SUMO2, - CHIP_FAMILY_BARTS, - CHIP_FAMILY_TURKS, - CHIP_FAMILY_CAICOS, - CHIP_FAMILY_CAYMAN, - CHIP_FAMILY_LAST -} RADEONChipFamily; - -typedef struct { - uint32_t pci_device_id; - RADEONChipFamily chip_family; - int mobility; - int igp; - int nocrtc2; - int nointtvout; - int singledac; -} RADEONCardInfo; - typedef enum { MT_UNKNOWN = -1, @@ -153,7 +87,6 @@ typedef enum CONNECTOR_0XD, CONNECTOR_DIN, CONNECTOR_DISPLAY_PORT, - CONNECTOR_EDP, CONNECTOR_UNSUPPORTED } RADEONConnectorType; @@ -213,11 +146,6 @@ typedef struct Bool hw_capable; } RADEONI2CBusRec, *RADEONI2CBusPtr; -enum radeon_pll_algo { - RADEON_PLL_OLD, - RADEON_PLL_NEW -}; - typedef struct _RADEONCrtcPrivateRec { void *crtc_rotate_mem; void *cursor_mem; @@ -231,11 +159,6 @@ typedef struct _RADEONCrtcPrivateRec { int can_tile; Bool enabled; Bool initialized; - Bool scaler_enabled; - float vsc; - float hsc; - int pll_id; - enum radeon_pll_algo pll_algo; } RADEONCrtcPrivateRec, *RADEONCrtcPrivatePtr; typedef struct _radeon_encoder { @@ -294,7 +217,6 @@ typedef struct _radeon_lvds { typedef struct _radeon_dvo { /* dvo */ - I2CBusPtr pI2CBus; I2CDevPtr DVOChip; RADEONI2CBusRec dvo_i2c; int dvo_i2c_slave_addr; @@ -314,9 +236,6 @@ typedef struct { Bool load_detection; Bool linkb; uint16_t connector_object; - uint16_t connector_object_id; - uint8_t ucI2cId; - uint8_t hpd_id; } RADEONBIOSConnector; typedef struct _RADEONOutputPrivateRec { @@ -332,7 +251,6 @@ typedef struct _RADEONOutputPrivateRec { Bool linkb; RADEONConnectorType ConnectorType; - uint16_t connector_object_id; RADEONDviType DVIType; RADEONMonitorType MonType; @@ -340,9 +258,6 @@ typedef struct _RADEONOutputPrivateRec { I2CBusPtr pI2CBus; RADEONI2CBusRec ddc_i2c; Bool shared_ddc; - - Bool custom_edid; - xf86MonPtr custom_mon; // router info // HDP info @@ -358,22 +273,9 @@ typedef struct _RADEONOutputPrivateRec { /* dce 3.x dig block */ int igp_lane_info; - int dig_encoder; + int dig_block; int pixel_clock; - - /* DP - aux bus*/ - I2CBusPtr dp_pI2CBus; - uint8_t ucI2cId; - char dp_bus_name[20]; - uint32_t dp_i2c_addr; - Bool dp_i2c_running; - /* DP - general config */ - uint8_t dpcd[8]; - int dp_lane_count; - int dp_clock; - uint8_t hpd_id; - int pll_id; } RADEONOutputPrivateRec, *RADEONOutputPrivatePtr; struct avivo_pll_state { @@ -411,12 +313,9 @@ struct avivo_crtc_state { struct avivo_grph_state { uint32_t enable; uint32_t control; - uint32_t swap_control; uint32_t prim_surf_addr; uint32_t sec_surf_addr; uint32_t pitch; - uint32_t prim_surf_addr_hi; - uint32_t sec_surf_addr_hi; uint32_t x_offset; uint32_t y_offset; uint32_t x_start; @@ -430,37 +329,6 @@ struct avivo_grph_state { uint32_t mode_data_format; }; -struct dce4_main_block_state { - struct avivo_grph_state grph; - uint32_t scl[6]; - uint32_t crtc[15]; - uint32_t fmt[10]; - uint32_t dig[20]; -}; - -struct dce4_state -{ - - uint32_t vga1_cntl; - uint32_t vga2_cntl; - uint32_t vga3_cntl; - uint32_t vga4_cntl; - uint32_t vga5_cntl; - uint32_t vga6_cntl; - uint32_t vga_render_control; - - struct dce4_main_block_state block[6]; - - uint32_t vga_pll[3][3]; - uint32_t pll[2][15]; - uint32_t pll_route[6]; - - uint32_t dac[2][26]; - uint32_t uniphy[6][10]; - - uint32_t dig[20]; -}; - struct avivo_state { uint32_t hdp_fb_location; @@ -470,25 +338,23 @@ struct avivo_state uint32_t vga1_cntl; uint32_t vga2_cntl; - uint32_t vga3_cntl; - uint32_t vga4_cntl; - uint32_t vga5_cntl; - uint32_t vga6_cntl; - uint32_t vga_render_control; uint32_t crtc_master_en; uint32_t crtc_tv_control; uint32_t dc_lb_memory_split; - struct avivo_pll_state pll[2]; + struct avivo_pll_state pll1; + struct avivo_pll_state pll2; struct avivo_pll_state vga25_ppll; struct avivo_pll_state vga28_ppll; struct avivo_pll_state vga41_ppll; - struct avivo_crtc_state crtc[2]; + struct avivo_crtc_state crtc1; + struct avivo_crtc_state crtc2; - struct avivo_grph_state grph[2]; + struct avivo_grph_state grph1; + struct avivo_grph_state grph2; /* DDIA block on RS6xx chips */ uint32_t ddia[37]; @@ -542,7 +408,6 @@ struct avivo_state typedef struct { struct avivo_state avivo; - struct dce4_state dce4; /* Common registers */ uint32_t ovr_clr; @@ -747,12 +612,6 @@ typedef struct RADEONSaveRec SavedReg; /* Original (text) mode */ void *MMIO; /* Map of MMIO region */ - int MMIO_cnt; /* Map of FB region refcount */ - void *FB; /* Map of FB region */ - int FB_cnt; /* Map of FB region refcount */ - int fd; /* for sharing across zaphod heads */ - Bool fd_wakeup_registered; /* fd has already been registered for wakeup handling */ - int dri2_info_cnt; } RADEONEntRec, *RADEONEntPtr; /* radeon_probe.c */ @@ -774,14 +633,4 @@ extern ModeStatus RADEONValidMode(int, DisplayModePtr, Bool, int); extern const OptionInfoRec *RADEONOptionsWeak(void); -#ifdef XF86DRM_MODE -extern Bool RADEONPreInit_KMS(ScrnInfoPtr, int); -extern Bool RADEONScreenInit_KMS(int, ScreenPtr, int, char **); -extern Bool RADEONSwitchMode_KMS(int, DisplayModePtr, int); -extern void RADEONAdjustFrame_KMS(int, int, int, int); -extern Bool RADEONEnterVT_KMS(int, int); -extern void RADEONLeaveVT_KMS(int, int); -extern void RADEONFreeScreen_KMS(int scrnIndex, int flags); -#endif - #endif /* _RADEON_PROBE_H_ */ diff --git a/driver/xf86-video-ati/src/radeon_reg.h b/driver/xf86-video-ati/src/radeon_reg.h index fbf15584e..d74a30a4c 100644 --- a/driver/xf86-video-ati/src/radeon_reg.h +++ b/driver/xf86-video-ati/src/radeon_reg.h @@ -103,6 +103,28 @@ #define RADEON_ATTRDR 0x03c1 /* VGA */ #define RADEON_ATTRDW 0x03c0 /* VGA */ #define RADEON_ATTRX 0x03c0 /* VGA */ +#define RADEON_AUX_SC_CNTL 0x1660 +# define RADEON_AUX1_SC_EN (1 << 0) +# define RADEON_AUX1_SC_MODE_OR (0 << 1) +# define RADEON_AUX1_SC_MODE_NAND (1 << 1) +# define RADEON_AUX2_SC_EN (1 << 2) +# define RADEON_AUX2_SC_MODE_OR (0 << 3) +# define RADEON_AUX2_SC_MODE_NAND (1 << 3) +# define RADEON_AUX3_SC_EN (1 << 4) +# define RADEON_AUX3_SC_MODE_OR (0 << 5) +# define RADEON_AUX3_SC_MODE_NAND (1 << 5) +#define RADEON_AUX1_SC_BOTTOM 0x1670 +#define RADEON_AUX1_SC_LEFT 0x1664 +#define RADEON_AUX1_SC_RIGHT 0x1668 +#define RADEON_AUX1_SC_TOP 0x166c +#define RADEON_AUX2_SC_BOTTOM 0x1680 +#define RADEON_AUX2_SC_LEFT 0x1674 +#define RADEON_AUX2_SC_RIGHT 0x1678 +#define RADEON_AUX2_SC_TOP 0x167c +#define RADEON_AUX3_SC_BOTTOM 0x1690 +#define RADEON_AUX3_SC_LEFT 0x1684 +#define RADEON_AUX3_SC_RIGHT 0x1688 +#define RADEON_AUX3_SC_TOP 0x168c #define RADEON_AUX_WINDOW_HORZ_CNTL 0x02d8 #define RADEON_AUX_WINDOW_VERT_CNTL 0x02dc @@ -254,59 +276,19 @@ #define RADEON_PCIE_INDEX 0x0030 #define RADEON_PCIE_DATA 0x0034 -#define R600_PCIE_PORT_INDEX 0x0038 -#define R600_PCIE_PORT_DATA 0x003c -/* PCIE_LC_LINK_WIDTH_CNTL is PCIE on r1xx-r5xx, PCIE_PORT on r6xx-r7xx */ -#define RADEON_PCIE_LC_LINK_WIDTH_CNTL 0xa2 /* PCIE */ -# define RADEON_PCIE_LC_LINK_WIDTH_SHIFT 0 -# define RADEON_PCIE_LC_LINK_WIDTH_MASK 0x7 -# define RADEON_PCIE_LC_LINK_WIDTH_X0 0 -# define RADEON_PCIE_LC_LINK_WIDTH_X1 1 -# define RADEON_PCIE_LC_LINK_WIDTH_X2 2 -# define RADEON_PCIE_LC_LINK_WIDTH_X4 3 -# define RADEON_PCIE_LC_LINK_WIDTH_X8 4 -# define RADEON_PCIE_LC_LINK_WIDTH_X12 5 -# define RADEON_PCIE_LC_LINK_WIDTH_X16 6 -# define RADEON_PCIE_LC_LINK_WIDTH_RD_SHIFT 4 -# define RADEON_PCIE_LC_LINK_WIDTH_RD_MASK 0x70 -# define R600_PCIE_LC_RECONFIG_ARC_MISSING_ESCAPE (1 << 7) -# define RADEON_PCIE_LC_RECONFIG_NOW (1 << 8) -# define RADEON_PCIE_LC_RECONFIG_LATER (1 << 9) -# define RADEON_PCIE_LC_SHORT_RECONFIG_EN (1 << 10) -# define R600_PCIE_LC_RENEGOTIATE_EN (1 << 10) -# define R600_PCIE_LC_SHORT_RECONFIG_EN (1 << 11) -#define R600_TARGET_AND_CURRENT_PROFILE_INDEX 0x70c -#define R700_TARGET_AND_CURRENT_PROFILE_INDEX 0x66c #define RADEON_CACHE_CNTL 0x1724 #define RADEON_CACHE_LINE 0x0f0c /* PCI */ #define RADEON_CAPABILITIES_ID 0x0f50 /* PCI */ #define RADEON_CAPABILITIES_PTR 0x0f34 /* PCI */ #define RADEON_CLK_PIN_CNTL 0x0001 /* PLL */ -# define RADEON_DONT_USE_XTALIN (1 << 4) # define RADEON_SCLK_DYN_START_CNTL (1 << 15) #define RADEON_CLOCK_CNTL_DATA 0x000c #define RADEON_CLOCK_CNTL_INDEX 0x0008 # define RADEON_PLL_WR_EN (1 << 7) # define RADEON_PLL_DIV_SEL (3 << 8) # define RADEON_PLL2_DIV_SEL_MASK ~(3 << 8) -#define RADEON_M_SPLL_REF_FB_DIV 0x000a /* PLL */ -# define RADEON_M_SPLL_REF_DIV_MASK 0xff -# define RADEON_M_SPLL_REF_DIV_SHIFT 0 -# define RADEON_MPLL_FB_DIV_MASK 0xff -# define RADEON_MPLL_FB_DIV_SHIFT 8 -# define RADEON_SPLL_FB_DIV_MASK 0xff -# define RADEON_SPLL_FB_DIV_SHIFT 16 -#define RADEON_SPLL_CNTL 0x000c /* PLL */ -# define RADEON_SPLL_SLEEP (1 << 0) -# define RADEON_SPLL_RESET (1 << 1) -# define RADEON_SPLL_PCP_MASK 0x7 -# define RADEON_SPLL_PCP_SHIFT 8 -# define RADEON_SPLL_PVG_MASK 0x7 -# define RADEON_SPLL_PVG_SHIFT 11 -# define RADEON_SPLL_PDC_MASK 0x3 -# define RADEON_SPLL_PDC_SHIFT 14 -#define RADEON_CLK_PWRMGT_CNTL 0x0014 /* PLL */ +#define RADEON_CLK_PWRMGT_CNTL 0x0014 # define RADEON_ENGIN_DYNCLK_MODE (1 << 12) # define RADEON_ACTIVE_HILO_LAT_MASK (3 << 13) # define RADEON_ACTIVE_HILO_LAT_SHIFT 13 @@ -318,7 +300,7 @@ # define RADEON_DYN_STOP_MODE_MASK (7 << 21) # define RADEON_TVPLL_PWRMGT_OFF (1 << 30) # define RADEON_TVCLK_TURNOFF (1 << 31) -#define RADEON_PLL_PWRMGT_CNTL 0x0015 /* PLL */ +#define RADEON_PLL_PWRMGT_CNTL 0x0015 # define RADEON_TCL_BYPASS_DISABLE (1 << 20) #define RADEON_CLR_CMP_CLR_3D 0x1a24 #define RADEON_CLR_CMP_CLR_DST 0x15c8 @@ -423,9 +405,8 @@ # define RADEON_CRTC_V_CUTOFF_ACTIVE_EN (1<<5) #define RADEON_CRTC_GUI_TRIG_VLINE 0x0218 # define RADEON_CRTC_GUI_TRIG_VLINE_START_SHIFT 0 -# define RADEON_CRTC_GUI_TRIG_VLINE_INV (1 << 15) # define RADEON_CRTC_GUI_TRIG_VLINE_END_SHIFT 16 -# define RADEON_CRTC_GUI_TRIG_VLINE_STALL (1 << 30) +# define RADEON_CRTC_GUI_TRIG_VLINE_INV (1 << 15) #define RADEON_CRTC_H_SYNC_STRT_WID 0x0204 # define RADEON_CRTC_H_SYNC_STRT_PIX (0x07 << 0) # define RADEON_CRTC_H_SYNC_STRT_CHAR (0x3ff << 3) @@ -882,7 +863,7 @@ # define RADEON_FP2_DVO_EN (1 << 25) # define RADEON_FP2_DVO_RATE_SEL_SDR (1 << 26) # define R200_FP2_DVO_RATE_SEL_SDR (1 << 27) -# define R200_FP2_DVO_CLOCK_MODE_SINGLE (1 << 28) +# define R300_FP2_DVO_CLOCK_MODE_SINGLE (1 << 28) # define R300_FP2_DVO_DUAL_CHANNEL_EN (1 << 29) #define RADEON_FP_H_SYNC_STRT_WID 0x02c4 #define RADEON_FP_H2_SYNC_STRT_WID 0x03c4 @@ -955,11 +936,11 @@ #define RADEON_GENMO_WT 0x03c2 /* VGA */ #define RADEON_GENS0 0x03c2 /* VGA */ #define RADEON_GENS1 0x03da /* VGA, 0x03ba */ -#define RADEON_GPIO_MONID 0x0068 /* DDC interface via I2C */ /* DDC3 */ +#define RADEON_GPIO_MONID 0x0068 /* DDC interface via I2C */ #define RADEON_GPIO_MONIDB 0x006c #define RADEON_GPIO_CRT2_DDC 0x006c -#define RADEON_GPIO_DVI_DDC 0x0064 /* DDC2 */ -#define RADEON_GPIO_VGA_DDC 0x0060 /* DDC1 */ +#define RADEON_GPIO_DVI_DDC 0x0064 +#define RADEON_GPIO_VGA_DDC 0x0060 # define RADEON_GPIO_A_0 (1 << 0) # define RADEON_GPIO_A_1 (1 << 1) # define RADEON_GPIO_Y_0 (1 << 8) @@ -998,28 +979,24 @@ /* Multimedia I2C bus */ #define RADEON_I2C_CNTL_0 0x0090 -#define RADEON_I2C_DONE (1 << 0) -#define RADEON_I2C_NACK (1 << 1) -#define RADEON_I2C_HALT (1 << 2) -#define RADEON_I2C_SOFT_RST (1 << 5) -#define RADEON_I2C_DRIVE_EN (1 << 6) -#define RADEON_I2C_DRIVE_SEL (1 << 7) -#define RADEON_I2C_START (1 << 8) -#define RADEON_I2C_STOP (1 << 9) -#define RADEON_I2C_RECEIVE (1 << 10) -#define RADEON_I2C_ABORT (1 << 11) -#define RADEON_I2C_GO (1 << 12) +#define RADEON_I2C_DONE (1<<0) +#define RADEON_I2C_NACK (1<<1) +#define RADEON_I2C_HALT (1<<2) +#define RADEON_I2C_SOFT_RST (1<<5) +#define RADEON_I2C_DRIVE_EN (1<<6) +#define RADEON_I2C_DRIVE_SEL (1<<7) +#define RADEON_I2C_START (1<<8) +#define RADEON_I2C_STOP (1<<9) +#define RADEON_I2C_RECEIVE (1<<10) +#define RADEON_I2C_ABORT (1<<11) +#define RADEON_I2C_GO (1<<12) #define RADEON_I2C_CNTL_1 0x0094 -#define RADEON_I2C_SEL (1 << 16) -#define RADEON_I2C_EN (1 << 17) +#define RADEON_I2C_SEL (1<<16) +#define RADEON_I2C_EN (1<<17) #define RADEON_I2C_DATA 0x0098 #define RADEON_DVI_I2C_CNTL_0 0x02e0 -# define R200_DVI_I2C_PIN_SEL(x) ((x) << 3) -# define R200_SEL_DDC1 0 /* 0x60 - VGA_DDC */ -# define R200_SEL_DDC2 1 /* 0x64 - DVI_DDC */ -# define R200_SEL_DDC3 2 /* 0x68 - MONID_DDC */ -#define RADEON_DVI_I2C_CNTL_1 0x02e4 +#define RADEON_DVI_I2C_CNTL_1 0x02e4 /* ? */ #define RADEON_DVI_I2C_DATA 0x02e8 #define RADEON_INTERRUPT_LINE 0x0f3c /* PCI */ @@ -3527,24 +3504,12 @@ # define R520_MEM_NUM_CHANNELS_SHIFT 24 # define R520_MC_CHANNEL_SIZE (1 << 23) -#define RS780_MC_INDEX 0x28f8 -# define RS780_MC_INDEX_MASK 0x1ff -# define RS780_MC_INDEX_WR_EN (1 << 9) -#define RS780_MC_DATA 0x28fc - #define R600_RAMCFG 0x2408 # define R600_CHANSIZE (1 << 7) # define R600_CHANSIZE_OVERRIDE (1 << 10) #define R600_SRBM_STATUS 0x0e50 -#define AVIVO_CP_DYN_CNTL 0x000f /* PLL */ -# define AVIVO_CP_FORCEON (1 << 0) -#define AVIVO_E2_DYN_CNTL 0x0011 /* PLL */ -# define AVIVO_E2_FORCEON (1 << 0) -#define AVIVO_IDCT_DYN_CNTL 0x0013 /* PLL */ -# define AVIVO_IDCT_FORCEON (1 << 0) - #define AVIVO_HDP_FB_LOCATION 0x134 #define AVIVO_VGA_RENDER_CONTROL 0x0300 @@ -3669,16 +3634,8 @@ # define R600_D1GRPH_SWAP_ENDIAN_32BIT (2 << 0) # define R600_D1GRPH_SWAP_ENDIAN_64BIT (3 << 0) -/* the *_HIGH surface regs are backwards; the D1 regs are in the D2 - * block and vice versa. This applies to GRPH, CUR, etc. - */ - #define AVIVO_D1GRPH_PRIMARY_SURFACE_ADDRESS 0x6110 -#define R700_D1GRPH_PRIMARY_SURFACE_ADDRESS_HIGH 0x6914 -#define R700_D2GRPH_PRIMARY_SURFACE_ADDRESS_HIGH 0x6114 #define AVIVO_D1GRPH_SECONDARY_SURFACE_ADDRESS 0x6118 -#define R700_D1GRPH_SECONDARY_SURFACE_ADDRESS_HIGH 0x691c -#define R700_D2GRPH_SECONDARY_SURFACE_ADDRESS_HIGH 0x611c #define AVIVO_D1GRPH_PITCH 0x6120 #define AVIVO_D1GRPH_SURFACE_OFFSET_X 0x6124 #define AVIVO_D1GRPH_SURFACE_OFFSET_Y 0x6128 @@ -3698,8 +3655,6 @@ # define AVIVO_D1CURSOR_MODE_MASK (0x3<<8) # define AVIVO_D1CURSOR_MODE_24BPP (0x2) #define AVIVO_D1CUR_SURFACE_ADDRESS 0x6408 -#define R700_D1CUR_SURFACE_ADDRESS_HIGH 0x6c0c -#define R700_D2CUR_SURFACE_ADDRESS_HIGH 0x640c #define AVIVO_D1CUR_SIZE 0x6410 #define AVIVO_D1CUR_POSITION 0x6414 #define AVIVO_D1CUR_HOT_SPOT 0x6418 @@ -3734,19 +3689,6 @@ # define AVIVO_DC_LB_MEMORY_SPLIT_SHIFT_MODE (1 << 2) # define AVIVO_DC_LB_DISP1_END_ADR_SHIFT 4 # define AVIVO_DC_LB_DISP1_END_ADR_MASK 0x7ff -#define AVIVO_D1MODE_PRIORITY_A_CNT 0x6548 -# define AVIVO_DxMODE_PRIORITY_MARK_MASK 0x7fff -# define AVIVO_DxMODE_PRIORITY_OFF (1 << 16) -# define AVIVO_DxMODE_PRIORITY_ALWAYS_ON (1 << 20) -# define AVIVO_DxMODE_PRIORITY_FORCE_MASK (1 << 24) -#define AVIVO_D1MODE_PRIORITY_B_CNT 0x654c -#define AVIVO_D2MODE_PRIORITY_A_CNT 0x6d48 -#define AVIVO_D2MODE_PRIORITY_B_CNT 0x6d4c -#define AVIVO_LB_MAX_REQ_OUTSTANDING 0x6d58 -# define AVIVO_LB_D1_MAX_REQ_OUTSTANDING_MASK 0xf -# define AVIVO_LB_D1_MAX_REQ_OUTSTANDING_SHIFT 0 -# define AVIVO_LB_D2_MAX_REQ_OUTSTANDING_MASK 0xf -# define AVIVO_LB_D2_MAX_REQ_OUTSTANDING_SHIFT 16 #define AVIVO_D1MODE_DATA_FORMAT 0x6528 # define AVIVO_D1MODE_INTERLEAVE_EN (1 << 0) @@ -3808,8 +3750,6 @@ #define AVIVO_D2CUR_SIZE 0x6c10 #define AVIVO_D2CUR_POSITION 0x6c14 -#define RS690_DCP_CONTROL 0x6c9c - #define AVIVO_D2MODE_DATA_FORMAT 0x6d28 #define AVIVO_D2MODE_DESKTOP_HEIGHT 0x6d2c #define AVIVO_D2MODE_VIEWPORT_START 0x6d80 @@ -4020,9 +3960,6 @@ #define AVIVO_GPIO_2 0x7e50 #define AVIVO_GPIO_3 0x7e60 -#define AVIVO_DC_GPIO_HPD_MASK 0x7e90 -#define AVIVO_DC_GPIO_HPD_A 0x7e94 -#define AVIVO_DC_GPIO_HPD_EN 0x7e98 #define AVIVO_DC_GPIO_HPD_Y 0x7e9c #define AVIVO_I2C_STATUS 0x7d30 @@ -4101,11 +4038,6 @@ # define R600_SCK_PRESCALE_CRYSTAL_CLK_SHIFT 28 # define R600_SCK_PRESCALE_CRYSTAL_CLK_MASK (0xf << 28) -#define R600_CG_SPLL_FUNC_CNTL 0x600 -# define R600_SPLL_BYPASS_EN (1 << 3) -#define R600_CG_SPLL_STATUS 0x60c -# define R600_SPLL_CHG_STATUS (1 << 1) - #define R600_BIOS_0_SCRATCH 0x1724 #define R600_BIOS_1_SCRATCH 0x1728 #define R600_BIOS_2_SCRATCH 0x172c @@ -4115,161 +4047,6 @@ #define R600_BIOS_6_SCRATCH 0x173c #define R600_BIOS_7_SCRATCH 0x1740 -/* evergreen */ -#define EVERGREEN_VGA_MEMORY_BASE_ADDRESS 0x310 -#define EVERGREEN_VGA_MEMORY_BASE_ADDRESS_HIGH 0x324 -#define EVERGREEN_D3VGA_CONTROL 0x3e0 -#define EVERGREEN_D4VGA_CONTROL 0x3e4 -#define EVERGREEN_D5VGA_CONTROL 0x3e8 -#define EVERGREEN_D6VGA_CONTROL 0x3ec - -#define EVERGREEN_P1PLL_SS_CNTL 0x414 -#define EVERGREEN_P2PLL_SS_CNTL 0x454 -# define EVERGREEN_PxPLL_SS_EN (1 << 12) -/* GRPH blocks at 0x6800, 0x7400, 0x10000, 0x10c00, 0x11800, 0x12400 */ -#define EVERGREEN_GRPH_ENABLE 0x6800 -#define EVERGREEN_GRPH_CONTROL 0x6804 -# define EVERGREEN_GRPH_DEPTH(x) (((x) & 0x3) << 0) -# define EVERGREEN_GRPH_DEPTH_8BPP 0 -# define EVERGREEN_GRPH_DEPTH_16BPP 1 -# define EVERGREEN_GRPH_DEPTH_32BPP 2 -# define EVERGREEN_GRPH_FORMAT(x) (((x) & 0x7) << 8) -/* 8 BPP */ -# define EVERGREEN_GRPH_FORMAT_INDEXED 0 -/* 16 BPP */ -# define EVERGREEN_GRPH_FORMAT_ARGB1555 0 -# define EVERGREEN_GRPH_FORMAT_ARGB565 1 -# define EVERGREEN_GRPH_FORMAT_ARGB4444 2 -# define EVERGREEN_GRPH_FORMAT_AI88 3 -# define EVERGREEN_GRPH_FORMAT_MONO16 4 -# define EVERGREEN_GRPH_FORMAT_BGRA5551 5 -/* 32 BPP */ -# define EVERGREEN_GRPH_FORMAT_ARGB8888 0 -# define EVERGREEN_GRPH_FORMAT_ARGB2101010 1 -# define EVERGREEN_GRPH_FORMAT_32BPP_DIG 2 -# define EVERGREEN_GRPH_FORMAT_8B_ARGB2101010 3 -# define EVERGREEN_GRPH_FORMAT_BGRA1010102 4 -# define EVERGREEN_GRPH_FORMAT_8B_BGRA1010102 5 -# define EVERGREEN_GRPH_FORMAT_RGB111110 6 -# define EVERGREEN_GRPH_FORMAT_BGR101111 7 -#define EVERGREEN_GRPH_SWAP_CONTROL 0x680c -# define EVERGREEN_GRPH_ENDIAN_SWAP(x) (((x) & 0x3) << 0) -# define EVERGREEN_GRPH_ENDIAN_NONE 0 -# define EVERGREEN_GRPH_ENDIAN_8IN16 1 -# define EVERGREEN_GRPH_ENDIAN_8IN32 2 -# define EVERGREEN_GRPH_ENDIAN_8IN64 3 -# define EVERGREEN_GRPH_RED_CROSSBAR(x) (((x) & 0x3) << 4) -# define EVERGREEN_GRPH_RED_SEL_R 0 -# define EVERGREEN_GRPH_RED_SEL_G 1 -# define EVERGREEN_GRPH_RED_SEL_B 2 -# define EVERGREEN_GRPH_RED_SEL_A 3 -# define EVERGREEN_GRPH_GREEN_CROSSBAR(x) (((x) & 0x3) << 6) -# define EVERGREEN_GRPH_GREEN_SEL_G 0 -# define EVERGREEN_GRPH_GREEN_SEL_B 1 -# define EVERGREEN_GRPH_GREEN_SEL_A 2 -# define EVERGREEN_GRPH_GREEN_SEL_R 3 -# define EVERGREEN_GRPH_BLUE_CROSSBAR(x) (((x) & 0x3) << 8) -# define EVERGREEN_GRPH_BLUE_SEL_B 0 -# define EVERGREEN_GRPH_BLUE_SEL_A 1 -# define EVERGREEN_GRPH_BLUE_SEL_R 2 -# define EVERGREEN_GRPH_BLUE_SEL_G 3 -# define EVERGREEN_GRPH_ALPHA_CROSSBAR(x) (((x) & 0x3) << 10) -# define EVERGREEN_GRPH_ALPHA_SEL_A 0 -# define EVERGREEN_GRPH_ALPHA_SEL_R 1 -# define EVERGREEN_GRPH_ALPHA_SEL_G 2 -# define EVERGREEN_GRPH_ALPHA_SEL_B 3 -#define EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS 0x6810 -#define EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS 0x6814 -# define EVERGREEN_GRPH_DFQ_ENABLE (1 << 0) -# define EVERGREEN_GRPH_SURFACE_ADDRESS_MASK 0xffffff00 -#define EVERGREEN_GRPH_PITCH 0x6818 -#define EVERGREEN_GRPH_PRIMARY_SURFACE_ADDRESS_HIGH 0x681c -#define EVERGREEN_GRPH_SECONDARY_SURFACE_ADDRESS_HIGH 0x6820 -#define EVERGREEN_GRPH_SURFACE_OFFSET_X 0x6824 -#define EVERGREEN_GRPH_SURFACE_OFFSET_Y 0x6828 -#define EVERGREEN_GRPH_X_START 0x682c -#define EVERGREEN_GRPH_Y_START 0x6830 -#define EVERGREEN_GRPH_X_END 0x6834 -#define EVERGREEN_GRPH_Y_END 0x6838 - -/* CUR blocks at 0x6998, 0x7598, 0x10198, 0x10d98, 0x11998, 0x12598 */ -#define EVERGREEN_CUR_CONTROL 0x6998 -# define EVERGREEN_CURSOR_EN (1 << 0) -# define EVERGREEN_CURSOR_MODE(x) (((x) & 0x3) << 8) -# define EVERGREEN_CURSOR_MONO 0 -# define EVERGREEN_CURSOR_24_1 1 -# define EVERGREEN_CURSOR_24_8_PRE_MULT 2 -# define EVERGREEN_CURSOR_24_8_UNPRE_MULT 3 -# define EVERGREEN_CURSOR_2X_MAGNIFY (1 << 16) -# define EVERGREEN_CURSOR_FORCE_MC_ON (1 << 20) -# define EVERGREEN_CURSOR_URGENT_CONTROL(x) (((x) & 0x7) << 24) -# define EVERGREEN_CURSOR_URGENT_ALWAYS 0 -# define EVERGREEN_CURSOR_URGENT_1_8 1 -# define EVERGREEN_CURSOR_URGENT_1_4 2 -# define EVERGREEN_CURSOR_URGENT_3_8 3 -# define EVERGREEN_CURSOR_URGENT_1_2 4 -#define EVERGREEN_CUR_SURFACE_ADDRESS 0x699c -# define EVERGREEN_CUR_SURFACE_ADDRESS_MASK 0xfffff000 -#define EVERGREEN_CUR_SIZE 0x69a0 -#define EVERGREEN_CUR_SURFACE_ADDRESS_HIGH 0x69a4 -#define EVERGREEN_CUR_POSITION 0x69a8 -#define EVERGREEN_CUR_HOT_SPOT 0x69ac -#define EVERGREEN_CUR_COLOR1 0x69b0 -#define EVERGREEN_CUR_COLOR2 0x69b4 -#define EVERGREEN_CUR_UPDATE 0x69b8 -# define EVERGREEN_CURSOR_UPDATE_PENDING (1 << 0) -# define EVERGREEN_CURSOR_UPDATE_TAKEN (1 << 1) -# define EVERGREEN_CURSOR_UPDATE_LOCK (1 << 16) -# define EVERGREEN_CURSOR_DISABLE_MULTIPLE_UPDATE (1 << 24) - -/* LUT blocks at 0x69e0, 0x75e0, 0x101e0, 0x10de0, 0x119e0, 0x125e0 */ -#define EVERGREEN_DC_LUT_RW_MODE 0x69e0 -#define EVERGREEN_DC_LUT_RW_INDEX 0x69e4 -#define EVERGREEN_DC_LUT_SEQ_COLOR 0x69e8 -#define EVERGREEN_DC_LUT_PWL_DATA 0x69ec -#define EVERGREEN_DC_LUT_30_COLOR 0x69f0 -#define EVERGREEN_DC_LUT_VGA_ACCESS_ENABLE 0x69f4 -#define EVERGREEN_DC_LUT_WRITE_EN_MASK 0x69f8 -#define EVERGREEN_DC_LUT_AUTOFILL 0x69fc -#define EVERGREEN_DC_LUT_CONTROL 0x6a00 -#define EVERGREEN_DC_LUT_BLACK_OFFSET_BLUE 0x6a04 -#define EVERGREEN_DC_LUT_BLACK_OFFSET_GREEN 0x6a08 -#define EVERGREEN_DC_LUT_BLACK_OFFSET_RED 0x6a0c -#define EVERGREEN_DC_LUT_WHITE_OFFSET_BLUE 0x6a10 -#define EVERGREEN_DC_LUT_WHITE_OFFSET_GREEN 0x6a14 -#define EVERGREEN_DC_LUT_WHITE_OFFSET_RED 0x6a18 - -#define EVERGREEN_DATA_FORMAT 0x6b00 -# define EVERGREEN_INTERLEAVE_EN (1 << 0) -#define EVERGREEN_DESKTOP_HEIGHT 0x6b04 -#define EVERGREEN_VLINE_START_END 0x6b08 -# define EVERGREEN_VLINE_START_SHIFT 0 -# define EVERGREEN_VLINE_END_SHIFT 16 -# define EVERGREEN_VLINE_INV (1 << 31) -#define EVERGREEN_VLINE_STATUS 0x6bb8 -# define EVERGREEN_VLINE_STAT (1 << 12) - -#define EVERGREEN_VIEWPORT_START 0x6d70 -#define EVERGREEN_VIEWPORT_SIZE 0x6d74 - -/* display controller offsets used for crtc/cur/lut/grph/viewport/etc. */ -#define EVERGREEN_CRTC0_REGISTER_OFFSET (0x6df0 - 0x6df0) -#define EVERGREEN_CRTC1_REGISTER_OFFSET (0x79f0 - 0x6df0) -#define EVERGREEN_CRTC2_REGISTER_OFFSET (0x105f0 - 0x6df0) -#define EVERGREEN_CRTC3_REGISTER_OFFSET (0x111f0 - 0x6df0) -#define EVERGREEN_CRTC4_REGISTER_OFFSET (0x11df0 - 0x6df0) -#define EVERGREEN_CRTC5_REGISTER_OFFSET (0x129f0 - 0x6df0) - -/* CRTC blocks at 0x6df0, 0x79f0, 0x105f0, 0x111f0, 0x11df0, 0x129f0 */ -#define EVERGREEN_CRTC_CONTROL 0x6e70 -# define EVERGREEN_CRTC_MASTER_EN (1 << 0) -#define EVERGREEN_CRTC_UPDATE_LOCK 0x6ed4 - -#define EVERGREEN_DC_GPIO_HPD_MASK 0x64b0 -#define EVERGREEN_DC_GPIO_HPD_A 0x64b4 -#define EVERGREEN_DC_GPIO_HPD_EN 0x64b8 -#define EVERGREEN_DC_GPIO_HPD_Y 0x64bc - #define R300_GB_TILE_CONFIG 0x4018 # define R300_ENABLE_TILING (1 << 0) # define R300_PIPE_COUNT_RV350 (0 << 1) @@ -4446,12 +4223,6 @@ #define R300_VAP_PVS_CODE_CNTL_1 0x22D8 # define R300_PVS_LAST_VTX_SRC_INST_SHIFT 0 #define R300_VAP_PVS_VECTOR_INDX_REG 0x2200 -# define R300_PVS_CODE_START 0 -# define R300_PVS_CONST_START 512 -# define R500_PVS_CONST_START 1024 -# define R300_PVS_VECTOR_INST_INDEX(x) ((x) + R300_PVS_CODE_START) -# define R300_PVS_VECTOR_CONST_INDEX(x) ((x) + R300_PVS_CONST_START) -# define R500_PVS_VECTOR_CONST_INDEX(x) ((x) + R500_PVS_CONST_START) #define R300_VAP_PVS_VECTOR_DATA_REG 0x2204 /* PVS instructions */ /* Opcode and dst instruction */ @@ -4570,10 +4341,6 @@ #define R300_PVS_SRC_ADDR_SEL(x) ((x) << 29) #define R300_PVS_SRC_ADDR_MODE_1 (1 << 31) -#define R300_VAP_PVS_CONST_CNTL 0x22d4 -# define R300_PVS_CONST_BASE_OFFSET(x) ((x) << 0) -# define R300_PVS_MAX_CONST_ADDR(x) ((x) << 16) - #define R300_VAP_PVS_FLOW_CNTL_OPC 0x22dc #define R300_VAP_OUT_VTX_FMT_0 0x2090 # define R300_VTX_POS_PRESENT (1 << 0) @@ -4688,7 +4455,6 @@ #define R300_TX_FORMAT0_2 0x4488 # define R300_TXWIDTH_SHIFT 0 # define R300_TXHEIGHT_SHIFT 11 -# define R300_TXDEPTH_SHIFT 22 # define R300_NUM_LEVELS_SHIFT 26 # define R300_NUM_LEVELS_MASK 0x # define R300_TXPROJECTED (1 << 30) @@ -5614,6 +5380,9 @@ # define R500_W_SRC_US (0 << 2) # define R500_W_SRC_RAS (1 << 2) +#define R500_GA_US_VECTOR_INDEX 0x4250 +#define R500_GA_US_VECTOR_DATA 0x4254 + #define R500_RS_INST_0 0x4320 #define R500_RS_INST_1 0x4324 # define R500_RS_INST_TEX_ID_SHIFT 0 diff --git a/driver/xf86-video-ati/src/radeon_render.c b/driver/xf86-video-ati/src/radeon_render.c index 3b77345ad..6668fe046 100644 --- a/driver/xf86-video-ati/src/radeon_render.c +++ b/driver/xf86-video-ati/src/radeon_render.c @@ -406,11 +406,11 @@ static Bool FUNC_NAME(R100SetupTexture)( txformat = RadeonGetTextureFormat(format); tex_bytepp = PICT_FORMAT_BPP(format) >> 3; - dst_pitch = RADEON_ALIGN(width * tex_bytepp, 64); + dst_pitch = (width * tex_bytepp + 63) & ~63; size = dst_pitch * height; if ((flags & XAA_RENDER_REPEAT) && (height != 1) && - (RADEON_ALIGN(width * tex_bytepp, 32) != dst_pitch)) + (((width * tex_bytepp + 31) & ~31) != dst_pitch)) return FALSE; #ifndef ACCEL_CP @@ -743,11 +743,11 @@ static Bool FUNC_NAME(R200SetupTexture)( txformat = RadeonGetTextureFormat(format); tex_bytepp = PICT_FORMAT_BPP(format) >> 3; - dst_pitch = RADEON_ALIGN(width * tex_bytepp, 64); + dst_pitch = (width * tex_bytepp + 63) & ~63; size = dst_pitch * height; if ((flags & XAA_RENDER_REPEAT) && (height != 1) && - (RADEON_ALIGN(width * tex_bytepp, 32) != dst_pitch)) + (((width * tex_bytepp + 31) & ~31) != dst_pitch)) return FALSE; #ifndef ACCEL_CP diff --git a/driver/xf86-video-ati/src/radeon_textured_video.c b/driver/xf86-video-ati/src/radeon_textured_video.c index e49575da9..79671c074 100644 --- a/driver/xf86-video-ati/src/radeon_textured_video.c +++ b/driver/xf86-video-ati/src/radeon_textured_video.c @@ -36,6 +36,7 @@ #include "radeon.h" #include "radeon_reg.h" +#include "r600_reg.h" #include "radeon_macros.h" #include "radeon_probe.h" #include "radeon_video.h" @@ -46,15 +47,10 @@ extern void R600DisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); -#ifdef XF86DRM_MODE -extern void -EVERGREENDisplayTexturedVideo(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); -#endif - extern Bool R600CopyToVRAM(ScrnInfoPtr pScrn, char *src, int src_pitch, - uint32_t dst_pitch, uint32_t dst_mc_addr, uint32_t dst_width, uint32_t dst_height, int bpp, + uint32_t dst_pitch, uint32_t dst_mc_addr, uint32_t dst_height, int bpp, int x, int y, int w, int h); #define IMAGE_MAX_WIDTH 2048 @@ -132,21 +128,11 @@ static __inline__ uint32_t float4touint(float fr, float fg, float fb, float fa) return (ua << 24) | (ur << 16) | (ug << 8) | ub; } -/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces - note the difference to the parameters used in overlay are due - to 10bit vs. float calcs */ -static REF_TRANSFORM trans[2] = -{ - {1.1643, 0.0, 1.5960, -0.3918, -0.8129, 2.0172, 0.0}, /* BT.601 */ - {1.1643, 0.0, 1.7927, -0.2132, -0.5329, 2.1124, 0.0} /* BT.709 */ -}; - #define ACCEL_MMIO #define ACCEL_PREAMBLE() unsigned char *RADEONMMIO = info->MMIO #define BEGIN_ACCEL(n) RADEONWaitForFifo(pScrn, (n)) #define OUT_ACCEL_REG(reg, val) OUTREG(reg, val) #define OUT_ACCEL_REG_F(reg, val) OUTREG(reg, F_TO_DW(val)) -#define OUT_RELOC(x, read, write) do {} while(0) #define FINISH_ACCEL() #include "radeon_textured_videofuncs.c" @@ -156,7 +142,6 @@ static REF_TRANSFORM trans[2] = #undef BEGIN_ACCEL #undef OUT_ACCEL_REG #undef OUT_ACCEL_REG_F -#undef OUT_RELOC #undef FINISH_ACCEL #ifdef XF86DRI @@ -170,7 +155,6 @@ static REF_TRANSFORM trans[2] = #define OUT_ACCEL_REG_F(reg, val) OUT_ACCEL_REG(reg, F_TO_DW(val)) #define FINISH_ACCEL() ADVANCE_RING() #define OUT_RING_F(x) OUT_RING(F_TO_DW(x)) -#define OUT_RELOC(x, read, write) OUT_RING_RELOC(x, read, write) #include "radeon_textured_videofuncs.c" @@ -185,40 +169,128 @@ static REF_TRANSFORM trans[2] = #endif /* XF86DRI */ static void -R600CopyData( - ScrnInfoPtr pScrn, - unsigned char *src, - unsigned char *dst, - unsigned int srcPitch, - unsigned int dstPitch, - unsigned int h, - unsigned int w, - unsigned int cpp -){ - RADEONInfoPtr info = RADEONPTR( pScrn ); +R600CopyPlanarHW(ScrnInfoPtr pScrn, + unsigned char *y_src, unsigned char *u_src, unsigned char *v_src, + uint32_t dst_mc_addr, + int srcPitch, int srcPitch2, int dstPitch, + int w, int h) +{ + int dstPitch2 = dstPitch >> 1; + int h2 = h >> 1; + int w2 = w >> 1; + int v_offset, u_offset; + v_offset = dstPitch * h; + v_offset = (v_offset + 255) & ~255; + u_offset = v_offset + (dstPitch2 * h2); + u_offset = (u_offset + 255) & ~255; - if (cpp == 2) { - w *= 2; - cpp = 1; + /* Y */ + R600CopyToVRAM(pScrn, + (char *)y_src, srcPitch, + dstPitch, dst_mc_addr, h, 8, + 0, 0, w, h); + + /* V */ + R600CopyToVRAM(pScrn, + (char *)v_src, srcPitch2, + dstPitch2, dst_mc_addr + v_offset, h2, 8, + 0, 0, w2, h2); + + /* U */ + R600CopyToVRAM(pScrn, + (char *)u_src, srcPitch2, + dstPitch2, dst_mc_addr + u_offset, h2, 8, + 0, 0, w2, h2); +} + +static void +R600CopyPackedHW(ScrnInfoPtr pScrn, + unsigned char *src, uint32_t dst_mc_addr, + int srcPitch, int dstPitch, + int w, int h) +{ + + /* YUV */ + R600CopyToVRAM(pScrn, + (char *)src, srcPitch, + dstPitch >> 2, dst_mc_addr, h, 32, + 0, 0, w >> 1, h); + +} + +static void +R600CopyPlanarSW(ScrnInfoPtr pScrn, + unsigned char *y_src, unsigned char *u_src, unsigned char *v_src, + unsigned char *dst, + int srcPitch, int srcPitch2, int dstPitch, + int w, int h) +{ + int i; + int dstPitch2 = dstPitch >> 1; + int h2 = h >> 1; + + /* Y */ + if (srcPitch == dstPitch) { + memcpy(dst, y_src, srcPitch * h); + dst += (dstPitch * h); + } else { + for (i = 0; i < h; i++) { + memcpy(dst, y_src, srcPitch); + y_src += srcPitch; + dst += dstPitch; + } } - if (info->DMAForXv) { - uint32_t dst_mc_addr = dst - (unsigned char *)info->FB + info->fbLocation; + /* tex base need 256B alignment */ + if (h & 1) + dst += dstPitch; - R600CopyToVRAM(pScrn, - (char *)src, srcPitch, - dstPitch, dst_mc_addr, w, h, cpp * 8, - 0, 0, w, h); + /* V */ + if (srcPitch2 == dstPitch2) { + memcpy(dst, v_src, srcPitch2 * h2); + dst += (dstPitch2 * h2); } else { - if (srcPitch == dstPitch) - memcpy(dst, src, srcPitch * h); - else { - while (h--) { - memcpy(dst, src, srcPitch); - src += srcPitch; - dst += dstPitch; - } - } + for (i = 0; i < h2; i++) { + memcpy(dst, v_src, srcPitch2); + v_src += srcPitch2; + dst += dstPitch2; + } + } + + /* tex base need 256B alignment */ + if (h2 & 1) + dst += dstPitch2; + + /* U */ + if (srcPitch2 == dstPitch2) { + memcpy(dst, u_src, srcPitch2 * h2); + dst += (dstPitch2 * h2); + } else { + for (i = 0; i < h2; i++) { + memcpy(dst, u_src, srcPitch2); + u_src += srcPitch2; + dst += dstPitch2; + } + } +} + +static void +R600CopyPackedSW(ScrnInfoPtr pScrn, + unsigned char *src, unsigned char *dst, + int srcPitch, int dstPitch, + int w, int h) +{ + int i; + + if (srcPitch == dstPitch) { + memcpy(dst, src, srcPitch * h); + dst += (dstPitch * h); + } else { + for (i = 0; i < h; i++) { + memcpy(dst, src, srcPitch); + src += srcPitch; + dst += dstPitch; + } } } @@ -244,15 +316,10 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, int srcPitch, srcPitch2, dstPitch, dstPitch2 = 0; int s2offset, s3offset, tmp; int d2line, d3line; - int top, nlines, size; + int top, left, npixels, nlines, size; BoxRec dstBox; int dst_width = width, dst_height = height; - int aligned_height; -#ifdef XF86DRM_MODE - int h_align = drmmode_get_height_align(pScrn, 0); -#else - int h_align = 1; -#endif + /* make the compiler happy */ s2offset = s3offset = srcPitch2 = 0; @@ -270,15 +337,18 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, if (!xf86XVClipVideoHelper(&dstBox, &x1, &x2, &y1, &y2, clipBoxes, width, height)) return Success; +/* src_w = (x2 - x1) >> 16; + src_h = (y2 - y1) >> 16; + drw_w = dstBox.x2 - dstBox.x1; + drw_h = dstBox.y2 - dstBox.y1;*/ + if ((x1 >= x2) || (y1 >= y2)) return Success; /* Bicubic filter setup */ pPriv->bicubic_enabled = (pPriv->bicubic_state != BICUBIC_OFF); - if (!(IS_R300_3D || IS_R500_3D)) { + if (!(IS_R300_3D || IS_R500_3D || IS_R600_3D)) pPriv->bicubic_enabled = FALSE; - pPriv->bicubic_state = BICUBIC_OFF; - } if (pPriv->bicubic_enabled && (pPriv->bicubic_state == BICUBIC_AUTO)) { /* * Applying the bicubic filter with a scale of less than 200% @@ -288,73 +358,70 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, pPriv->bicubic_enabled = FALSE; } -#ifdef XF86DRM_MODE - if (info->cs) { - if (info->ChipFamily >= CHIP_FAMILY_R600) - pPriv->hw_align = drmmode_get_base_align(pScrn, 2, 0); - else - pPriv->hw_align = 64; - } else -#endif - { - if (info->ChipFamily >= CHIP_FAMILY_R600) - pPriv->hw_align = 256; - else - pPriv->hw_align = 64; - } - - aligned_height = RADEON_ALIGN(dst_height, h_align); + pPriv->planar_hw = pPriv->planar_state; + if (pPriv->bicubic_enabled || !( IS_R300_3D || + (info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280) || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_R200) )) + pPriv->planar_hw = 0; switch(id) { case FOURCC_YV12: case FOURCC_I420: - srcPitch = RADEON_ALIGN(width, 4); - srcPitch2 = RADEON_ALIGN(width >> 1, 4); - if (pPriv->bicubic_state != BICUBIC_OFF) { - dstPitch = RADEON_ALIGN(dst_width << 1, pPriv->hw_align); - dstPitch2 = 0; + srcPitch = (width + 3) & ~3; + srcPitch2 = ((width >> 1) + 3) & ~3; + if (pPriv->planar_hw) { + dstPitch = (dst_width + 15) & ~15; + dstPitch = (dstPitch + 63) & ~63; + dstPitch2 = ((dst_width >> 1) + 15) & ~15; + dstPitch2 = (dstPitch2 + 63) & ~63; } else { - dstPitch = RADEON_ALIGN(dst_width, pPriv->hw_align); - dstPitch2 = RADEON_ALIGN(dstPitch >> 1, pPriv->hw_align); + dstPitch = ((dst_width << 1) + 15) & ~15; + dstPitch = (dstPitch + 63) & ~63; } break; case FOURCC_UYVY: case FOURCC_YUY2: default: - dstPitch = RADEON_ALIGN(dst_width << 1, pPriv->hw_align); + dstPitch = ((dst_width << 1) + 15) & ~15; + dstPitch = (dstPitch + 63) & ~63; srcPitch = (width << 1); srcPitch2 = 0; break; } - size = dstPitch * aligned_height + 2 * dstPitch2 * RADEON_ALIGN(((aligned_height + 1) >> 1), h_align); - size = RADEON_ALIGN(size, pPriv->hw_align); + if (info->ChipFamily >= CHIP_FAMILY_R600) + dstPitch = (dstPitch + 255) & ~255; - if (size != pPriv->size) { - RADEONFreeVideoMemory(pScrn, pPriv); + size = dstPitch * dst_height + 2 * dstPitch2 * ((dst_height + 1) >> 1); + + if (pPriv->video_memory != NULL && size != pPriv->size) { + radeon_legacy_free_memory(pScrn, pPriv->video_memory); + pPriv->video_memory = NULL; } if (pPriv->video_memory == NULL) { - pPriv->video_offset = radeon_legacy_allocate_memory(pScrn, - &pPriv->video_memory, - size, pPriv->hw_align, - RADEON_GEM_DOMAIN_GTT); + if (info->ChipFamily >= CHIP_FAMILY_R600) + pPriv->video_offset = radeon_legacy_allocate_memory(pScrn, + &pPriv->video_memory, + size * 2, 256); + else + pPriv->video_offset = radeon_legacy_allocate_memory(pScrn, + &pPriv->video_memory, + size * 2, 64); if (pPriv->video_offset == 0) return BadAlloc; - - if (info->cs) { - pPriv->src_bo[0] = pPriv->video_memory; - radeon_legacy_allocate_memory(pScrn, (void*)&pPriv->src_bo[1], size, - pPriv->hw_align, - RADEON_GEM_DOMAIN_GTT); - } } /* Bicubic filter loading */ - if (pPriv->bicubic_enabled) { - if (info->bicubic_offset == 0) - pPriv->bicubic_enabled = FALSE; - pPriv->bicubic_src_offset = info->bicubic_offset; + if (pPriv->bicubic_memory == NULL && pPriv->bicubic_enabled) { + pPriv->bicubic_offset = radeon_legacy_allocate_memory(pScrn, + &pPriv->bicubic_memory, + sizeof(bicubic_tex_512), 64); + pPriv->bicubic_src_offset = pPriv->bicubic_offset + info->fbLocation + pScrn->fbOffset; + if (pPriv->bicubic_offset == 0) + pPriv->bicubic_enabled = FALSE; } if (pDraw->type == DRAWABLE_WINDOW) @@ -365,9 +432,7 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, #ifdef USE_EXA if (info->useEXA) { /* Force the pixmap into framebuffer so we can draw to it. */ - info->exa_force_create = TRUE; exaMoveInPixmap(pPriv->pPixmap); - info->exa_force_create = FALSE; } #endif @@ -382,93 +447,130 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, } /* copy data */ - top = (y1 >> 16) & ~1; - nlines = ((y2 + 0xffff) >> 16) - top; + top = y1 >> 16; + left = (x1 >> 16) & ~1; + npixels = ((((x2 + 0xffff) >> 16) + 1) & ~1) - left; - pPriv->src_offset = pPriv->video_offset; - if (info->cs) { - struct radeon_bo *src_bo; - int ret; - - pPriv->currentBuffer ^= 1; - - src_bo = pPriv->src_bo[pPriv->currentBuffer]; - - ret = radeon_bo_map(src_bo, 1); - if (ret) - return BadAlloc; - - pPriv->src_addr = src_bo->ptr; - } else { + pPriv->src_offset = pPriv->video_offset + info->fbLocation + pScrn->fbOffset; + if (info->ChipFamily >= CHIP_FAMILY_R600) pPriv->src_addr = (uint8_t *)(info->FB + pPriv->video_offset); - RADEONWaitForIdleMMIO(pScrn); - } + else + pPriv->src_addr = (uint8_t *)(info->FB + pPriv->video_offset + (top * dstPitch)); pPriv->src_pitch = dstPitch; - - pPriv->planeu_offset = dstPitch * aligned_height; - pPriv->planeu_offset = RADEON_ALIGN(pPriv->planeu_offset, pPriv->hw_align); - pPriv->planev_offset = pPriv->planeu_offset + dstPitch2 * RADEON_ALIGN(((aligned_height + 1) >> 1), h_align); - pPriv->planev_offset = RADEON_ALIGN(pPriv->planev_offset, pPriv->hw_align); - + pPriv->planeu_offset = dstPitch * dst_height; + pPriv->planev_offset = pPriv->planeu_offset + dstPitch2 * ((dst_height + 1) >> 1); pPriv->size = size; pPriv->pDraw = pDraw; + +#if 0 + ErrorF("planeu_offset: 0x%x\n", pPriv->planeu_offset); + ErrorF("planev_offset: 0x%x\n", pPriv->planev_offset); + ErrorF("dstPitch2: 0x%x\n", dstPitch2); + ErrorF("src_offset: 0x%x\n", pPriv->src_offset); + ErrorF("src_addr: 0x%x\n", pPriv->src_addr); + ErrorF("src_pitch: 0x%x\n", pPriv->src_pitch); +#endif + switch(id) { case FOURCC_YV12: case FOURCC_I420: - s2offset = srcPitch * (RADEON_ALIGN(height, 2)); - s3offset = s2offset + (srcPitch2 * ((height + 1) >> 1)); - s2offset += ((top >> 1) * srcPitch2); - s3offset += ((top >> 1) * srcPitch2); - if (pPriv->bicubic_state != BICUBIC_OFF) { + if (info->ChipFamily >= CHIP_FAMILY_R600) { + s2offset = srcPitch * height; + s3offset = (srcPitch2 * (height >> 1)) + s2offset; + if (info->DMAForXv) { + if (id == FOURCC_YV12) + R600CopyPlanarHW(pScrn, buf, buf + s3offset, buf + s2offset, + pPriv->src_offset, + srcPitch, srcPitch2, pPriv->src_pitch, + width, height); + else + R600CopyPlanarHW(pScrn, buf, buf + s2offset, buf + s3offset, + pPriv->src_offset, + srcPitch, srcPitch2, pPriv->src_pitch, + width, height); + } else { + if (id == FOURCC_YV12) + R600CopyPlanarSW(pScrn, buf, buf + s3offset, buf + s2offset, + pPriv->src_addr, + srcPitch, srcPitch2, pPriv->src_pitch, + width, height); + else + R600CopyPlanarSW(pScrn, buf, buf + s2offset, buf + s3offset, + pPriv->src_addr, + srcPitch, srcPitch2, pPriv->src_pitch, + width, height); + } + } + else if (pPriv->planar_hw) { + top &= ~1; + s2offset = srcPitch * ((height + 1) & ~1); + s3offset = s2offset + srcPitch2 * ((height + 1) >> 1); + s2offset += (top >> 1) * srcPitch2 + (left >> 1); + s3offset += (top >> 1) * srcPitch2 + (left >> 1); + d2line = pPriv->planeu_offset; + d3line = pPriv->planev_offset; + d2line += (top >> 1) * dstPitch2 - (top * dstPitch); + d3line += (top >> 1) * dstPitch2 - (top * dstPitch); + nlines = ((y2 + 0xffff) >> 16) - top; + if(id == FOURCC_YV12) { + tmp = s2offset; + s2offset = s3offset; + s3offset = tmp; + } + RADEONCopyData(pScrn, buf + (top * srcPitch) + left, pPriv->src_addr + left, + srcPitch, dstPitch, nlines, npixels, 1); + RADEONCopyData(pScrn, buf + s2offset, pPriv->src_addr + d2line + (left >> 1), + srcPitch2, dstPitch2, (nlines + 1) >> 1, npixels >> 1, 1); + RADEONCopyData(pScrn, buf + s3offset, pPriv->src_addr + d3line + (left >> 1), + srcPitch2, dstPitch2, (nlines + 1) >> 1, npixels >> 1, 1); + } else { + top &= ~1; + nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top; + s2offset = srcPitch * height; + s3offset = (srcPitch2 * (height >> 1)) + s2offset; + pPriv->src_addr += left << 1; + tmp = ((top >> 1) * srcPitch2) + (left >> 1); + s2offset += tmp; + s3offset += tmp; if (id == FOURCC_I420) { tmp = s2offset; s2offset = s3offset; s3offset = tmp; } - RADEONCopyMungedData(pScrn, buf + (top * srcPitch), - buf + s2offset, buf + s3offset, pPriv->src_addr + (top * dstPitch), - srcPitch, srcPitch2, dstPitch, nlines, width); - } else { - if (id == FOURCC_YV12) { - tmp = s2offset; - s2offset = s3offset; - s3offset = tmp; - } - d2line = pPriv->planeu_offset + ((top >> 1) * dstPitch2); - d3line = pPriv->planev_offset + ((top >> 1) * dstPitch2); - - if (info->ChipFamily >= CHIP_FAMILY_R600) { - R600CopyData(pScrn, buf + (top * srcPitch), pPriv->src_addr + (top * dstPitch), - srcPitch, dstPitch, nlines, width, 1); - R600CopyData(pScrn, buf + s2offset, pPriv->src_addr + d2line, - srcPitch2, dstPitch2, (nlines + 1) >> 1, width >> 1, 1); - R600CopyData(pScrn, buf + s3offset, pPriv->src_addr + d3line, - srcPitch2, dstPitch2, (nlines + 1) >> 1, width >> 1, 1); - } else { - RADEONCopyData(pScrn, buf + (top * srcPitch), pPriv->src_addr + (top * dstPitch), - srcPitch, dstPitch, nlines, width, 1); - RADEONCopyData(pScrn, buf + s2offset, pPriv->src_addr + d2line, - srcPitch2, dstPitch2, (nlines + 1) >> 1, width >> 1, 1); - RADEONCopyData(pScrn, buf + s3offset, pPriv->src_addr + d3line, - srcPitch2, dstPitch2, (nlines + 1) >> 1, width >> 1, 1); - } + RADEONCopyMungedData(pScrn, buf + (top * srcPitch) + left, + buf + s2offset, buf + s3offset, pPriv->src_addr, + srcPitch, srcPitch2, dstPitch, nlines, npixels); } break; case FOURCC_UYVY: case FOURCC_YUY2: default: - if (info->ChipFamily >= CHIP_FAMILY_R600) - R600CopyData(pScrn, buf + (top * srcPitch), - pPriv->src_addr + (top * dstPitch), - srcPitch, dstPitch, nlines, width, 2); - else - RADEONCopyData(pScrn, buf + (top * srcPitch), - pPriv->src_addr + (top * dstPitch), - srcPitch, dstPitch, nlines, width, 2); + if (info->ChipFamily >= CHIP_FAMILY_R600) { + if (info->DMAForXv) + R600CopyPackedHW(pScrn, buf, pPriv->src_offset, + 2 * width, pPriv->src_pitch, + width, height); + else + R600CopyPackedSW(pScrn, buf, pPriv->src_addr, + 2 * width, pPriv->src_pitch, + width, height); + } else { + nlines = ((y2 + 0xffff) >> 16) - top; + pPriv->src_addr += left << 1; + RADEONCopyData(pScrn, buf + (top * srcPitch) + (left << 1), + pPriv->src_addr, srcPitch, dstPitch, nlines, npixels, 2); + } break; } + /* Upload bicubic filter tex */ + if (pPriv->bicubic_enabled) { + if (info->ChipFamily < CHIP_FAMILY_R600) + RADEONCopyData(pScrn, (uint8_t *)bicubic_tex_512, + (uint8_t *)(info->FB + pPriv->bicubic_offset), 1024, 1024, 1, 512, 2); + } + /* update cliplist */ if (!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) { REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes); @@ -477,8 +579,6 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, pPriv->id = id; pPriv->src_w = src_w; pPriv->src_h = src_h; - pPriv->src_x = src_x; - pPriv->src_y = src_y; pPriv->drw_x = drw_x; pPriv->drw_y = drw_y; pPriv->dst_w = drw_w; @@ -486,39 +586,14 @@ RADEONPutImageTextured(ScrnInfoPtr pScrn, pPriv->w = width; pPriv->h = height; -#if defined(XF86DRM_MODE) - if (info->cs) - radeon_bo_unmap(pPriv->src_bo[pPriv->currentBuffer]); -#endif #ifdef XF86DRI - if (info->directRenderingEnabled) { -#ifdef XF86DRM_MODE - if (IS_EVERGREEN_3D) - EVERGREENDisplayTexturedVideo(pScrn, pPriv); - else + if (IS_R600_3D) + R600DisplayTexturedVideo(pScrn, pPriv); + else if (info->directRenderingEnabled) + RADEONDisplayTexturedVideoCP(pScrn, pPriv); + else #endif - if (IS_R600_3D) - R600DisplayTexturedVideo(pScrn, pPriv); - else if (IS_R500_3D) - R500DisplayTexturedVideoCP(pScrn, pPriv); - else if (IS_R300_3D) - R300DisplayTexturedVideoCP(pScrn, pPriv); - else if (IS_R200_3D) - R200DisplayTexturedVideoCP(pScrn, pPriv); - else - RADEONDisplayTexturedVideoCP(pScrn, pPriv); - } else -#endif - { - if (IS_R500_3D) - R500DisplayTexturedVideoMMIO(pScrn, pPriv); - else if (IS_R300_3D) - R300DisplayTexturedVideoMMIO(pScrn, pPriv); - else if (IS_R200_3D) - R200DisplayTexturedVideoMMIO(pScrn, pPriv); - else - RADEONDisplayTexturedVideoMMIO(pScrn, pPriv); - } + RADEONDisplayTexturedVideoMMIO(pScrn, pPriv); return Success; } @@ -566,86 +641,23 @@ static XF86VideoFormatRec Formats[NUM_FORMATS] = static XF86AttributeRec Attributes[NUM_ATTRIBUTES+1] = { {XvSettable | XvGettable, 0, 1, "XV_VSYNC"}, - {XvSettable | XvGettable, -1, 1, "XV_CRTC"}, + {XvSettable | XvGettable, 0, 1, "XV_HWPLANAR"}, {0, 0, 0, NULL} }; -#define NUM_ATTRIBUTES_R200 7 - -static XF86AttributeRec Attributes_r200[NUM_ATTRIBUTES_R200+1] = -{ - {XvSettable | XvGettable, 0, 1, "XV_VSYNC"}, - {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, - {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, - {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}, - {XvSettable | XvGettable, -1000, 1000, "XV_HUE"}, - {XvSettable | XvGettable, 0, 1, "XV_COLORSPACE"}, - {XvSettable | XvGettable, -1, 1, "XV_CRTC"}, - {0, 0, 0, NULL} -}; - -#define NUM_ATTRIBUTES_R300 9 +#define NUM_ATTRIBUTES_R300 3 static XF86AttributeRec Attributes_r300[NUM_ATTRIBUTES_R300+1] = { {XvSettable | XvGettable, 0, 2, "XV_BICUBIC"}, {XvSettable | XvGettable, 0, 1, "XV_VSYNC"}, - {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, - {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, - {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}, - {XvSettable | XvGettable, -1000, 1000, "XV_HUE"}, - {XvSettable | XvGettable, 100, 10000, "XV_GAMMA"}, - {XvSettable | XvGettable, 0, 1, "XV_COLORSPACE"}, - {XvSettable | XvGettable, -1, 1, "XV_CRTC"}, - {0, 0, 0, NULL} -}; - -#define NUM_ATTRIBUTES_R500 8 - -static XF86AttributeRec Attributes_r500[NUM_ATTRIBUTES_R500+1] = -{ - {XvSettable | XvGettable, 0, 2, "XV_BICUBIC"}, - {XvSettable | XvGettable, 0, 1, "XV_VSYNC"}, - {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, - {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, - {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}, - {XvSettable | XvGettable, -1000, 1000, "XV_HUE"}, - {XvSettable | XvGettable, 0, 1, "XV_COLORSPACE"}, - {XvSettable | XvGettable, -1, 1, "XV_CRTC"}, - {0, 0, 0, NULL} -}; - -#define NUM_ATTRIBUTES_R600 7 - -static XF86AttributeRec Attributes_r600[NUM_ATTRIBUTES_R600+1] = -{ - {XvSettable | XvGettable, 0, 1, "XV_VSYNC"}, - {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, - {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, - {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}, - {XvSettable | XvGettable, -1000, 1000, "XV_HUE"}, - {XvSettable | XvGettable, 0, 1, "XV_COLORSPACE"}, - {XvSettable | XvGettable, -1, 1, "XV_CRTC"}, - {0, 0, 0, NULL} -}; - -static XF86AttributeRec Attributes_eg[NUM_ATTRIBUTES_R600+1] = -{ - {XvSettable | XvGettable, 0, 1, "XV_VSYNC"}, - {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"}, - {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"}, - {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}, - {XvSettable | XvGettable, -1000, 1000, "XV_HUE"}, - {XvSettable | XvGettable, 0, 1, "XV_COLORSPACE"}, - {XvSettable | XvGettable, -1, 5, "XV_CRTC"}, + {XvSettable | XvGettable, 0, 1, "XV_HWPLANAR"}, {0, 0, 0, NULL} }; static Atom xvBicubic; static Atom xvVSync; -static Atom xvBrightness, xvContrast, xvSaturation, xvHue; -static Atom xvGamma, xvColorspace; -static Atom xvCRTC; +static Atom xvHWPlanar; #define NUM_IMAGES 4 @@ -672,28 +684,9 @@ RADEONGetTexPortAttribute(ScrnInfoPtr pScrn, *value = pPriv->bicubic_state; else if (attribute == xvVSync) *value = pPriv->vsync; - else if (attribute == xvBrightness) - *value = pPriv->brightness; - else if (attribute == xvContrast) - *value = pPriv->contrast; - else if (attribute == xvSaturation) - *value = pPriv->saturation; - else if (attribute == xvHue) - *value = pPriv->hue; - else if (attribute == xvGamma) - *value = pPriv->gamma; - else if(attribute == xvColorspace) - *value = pPriv->transform_index; - else if(attribute == xvCRTC) { - int c; - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - for (c = 0; c < xf86_config->num_crtc; c++) - if (xf86_config->crtc[c] == pPriv->desired_crtc) - break; - if (c == xf86_config->num_crtc) - c = -1; - *value = c; - } else + else if (attribute == xvHWPlanar) + *value = pPriv->planar_state; + else return BadMatch; return Success; @@ -714,87 +707,14 @@ RADEONSetTexPortAttribute(ScrnInfoPtr pScrn, pPriv->bicubic_state = ClipValue (value, 0, 2); else if (attribute == xvVSync) pPriv->vsync = ClipValue (value, 0, 1); - else if (attribute == xvBrightness) - pPriv->brightness = ClipValue (value, -1000, 1000); - else if (attribute == xvContrast) - pPriv->contrast = ClipValue (value, -1000, 1000); - else if (attribute == xvSaturation) - pPriv->saturation = ClipValue (value, -1000, 1000); - else if (attribute == xvHue) - pPriv->hue = ClipValue (value, -1000, 1000); - else if (attribute == xvGamma) - pPriv->gamma = ClipValue (value, 100, 10000); - else if(attribute == xvColorspace) - pPriv->transform_index = ClipValue (value, 0, 1); - else if(attribute == xvCRTC) { - xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); - if ((value < -1) || (value > xf86_config->num_crtc)) - return BadValue; - if (value < 0) - pPriv->desired_crtc = NULL; - else - pPriv->desired_crtc = xf86_config->crtc[value]; - } else + else if (attribute == xvHWPlanar) + pPriv->planar_state = ClipValue (value, 0, 1); + else return BadMatch; return Success; } -Bool radeon_load_bicubic_texture(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - /* Bicubic filter loading */ - info->bicubic_offset = radeon_legacy_allocate_memory(pScrn, - &info->bicubic_memory, - sizeof(bicubic_tex_512), 64, - RADEON_GEM_DOMAIN_VRAM); - if (info->bicubic_offset == 0) - return FALSE; - - if (info->cs) - info->bicubic_bo = info->bicubic_memory; - - /* Upload bicubic filter tex */ - if (info->ChipFamily < CHIP_FAMILY_R600) { - uint8_t *bicubic_addr; - int ret; - if (info->cs) { - ret = radeon_bo_map(info->bicubic_bo, 1); - if (ret) - return FALSE; - - bicubic_addr = info->bicubic_bo->ptr; - } else - bicubic_addr = (uint8_t *)(info->FB + info->bicubic_offset); - - RADEONCopySwap(bicubic_addr, (uint8_t *)bicubic_tex_512, 1024, -#if X_BYTE_ORDER == X_BIG_ENDIAN - RADEON_HOST_DATA_SWAP_16BIT -#else - RADEON_HOST_DATA_SWAP_NONE -#endif -); - if (info->cs) - radeon_bo_unmap(info->bicubic_bo); - } - return TRUE; -} - -#if 0 -/* XXX */ -static void radeon_unload_bicubic_texture(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (info->bicubic_memory != NULL) { - radeon_legacy_free_memory(pScrn, info->bicubic_memory); - info->bicubic_memory = NULL; - } - -} -#endif - XF86VideoAdaptorPtr RADEONSetupImageTexturedVideo(ScreenPtr pScreen) { @@ -805,20 +725,14 @@ RADEONSetupImageTexturedVideo(ScreenPtr pScreen) int i; int num_texture_ports = 16; - adapt = calloc(1, sizeof(XF86VideoAdaptorRec) + num_texture_ports * - (sizeof(RADEONPortPrivRec) + sizeof(DevUnion))); + adapt = xcalloc(1, sizeof(XF86VideoAdaptorRec) + num_texture_ports * + (sizeof(RADEONPortPrivRec) + sizeof(DevUnion))); if (adapt == NULL) return NULL; xvBicubic = MAKE_ATOM("XV_BICUBIC"); xvVSync = MAKE_ATOM("XV_VSYNC"); - xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); - xvContrast = MAKE_ATOM("XV_CONTRAST"); - xvSaturation = MAKE_ATOM("XV_SATURATION"); - xvHue = MAKE_ATOM("XV_HUE"); - xvGamma = MAKE_ATOM("XV_GAMMA"); - xvColorspace = MAKE_ATOM("XV_COLORSPACE"); - xvCRTC = MAKE_ATOM("XV_CRTC"); + xvHWPlanar = MAKE_ATOM("XV_HWPLANAR"); adapt->type = XvWindowMask | XvInputMask | XvImageMask; adapt->flags = 0; @@ -838,27 +752,10 @@ RADEONSetupImageTexturedVideo(ScreenPtr pScreen) pPortPriv = (RADEONPortPrivPtr)(&adapt->pPortPrivates[num_texture_ports]); - if (IS_EVERGREEN_3D) { - adapt->pAttributes = Attributes_eg; - adapt->nAttributes = NUM_ATTRIBUTES_R600; - } - else if (IS_R600_3D) { - adapt->pAttributes = Attributes_r600; - adapt->nAttributes = NUM_ATTRIBUTES_R600; - } - else if (IS_R500_3D) { - adapt->pAttributes = Attributes_r500; - adapt->nAttributes = NUM_ATTRIBUTES_R500; - } - else if (IS_R300_3D) { + if (IS_R300_3D || IS_R500_3D) { adapt->pAttributes = Attributes_r300; adapt->nAttributes = NUM_ATTRIBUTES_R300; - } - else if (IS_R200_3D) { - adapt->pAttributes = Attributes_r200; - adapt->nAttributes = NUM_ATTRIBUTES_R200; - } - else { + } else { adapt->pAttributes = Attributes; adapt->nAttributes = NUM_ATTRIBUTES; } @@ -883,27 +780,15 @@ RADEONSetupImageTexturedVideo(ScreenPtr pScreen) pPriv->videoStatus = 0; pPriv->currentBuffer = 0; pPriv->doubleBuffer = 0; - pPriv->bicubic_state = BICUBIC_OFF; + pPriv->bicubic_state = BICUBIC_AUTO; pPriv->vsync = TRUE; - pPriv->brightness = 0; - pPriv->contrast = 0; - pPriv->saturation = 0; - pPriv->hue = 0; - pPriv->gamma = 1000; - pPriv->transform_index = 0; - pPriv->desired_crtc = NULL; + pPriv->planar_state = 1; /* gotta uninit this someplace, XXX: shouldn't be necessary for textured */ REGION_NULL(pScreen, &pPriv->clip); adapt->pPortPrivates[i].ptr = (pointer) (pPriv); } - if (IS_R500_3D || IS_R300_3D) - radeon_load_bicubic_texture(pScrn); - - info->xv_max_width = adapt->pEncodings->width; - info->xv_max_height = adapt->pEncodings->height; - return adapt; } diff --git a/driver/xf86-video-ati/src/radeon_textured_videofuncs.c b/driver/xf86-video-ati/src/radeon_textured_videofuncs.c index 84aba6f82..6cb2870a3 100644 --- a/driver/xf86-video-ati/src/radeon_textured_videofuncs.c +++ b/driver/xf86-video-ati/src/radeon_textured_videofuncs.c @@ -47,8 +47,8 @@ #ifdef ACCEL_CP -#define VTX_OUT_6(_dstX, _dstY, _srcX, _srcY, _maskX, _maskY) \ -do { \ +#define VTX_OUT_FILTER(_dstX, _dstY, _srcX, _srcY, _maskX, _maskY) \ +do { \ OUT_RING_F(_dstX); \ OUT_RING_F(_dstY); \ OUT_RING_F(_srcX); \ @@ -57,7 +57,7 @@ do { \ OUT_RING_F(_maskY); \ } while (0) -#define VTX_OUT_4(_dstX, _dstY, _srcX, _srcY) \ +#define VTX_OUT(_dstX, _dstY, _srcX, _srcY) \ do { \ OUT_RING_F(_dstX); \ OUT_RING_F(_dstY); \ @@ -67,7 +67,7 @@ do { \ #else /* ACCEL_CP */ -#define VTX_OUT_6(_dstX, _dstY, _srcX, _srcY, _maskX, _maskY) \ +#define VTX_OUT_FILTER(_dstX, _dstY, _srcX, _srcY, _maskX, _maskY) \ do { \ OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstX); \ OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstY); \ @@ -77,7 +77,7 @@ do { \ OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _maskY); \ } while (0) -#define VTX_OUT_4(_dstX, _dstY, _srcX, _srcY) \ +#define VTX_OUT(_dstX, _dstY, _srcX, _srcY) \ do { \ OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstX); \ OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstY); \ @@ -87,2379 +87,35 @@ do { \ #endif /* !ACCEL_CP */ -static Bool -FUNC_NAME(RADEONPrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pPixmap = pPriv->pPixmap; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *src_bo = pPriv->src_bo[pPriv->currentBuffer]; - uint32_t txformat, txsize, txpitch, txoffset; - uint32_t dst_pitch, dst_format; - uint32_t colorpitch; - int pixel_shift; - int scissor_w = MIN(pPixmap->drawable.width, 2047); - int scissor_h = MIN(pPixmap->drawable.height, 2047); - ACCEL_PREAMBLE(); - -#ifdef XF86DRM_MODE - if (info->cs) { - int ret; - - radeon_cs_space_reset_bos(info->cs); - radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - if (pPriv->bicubic_enabled) - radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - driver_priv = exaGetPixmapDriverPrivate(pPixmap); - radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); - - ret = radeon_cs_space_check(info->cs); - if (ret) { - ErrorF("Not enough RAM to hw accel xv operation\n"); - return FALSE; - } - } -#endif - - pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; - - -#ifdef USE_EXA - if (info->useEXA) { - dst_pitch = exaGetPixmapPitch(pPixmap); - } else -#endif - { - dst_pitch = pPixmap->devKind; - } - -#ifdef USE_EXA - if (info->useEXA) { - RADEON_SWITCH_TO_3D(); - } else -#endif - { - BEGIN_ACCEL(2); - OUT_ACCEL_REG(RADEON_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH); - /* We must wait for 3d to idle, in case source was just written as a dest. */ - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_HOST_IDLECLEAN | - RADEON_WAIT_2D_IDLECLEAN | - RADEON_WAIT_3D_IDLECLEAN | - RADEON_WAIT_DMA_GUI_IDLE); - FINISH_ACCEL(); - - if (!info->accel_state->XInited3D) - RADEONInit3DEngine(pScrn); - } - - /* Same for R100/R200 */ - switch (pPixmap->drawable.bitsPerPixel) { - case 16: - if (pPixmap->drawable.depth == 15) - dst_format = RADEON_COLOR_FORMAT_ARGB1555; - else - dst_format = RADEON_COLOR_FORMAT_RGB565; - break; - case 32: - dst_format = RADEON_COLOR_FORMAT_ARGB8888; - break; - default: - return FALSE; - } - - if (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12) { - pPriv->is_planar = TRUE; - txformat = RADEON_TXFORMAT_Y8; - } else { - pPriv->is_planar = FALSE; - if (pPriv->id == FOURCC_UYVY) - txformat = RADEON_TXFORMAT_YVYU422; - else - txformat = RADEON_TXFORMAT_VYUY422; - } - - txformat |= RADEON_TXFORMAT_NON_POWER2; - - colorpitch = dst_pitch >> pixel_shift; - - if (RADEONTilingEnabled(pScrn, pPixmap)) - colorpitch |= RADEON_COLOR_TILE_ENABLE; - - txoffset = info->cs ? 0 : pPriv->src_offset; - - BEGIN_ACCEL_RELOC(4,2); - - OUT_ACCEL_REG(RADEON_RB3D_CNTL, dst_format); - EMIT_WRITE_OFFSET(RADEON_RB3D_COLOROFFSET, 0, pPixmap); - EMIT_COLORPITCH(RADEON_RB3D_COLORPITCH, colorpitch, pPixmap); - OUT_ACCEL_REG(RADEON_RB3D_BLENDCNTL, - RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO); - - FINISH_ACCEL(); - - if (pPriv->is_planar) { - /* need 2 texcoord sets (even though they are identical) due - to denormalization! hw apparently can't premultiply - same coord set by different texture size */ - pPriv->vtx_count = 6; - - txsize = (((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) | - (((((pPriv->h + 1 ) >> 1) - 1) & 0x7ff) << RADEON_TEX_VSIZE_SHIFT)); - txpitch = RADEON_ALIGN(pPriv->src_pitch >> 1, 64); - txpitch -= 32; - - BEGIN_ACCEL_RELOC(23, 3); - - OUT_ACCEL_REG(RADEON_SE_VTX_FMT, (RADEON_SE_VTX_FMT_XY | - RADEON_SE_VTX_FMT_ST0 | - RADEON_SE_VTX_FMT_ST1)); - - OUT_ACCEL_REG(RADEON_PP_CNTL, (RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE | - RADEON_TEX_1_ENABLE | RADEON_TEX_BLEND_1_ENABLE | - RADEON_TEX_2_ENABLE | RADEON_TEX_BLEND_2_ENABLE | - RADEON_PLANAR_YUV_ENABLE)); - - /* Y */ - OUT_ACCEL_REG(RADEON_PP_TXFILTER_0, - RADEON_MAG_FILTER_LINEAR | - RADEON_MIN_FILTER_LINEAR | - RADEON_CLAMP_S_CLAMP_LAST | - RADEON_CLAMP_T_CLAMP_LAST | - RADEON_YUV_TO_RGB); - OUT_ACCEL_REG(RADEON_PP_TXFORMAT_0, txformat | RADEON_TXFORMAT_ST_ROUTE_STQ0); - OUT_TEXTURE_REG(RADEON_PP_TXOFFSET_0, txoffset, src_bo); - OUT_ACCEL_REG(RADEON_PP_TXCBLEND_0, - RADEON_COLOR_ARG_A_ZERO | - RADEON_COLOR_ARG_B_ZERO | - RADEON_COLOR_ARG_C_T0_COLOR | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - OUT_ACCEL_REG(RADEON_PP_TXABLEND_0, - RADEON_ALPHA_ARG_A_ZERO | - RADEON_ALPHA_ARG_B_ZERO | - RADEON_ALPHA_ARG_C_T0_ALPHA | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - - OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_0, - (pPriv->w - 1) | - ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); - OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_0, - pPriv->src_pitch - 32); - - /* U */ - OUT_ACCEL_REG(RADEON_PP_TXFILTER_1, - RADEON_MAG_FILTER_LINEAR | - RADEON_MIN_FILTER_LINEAR | - RADEON_CLAMP_S_CLAMP_LAST | - RADEON_CLAMP_T_CLAMP_LAST); - OUT_ACCEL_REG(RADEON_PP_TXFORMAT_1, txformat | RADEON_TXFORMAT_ST_ROUTE_STQ1); - OUT_TEXTURE_REG(RADEON_PP_TXOFFSET_1, txoffset + pPriv->planeu_offset, src_bo); - OUT_ACCEL_REG(RADEON_PP_TXCBLEND_1, - RADEON_COLOR_ARG_A_ZERO | - RADEON_COLOR_ARG_B_ZERO | - RADEON_COLOR_ARG_C_T0_COLOR | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - OUT_ACCEL_REG(RADEON_PP_TXABLEND_1, - RADEON_ALPHA_ARG_A_ZERO | - RADEON_ALPHA_ARG_B_ZERO | - RADEON_ALPHA_ARG_C_T0_ALPHA | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - - OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_1, txsize); - OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_1, txpitch); - - /* V */ - OUT_ACCEL_REG(RADEON_PP_TXFILTER_2, - RADEON_MAG_FILTER_LINEAR | - RADEON_MIN_FILTER_LINEAR | - RADEON_CLAMP_S_CLAMP_LAST | - RADEON_CLAMP_T_CLAMP_LAST); - OUT_ACCEL_REG(RADEON_PP_TXFORMAT_2, txformat | RADEON_TXFORMAT_ST_ROUTE_STQ1); - OUT_TEXTURE_REG(RADEON_PP_TXOFFSET_2, txoffset + pPriv->planev_offset, src_bo); - OUT_ACCEL_REG(RADEON_PP_TXCBLEND_2, - RADEON_COLOR_ARG_A_ZERO | - RADEON_COLOR_ARG_B_ZERO | - RADEON_COLOR_ARG_C_T0_COLOR | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - OUT_ACCEL_REG(RADEON_PP_TXABLEND_2, - RADEON_ALPHA_ARG_A_ZERO | - RADEON_ALPHA_ARG_B_ZERO | - RADEON_ALPHA_ARG_C_T0_ALPHA | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - - OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_2, txsize); - OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_2, txpitch); - FINISH_ACCEL(); - } else { - pPriv->vtx_count = 4; - BEGIN_ACCEL_RELOC(9, 1); - - OUT_ACCEL_REG(RADEON_SE_VTX_FMT, (RADEON_SE_VTX_FMT_XY | - RADEON_SE_VTX_FMT_ST0)); - - OUT_ACCEL_REG(RADEON_PP_CNTL, RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE); - - OUT_ACCEL_REG(RADEON_PP_TXFILTER_0, - RADEON_MAG_FILTER_LINEAR | - RADEON_MIN_FILTER_LINEAR | - RADEON_CLAMP_S_CLAMP_LAST | - RADEON_CLAMP_T_CLAMP_LAST | - RADEON_YUV_TO_RGB); - OUT_ACCEL_REG(RADEON_PP_TXFORMAT_0, txformat | RADEON_TXFORMAT_ST_ROUTE_STQ0); - OUT_TEXTURE_REG(RADEON_PP_TXOFFSET_0, txoffset, src_bo); - OUT_ACCEL_REG(RADEON_PP_TXCBLEND_0, - RADEON_COLOR_ARG_A_ZERO | - RADEON_COLOR_ARG_B_ZERO | - RADEON_COLOR_ARG_C_T0_COLOR | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - OUT_ACCEL_REG(RADEON_PP_TXABLEND_0, - RADEON_ALPHA_ARG_A_ZERO | - RADEON_ALPHA_ARG_B_ZERO | - RADEON_ALPHA_ARG_C_T0_ALPHA | - RADEON_BLEND_CTL_ADD | - RADEON_CLAMP_TX); - - OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_0, - (pPriv->w - 1) | - ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); - OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_0, - pPriv->src_pitch - 32); - FINISH_ACCEL(); - } - - BEGIN_ACCEL(2); - OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0); - OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, ((scissor_w << RADEON_RE_WIDTH_SHIFT) | - (scissor_h << RADEON_RE_HEIGHT_SHIFT))); - FINISH_ACCEL(); - - if (pPriv->vsync) { - xf86CrtcPtr crtc; - if (pPriv->desired_crtc) - crtc = pPriv->desired_crtc; - else - crtc = radeon_pick_best_crtc(pScrn, - pPriv->drw_x, - pPriv->drw_x + pPriv->dst_w, - pPriv->drw_y, - pPriv->drw_y + pPriv->dst_h); - if (crtc) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pPixmap, - crtc, - pPriv->drw_y - crtc->y, - (pPriv->drw_y - crtc->y) + pPriv->dst_h); - } - - return TRUE; -} - static void FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) { RADEONInfoPtr info = RADEONPTR(pScrn); PixmapPtr pPixmap = pPriv->pPixmap; - int dstxoff, dstyoff; - BoxPtr pBox = REGION_RECTS(&pPriv->clip); - int nBox = REGION_NUM_RECTS(&pPriv->clip); - ACCEL_PREAMBLE(); - -#ifdef COMPOSITE - dstxoff = -pPixmap->screen_x + pPixmap->drawable.x; - dstyoff = -pPixmap->screen_y + pPixmap->drawable.y; -#else - dstxoff = 0; - dstyoff = 0; -#endif - - if (!FUNC_NAME(RADEONPrepareTexturedVideo)(pScrn, pPriv)) - return; - - /* - * Rendering of the actual polygon is done in two different - * ways depending on chip generation: - * - * < R300: - * - * These chips can render a rectangle in one pass, so - * handling is pretty straight-forward. - * - * >= R300: - * - * These chips can accept a quad, but will render it as - * two triangles which results in a diagonal tear. Instead - * We render a single, large triangle and use the scissor - * functionality to restrict it to the desired rectangle. - * Due to guardband limits on r3xx/r4xx, we can only use - * the single triangle up to 2560/4021 pixels; above that we - * render as a quad. - */ -#ifdef ACCEL_CP - while (nBox) { - int draw_size = 3 * pPriv->vtx_count + 5; - int loop_boxes; - - if (draw_size > radeon_cs_space_remaining(pScrn)) { - if (info->cs) - radeon_cs_flush_indirect(pScrn); - else - RADEONCPFlushIndirect(pScrn, 1); - if (!FUNC_NAME(RADEONPrepareTexturedVideo)(pScrn, pPriv)) - return; - } - loop_boxes = MIN(radeon_cs_space_remaining(pScrn) / draw_size, nBox); - nBox -= loop_boxes; - - BEGIN_RING(loop_boxes * 3 * pPriv->vtx_count + 5); - OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD, - loop_boxes * 3 * pPriv->vtx_count + 1)); - if (pPriv->is_planar) - OUT_RING(RADEON_CP_VC_FRMT_XY | - RADEON_CP_VC_FRMT_ST0 | - RADEON_CP_VC_FRMT_ST1); - else - OUT_RING(RADEON_CP_VC_FRMT_XY | - RADEON_CP_VC_FRMT_ST0); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - RADEON_CP_VC_CNTL_MAOS_ENABLE | - RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | - ((loop_boxes * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT)); - - while (loop_boxes--) { - int srcX, srcY, srcw, srch; - int dstX, dstY, dstw, dsth; - dstX = pBox->x1 + dstxoff; - dstY = pBox->y1 + dstyoff; - dstw = pBox->x2 - pBox->x1; - dsth = pBox->y2 - pBox->y1; - - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; - - srcw = (pPriv->src_w * dstw) / pPriv->dst_w; - srch = (pPriv->src_h * dsth) / pPriv->dst_h; - - - if (pPriv->is_planar) { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_6((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } else { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_4((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } - - pBox++; - } - - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); - ADVANCE_RING(); - } -#else /* ACCEL_CP */ - BEGIN_ACCEL(nBox * pPriv->vtx_count * 3 + 2); - OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST | - RADEON_VF_PRIM_WALK_DATA | - RADEON_VF_RADEON_MODE | - ((nBox * 3) << RADEON_VF_NUM_VERTICES_SHIFT))); - while (nBox--) { - int srcX, srcY, srcw, srch; - int dstX, dstY, dstw, dsth; - dstX = pBox->x1 + dstxoff; - dstY = pBox->y1 + dstyoff; - dstw = pBox->x2 - pBox->x1; - dsth = pBox->y2 - pBox->y1; - - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; - - srcw = (pPriv->src_w * dstw) / pPriv->dst_w; - srch = (pPriv->src_h * dsth) / pPriv->dst_h; - - - if (pPriv->is_planar) { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_6((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } else { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_4((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } - - pBox++; - } - - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); - FINISH_ACCEL(); -#endif /* !ACCEL_CP */ - - DamageDamageRegion(pPriv->pDraw, &pPriv->clip); -} - -static Bool -FUNC_NAME(R200PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pPixmap = pPriv->pPixmap; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *src_bo = pPriv->src_bo[pPriv->currentBuffer]; uint32_t txformat; - uint32_t txfilter, txsize, txpitch, txoffset; - uint32_t dst_pitch, dst_format; - uint32_t colorpitch; - int pixel_shift; - int scissor_w = MIN(pPixmap->drawable.width, 2047); - int scissor_h = MIN(pPixmap->drawable.height, 2047); - /* note: in contrast to r300, use input biasing on uv components */ - const float Loff = -0.0627; - float uvcosf, uvsinf; - float yco, yoff; - float uco[3], vco[3]; - float bright, cont, sat; - int ref = pPriv->transform_index; - float ucscale = 0.25, vcscale = 0.25; - Bool needux8 = FALSE, needvx8 = FALSE; - ACCEL_PREAMBLE(); - -#ifdef XF86DRM_MODE - if (info->cs) { - int ret; - - radeon_cs_space_reset_bos(info->cs); - radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - if (pPriv->bicubic_enabled) - radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - driver_priv = exaGetPixmapDriverPrivate(pPixmap); - radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); - - ret = radeon_cs_space_check(info->cs); - if (ret) { - ErrorF("Not enough RAM to hw accel xv operation\n"); - return FALSE; - } - } -#endif - - pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; - -#ifdef USE_EXA - if (info->useEXA) { - dst_pitch = exaGetPixmapPitch(pPixmap); - } else -#endif - { - dst_pitch = pPixmap->devKind; - } - -#ifdef USE_EXA - if (info->useEXA) { - RADEON_SWITCH_TO_3D(); - } else -#endif - { - BEGIN_ACCEL(2); - OUT_ACCEL_REG(RADEON_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH); - /* We must wait for 3d to idle, in case source was just written as a dest. */ - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_HOST_IDLECLEAN | - RADEON_WAIT_2D_IDLECLEAN | - RADEON_WAIT_3D_IDLECLEAN | - RADEON_WAIT_DMA_GUI_IDLE); - FINISH_ACCEL(); - - if (!info->accel_state->XInited3D) - RADEONInit3DEngine(pScrn); - } - - /* Same for R100/R200 */ - switch (pPixmap->drawable.bitsPerPixel) { - case 16: - if (pPixmap->drawable.depth == 15) - dst_format = RADEON_COLOR_FORMAT_ARGB1555; - else - dst_format = RADEON_COLOR_FORMAT_RGB565; - break; - case 32: - dst_format = RADEON_COLOR_FORMAT_ARGB8888; - break; - default: - return FALSE; - } - - if (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12) { - pPriv->is_planar = TRUE; - txformat = RADEON_TXFORMAT_I8; - } else { - pPriv->is_planar = FALSE; - if (pPriv->id == FOURCC_UYVY) - txformat = RADEON_TXFORMAT_YVYU422; - else - txformat = RADEON_TXFORMAT_VYUY422; - } - - txformat |= RADEON_TXFORMAT_NON_POWER2; - - colorpitch = dst_pitch >> pixel_shift; - - if (RADEONTilingEnabled(pScrn, pPixmap)) - colorpitch |= RADEON_COLOR_TILE_ENABLE; - - BEGIN_ACCEL_RELOC(4,2); - - OUT_ACCEL_REG(RADEON_RB3D_CNTL, dst_format); - EMIT_WRITE_OFFSET(RADEON_RB3D_COLOROFFSET, 0, pPixmap); - EMIT_COLORPITCH(RADEON_RB3D_COLORPITCH, colorpitch, pPixmap); - - OUT_ACCEL_REG(RADEON_RB3D_BLENDCNTL, - RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO); - - FINISH_ACCEL(); - - txfilter = R200_MAG_FILTER_LINEAR | - R200_MIN_FILTER_LINEAR | - R200_CLAMP_S_CLAMP_LAST | - R200_CLAMP_T_CLAMP_LAST; - - /* contrast can cause constant overflow, clamp */ - cont = RTFContrast(pPriv->contrast); - if (cont * trans[ref].RefLuma > 2.0) - cont = 2.0 / trans[ref].RefLuma; - /* brightness is only from -0.5 to 0.5 should be safe */ - bright = RTFBrightness(pPriv->brightness); - /* saturation can also cause overflow, clamp */ - sat = RTFSaturation(pPriv->saturation); - if (sat * trans[ref].RefBCb > 4.0) - sat = 4.0 / trans[ref].RefBCb; - uvcosf = sat * cos(RTFHue(pPriv->hue)); - uvsinf = sat * sin(RTFHue(pPriv->hue)); - - yco = trans[ref].RefLuma * cont; - uco[0] = -trans[ref].RefRCr * uvsinf; - uco[1] = trans[ref].RefGCb * uvcosf - trans[ref].RefGCr * uvsinf; - uco[2] = trans[ref].RefBCb * uvcosf; - vco[0] = trans[ref].RefRCr * uvcosf; - vco[1] = trans[ref].RefGCb * uvsinf + trans[ref].RefGCr * uvcosf; - vco[2] = trans[ref].RefBCb * uvsinf; - yoff = Loff * yco + bright; - - if ((uco[0] > 2.0) || (uco[2] > 2.0)) { - needux8 = TRUE; - ucscale = 0.125; - } - if ((vco[0] > 2.0) || (vco[2] > 2.0)) { - needvx8 = TRUE; - vcscale = 0.125; - } - - txoffset = info->cs ? 0 : pPriv->src_offset; - - if (pPriv->is_planar) { - /* need 2 texcoord sets (even though they are identical) due - to denormalization! hw apparently can't premultiply - same coord set by different texture size */ - pPriv->vtx_count = 6; - - txsize = (((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) | - (((((pPriv->h + 1 ) >> 1) - 1) & 0x7ff) << RADEON_TEX_VSIZE_SHIFT)); - txpitch = RADEON_ALIGN(pPriv->src_pitch >> 1, 64); - txpitch -= 32; - - BEGIN_ACCEL_RELOC(36, 3); - - OUT_ACCEL_REG(RADEON_PP_CNTL, - RADEON_TEX_0_ENABLE | RADEON_TEX_1_ENABLE | RADEON_TEX_2_ENABLE | - RADEON_TEX_BLEND_0_ENABLE | - RADEON_TEX_BLEND_1_ENABLE | - RADEON_TEX_BLEND_2_ENABLE); - - OUT_ACCEL_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); - OUT_ACCEL_REG(R200_SE_VTX_FMT_1, - (2 << R200_VTX_TEX0_COMP_CNT_SHIFT) | - (2 << R200_VTX_TEX1_COMP_CNT_SHIFT)); - - OUT_ACCEL_REG(R200_PP_TXFILTER_0, txfilter); - OUT_ACCEL_REG(R200_PP_TXFORMAT_0, txformat); - OUT_ACCEL_REG(R200_PP_TXFORMAT_X_0, 0); - OUT_ACCEL_REG(R200_PP_TXSIZE_0, - (pPriv->w - 1) | - ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); - OUT_ACCEL_REG(R200_PP_TXPITCH_0, pPriv->src_pitch - 32); - OUT_TEXTURE_REG(R200_PP_TXOFFSET_0, txoffset, src_bo); - - OUT_ACCEL_REG(R200_PP_TXFILTER_1, txfilter); - OUT_ACCEL_REG(R200_PP_TXFORMAT_1, txformat | R200_TXFORMAT_ST_ROUTE_STQ1); - OUT_ACCEL_REG(R200_PP_TXFORMAT_X_1, 0); - OUT_ACCEL_REG(R200_PP_TXSIZE_1, txsize); - OUT_ACCEL_REG(R200_PP_TXPITCH_1, txpitch); - OUT_TEXTURE_REG(R200_PP_TXOFFSET_1, txoffset + pPriv->planeu_offset, src_bo); - - OUT_ACCEL_REG(R200_PP_TXFILTER_2, txfilter); - OUT_ACCEL_REG(R200_PP_TXFORMAT_2, txformat | R200_TXFORMAT_ST_ROUTE_STQ1); - OUT_ACCEL_REG(R200_PP_TXFORMAT_X_2, 0); - OUT_ACCEL_REG(R200_PP_TXSIZE_2, txsize); - OUT_ACCEL_REG(R200_PP_TXPITCH_2, txpitch); - OUT_TEXTURE_REG(R200_PP_TXOFFSET_2, txoffset + pPriv->planev_offset, src_bo); - - /* similar to r300 code. Note the big problem is that hardware constants - * are 8 bits only, representing 0.0-1.0. We can get that up (using bias - * + scale) to -1.0-1.0 (but precision will suffer). AFAIK the hw actually - * has 12 bits fractional precision (plus 1 sign bit, 3 range bits) but - * the constants not. To get larger range can use output scale, but for - * that 2.018 value we need a total scale by 8, which means the constants - * really have no accuracy whatsoever (5 fractional bits only). - * The only direct way to get high precision "constants" into the fragment - * pipe I know of is to use the texcoord interpolator (not color, this one - * is 8 bit only too), which seems a bit expensive. We're lucky though it - * seems the values we need seem to fit better than worst case (get about - * 6 fractional bits for this instead of 5, at least when not correcting for - * hue/saturation/contrast/brightness, which is the same as for vco - yco and - * yoff get 8 fractional bits). Try to preserve as much accuracy as possible - * even with non-default saturation/hue/contrast/brightness adjustments, - * it gets a little crazy and ultimately precision might still be lacking. - * - * A higher precision (8 fractional bits) version might just put uco into - * a texcoord, and calculate a new vcoconst in the shader, like so: - * cohelper = {1.0, 0.0, 0.0} - shouldn't use 0.5 since not exactly representable - * vco = {1.5958 - 1.0, -0.8129 + 1.0, 1.0} - * vcocalc = ADD temp, bias/scale(cohelper), vco - * would in total use 4 tex units, 4 instructions which seems fairly - * balanced for this architecture (instead of 3 + 3 for the solution here) - * - * temp = MAD(yco, yuv.yyyy, yoff) - * temp = MAD(uco, yuv.uuuu, temp) - * result = MAD(vco, yuv.vvvv, temp) - * - * note first mad produces actually scalar, hence we transform - * it into a dp2a to get 8 bit precision of yco instead of 7 - - * That's assuming hw correctly expands consts to internal precision. - * (y * 1 + y * (yco - 1) + yoff) - * temp = DP2A / 2 (yco, yuv.yyyy, yoff) - * temp = MAD (uco / 4, yuv.uuuu * 2, temp) - * result = MAD x2 (vco / 2, yuv.vvvv, temp) - * - * vco, uco need bias (and hence scale too) - * - */ - - /* MAD temp0 / 2, const0.a * 2, temp0, -const0.rgb */ - OUT_ACCEL_REG(R200_PP_TXCBLEND_0, - R200_TXC_ARG_A_TFACTOR_COLOR | - R200_TXC_ARG_B_R0_COLOR | - R200_TXC_ARG_C_TFACTOR_COLOR | - (yoff < 0 ? R200_TXC_NEG_ARG_C : 0) | - R200_TXC_OP_DOT2_ADD); - OUT_ACCEL_REG(R200_PP_TXCBLEND2_0, - (0 << R200_TXC_TFACTOR_SEL_SHIFT) | - R200_TXC_SCALE_INV2 | - R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R0); - OUT_ACCEL_REG(R200_PP_TXABLEND_0, - R200_TXA_ARG_A_ZERO | - R200_TXA_ARG_B_ZERO | - R200_TXA_ARG_C_ZERO | - R200_TXA_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXABLEND2_0, - R200_TXA_OUTPUT_REG_NONE); - - /* MAD temp0, (const1 - 0.5) * 2, (temp1 - 0.5) * 2, temp0 */ - OUT_ACCEL_REG(R200_PP_TXCBLEND_1, - R200_TXC_ARG_A_TFACTOR_COLOR | - R200_TXC_BIAS_ARG_A | - R200_TXC_SCALE_ARG_A | - R200_TXC_ARG_B_R1_COLOR | - R200_TXC_BIAS_ARG_B | - (needux8 ? R200_TXC_SCALE_ARG_B : 0) | - R200_TXC_ARG_C_R0_COLOR | - R200_TXC_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXCBLEND2_1, - (1 << R200_TXC_TFACTOR_SEL_SHIFT) | - R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R0); - OUT_ACCEL_REG(R200_PP_TXABLEND_1, - R200_TXA_ARG_A_ZERO | - R200_TXA_ARG_B_ZERO | - R200_TXA_ARG_C_ZERO | - R200_TXA_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXABLEND2_1, - R200_TXA_OUTPUT_REG_NONE); - - /* MAD temp0 x 2, (const2 - 0.5) * 2, (temp2 - 0.5), temp0 */ - OUT_ACCEL_REG(R200_PP_TXCBLEND_2, - R200_TXC_ARG_A_TFACTOR_COLOR | - R200_TXC_BIAS_ARG_A | - R200_TXC_SCALE_ARG_A | - R200_TXC_ARG_B_R2_COLOR | - R200_TXC_BIAS_ARG_B | - (needvx8 ? R200_TXC_SCALE_ARG_B : 0) | - R200_TXC_ARG_C_R0_COLOR | - R200_TXC_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXCBLEND2_2, - (2 << R200_TXC_TFACTOR_SEL_SHIFT) | - R200_TXC_SCALE_2X | - R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); - OUT_ACCEL_REG(R200_PP_TXABLEND_2, - R200_TXA_ARG_A_ZERO | - R200_TXA_ARG_B_ZERO | - R200_TXA_ARG_C_ZERO | - R200_TXA_COMP_ARG_C | - R200_TXA_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXABLEND2_2, - R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); - - /* shader constants */ - OUT_ACCEL_REG(R200_PP_TFACTOR_0, float4touint(yco > 1.0 ? 1.0 : 0.0, /* range special [0, 2] */ - yco > 1.0 ? yco - 1.0: yco, - yoff < 0 ? -yoff : yoff, /* range special [-1, 1] */ - 0.0)); - OUT_ACCEL_REG(R200_PP_TFACTOR_1, float4touint(uco[0] * ucscale + 0.5, /* range [-4, 4] */ - uco[1] * ucscale + 0.5, /* or [-2, 2] */ - uco[2] * ucscale + 0.5, - 0.0)); - OUT_ACCEL_REG(R200_PP_TFACTOR_2, float4touint(vco[0] * vcscale + 0.5, /* range [-2, 2] */ - vco[1] * vcscale + 0.5, /* or [-4, 4] */ - vco[2] * vcscale + 0.5, - 0.0)); - - FINISH_ACCEL(); - } else { - pPriv->vtx_count = 4; - - BEGIN_ACCEL_RELOC(24, 1); - - OUT_ACCEL_REG(RADEON_PP_CNTL, - RADEON_TEX_0_ENABLE | - RADEON_TEX_BLEND_0_ENABLE | RADEON_TEX_BLEND_1_ENABLE | - RADEON_TEX_BLEND_2_ENABLE); - - OUT_ACCEL_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); - OUT_ACCEL_REG(R200_SE_VTX_FMT_1, - (2 << R200_VTX_TEX0_COMP_CNT_SHIFT)); - - OUT_ACCEL_REG(R200_PP_TXFILTER_0, txfilter); - OUT_ACCEL_REG(R200_PP_TXFORMAT_0, txformat); - OUT_ACCEL_REG(R200_PP_TXFORMAT_X_0, 0); - OUT_ACCEL_REG(R200_PP_TXSIZE_0, - (pPriv->w - 1) | - ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); - OUT_ACCEL_REG(R200_PP_TXPITCH_0, pPriv->src_pitch - 32); - OUT_TEXTURE_REG(R200_PP_TXOFFSET_0, txoffset, src_bo); - - /* MAD temp1 / 2, const0.a * 2, temp0.ggg, -const0.rgb */ - OUT_ACCEL_REG(R200_PP_TXCBLEND_0, - R200_TXC_ARG_A_TFACTOR_COLOR | - R200_TXC_ARG_B_R0_COLOR | - R200_TXC_ARG_C_TFACTOR_COLOR | - (yoff < 0 ? R200_TXC_NEG_ARG_C : 0) | - R200_TXC_OP_DOT2_ADD); - OUT_ACCEL_REG(R200_PP_TXCBLEND2_0, - (0 << R200_TXC_TFACTOR_SEL_SHIFT) | - R200_TXC_SCALE_INV2 | - (R200_TXC_REPL_GREEN << R200_TXC_REPL_ARG_B_SHIFT) | - R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R1); - OUT_ACCEL_REG(R200_PP_TXABLEND_0, - R200_TXA_ARG_A_ZERO | - R200_TXA_ARG_B_ZERO | - R200_TXA_ARG_C_ZERO | - R200_TXA_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXABLEND2_0, - R200_TXA_OUTPUT_REG_NONE); - - /* MAD temp1, (const1 - 0.5) * 2, (temp0.rrr - 0.5) * 2, temp1 */ - OUT_ACCEL_REG(R200_PP_TXCBLEND_1, - R200_TXC_ARG_A_TFACTOR_COLOR | - R200_TXC_BIAS_ARG_A | - R200_TXC_SCALE_ARG_A | - R200_TXC_ARG_B_R0_COLOR | - R200_TXC_BIAS_ARG_B | - (needux8 ? R200_TXC_SCALE_ARG_B : 0) | - R200_TXC_ARG_C_R1_COLOR | - R200_TXC_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXCBLEND2_1, - (1 << R200_TXC_TFACTOR_SEL_SHIFT) | - (R200_TXC_REPL_BLUE << R200_TXC_REPL_ARG_B_SHIFT) | - R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R1); - OUT_ACCEL_REG(R200_PP_TXABLEND_1, - R200_TXA_ARG_A_ZERO | - R200_TXA_ARG_B_ZERO | - R200_TXA_ARG_C_ZERO | - R200_TXA_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXABLEND2_1, - R200_TXA_OUTPUT_REG_NONE); - - /* MAD temp0 x 2, (const2 - 0.5) * 2, (temp0.bbb - 0.5), temp1 */ - OUT_ACCEL_REG(R200_PP_TXCBLEND_2, - R200_TXC_ARG_A_TFACTOR_COLOR | - R200_TXC_BIAS_ARG_A | - R200_TXC_SCALE_ARG_A | - R200_TXC_ARG_B_R0_COLOR | - R200_TXC_BIAS_ARG_B | - (needvx8 ? R200_TXC_SCALE_ARG_B : 0) | - R200_TXC_ARG_C_R1_COLOR | - R200_TXC_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXCBLEND2_2, - (2 << R200_TXC_TFACTOR_SEL_SHIFT) | - R200_TXC_SCALE_2X | - (R200_TXC_REPL_RED << R200_TXC_REPL_ARG_B_SHIFT) | - R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); - OUT_ACCEL_REG(R200_PP_TXABLEND_2, - R200_TXA_ARG_A_ZERO | - R200_TXA_ARG_B_ZERO | - R200_TXA_ARG_C_ZERO | - R200_TXA_COMP_ARG_C | - R200_TXA_OP_MADD); - OUT_ACCEL_REG(R200_PP_TXABLEND2_2, - R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); - - /* shader constants */ - OUT_ACCEL_REG(R200_PP_TFACTOR_0, float4touint(yco > 1.0 ? 1.0 : 0.0, /* range special [0, 2] */ - yco > 1.0 ? yco - 1.0: yco, - yoff < 0 ? -yoff : yoff, /* range special [-1, 1] */ - 0.0)); - OUT_ACCEL_REG(R200_PP_TFACTOR_1, float4touint(uco[0] * ucscale + 0.5, /* range [-4, 4] */ - uco[1] * ucscale + 0.5, /* or [-2, 2] */ - uco[2] * ucscale + 0.5, - 0.0)); - OUT_ACCEL_REG(R200_PP_TFACTOR_2, float4touint(vco[0] * vcscale + 0.5, /* range [-2, 2] */ - vco[1] * vcscale + 0.5, /* or [-4, 4] */ - vco[2] * vcscale + 0.5, - 0.0)); - - FINISH_ACCEL(); - } - - BEGIN_ACCEL(2); - OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0); - OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, ((scissor_w << RADEON_RE_WIDTH_SHIFT) | - (scissor_h << RADEON_RE_HEIGHT_SHIFT))); - FINISH_ACCEL(); - - if (pPriv->vsync) { - xf86CrtcPtr crtc; - if (pPriv->desired_crtc) - crtc = pPriv->desired_crtc; - else - crtc = radeon_pick_best_crtc(pScrn, - pPriv->drw_x, - pPriv->drw_x + pPriv->dst_w, - pPriv->drw_y, - pPriv->drw_y + pPriv->dst_h); - if (crtc) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pPixmap, - crtc, - pPriv->drw_y - crtc->y, - (pPriv->drw_y - crtc->y) + pPriv->dst_h); - } - - return TRUE; -} - -static void -FUNC_NAME(R200DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pPixmap = pPriv->pPixmap; - int dstxoff, dstyoff; - BoxPtr pBox = REGION_RECTS(&pPriv->clip); - int nBox = REGION_NUM_RECTS(&pPriv->clip); - ACCEL_PREAMBLE(); - -#ifdef COMPOSITE - dstxoff = -pPixmap->screen_x + pPixmap->drawable.x; - dstyoff = -pPixmap->screen_y + pPixmap->drawable.y; -#else - dstxoff = 0; - dstyoff = 0; -#endif - - if (!FUNC_NAME(R200PrepareTexturedVideo)(pScrn, pPriv)) - return; - - /* - * Rendering of the actual polygon is done in two different - * ways depending on chip generation: - * - * < R300: - * - * These chips can render a rectangle in one pass, so - * handling is pretty straight-forward. - * - * >= R300: - * - * These chips can accept a quad, but will render it as - * two triangles which results in a diagonal tear. Instead - * We render a single, large triangle and use the scissor - * functionality to restrict it to the desired rectangle. - * Due to guardband limits on r3xx/r4xx, we can only use - * the single triangle up to 2560/4021 pixels; above that we - * render as a quad. - */ - -#ifdef ACCEL_CP - while (nBox) { - int draw_size = 3 * pPriv->vtx_count + 4; - int loop_boxes; - - if (draw_size > radeon_cs_space_remaining(pScrn)) { - if (info->cs) - radeon_cs_flush_indirect(pScrn); - else - RADEONCPFlushIndirect(pScrn, 1); - if (!FUNC_NAME(R200PrepareTexturedVideo)(pScrn, pPriv)) - return; - } - loop_boxes = MIN(radeon_cs_space_remaining(pScrn) / draw_size, nBox); - nBox -= loop_boxes; - - BEGIN_RING(loop_boxes * 3 * pPriv->vtx_count + 4); - OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - loop_boxes * 3 * pPriv->vtx_count)); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - ((loop_boxes * 3) << RADEON_CP_VC_CNTL_NUM_SHIFT)); - - while (loop_boxes--) { - int srcX, srcY, srcw, srch; - int dstX, dstY, dstw, dsth; - dstX = pBox->x1 + dstxoff; - dstY = pBox->y1 + dstyoff; - dstw = pBox->x2 - pBox->x1; - dsth = pBox->y2 - pBox->y1; - - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; - - srcw = (pPriv->src_w * dstw) / pPriv->dst_w; - srch = (pPriv->src_h * dsth) / pPriv->dst_h; - - if (pPriv->is_planar) { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_6((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } else { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_4((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } - - pBox++; - } - - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); - ADVANCE_RING(); - } -#else /* ACCEL_CP */ - BEGIN_ACCEL(nBox * 3 * pPriv->vtx_count + 2); - OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST | - RADEON_VF_PRIM_WALK_DATA | - ((nBox * 3) << RADEON_VF_NUM_VERTICES_SHIFT))); - while (nBox--) { - int srcX, srcY, srcw, srch; - int dstX, dstY, dstw, dsth; - dstX = pBox->x1 + dstxoff; - dstY = pBox->y1 + dstyoff; - dstw = pBox->x2 - pBox->x1; - dsth = pBox->y2 - pBox->y1; - - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; - - srcw = (pPriv->src_w * dstw) / pPriv->dst_w; - srch = (pPriv->src_h * dsth) / pPriv->dst_h; - - if (pPriv->is_planar) { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_6((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_6((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } else { - /* - * Just render a rect (using three coords). - */ - VTX_OUT_4((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } - - pBox++; - } - - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); - FINISH_ACCEL(); -#endif /* !ACCEL_CP */ - - DamageDamageRegion(pPriv->pDraw, &pPriv->clip); -} - -static Bool -FUNC_NAME(R300PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pPixmap = pPriv->pPixmap; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *src_bo = pPriv->src_bo[pPriv->currentBuffer]; uint32_t txfilter, txformat0, txformat1, txoffset, txpitch; - uint32_t dst_pitch, dst_format; - uint32_t txenable, colorpitch, bicubic_offset; - uint32_t output_fmt; - int pixel_shift; + uint32_t dst_offset, dst_pitch, dst_format; + uint32_t txenable, colorpitch; + uint32_t blendcntl; + Bool isplanar = FALSE; + int dstxoff, dstyoff, pixel_shift, vtx_count; + BoxPtr pBox = REGION_RECTS(&pPriv->clip); + int nBox = REGION_NUM_RECTS(&pPriv->clip); ACCEL_PREAMBLE(); -#ifdef XF86DRM_MODE - if (info->cs) { - int ret; - - radeon_cs_space_reset_bos(info->cs); - radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - if (pPriv->bicubic_enabled) - radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - driver_priv = exaGetPixmapDriverPrivate(pPixmap); - radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); - - ret = radeon_cs_space_check(info->cs); - if (ret) { - ErrorF("Not enough RAM to hw accel xv operation\n"); - return FALSE; - } - } -#endif - pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; #ifdef USE_EXA if (info->useEXA) { + dst_offset = exaGetPixmapOffset(pPixmap) + info->fbLocation + pScrn->fbOffset; dst_pitch = exaGetPixmapPitch(pPixmap); } else #endif - { - dst_pitch = pPixmap->devKind; - } - -#ifdef USE_EXA - if (info->useEXA) { - RADEON_SWITCH_TO_3D(); - } else -#endif - { - BEGIN_ACCEL(2); - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); - /* We must wait for 3d to idle, in case source was just written as a dest. */ - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_HOST_IDLECLEAN | - RADEON_WAIT_2D_IDLECLEAN | - RADEON_WAIT_3D_IDLECLEAN | - RADEON_WAIT_DMA_GUI_IDLE); - FINISH_ACCEL(); - - if (!info->accel_state->XInited3D) - RADEONInit3DEngine(pScrn); - } - - if (pPriv->bicubic_enabled) - pPriv->vtx_count = 6; - else - pPriv->vtx_count = 4; - - switch (pPixmap->drawable.bitsPerPixel) { - case 16: - if (pPixmap->drawable.depth == 15) - dst_format = R300_COLORFORMAT_ARGB1555; - else - dst_format = R300_COLORFORMAT_RGB565; - break; - case 32: - dst_format = R300_COLORFORMAT_ARGB8888; - break; - default: - return FALSE; - } - - output_fmt = (R300_OUT_FMT_C4_8 | - R300_OUT_FMT_C0_SEL_BLUE | - R300_OUT_FMT_C1_SEL_GREEN | - R300_OUT_FMT_C2_SEL_RED | - R300_OUT_FMT_C3_SEL_ALPHA); - - colorpitch = dst_pitch >> pixel_shift; - colorpitch |= dst_format; - - if (RADEONTilingEnabled(pScrn, pPixmap)) - colorpitch |= R300_COLORTILE; - - - if (((pPriv->bicubic_state == BICUBIC_OFF)) && - (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12)) - pPriv->is_planar = TRUE; - else - pPriv->is_planar = FALSE; - - if (pPriv->is_planar) { - txformat1 = R300_TX_FORMAT_X8 | R300_TX_FORMAT_CACHE_HALF_REGION_0; - txpitch = pPriv->src_pitch; - } else { - if (pPriv->id == FOURCC_UYVY) - txformat1 = R300_TX_FORMAT_YVYU422; - else - txformat1 = R300_TX_FORMAT_VYUY422; - - if (pPriv->bicubic_state != BICUBIC_OFF) - txformat1 |= R300_TX_FORMAT_YUV_TO_RGB_CLAMP; - - /* pitch is in pixels */ - txpitch = pPriv->src_pitch / 2; - } - txpitch -= 1; - - txformat0 = ((((pPriv->w - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | - (((pPriv->h - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) | - R300_TXPITCH_EN); - - txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | - R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST) | - R300_TX_MAG_FILTER_LINEAR | - R300_TX_MIN_FILTER_LINEAR | - (0 << R300_TX_ID_SHIFT)); - - txoffset = info->cs ? 0 : pPriv->src_offset; - - BEGIN_ACCEL_RELOC(6, 1); - OUT_ACCEL_REG(R300_TX_FILTER0_0, txfilter); - OUT_ACCEL_REG(R300_TX_FILTER1_0, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_0, txformat0); - if (pPriv->is_planar) - OUT_ACCEL_REG(R300_TX_FORMAT1_0, txformat1 | R300_TX_FORMAT_CACHE_HALF_REGION_0); - else - OUT_ACCEL_REG(R300_TX_FORMAT1_0, txformat1); - OUT_ACCEL_REG(R300_TX_FORMAT2_0, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_0, txoffset, src_bo); - FINISH_ACCEL(); - - txenable = R300_TEX_0_ENABLE; - - if (pPriv->is_planar) { - txformat0 = ((((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | - (((((pPriv->h + 1 ) >> 1 ) - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) | - R300_TXPITCH_EN); - txpitch = RADEON_ALIGN(pPriv->src_pitch >> 1, 64); - txpitch -= 1; - txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | - R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST) | - R300_TX_MIN_FILTER_LINEAR | - R300_TX_MAG_FILTER_LINEAR); - - BEGIN_ACCEL_RELOC(12, 2); - OUT_ACCEL_REG(R300_TX_FILTER0_1, txfilter | (1 << R300_TX_ID_SHIFT)); - OUT_ACCEL_REG(R300_TX_FILTER1_1, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0); - OUT_ACCEL_REG(R300_TX_FORMAT1_1, R300_TX_FORMAT_X8 | R300_TX_FORMAT_CACHE_FOURTH_REGION_2); - OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_1, txoffset + pPriv->planeu_offset, src_bo); - OUT_ACCEL_REG(R300_TX_FILTER0_2, txfilter | (2 << R300_TX_ID_SHIFT)); - OUT_ACCEL_REG(R300_TX_FILTER1_2, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_2, txformat0); - OUT_ACCEL_REG(R300_TX_FORMAT1_2, R300_TX_FORMAT_X8 | R300_TX_FORMAT_CACHE_FOURTH_REGION_3); - OUT_ACCEL_REG(R300_TX_FORMAT2_2, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_2, txoffset + pPriv->planev_offset, src_bo); - FINISH_ACCEL(); - txenable |= R300_TEX_1_ENABLE | R300_TEX_2_ENABLE; - } - - if (pPriv->bicubic_enabled) { - /* Size is 128x1 */ - txformat0 = ((0x7f << R300_TXWIDTH_SHIFT) | - (0x0 << R300_TXHEIGHT_SHIFT) | - R300_TXPITCH_EN); - /* Format is 32-bit floats, 4bpp */ - txformat1 = R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16); - /* Pitch is 127 (128-1) */ - txpitch = 0x7f; - /* Tex filter */ - txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_WRAP) | - R300_TX_CLAMP_T(R300_TX_CLAMP_WRAP) | - R300_TX_MIN_FILTER_NEAREST | - R300_TX_MAG_FILTER_NEAREST | - (1 << R300_TX_ID_SHIFT)); - - if (info->cs) - bicubic_offset = 0; - else - bicubic_offset = pPriv->bicubic_src_offset; - - BEGIN_ACCEL_RELOC(6, 1); - OUT_ACCEL_REG(R300_TX_FILTER0_1, txfilter); - OUT_ACCEL_REG(R300_TX_FILTER1_1, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0); - OUT_ACCEL_REG(R300_TX_FORMAT1_1, txformat1); - OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_1, bicubic_offset, info->bicubic_bo); - FINISH_ACCEL(); - - /* Enable tex 1 */ - txenable |= R300_TEX_1_ENABLE; - } - - /* setup the VAP */ - if (info->accel_state->has_tcl) { - if (pPriv->bicubic_enabled) - BEGIN_ACCEL(7); - else - BEGIN_ACCEL(6); - } else { - if (pPriv->bicubic_enabled) - BEGIN_ACCEL(5); - else - BEGIN_ACCEL(4); - } - - /* These registers define the number, type, and location of data submitted - * to the PVS unit of GA input (when PVS is disabled) - * DST_VEC_LOC is the slot in the PVS input vector memory when PVS/TCL is - * enabled. This memory provides the imputs to the vertex shader program - * and ordering is not important. When PVS/TCL is disabled, this field maps - * directly to the GA input memory and the order is signifigant. In - * PVS_BYPASS mode the order is as follows: - * Position - * Point Size - * Color 0-3 - * Textures 0-7 - * Fog - */ - if (pPriv->bicubic_enabled) { - OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, - ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | - (0 << R300_SKIP_DWORDS_0_SHIFT) | - (0 << R300_DST_VEC_LOC_0_SHIFT) | - R300_SIGNED_0 | - (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | - (0 << R300_SKIP_DWORDS_1_SHIFT) | - (6 << R300_DST_VEC_LOC_1_SHIFT) | - R300_SIGNED_1)); - OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_1, - ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_2_SHIFT) | - (0 << R300_SKIP_DWORDS_2_SHIFT) | - (7 << R300_DST_VEC_LOC_2_SHIFT) | - R300_LAST_VEC_2 | - R300_SIGNED_2)); - } else { - OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, - ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | - (0 << R300_SKIP_DWORDS_0_SHIFT) | - (0 << R300_DST_VEC_LOC_0_SHIFT) | - R300_SIGNED_0 | - (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | - (0 << R300_SKIP_DWORDS_1_SHIFT) | - (6 << R300_DST_VEC_LOC_1_SHIFT) | - R300_LAST_VEC_1 | - R300_SIGNED_1)); - } - - /* load the vertex shader - * We pre-load vertex programs in RADEONInit3DEngine(): - * - exa - * - Xv - * - Xv bicubic - * Here we select the offset of the vertex program we want to use - */ - if (info->accel_state->has_tcl) { - if (pPriv->bicubic_enabled) { - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, - ((11 << R300_PVS_FIRST_INST_SHIFT) | - (13 << R300_PVS_XYZW_VALID_INST_SHIFT) | - (13 << R300_PVS_LAST_INST_SHIFT))); - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, - (13 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); - } else { - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, - ((9 << R300_PVS_FIRST_INST_SHIFT) | - (10 << R300_PVS_XYZW_VALID_INST_SHIFT) | - (10 << R300_PVS_LAST_INST_SHIFT))); - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, - (10 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + { + dst_offset = (pPixmap->devPrivate.ptr - info->FB) + + info->fbLocation + pScrn->fbOffset; + dst_pitch = pPixmap->devKind; } - } - - /* Position and one set of 2 texture coordinates */ - OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_0, R300_VTX_POS_PRESENT); - if (pPriv->bicubic_enabled) - OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, ((2 << R300_TEX_0_COMP_CNT_SHIFT) | - (2 << R300_TEX_1_COMP_CNT_SHIFT))); - else - OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, (2 << R300_TEX_0_COMP_CNT_SHIFT)); - - OUT_ACCEL_REG(R300_US_OUT_FMT_0, output_fmt); - FINISH_ACCEL(); - - /* setup pixel shader */ - if (pPriv->bicubic_state != BICUBIC_OFF) { - if (pPriv->bicubic_enabled) { - BEGIN_ACCEL(79); - - /* 4 components: 2 for tex0 and 2 for tex1 */ - OUT_ACCEL_REG(R300_RS_COUNT, ((4 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); - - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1)); - - /* Pixel stack frame size. */ - OUT_ACCEL_REG(R300_US_PIXSIZE, 5); - - /* Indirection levels */ - OUT_ACCEL_REG(R300_US_CONFIG, ((2 << R300_NLEVEL_SHIFT) | - R300_FIRST_TEX)); - - /* Set nodes. */ - OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | - R300_ALU_CODE_SIZE(14) | - R300_TEX_CODE_OFFSET(0) | - R300_TEX_CODE_SIZE(6))); - - /* Nodes are allocated highest first, but executed lowest first */ - OUT_ACCEL_REG(R300_US_CODE_ADDR_0, 0); - OUT_ACCEL_REG(R300_US_CODE_ADDR_1, (R300_ALU_START(0) | - R300_ALU_SIZE(0) | - R300_TEX_START(0) | - R300_TEX_SIZE(0))); - OUT_ACCEL_REG(R300_US_CODE_ADDR_2, (R300_ALU_START(1) | - R300_ALU_SIZE(9) | - R300_TEX_START(1) | - R300_TEX_SIZE(0))); - OUT_ACCEL_REG(R300_US_CODE_ADDR_3, (R300_ALU_START(11) | - R300_ALU_SIZE(2) | - R300_TEX_START(2) | - R300_TEX_SIZE(3) | - R300_RGBA_OUT)); - - /* ** BICUBIC FP ** */ - - /* texcoord0 => temp0 - * texcoord1 => temp1 */ - - // first node - /* TEX temp2, temp1.rrr0, tex1, 1D */ - OUT_ACCEL_REG(R300_US_TEX_INST(0), (R300_TEX_INST(R300_TEX_INST_LD) | - R300_TEX_ID(1) | - R300_TEX_SRC_ADDR(1) | - R300_TEX_DST_ADDR(2))); - - /* MOV temp1.r, temp1.ggg0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(0), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(0), (R300_ALU_RGB_ADDR0(1) | - R300_ALU_RGB_ADDRD(1) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(0), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(0), (R300_ALU_ALPHA_ADDRD(1) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - - // second node - /* TEX temp1, temp1, tex1, 1D */ - OUT_ACCEL_REG(R300_US_TEX_INST(1), (R300_TEX_INST(R300_TEX_INST_LD) | - R300_TEX_ID(1) | - R300_TEX_SRC_ADDR(1) | - R300_TEX_DST_ADDR(1))); - - /* MUL temp3.rg, temp2.ggg0, const0.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(1), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(1), (R300_ALU_RGB_ADDR0(2) | - R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(0)) | - R300_ALU_RGB_ADDRD(3) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(1), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(1), (R300_ALU_ALPHA_ADDRD(3) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - - /* MUL temp2.rg, temp2.rrr0, const0.rgb */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(2), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RRR) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(2), (R300_ALU_RGB_ADDR0(2) | - R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(0)) | - R300_ALU_RGB_ADDRD(2) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(2), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(2), (R300_ALU_ALPHA_ADDRD(2) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* MAD temp4.rg, temp1.ggg0, const1.rgb, temp3.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(3), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(3), (R300_ALU_RGB_ADDR0(1) | - R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | - R300_ALU_RGB_ADDR2(3) | - R300_ALU_RGB_ADDRD(4) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(3), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(3), (R300_ALU_ALPHA_ADDRD(4) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* MAD temp5.rg, temp1.ggg0, const1.rgb, temp2.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(4), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(4), (R300_ALU_RGB_ADDR0(1) | - R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | - R300_ALU_RGB_ADDR2(2) | - R300_ALU_RGB_ADDRD(5) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(4), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(4), (R300_ALU_ALPHA_ADDRD(5) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* MAD temp3.rg, temp1.rrr0, const1.rgb, temp3.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(5), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RRR) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(5), (R300_ALU_RGB_ADDR0(1) | - R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | - R300_ALU_RGB_ADDR2(3) | - R300_ALU_RGB_ADDRD(3) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(5), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(5), (R300_ALU_ALPHA_ADDRD(3) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* MAD temp1.rg, temp1.rrr0, const1.rgb, temp2.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(6), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RRR) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(6), (R300_ALU_RGB_ADDR0(1) | - R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | - R300_ALU_RGB_ADDR2(2) | - R300_ALU_RGB_ADDRD(1) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(6), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(6), (R300_ALU_ALPHA_ADDRD(1) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* ADD temp1.rg, temp0.rgb0, temp1.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(7), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(7), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR2(1) | - R300_ALU_RGB_ADDRD(1) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(7), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(7), (R300_ALU_ALPHA_ADDRD(1) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* ADD temp2.rg, temp0.rgb0, temp3.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(8), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(8), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR2(3) | - R300_ALU_RGB_ADDRD(2) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(8), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(8), (R300_ALU_ALPHA_ADDRD(2) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* ADD temp3.rg, temp0.rgb0, temp5.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(9), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(9), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR2(5) | - R300_ALU_RGB_ADDRD(3) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(9), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(9), (R300_ALU_ALPHA_ADDRD(3) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - /* ADD temp0.rg, temp0.rgb0, temp4.rgb0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(10), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(10), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR2(4) | - R300_ALU_RGB_ADDRD(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(10), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(10), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - - - // third node - /* TEX temp4, temp1.rg--, tex0, 1D */ - OUT_ACCEL_REG(R300_US_TEX_INST(2), (R300_TEX_INST(R300_TEX_INST_LD) | - R300_TEX_ID(0) | - R300_TEX_SRC_ADDR(1) | - R300_TEX_DST_ADDR(4))); - - /* TEX temp3, temp3.rg--, tex0, 1D */ - OUT_ACCEL_REG(R300_US_TEX_INST(3), (R300_TEX_INST(R300_TEX_INST_LD) | - R300_TEX_ID(0) | - R300_TEX_SRC_ADDR(3) | - R300_TEX_DST_ADDR(3))); - - /* TEX temp5, temp2.rg--, tex0, 1D */ - OUT_ACCEL_REG(R300_US_TEX_INST(4), (R300_TEX_INST(R300_TEX_INST_LD) | - R300_TEX_ID(0) | - R300_TEX_SRC_ADDR(2) | - R300_TEX_DST_ADDR(5))); - - /* TEX temp0, temp0.rg--, tex0, 1D */ - OUT_ACCEL_REG(R300_US_TEX_INST(5), (R300_TEX_INST(R300_TEX_INST_LD) | - R300_TEX_ID(0) | - R300_TEX_SRC_ADDR(0) | - R300_TEX_DST_ADDR(0))); - - /* LRP temp3, temp1.bbbb, temp4, temp3 -> - * - PRESUB temps, temp4 - temp3 - * - MAD temp3, temp1.bbbb, temps, temp3 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(11), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC2_BBB) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRCP_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_SRCP_OP(R300_ALU_RGB_SRCP_OP_RGB1_MINUS_RGB0))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(11), (R300_ALU_RGB_ADDR0(3) | - R300_ALU_RGB_ADDR1(4) | - R300_ALU_RGB_ADDR2(1) | - R300_ALU_RGB_ADDRD(3) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(11), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC2_B) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_SRCP_A) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_SRC0_A))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(11), (R300_ALU_ALPHA_ADDR0(3) | - R300_ALU_ALPHA_ADDR1(4) | - R300_ALU_ALPHA_ADDR2(1) | - R300_ALU_ALPHA_ADDRD(3) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_A))); - - /* LRP temp0, temp1.bbbb, temp5, temp0 -> - * - PRESUB temps, temp5 - temp0 - * - MAD temp0, temp1.bbbb, temps, temp0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(12), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC2_BBB) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRCP_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_SRCP_OP(R300_ALU_RGB_SRCP_OP_RGB1_MINUS_RGB0) | - R300_ALU_RGB_INSERT_NOP)); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(12), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR1(5) | - R300_ALU_RGB_ADDR2(1) | - R300_ALU_RGB_ADDRD(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(12), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC2_B) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_SRCP_A) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_SRC0_A))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(12), (R300_ALU_ALPHA_ADDR0(0) | - R300_ALU_ALPHA_ADDR1(5) | - R300_ALU_ALPHA_ADDR2(1) | - R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_A))); - - /* LRP output, temp2.bbbb, temp3, temp0 -> - * - PRESUB temps, temp3 - temp0 - * - MAD output, temp2.bbbb, temps, temp0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(13), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC2_BBB) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRCP_RGB) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_SRCP_OP(R300_ALU_RGB_SRCP_OP_RGB1_MINUS_RGB0))); - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(13), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR1(3) | - R300_ALU_RGB_ADDR2(2) | - R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(13), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC2_B) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_SRCP_A) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_SRC0_A))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(13), (R300_ALU_ALPHA_ADDR0(0) | - R300_ALU_ALPHA_ADDR1(3) | - R300_ALU_ALPHA_ADDR2(2) | - R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A))); - - /* Shader constants. */ - OUT_ACCEL_REG(R300_US_ALU_CONST_R(0), F_TO_24(1.0/(float)pPriv->w)); - OUT_ACCEL_REG(R300_US_ALU_CONST_G(0), 0); - OUT_ACCEL_REG(R300_US_ALU_CONST_B(0), 0); - OUT_ACCEL_REG(R300_US_ALU_CONST_A(0), 0); - - OUT_ACCEL_REG(R300_US_ALU_CONST_R(1), 0); - OUT_ACCEL_REG(R300_US_ALU_CONST_G(1), F_TO_24(1.0/(float)pPriv->h)); - OUT_ACCEL_REG(R300_US_ALU_CONST_B(1), 0); - OUT_ACCEL_REG(R300_US_ALU_CONST_A(1), 0); - - FINISH_ACCEL(); - } else { - BEGIN_ACCEL(11); - /* 2 components: 2 for tex0 */ - OUT_ACCEL_REG(R300_RS_COUNT, - ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); - - OUT_ACCEL_REG(R300_US_PIXSIZE, 0); /* highest temp used */ - - /* Indirection levels */ - OUT_ACCEL_REG(R300_US_CONFIG, ((0 << R300_NLEVEL_SHIFT) | - R300_FIRST_TEX)); - - OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | - R300_ALU_CODE_SIZE(1) | - R300_TEX_CODE_OFFSET(0) | - R300_TEX_CODE_SIZE(1))); - - OUT_ACCEL_REG(R300_US_CODE_ADDR_3, (R300_ALU_START(0) | - R300_ALU_SIZE(0) | - R300_TEX_START(0) | - R300_TEX_SIZE(0) | - R300_RGBA_OUT)); - - /* tex inst */ - OUT_ACCEL_REG(R300_US_TEX_INST_0, (R300_TEX_SRC_ADDR(0) | - R300_TEX_DST_ADDR(0) | - R300_TEX_ID(0) | - R300_TEX_INST(R300_TEX_INST_LD))); - - /* ALU inst */ - /* RGB */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR_0, (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR1(0) | - R300_ALU_RGB_ADDR2(0) | - R300_ALU_RGB_ADDRD(0) | - R300_ALU_RGB_OMASK((R300_ALU_RGB_MASK_R | - R300_ALU_RGB_MASK_G | - R300_ALU_RGB_MASK_B)) | - R300_ALU_RGB_TARGET_A)); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST_0, (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | - R300_ALU_RGB_CLAMP)); - /* Alpha */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR_0, (R300_ALU_ALPHA_ADDR0(0) | - R300_ALU_ALPHA_ADDR1(0) | - R300_ALU_ALPHA_ADDR2(0) | - R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | - R300_ALU_ALPHA_TARGET_A | - R300_ALU_ALPHA_OMASK_W(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST_0, (R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_A) | - R300_ALU_ALPHA_MOD_A(R300_ALU_ALPHA_MOD_NOP) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_1_0) | - R300_ALU_ALPHA_MOD_B(R300_ALU_ALPHA_MOD_NOP) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_MOD_C(R300_ALU_ALPHA_MOD_NOP) | - R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_OMOD(R300_ALU_ALPHA_OMOD_NONE) | - R300_ALU_ALPHA_CLAMP)); - FINISH_ACCEL(); - } - } else { - /* - * y' = y - .0625 - * u' = u - .5 - * v' = v - .5; - * - * r = 1.1643 * y' + 0.0 * u' + 1.5958 * v' - * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v' - * b = 1.1643 * y' + 2.017 * u' + 0.0 * v' - * - * DP3 might look like the straightforward solution - * but we'd need to move the texture yuv values in - * the same reg for this to work. Therefore use MADs. - * Brightness just adds to the off constant. - * Contrast is multiplication of luminance. - * Saturation and hue change the u and v coeffs. - * Default values (before adjustments - depend on colorspace): - * yco = 1.1643 - * uco = 0, -0.39173, 2.017 - * vco = 1.5958, -0.8129, 0 - * off = -0.0625 * yco + -0.5 * uco[r] + -0.5 * vco[r], - * -0.0625 * yco + -0.5 * uco[g] + -0.5 * vco[g], - * -0.0625 * yco + -0.5 * uco[b] + -0.5 * vco[b], - * - * temp = MAD(yco, yuv.yyyy, off) - * temp = MAD(uco, yuv.uuuu, temp) - * result = MAD(vco, yuv.vvvv, temp) - */ - /* TODO: don't recalc consts always */ - const float Loff = -0.0627; - const float Coff = -0.502; - float uvcosf, uvsinf; - float yco; - float uco[3], vco[3], off[3]; - float bright, cont, gamma; - int ref = pPriv->transform_index; - Bool needgamma = FALSE; - - cont = RTFContrast(pPriv->contrast); - bright = RTFBrightness(pPriv->brightness); - gamma = (float)pPriv->gamma / 1000.0; - uvcosf = RTFSaturation(pPriv->saturation) * cos(RTFHue(pPriv->hue)); - uvsinf = RTFSaturation(pPriv->saturation) * sin(RTFHue(pPriv->hue)); - /* overlay video also does pre-gamma contrast/sat adjust, should we? */ - - yco = trans[ref].RefLuma * cont; - uco[0] = -trans[ref].RefRCr * uvsinf; - uco[1] = trans[ref].RefGCb * uvcosf - trans[ref].RefGCr * uvsinf; - uco[2] = trans[ref].RefBCb * uvcosf; - vco[0] = trans[ref].RefRCr * uvcosf; - vco[1] = trans[ref].RefGCb * uvsinf + trans[ref].RefGCr * uvcosf; - vco[2] = trans[ref].RefBCb * uvsinf; - off[0] = Loff * yco + Coff * (uco[0] + vco[0]) + bright; - off[1] = Loff * yco + Coff * (uco[1] + vco[1]) + bright; - off[2] = Loff * yco + Coff * (uco[2] + vco[2]) + bright; - - if (gamma != 1.0) { - needgamma = TRUE; - /* note: gamma correction is out = in ^ gamma; - gpu can only do LG2/EX2 therefore we transform into - in ^ gamma = 2 ^ (log2(in) * gamma). - Lots of scalar ops, unfortunately (better solution?) - - without gamma that's 3 inst, with gamma it's 10... - could use different gamma factors per channel, - if that's of any use. */ - } - - if (pPriv->is_planar) { - BEGIN_ACCEL(needgamma ? 28 + 33 : 33); - /* 2 components: same 2 for tex0/1/2 */ - OUT_ACCEL_REG(R300_RS_COUNT, - ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); - - OUT_ACCEL_REG(R300_US_PIXSIZE, 2); /* highest temp used */ - - /* Indirection levels */ - OUT_ACCEL_REG(R300_US_CONFIG, ((0 << R300_NLEVEL_SHIFT) | - R300_FIRST_TEX)); - - OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | - R300_ALU_CODE_SIZE(needgamma ? 7 + 3 : 3) | - R300_TEX_CODE_OFFSET(0) | - R300_TEX_CODE_SIZE(3))); - - OUT_ACCEL_REG(R300_US_CODE_ADDR_3, (R300_ALU_START(0) | - R300_ALU_SIZE(needgamma ? 7 + 2 : 2) | - R300_TEX_START(0) | - R300_TEX_SIZE(2) | - R300_RGBA_OUT)); - - /* tex inst */ - OUT_ACCEL_REG(R300_US_TEX_INST_0, (R300_TEX_SRC_ADDR(0) | - R300_TEX_DST_ADDR(2) | - R300_TEX_ID(0) | - R300_TEX_INST(R300_TEX_INST_LD))); - OUT_ACCEL_REG(R300_US_TEX_INST_1, (R300_TEX_SRC_ADDR(0) | - R300_TEX_DST_ADDR(1) | - R300_TEX_ID(1) | - R300_TEX_INST(R300_TEX_INST_LD))); - OUT_ACCEL_REG(R300_US_TEX_INST_2, (R300_TEX_SRC_ADDR(0) | - R300_TEX_DST_ADDR(0) | - R300_TEX_ID(2) | - R300_TEX_INST(R300_TEX_INST_LD))); - - /* ALU inst */ - /* MAD temp2.rgb, const0.aaa, temp2.rgb, const0.rgb */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(0), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(0)) | - R300_ALU_RGB_ADDR1(2) | - R300_ALU_RGB_ADDR2(0) | - R300_ALU_RGB_ADDRD(2) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(0), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_AAA) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); - /* alpha nop, but need to set up alpha source for rgb usage */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(0), (R300_ALU_ALPHA_ADDR0(R300_ALU_ALPHA_CONST(0)) | - R300_ALU_ALPHA_ADDR1(2) | - R300_ALU_ALPHA_ADDR2(0) | - R300_ALU_ALPHA_ADDRD(2) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(0), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* MAD temp2.rgb, const1.rgb, temp1.rgb, temp2.rgb */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(1), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(1)) | - R300_ALU_RGB_ADDR1(1) | - R300_ALU_RGB_ADDR2(2) | - R300_ALU_RGB_ADDRD(2) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(1), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); - /* alpha nop */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(1), (R300_ALU_ALPHA_ADDRD(2) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(1), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* MAD result.rgb, const2.rgb, temp0.rgb, temp2.rgb */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(2), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(2)) | - R300_ALU_RGB_ADDR1(0) | - R300_ALU_RGB_ADDR2(2) | - R300_ALU_RGB_ADDRD(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB) | - (needgamma ? 0 : R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_RGB)))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(2), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | - R300_ALU_RGB_CLAMP)); - /* write alpha 1 */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(2), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | - R300_ALU_ALPHA_TARGET_A)); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(2), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_1_0))); - - if (needgamma) { - /* rgb temp0.r = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(3), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(3), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha lg2 temp0, temp0.r */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(3), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(3), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_LN2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_R) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb temp0.g = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(4), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(4), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha lg2 temp0, temp0.g */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(4), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(4), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_LN2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_G) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb temp0.b = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(5), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_B))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(5), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha lg2 temp0, temp0.b */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(5), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(5), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_LN2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_B) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* MUL const1, temp1, temp0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(6), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR1(0) | - R300_ALU_RGB_ADDR2(0) | - R300_ALU_RGB_ADDRD(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(6), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC0_AAA) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); - /* alpha nop, but set up const1 */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(6), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_ADDR0(R300_ALU_ALPHA_CONST(1)) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(6), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb out0.r = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(7), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R) | - R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_R))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(7), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha ex2 temp0, temp0.r */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(7), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(7), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_EX2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_R) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb out0.g = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(8), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_G) | - R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(8), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha ex2 temp0, temp0.g */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(8), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(8), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_EX2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_G) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb out0.b = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(9), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_B) | - R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_B))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(9), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha ex2 temp0, temp0.b */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(9), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(9), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_EX2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_B) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - } - } else { - BEGIN_ACCEL(needgamma ? 28 + 31 : 31); - /* 2 components */ - OUT_ACCEL_REG(R300_RS_COUNT, - ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); - - OUT_ACCEL_REG(R300_US_PIXSIZE, 1); /* highest temp used */ - - /* Indirection levels */ - OUT_ACCEL_REG(R300_US_CONFIG, ((0 << R300_NLEVEL_SHIFT) | - R300_FIRST_TEX)); - - OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | - R300_ALU_CODE_SIZE(needgamma ? 7 + 3 : 3) | - R300_TEX_CODE_OFFSET(0) | - R300_TEX_CODE_SIZE(1))); - - OUT_ACCEL_REG(R300_US_CODE_ADDR_3, (R300_ALU_START(0) | - R300_ALU_SIZE(needgamma ? 7 + 2 : 2) | - R300_TEX_START(0) | - R300_TEX_SIZE(0) | - R300_RGBA_OUT)); - - /* tex inst */ - OUT_ACCEL_REG(R300_US_TEX_INST_0, (R300_TEX_SRC_ADDR(0) | - R300_TEX_DST_ADDR(0) | - R300_TEX_ID(0) | - R300_TEX_INST(R300_TEX_INST_LD))); - - /* ALU inst */ - /* MAD temp1.rgb, const0.aaa, temp0.ggg, const0.rgb */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(0), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(0)) | - R300_ALU_RGB_ADDR1(0) | - R300_ALU_RGB_ADDR2(0) | - R300_ALU_RGB_ADDRD(1) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(0), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_AAA) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_GGG) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); - /* alpha nop, but need to set up alpha source for rgb usage */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(0), (R300_ALU_ALPHA_ADDR0(R300_ALU_ALPHA_CONST(0)) | - R300_ALU_ALPHA_ADDR1(0) | - R300_ALU_ALPHA_ADDR2(0) | - R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(0), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* MAD temp1.rgb, const1.rgb, temp0.bbb, temp1.rgb */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(1), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(1)) | - R300_ALU_RGB_ADDR1(0) | - R300_ALU_RGB_ADDR2(1) | - R300_ALU_RGB_ADDRD(1) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(1), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_BBB) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); - /* alpha nop */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(1), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(1), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* MAD result.rgb, const2.rgb, temp0.rrr, temp1.rgb */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(2), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(2)) | - R300_ALU_RGB_ADDR1(0) | - R300_ALU_RGB_ADDR2(1) | - R300_ALU_RGB_ADDRD(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB) | - (needgamma ? 0 : R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_RGB)))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(2), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RRR) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | - R300_ALU_RGB_CLAMP)); - /* write alpha 1 */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(2), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | - R300_ALU_ALPHA_TARGET_A)); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(2), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_1_0))); - - if (needgamma) { - /* rgb temp0.r = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(3), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(3), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha lg2 temp0, temp0.r */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(3), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(3), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_LN2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_R) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb temp0.g = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(4), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(4), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha lg2 temp0, temp0.g */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(4), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(4), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_LN2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_G) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb temp0.b = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(5), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_B))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(5), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha lg2 temp0, temp0.b */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(5), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(5), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_LN2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_B) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* MUL const1, temp1, temp0 */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(6), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_ADDR1(0) | - R300_ALU_RGB_ADDR2(0) | - R300_ALU_RGB_ADDRD(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(6), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | - R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC0_AAA) | - R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0) | - R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | - R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); - /* alpha nop, but set up const1 */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(6), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_ADDR0(R300_ALU_ALPHA_CONST(1)) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(6), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb out0.r = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(7), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R) | - R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_R))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(7), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha ex2 temp0, temp0.r */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(7), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(7), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_EX2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_R) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb out0.g = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(8), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_G) | - R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_G))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(8), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha ex2 temp0, temp0.g */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(8), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(8), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_EX2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_G) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - - /* rgb out0.b = op_sop, set up src0 reg */ - OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(9), (R300_ALU_RGB_ADDR0(0) | - R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_B) | - R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_B))); - OUT_ACCEL_REG(R300_US_ALU_RGB_INST(9), - R300_ALU_RGB_OP(R300_ALU_RGB_OP_SOP) | - R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE)); - /* alpha ex2 temp0, temp0.b */ - OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(9), (R300_ALU_ALPHA_ADDRD(0) | - R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); - OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(9), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_EX2) | - R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_B) | - R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | - R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); - } - } - - /* Shader constants. */ - /* constant 0: off, yco */ - OUT_ACCEL_REG(R300_US_ALU_CONST_R(0), F_TO_24(off[0])); - OUT_ACCEL_REG(R300_US_ALU_CONST_G(0), F_TO_24(off[1])); - OUT_ACCEL_REG(R300_US_ALU_CONST_B(0), F_TO_24(off[2])); - OUT_ACCEL_REG(R300_US_ALU_CONST_A(0), F_TO_24(yco)); - /* constant 1: uco */ - OUT_ACCEL_REG(R300_US_ALU_CONST_R(1), F_TO_24(uco[0])); - OUT_ACCEL_REG(R300_US_ALU_CONST_G(1), F_TO_24(uco[1])); - OUT_ACCEL_REG(R300_US_ALU_CONST_B(1), F_TO_24(uco[2])); - OUT_ACCEL_REG(R300_US_ALU_CONST_A(1), F_TO_24(gamma)); - /* constant 2: vco */ - OUT_ACCEL_REG(R300_US_ALU_CONST_R(2), F_TO_24(vco[0])); - OUT_ACCEL_REG(R300_US_ALU_CONST_G(2), F_TO_24(vco[1])); - OUT_ACCEL_REG(R300_US_ALU_CONST_B(2), F_TO_24(vco[2])); - OUT_ACCEL_REG(R300_US_ALU_CONST_A(2), F_TO_24(0.0)); - - FINISH_ACCEL(); - } - - BEGIN_ACCEL_RELOC(6, 2); - OUT_ACCEL_REG(R300_TX_INVALTAGS, 0); - OUT_ACCEL_REG(R300_TX_ENABLE, txenable); - - EMIT_WRITE_OFFSET(R300_RB3D_COLOROFFSET0, 0, pPixmap); - EMIT_COLORPITCH(R300_RB3D_COLORPITCH0, colorpitch, pPixmap); - - /* no need to enable blending */ - OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO); - - OUT_ACCEL_REG(R300_VAP_VTX_SIZE, pPriv->vtx_count); - FINISH_ACCEL(); - - if (pPriv->vsync) { - xf86CrtcPtr crtc; - if (pPriv->desired_crtc) - crtc = pPriv->desired_crtc; - else - crtc = radeon_pick_best_crtc(pScrn, - pPriv->drw_x, - pPriv->drw_x + pPriv->dst_w, - pPriv->drw_y, - pPriv->drw_y + pPriv->dst_h); - if (crtc) - FUNC_NAME(RADEONWaitForVLine)(pScrn, pPixmap, - crtc, - pPriv->drw_y - crtc->y, - (pPriv->drw_y - crtc->y) + pPriv->dst_h); - } - - return TRUE; -} - -static void -FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pPixmap = pPriv->pPixmap; - int dstxoff, dstyoff; - BoxPtr pBox = REGION_RECTS(&pPriv->clip); - int nBox = REGION_NUM_RECTS(&pPriv->clip); - ACCEL_PREAMBLE(); #ifdef COMPOSITE dstxoff = -pPixmap->screen_x + pPixmap->drawable.x; @@ -2469,1638 +125,1879 @@ FUNC_NAME(R300DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) dstyoff = 0; #endif - if (!FUNC_NAME(R300PrepareTexturedVideo)(pScrn, pPriv)) - return; - - /* - * Rendering of the actual polygon is done in two different - * ways depending on chip generation: - * - * < R300: - * - * These chips can render a rectangle in one pass, so - * handling is pretty straight-forward. - * - * >= R300: - * - * These chips can accept a quad, but will render it as - * two triangles which results in a diagonal tear. Instead - * We render a single, large triangle and use the scissor - * functionality to restrict it to the desired rectangle. - * Due to guardband limits on r3xx/r4xx, we can only use - * the single triangle up to 2560/4021 pixels; above that we - * render as a quad. - */ - - while (nBox--) { - int srcX, srcY, srcw, srch; - int dstX, dstY, dstw, dsth; - Bool use_quad = FALSE; -#ifdef ACCEL_CP - int draw_size = 4 * pPriv->vtx_count + 4 + 2 + 3; - - if (draw_size > radeon_cs_space_remaining(pScrn)) { - if (info->cs) - radeon_cs_flush_indirect(pScrn); +#ifdef USE_EXA + if (info->useEXA) { + RADEON_SWITCH_TO_3D(); + } else +#endif + { + BEGIN_ACCEL(2); + if (IS_R300_3D || IS_R500_3D) + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); else - RADEONCPFlushIndirect(pScrn, 1); - if (!FUNC_NAME(R300PrepareTexturedVideo)(pScrn, pPriv)) - return; + OUT_ACCEL_REG(RADEON_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH); + /* We must wait for 3d to idle, in case source was just written as a dest. */ + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_HOST_IDLECLEAN | + RADEON_WAIT_2D_IDLECLEAN | + RADEON_WAIT_3D_IDLECLEAN | + RADEON_WAIT_DMA_GUI_IDLE); + FINISH_ACCEL(); + + if (!info->accel_state->XInited3D) + RADEONInit3DEngine(pScrn); } -#endif - - dstX = pBox->x1 + dstxoff; - dstY = pBox->y1 + dstyoff; - dstw = pBox->x2 - pBox->x1; - dsth = pBox->y2 - pBox->y1; - - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; - - srcw = (pPriv->src_w * dstw) / pPriv->dst_w; - srch = (pPriv->src_h * dsth) / pPriv->dst_h; - - if (IS_R400_3D) { - if ((dstw+dsth) > 4021) - use_quad = TRUE; - } else { - if ((dstw+dsth) > 2560) - use_quad = TRUE; - } - /* - * Set up the scissor area to that of the output size. - */ - BEGIN_ACCEL(2); - /* R300 has an offset */ - OUT_ACCEL_REG(R300_SC_SCISSOR0, (((dstX + 1440) << R300_SCISSOR_X_SHIFT) | - ((dstY + 1440) << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, (((dstX + dstw + 1440 - 1) << R300_SCISSOR_X_SHIFT) | - ((dstY + dsth + 1440 - 1) << R300_SCISSOR_Y_SHIFT))); - FINISH_ACCEL(); - -#ifdef ACCEL_CP - if (use_quad) { - BEGIN_RING(4 * pPriv->vtx_count + 4); - OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - 4 * pPriv->vtx_count)); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); - } else { - BEGIN_RING(3 * pPriv->vtx_count + 4); - OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - 3 * pPriv->vtx_count)); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); - } -#else /* ACCEL_CP */ - if (use_quad) - BEGIN_ACCEL(2 + pPriv->vtx_count * 4); - else - BEGIN_ACCEL(2 + pPriv->vtx_count * 3); - - if (use_quad) - OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_QUAD_LIST | - RADEON_VF_PRIM_WALK_DATA | - (4 << RADEON_VF_NUM_VERTICES_SHIFT))); - else - OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_TRIANGLE_LIST | - RADEON_VF_PRIM_WALK_DATA | - (3 << RADEON_VF_NUM_VERTICES_SHIFT))); -#endif - if (pPriv->bicubic_enabled) { - /* - * This code is only executed on >= R300, so we don't - * have to deal with the legacy handling. - */ - if (use_quad) { - VTX_OUT_6((float)dstX, (float)dstY, - (float)srcX / pPriv->w, (float)srcY / pPriv->h, - (float)srcX + 0.5, (float)srcY + 0.5); - VTX_OUT_6((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)srcX + 0.5, (float)(srcY + srch) + 0.5); - VTX_OUT_6((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h, - (float)(srcX + srcw) + 0.5, (float)(srcY + srch) + 0.5); - VTX_OUT_6((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h, - (float)(srcX + srcw) + 0.5, (float)srcY + 0.5); - } else { - VTX_OUT_6((float)dstX, (float)dstY, - (float)srcX / pPriv->w, (float)srcY / pPriv->h, - (float)srcX + 0.5, (float)srcY + 0.5); - VTX_OUT_6((float)dstX, (float)(dstY + dstw + dsth), - (float)srcX / pPriv->w, - ((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) / pPriv->h, - (float)srcX + 0.5, - (float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0) + 0.5); - VTX_OUT_6((float)(dstX + dstw + dsth), (float)dstY, - ((float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0)) / pPriv->w, - (float)srcY / pPriv->h, - (float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0) + 0.5, - (float)srcY + 0.5); - } - } else { - if (use_quad) { - VTX_OUT_4((float)dstX, (float)dstY, - (float)srcX / pPriv->w, (float)srcY / pPriv->h); - VTX_OUT_4((float)dstX, (float)(dstY + dsth), - (float)srcX / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)(dstY + dsth), - (float)(srcX + srcw) / pPriv->w, (float)(srcY + srch) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw), (float)dstY, - (float)(srcX + srcw) / pPriv->w, (float)srcY / pPriv->h); - } else { - /* - * Render a big, scissored triangle. This means - * increasing the triangle size and adjusting - * texture coordinates. - */ - VTX_OUT_4((float)dstX, (float)dstY, - (float)srcX / pPriv->w, (float)srcY / pPriv->h); - VTX_OUT_4((float)dstX, (float)(dstY + dsth + dstw), - (float)srcX / pPriv->w, - ((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw + dsth), (float)dstY, - ((float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0)) / pPriv->w, - (float)srcY / pPriv->h); - } - } - - /* flushing is pipelined, free/finish is not */ - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); - -#ifdef ACCEL_CP - ADVANCE_RING(); -#else - FINISH_ACCEL(); -#endif /* !ACCEL_CP */ - - pBox++; - } - - BEGIN_ACCEL(3); - OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA); - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); - FINISH_ACCEL(); - - DamageDamageRegion(pPriv->pDraw, &pPriv->clip); -} - -static Bool -FUNC_NAME(R500PrepareTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pPixmap = pPriv->pPixmap; - struct radeon_exa_pixmap_priv *driver_priv; - struct radeon_bo *src_bo = pPriv->src_bo[pPriv->currentBuffer]; - uint32_t txfilter, txformat0, txformat1, txoffset, txpitch, us_format = 0; - uint32_t dst_pitch, dst_format; - uint32_t txenable, colorpitch, bicubic_offset; - uint32_t output_fmt; - int pixel_shift, out_size = 6; - ACCEL_PREAMBLE(); - -#ifdef XF86DRM_MODE - if (info->cs) { - int ret; - - radeon_cs_space_reset_bos(info->cs); - radeon_cs_space_add_persistent_bo(info->cs, src_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - if (pPriv->bicubic_enabled) - radeon_cs_space_add_persistent_bo(info->cs, info->bicubic_bo, RADEON_GEM_DOMAIN_GTT | RADEON_GEM_DOMAIN_VRAM, 0); - - driver_priv = exaGetPixmapDriverPrivate(pPixmap); - radeon_cs_space_add_persistent_bo(info->cs, driver_priv->bo, 0, RADEON_GEM_DOMAIN_VRAM); - - ret = radeon_cs_space_check(info->cs); - if (ret) { - ErrorF("Not enough RAM to hw accel xv operation\n"); - return FALSE; - } - } -#endif - - pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; - -#ifdef USE_EXA - if (info->useEXA) { - dst_pitch = exaGetPixmapPitch(pPixmap); - } else -#endif - { - dst_pitch = pPixmap->devKind; - } - -#ifdef USE_EXA - if (info->useEXA) { - RADEON_SWITCH_TO_3D(); - } else -#endif - { - BEGIN_ACCEL(2); - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); - /* We must wait for 3d to idle, in case source was just written as a dest. */ - OUT_ACCEL_REG(RADEON_WAIT_UNTIL, - RADEON_WAIT_HOST_IDLECLEAN | - RADEON_WAIT_2D_IDLECLEAN | - RADEON_WAIT_3D_IDLECLEAN | - RADEON_WAIT_DMA_GUI_IDLE); - FINISH_ACCEL(); - - if (!info->accel_state->XInited3D) - RADEONInit3DEngine(pScrn); - } if (pPriv->bicubic_enabled) - pPriv->vtx_count = 6; + vtx_count = 6; else - pPriv->vtx_count = 4; + vtx_count = 4; - switch (pPixmap->drawable.bitsPerPixel) { - case 16: - if (pPixmap->drawable.depth == 15) - dst_format = R300_COLORFORMAT_ARGB1555; - else - dst_format = R300_COLORFORMAT_RGB565; - break; - case 32: - dst_format = R300_COLORFORMAT_ARGB8888; - break; - default: - return FALSE; - } + if (IS_R300_3D || IS_R500_3D) { + uint32_t output_fmt; - output_fmt = (R300_OUT_FMT_C4_8 | - R300_OUT_FMT_C0_SEL_BLUE | - R300_OUT_FMT_C1_SEL_GREEN | - R300_OUT_FMT_C2_SEL_RED | - R300_OUT_FMT_C3_SEL_ALPHA); + switch (pPixmap->drawable.bitsPerPixel) { + case 16: + if (pPixmap->drawable.depth == 15) + dst_format = R300_COLORFORMAT_ARGB1555; + else + dst_format = R300_COLORFORMAT_RGB565; + break; + case 32: + dst_format = R300_COLORFORMAT_ARGB8888; + break; + default: + return; + } - colorpitch = dst_pitch >> pixel_shift; - colorpitch |= dst_format; + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); - if (RADEONTilingEnabled(pScrn, pPixmap)) - colorpitch |= R300_COLORTILE; + colorpitch = dst_pitch >> pixel_shift; + colorpitch |= dst_format; - if (((pPriv->bicubic_state == BICUBIC_OFF)) && - (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12)) - pPriv->is_planar = TRUE; - else - pPriv->is_planar = FALSE; + if (RADEONTilingEnabled(pScrn, pPixmap)) + colorpitch |= R300_COLORTILE; - if (pPriv->is_planar) { - txformat1 = R300_TX_FORMAT_X8; - txpitch = pPriv->src_pitch; - } else { - if (pPriv->id == FOURCC_UYVY) - txformat1 = R300_TX_FORMAT_YVYU422; - else - txformat1 = R300_TX_FORMAT_VYUY422; + if (pPriv->planar_hw && (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12)) { + isplanar = TRUE; + } + + if (isplanar) { + txformat1 = R300_TX_FORMAT_X8 | R300_TX_FORMAT_CACHE_HALF_REGION_0; + txpitch = pPriv->src_pitch; + } else { + if (pPriv->id == FOURCC_UYVY) + txformat1 = R300_TX_FORMAT_YVYU422; + else + txformat1 = R300_TX_FORMAT_VYUY422; - if (pPriv->bicubic_state != BICUBIC_OFF) txformat1 |= R300_TX_FORMAT_YUV_TO_RGB_CLAMP; - /* pitch is in pixels */ - txpitch = pPriv->src_pitch / 2; - } - txpitch -= 1; - - txformat0 = ((((pPriv->w - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | - (((pPriv->h - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) | - R300_TXPITCH_EN); - - txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | - R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST) | - R300_TX_MAG_FILTER_LINEAR | - R300_TX_MIN_FILTER_LINEAR | - (0 << R300_TX_ID_SHIFT)); - - - if ((pPriv->w - 1) & 0x800) - txpitch |= R500_TXWIDTH_11; - - if ((pPriv->h - 1) & 0x800) - txpitch |= R500_TXHEIGHT_11; - - if (info->ChipFamily == CHIP_FAMILY_R520) { - unsigned us_width = (pPriv->w - 1) & 0x7ff; - unsigned us_height = (pPriv->h - 1) & 0x7ff; - unsigned us_depth = 0; - - if (pPriv->w > 2048) { - us_width = (0x7ff + us_width) >> 1; - us_depth |= 0x0d; + /* pitch is in pixels */ + txpitch = pPriv->src_pitch / 2; } - if (pPriv->h > 2048) { - us_height = (0x7ff + us_height) >> 1; - us_depth |= 0x0e; - } - us_format = (us_width << R300_TXWIDTH_SHIFT) | - (us_height << R300_TXHEIGHT_SHIFT) | - (us_depth << R300_TXDEPTH_SHIFT); - out_size++; - } - - txoffset = info->cs ? 0 : pPriv->src_offset; - - BEGIN_ACCEL_RELOC(out_size, 1); - OUT_ACCEL_REG(R300_TX_FILTER0_0, txfilter); - OUT_ACCEL_REG(R300_TX_FILTER1_0, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_0, txformat0); - OUT_ACCEL_REG(R300_TX_FORMAT1_0, txformat1); - OUT_ACCEL_REG(R300_TX_FORMAT2_0, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_0, txoffset, src_bo); - if (info->ChipFamily == CHIP_FAMILY_R520) - OUT_ACCEL_REG(R500_US_FORMAT0_0, us_format); - FINISH_ACCEL(); - - txenable = R300_TEX_0_ENABLE; - - if (pPriv->is_planar) { - txformat0 = ((((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | - (((((pPriv->h + 1 ) >> 1 ) - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) | - R300_TXPITCH_EN); - txpitch = RADEON_ALIGN(pPriv->src_pitch >> 1, 64); txpitch -= 1; + + txformat0 = ((((pPriv->w - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | + (((pPriv->h - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) | + R300_TXPITCH_EN); + + info->accel_state->texW[0] = pPriv->w; + info->accel_state->texH[0] = pPriv->h; + txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST) | + R300_TX_MAG_FILTER_LINEAR | R300_TX_MIN_FILTER_LINEAR | - R300_TX_MAG_FILTER_LINEAR); + (0 << R300_TX_ID_SHIFT)); - BEGIN_ACCEL_RELOC(12, 2); - OUT_ACCEL_REG(R300_TX_FILTER0_1, txfilter | (1 << R300_TX_ID_SHIFT)); - OUT_ACCEL_REG(R300_TX_FILTER1_1, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0); - OUT_ACCEL_REG(R300_TX_FORMAT1_1, R300_TX_FORMAT_X8); - OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_1, txoffset + pPriv->planeu_offset, src_bo); - OUT_ACCEL_REG(R300_TX_FILTER0_2, txfilter | (2 << R300_TX_ID_SHIFT)); - OUT_ACCEL_REG(R300_TX_FILTER1_2, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_2, txformat0); - OUT_ACCEL_REG(R300_TX_FORMAT1_2, R300_TX_FORMAT_X8); - OUT_ACCEL_REG(R300_TX_FORMAT2_2, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_2, txoffset + pPriv->planev_offset, src_bo); - FINISH_ACCEL(); - txenable |= R300_TEX_1_ENABLE | R300_TEX_2_ENABLE; - } - if (pPriv->bicubic_enabled) { - /* Size is 128x1 */ - txformat0 = ((0x7f << R300_TXWIDTH_SHIFT) | - (0x0 << R300_TXHEIGHT_SHIFT) | - R300_TXPITCH_EN); - /* Format is 32-bit floats, 4bpp */ - txformat1 = R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16); - /* Pitch is 127 (128-1) */ - txpitch = 0x7f; - /* Tex filter */ - txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_WRAP) | - R300_TX_CLAMP_T(R300_TX_CLAMP_WRAP) | - R300_TX_MIN_FILTER_NEAREST | - R300_TX_MAG_FILTER_NEAREST | - (1 << R300_TX_ID_SHIFT)); + if (IS_R500_3D && ((pPriv->w - 1) & 0x800)) + txpitch |= R500_TXWIDTH_11; - if (info->cs) - bicubic_offset = 0; - else - bicubic_offset = pPriv->bicubic_src_offset; + if (IS_R500_3D && ((pPriv->h - 1) & 0x800)) + txpitch |= R500_TXHEIGHT_11; - BEGIN_ACCEL_RELOC(6, 1); - OUT_ACCEL_REG(R300_TX_FILTER0_1, txfilter); - OUT_ACCEL_REG(R300_TX_FILTER1_1, 0); - OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0); - OUT_ACCEL_REG(R300_TX_FORMAT1_1, txformat1); - OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch); - OUT_TEXTURE_REG(R300_TX_OFFSET_1, bicubic_offset, info->bicubic_bo); + txoffset = pPriv->src_offset; + + BEGIN_ACCEL(6); + OUT_ACCEL_REG(R300_TX_FILTER0_0, txfilter); + OUT_ACCEL_REG(R300_TX_FILTER1_0, 0); + OUT_ACCEL_REG(R300_TX_FORMAT0_0, txformat0); + OUT_ACCEL_REG(R300_TX_FORMAT1_0, txformat1); + OUT_ACCEL_REG(R300_TX_FORMAT2_0, txpitch); + OUT_ACCEL_REG(R300_TX_OFFSET_0, txoffset); FINISH_ACCEL(); - /* Enable tex 1 */ - txenable |= R300_TEX_1_ENABLE; - } + txenable = R300_TEX_0_ENABLE; - /* setup the VAP */ - if (info->accel_state->has_tcl) { - if (pPriv->bicubic_enabled) - BEGIN_ACCEL(7); - else - BEGIN_ACCEL(6); - } else { - if (pPriv->bicubic_enabled) - BEGIN_ACCEL(5); - else - BEGIN_ACCEL(4); - } + if (isplanar) { + txformat0 = ((((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | + (((((pPriv->h + 1 ) >> 1 ) - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT) | + R300_TXPITCH_EN); + txpitch = ((pPriv->src_pitch >> 1) + 63) & ~63; + txpitch -= 1; + txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | + R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST) | + R300_TX_MIN_FILTER_LINEAR | + R300_TX_MAG_FILTER_LINEAR); - /* These registers define the number, type, and location of data submitted - * to the PVS unit of GA input (when PVS is disabled) - * DST_VEC_LOC is the slot in the PVS input vector memory when PVS/TCL is - * enabled. This memory provides the imputs to the vertex shader program - * and ordering is not important. When PVS/TCL is disabled, this field maps - * directly to the GA input memory and the order is signifigant. In - * PVS_BYPASS mode the order is as follows: - * Position - * Point Size - * Color 0-3 - * Textures 0-7 - * Fog - */ - if (pPriv->bicubic_enabled) { - OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, - ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | - (0 << R300_SKIP_DWORDS_0_SHIFT) | - (0 << R300_DST_VEC_LOC_0_SHIFT) | - R300_SIGNED_0 | - (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | - (0 << R300_SKIP_DWORDS_1_SHIFT) | - (6 << R300_DST_VEC_LOC_1_SHIFT) | - R300_SIGNED_1)); - OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_1, - ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_2_SHIFT) | - (0 << R300_SKIP_DWORDS_2_SHIFT) | - (7 << R300_DST_VEC_LOC_2_SHIFT) | - R300_LAST_VEC_2 | - R300_SIGNED_2)); - } else { - OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, - ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | - (0 << R300_SKIP_DWORDS_0_SHIFT) | - (0 << R300_DST_VEC_LOC_0_SHIFT) | - R300_SIGNED_0 | - (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | - (0 << R300_SKIP_DWORDS_1_SHIFT) | - (6 << R300_DST_VEC_LOC_1_SHIFT) | - R300_LAST_VEC_1 | - R300_SIGNED_1)); - } - - /* load the vertex shader - * We pre-load vertex programs in RADEONInit3DEngine(): - * - exa - * - Xv - * - Xv bicubic - * Here we select the offset of the vertex program we want to use - */ - if (info->accel_state->has_tcl) { - if (pPriv->bicubic_enabled) { - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, - ((11 << R300_PVS_FIRST_INST_SHIFT) | - (13 << R300_PVS_XYZW_VALID_INST_SHIFT) | - (13 << R300_PVS_LAST_INST_SHIFT))); - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, - (13 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); - } else { - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, - ((9 << R300_PVS_FIRST_INST_SHIFT) | - (10 << R300_PVS_XYZW_VALID_INST_SHIFT) | - (10 << R300_PVS_LAST_INST_SHIFT))); - OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, - (10 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + BEGIN_ACCEL(12); + OUT_ACCEL_REG(R300_TX_FILTER0_1, txfilter | (1 << R300_TX_ID_SHIFT)); + OUT_ACCEL_REG(R300_TX_FILTER1_1, 0); + OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0); + OUT_ACCEL_REG(R300_TX_FORMAT1_1, R300_TX_FORMAT_X8 | R300_TX_FORMAT_CACHE_FOURTH_REGION_2); + OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch); + OUT_ACCEL_REG(R300_TX_OFFSET_1, txoffset + pPriv->planeu_offset); + OUT_ACCEL_REG(R300_TX_FILTER0_2, txfilter | (2 << R300_TX_ID_SHIFT)); + OUT_ACCEL_REG(R300_TX_FILTER1_2, 0); + OUT_ACCEL_REG(R300_TX_FORMAT0_2, txformat0); + OUT_ACCEL_REG(R300_TX_FORMAT1_2, R300_TX_FORMAT_X8 | R300_TX_FORMAT_CACHE_FOURTH_REGION_3); + OUT_ACCEL_REG(R300_TX_FORMAT2_2, txpitch); + OUT_ACCEL_REG(R300_TX_OFFSET_2, txoffset + pPriv->planev_offset); + FINISH_ACCEL(); + txenable |= R300_TEX_1_ENABLE | R300_TEX_2_ENABLE; } - } - /* Position and one set of 2 texture coordinates */ - OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_0, R300_VTX_POS_PRESENT); - if (pPriv->bicubic_enabled) - OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, ((2 << R300_TEX_0_COMP_CNT_SHIFT) | - (2 << R300_TEX_1_COMP_CNT_SHIFT))); - else - OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, (2 << R300_TEX_0_COMP_CNT_SHIFT)); - - OUT_ACCEL_REG(R300_US_OUT_FMT_0, output_fmt); - FINISH_ACCEL(); - - /* setup pixel shader */ - if (pPriv->bicubic_state != BICUBIC_OFF) { if (pPriv->bicubic_enabled) { - BEGIN_ACCEL(7); + /* Size is 128x1 */ + txformat0 = ((0x7f << R300_TXWIDTH_SHIFT) | + (0x0 << R300_TXHEIGHT_SHIFT) | + R300_TXPITCH_EN); + /* Format is 32-bit floats, 4bpp */ + txformat1 = R300_EASY_TX_FORMAT(Z, Y, X, W, FL_R16G16B16A16); + /* Pitch is 127 (128-1) */ + txpitch = 0x7f; + /* Tex filter */ + txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_WRAP) | + R300_TX_CLAMP_T(R300_TX_CLAMP_WRAP) | + R300_TX_MIN_FILTER_NEAREST | + R300_TX_MAG_FILTER_NEAREST | + (1 << R300_TX_ID_SHIFT)); - /* 4 components: 2 for tex0 and 2 for tex1 */ - OUT_ACCEL_REG(R300_RS_COUNT, - ((4 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); + BEGIN_ACCEL(6); + OUT_ACCEL_REG(R300_TX_FILTER0_1, txfilter); + OUT_ACCEL_REG(R300_TX_FILTER1_1, 0); + OUT_ACCEL_REG(R300_TX_FORMAT0_1, txformat0); + OUT_ACCEL_REG(R300_TX_FORMAT1_1, txformat1); + OUT_ACCEL_REG(R300_TX_FORMAT2_1, txpitch); + OUT_ACCEL_REG(R300_TX_OFFSET_1, pPriv->bicubic_src_offset); + FINISH_ACCEL(); - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1)); - - /* Pixel stack frame size. */ - OUT_ACCEL_REG(R300_US_PIXSIZE, 5); - - /* FP length. */ - OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | - R500_US_CODE_END_ADDR(13))); - OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | - R500_US_CODE_RANGE_SIZE(13))); - - /* Prepare for FP emission. */ - OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); - OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_INST_INDEX(0)); - FINISH_ACCEL(); - - BEGIN_ACCEL(89); - /* Pixel shader. - * I've gone ahead and annotated each instruction, since this - * thing is MASSIVE. :3 - * Note: In order to avoid buggies with temps and multiple - * inputs, all temps are offset by 2. temp0 -> register2. */ - - /* TEX temp2, input1.xxxx, tex1, 1D */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(1) | - R500_TEX_INST_LD | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(1) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_R | - R500_TEX_SRC_R_SWIZ_R | - R500_TEX_SRC_Q_SWIZ_R | - R500_TEX_DST_ADDR(2) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* TEX temp5, input1.yyyy, tex1, 1D */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(1) | - R500_TEX_INST_LD | - R500_TEX_SEM_ACQUIRE | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(1) | - R500_TEX_SRC_S_SWIZ_G | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_SRC_R_SWIZ_G | - R500_TEX_SRC_Q_SWIZ_G | - R500_TEX_DST_ADDR(5) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* MUL temp4, const0.x0x0, temp2.yyxx */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_0 | - R500_ALU_RGB_B_SWIZ_A_R | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_G | - R500_ALU_RGB_G_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(4) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SEL_A_SRC0 | - R500_ALPHA_SWIZ_A_0 | - R500_ALPHA_SEL_B_SRC1 | - R500_ALPHA_SWIZ_B_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(4) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_R_SWIZ_0 | - R500_ALU_RGBA_G_SWIZ_0 | - R500_ALU_RGBA_B_SWIZ_0 | - R500_ALU_RGBA_A_SWIZ_0)); - - /* MAD temp3, const0.0y0y, temp5.xxxx, temp4 */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(5) | - R500_RGB_ADDR2(4))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(5) | - R500_ALPHA_ADDR2(4))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_0 | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_0 | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_G_SWIZ_B_R | - R500_ALU_RGB_B_SWIZ_B_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(3) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SEL_A_SRC0 | - R500_ALPHA_SWIZ_A_G | - R500_ALPHA_SEL_B_SRC1 | - R500_ALPHA_SWIZ_B_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(3) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_A_SWIZ_A)); - - /* ADD temp3, temp3, input0.xyxy */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR1(3) | - R500_RGB_ADDR2(0))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR1(3) | - R500_ALPHA_ADDR2(0))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_R_SWIZ_A_1 | - R500_ALU_RGB_G_SWIZ_A_1 | - R500_ALU_RGB_B_SWIZ_A_1 | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_G_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(3) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SWIZ_A_1 | - R500_ALPHA_SEL_B_SRC1 | - R500_ALPHA_SWIZ_B_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(3) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_R | - R500_ALU_RGBA_A_SWIZ_G)); - - /* TEX temp1, temp3.zwxy, tex0, 2D */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | - R500_TEX_INST_LD | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(3) | - R500_TEX_SRC_S_SWIZ_B | - R500_TEX_SRC_T_SWIZ_A | - R500_TEX_SRC_R_SWIZ_R | - R500_TEX_SRC_Q_SWIZ_G | - R500_TEX_DST_ADDR(1) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* TEX temp3, temp3.xyzw, tex0, 2D */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | - R500_TEX_INST_LD | - R500_TEX_SEM_ACQUIRE | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(3) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_SRC_R_SWIZ_B | - R500_TEX_SRC_Q_SWIZ_A | - R500_TEX_DST_ADDR(3) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* MAD temp4, const0.0y0y, temp5.yyyy, temp4 */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(5) | - R500_RGB_ADDR2(4))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(5) | - R500_ALPHA_ADDR2(4))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_0 | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_0 | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_G | - R500_ALU_RGB_G_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_G)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(4) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SEL_A_SRC0 | - R500_ALPHA_SWIZ_A_G | - R500_ALPHA_SEL_B_SRC1 | - R500_ALPHA_SWIZ_B_G)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(4) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_A_SWIZ_A)); - - /* ADD temp0, temp4, input0.xyxy */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR1(4) | - R500_RGB_ADDR2(0))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR1(4) | - R500_ALPHA_ADDR2(0))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_R_SWIZ_A_1 | - R500_ALU_RGB_G_SWIZ_A_1 | - R500_ALU_RGB_B_SWIZ_A_1 | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_G_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(0) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SWIZ_A_1 | - R500_ALPHA_SEL_B_SRC1 | - R500_ALPHA_SWIZ_B_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(0) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_R | - R500_ALU_RGBA_A_SWIZ_G)); - - /* TEX temp4, temp0.zwzw, tex0, 2D */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | - R500_TEX_INST_LD | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | - R500_TEX_SRC_S_SWIZ_B | - R500_TEX_SRC_T_SWIZ_A | - R500_TEX_SRC_R_SWIZ_B | - R500_TEX_SRC_Q_SWIZ_A | - R500_TEX_DST_ADDR(4) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* TEX temp0, temp0.xyzw, tex0, 2D */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | - R500_TEX_INST_LD | - R500_TEX_SEM_ACQUIRE | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_SRC_R_SWIZ_B | - R500_TEX_SRC_Q_SWIZ_A | - R500_TEX_DST_ADDR(0) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* LRP temp3, temp2.zzzz, temp1, temp3 -> - * - PRESUB temps, temp1 - temp3 - * - MAD temp2.zzzz, temps, temp3 */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(3) | - R500_RGB_SRCP_OP_RGB1_MINUS_RGB0 | - R500_RGB_ADDR1(1) | - R500_RGB_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(3) | - R500_ALPHA_SRCP_OP_A1_MINUS_A0 | - R500_ALPHA_ADDR1(1) | - R500_ALPHA_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC2 | - R500_ALU_RGB_R_SWIZ_A_B | - R500_ALU_RGB_G_SWIZ_A_B | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRCP | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_G_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(3) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SEL_A_SRC2 | - R500_ALPHA_SWIZ_A_B | - R500_ALPHA_SEL_B_SRCP | - R500_ALPHA_SWIZ_B_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(3) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_SEL_C_SRC0 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_A_SWIZ_A)); - - /* LRP temp0, temp2.zzzz, temp4, temp0 -> - * - PRESUB temps, temp4 - temp1 - * - MAD temp2.zzzz, temps, temp0 */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_SRCP_OP_RGB1_MINUS_RGB0 | - R500_RGB_ADDR1(4) | - R500_RGB_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_SRCP_OP_A1_MINUS_A0 | - R500_ALPHA_ADDR1(4) | - R500_ALPHA_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC2 | - R500_ALU_RGB_R_SWIZ_A_B | - R500_ALU_RGB_G_SWIZ_A_B | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRCP | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_G_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(0) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SEL_A_SRC2 | - R500_ALPHA_SWIZ_A_B | - R500_ALPHA_SEL_B_SRCP | - R500_ALPHA_SWIZ_B_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(0) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_SEL_C_SRC0 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_A_SWIZ_A)); - - /* LRP output, temp5.zzzz, temp3, temp0 -> - * - PRESUB temps, temp3 - temp0 - * - MAD temp5.zzzz, temps, temp0 */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | - R500_INST_LAST | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK | - R500_INST_RGB_OMASK_R | - R500_INST_RGB_OMASK_G | - R500_INST_RGB_OMASK_B | - R500_INST_ALPHA_OMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_SRCP_OP_RGB1_MINUS_RGB0 | - R500_RGB_ADDR1(3) | - R500_RGB_ADDR2(5))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_SRCP_OP_A1_MINUS_A0 | - R500_ALPHA_ADDR1(3) | - R500_ALPHA_ADDR2(5))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC2 | - R500_ALU_RGB_R_SWIZ_A_B | - R500_ALU_RGB_G_SWIZ_A_B | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRCP | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_G_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(0) | - R500_ALPHA_OP_MAD | - R500_ALPHA_SEL_A_SRC2 | - R500_ALPHA_SWIZ_A_B | - R500_ALPHA_SEL_B_SRCP | - R500_ALPHA_SWIZ_B_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(0) | - R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_SEL_C_SRC0 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_A_SWIZ_A)); - - /* Shader constants. */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_CONST_INDEX(0)); - - /* const0 = {1 / texture[0].width, 1 / texture[0].height, 0, 0} */ - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, (1.0/(float)pPriv->w)); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, (1.0/(float)pPriv->h)); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, 0x0); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, 0x0); - - FINISH_ACCEL(); - } else { - BEGIN_ACCEL(19); - /* 2 components: 2 for tex0 */ - OUT_ACCEL_REG(R300_RS_COUNT, - ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); - - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); - - /* Pixel stack frame size. */ - OUT_ACCEL_REG(R300_US_PIXSIZE, 0); /* highest temp used */ - - /* FP length. */ - OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | - R500_US_CODE_END_ADDR(1))); - OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | - R500_US_CODE_RANGE_SIZE(1))); - - /* Prepare for FP emission. */ - OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); - OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_INST_INDEX(0)); - - /* tex inst */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | - R500_TEX_INST_LD | - R500_TEX_SEM_ACQUIRE | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_DST_ADDR(0) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | - R500_DX_S_SWIZ_R | - R500_DX_T_SWIZ_R | - R500_DX_R_SWIZ_R | - R500_DX_Q_SWIZ_R | - R500_DY_ADDR(0) | - R500_DY_S_SWIZ_R | - R500_DY_T_SWIZ_R | - R500_DY_R_SWIZ_R | - R500_DY_Q_SWIZ_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* ALU inst */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | - R500_INST_TEX_SEM_WAIT | - R500_INST_LAST | - R500_INST_RGB_OMASK_R | - R500_INST_RGB_OMASK_G | - R500_INST_RGB_OMASK_B | - R500_INST_ALPHA_OMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_ADDR1(0) | - R500_RGB_ADDR1_CONST | - R500_RGB_ADDR2(0) | - R500_RGB_ADDR2_CONST)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_ADDR1(0) | - R500_ALPHA_ADDR1_CONST | - R500_ALPHA_ADDR2(0) | - R500_ALPHA_ADDR2_CONST)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRC0 | - R500_ALU_RGB_R_SWIZ_B_1 | - R500_ALU_RGB_B_SWIZ_B_1 | - R500_ALU_RGB_G_SWIZ_B_1)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | - R500_ALPHA_SWIZ_A_A | - R500_ALPHA_SWIZ_B_1)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_R_SWIZ_0 | - R500_ALU_RGBA_G_SWIZ_0 | - R500_ALU_RGBA_B_SWIZ_0 | - R500_ALU_RGBA_A_SWIZ_0)); - FINISH_ACCEL(); + /* Enable tex 1 */ + txenable |= R300_TEX_1_ENABLE; } - } else { - /* - * y' = y - .0625 - * u' = u - .5 - * v' = v - .5; - * - * r = 1.1643 * y' + 0.0 * u' + 1.5958 * v' - * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v' - * b = 1.1643 * y' + 2.017 * u' + 0.0 * v' - * - * DP3 might look like the straightforward solution - * but we'd need to move the texture yuv values in - * the same reg for this to work. Therefore use MADs. - * Brightness just adds to the off constant. - * Contrast is multiplication of luminance. - * Saturation and hue change the u and v coeffs. - * Default values (before adjustments - depend on colorspace): - * yco = 1.1643 - * uco = 0, -0.39173, 2.017 - * vco = 1.5958, -0.8129, 0 - * off = -0.0625 * yco + -0.5 * uco[r] + -0.5 * vco[r], - * -0.0625 * yco + -0.5 * uco[g] + -0.5 * vco[g], - * -0.0625 * yco + -0.5 * uco[b] + -0.5 * vco[b], - * - * temp = MAD(yco, yuv.yyyy, off) - * temp = MAD(uco, yuv.uuuu, temp) - * result = MAD(vco, yuv.vvvv, temp) + + /* setup the VAP */ + if (info->accel_state->has_tcl) { + if (pPriv->bicubic_enabled) + BEGIN_ACCEL(7); + else + BEGIN_ACCEL(6); + } else { + if (pPriv->bicubic_enabled) + BEGIN_ACCEL(5); + else + BEGIN_ACCEL(4); + } + + /* These registers define the number, type, and location of data submitted + * to the PVS unit of GA input (when PVS is disabled) + * DST_VEC_LOC is the slot in the PVS input vector memory when PVS/TCL is + * enabled. This memory provides the imputs to the vertex shader program + * and ordering is not important. When PVS/TCL is disabled, this field maps + * directly to the GA input memory and the order is signifigant. In + * PVS_BYPASS mode the order is as follows: + * Position + * Point Size + * Color 0-3 + * Textures 0-7 + * Fog */ - /* TODO: don't recalc consts always */ - const float Loff = -0.0627; - const float Coff = -0.502; - float uvcosf, uvsinf; - float yco; - float uco[3], vco[3], off[3]; - float bright, cont, gamma; - int ref = pPriv->transform_index; - Bool needgamma = FALSE; - - cont = RTFContrast(pPriv->contrast); - bright = RTFBrightness(pPriv->brightness); - gamma = (float)pPriv->gamma / 1000.0; - uvcosf = RTFSaturation(pPriv->saturation) * cos(RTFHue(pPriv->hue)); - uvsinf = RTFSaturation(pPriv->saturation) * sin(RTFHue(pPriv->hue)); - /* overlay video also does pre-gamma contrast/sat adjust, should we? */ - - yco = trans[ref].RefLuma * cont; - uco[0] = -trans[ref].RefRCr * uvsinf; - uco[1] = trans[ref].RefGCb * uvcosf - trans[ref].RefGCr * uvsinf; - uco[2] = trans[ref].RefBCb * uvcosf; - vco[0] = trans[ref].RefRCr * uvcosf; - vco[1] = trans[ref].RefGCb * uvsinf + trans[ref].RefGCr * uvcosf; - vco[2] = trans[ref].RefBCb * uvsinf; - off[0] = Loff * yco + Coff * (uco[0] + vco[0]) + bright; - off[1] = Loff * yco + Coff * (uco[1] + vco[1]) + bright; - off[2] = Loff * yco + Coff * (uco[2] + vco[2]) + bright; - - //XXX gamma - - if (gamma != 1.0) { - needgamma = TRUE; - /* note: gamma correction is out = in ^ gamma; - gpu can only do LG2/EX2 therefore we transform into - in ^ gamma = 2 ^ (log2(in) * gamma). - Lots of scalar ops, unfortunately (better solution?) - - without gamma that's 3 inst, with gamma it's 10... - could use different gamma factors per channel, - if that's of any use. */ - } - - if (pPriv->is_planar) { - BEGIN_ACCEL(56); - /* 2 components: 2 for tex0 */ - OUT_ACCEL_REG(R300_RS_COUNT, - ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); - - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); - - /* Pixel stack frame size. */ - OUT_ACCEL_REG(R300_US_PIXSIZE, 2); /* highest temp used */ - - /* FP length. */ - OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | - R500_US_CODE_END_ADDR(5))); - OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | - R500_US_CODE_RANGE_SIZE(5))); - - /* Prepare for FP emission. */ - OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); - OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_INST_INDEX(0)); - - /* tex inst */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | - R500_TEX_INST_LD | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_DST_ADDR(2) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | - R500_DX_S_SWIZ_R | - R500_DX_T_SWIZ_R | - R500_DX_R_SWIZ_R | - R500_DX_Q_SWIZ_R | - R500_DY_ADDR(0) | - R500_DY_S_SWIZ_R | - R500_DY_T_SWIZ_R | - R500_DY_R_SWIZ_R | - R500_DY_Q_SWIZ_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* tex inst */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(1) | - R500_TEX_INST_LD | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_DST_ADDR(1) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | - R500_DX_S_SWIZ_R | - R500_DX_T_SWIZ_R | - R500_DX_R_SWIZ_R | - R500_DX_Q_SWIZ_R | - R500_DY_ADDR(0) | - R500_DY_S_SWIZ_R | - R500_DY_T_SWIZ_R | - R500_DY_R_SWIZ_R | - R500_DY_Q_SWIZ_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* tex inst */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(2) | - R500_TEX_INST_LD | - R500_TEX_SEM_ACQUIRE | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_DST_ADDR(0) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | - R500_DX_S_SWIZ_R | - R500_DX_T_SWIZ_R | - R500_DX_R_SWIZ_R | - R500_DX_Q_SWIZ_R | - R500_DY_ADDR(0) | - R500_DY_S_SWIZ_R | - R500_DY_T_SWIZ_R | - R500_DY_R_SWIZ_R | - R500_DY_Q_SWIZ_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* ALU inst */ - /* MAD temp2.rgb, const0.aaa, temp2.rgb, const0.rgb */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(2) | - R500_RGB_ADDR2(0) | - R500_RGB_ADDR2_CONST)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(2) | - R500_ALPHA_ADDR2(0) | - R500_ALPHA_ADDR2_CONST)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_A | - R500_ALU_RGB_G_SWIZ_A_A | - R500_ALU_RGB_B_SWIZ_A_A | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_B_SWIZ_B_G | - R500_ALU_RGB_G_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | - R500_ALPHA_ADDRD(2) | - R500_ALPHA_SWIZ_A_0 | - R500_ALPHA_SWIZ_B_0)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_ADDRD(2) | - R500_ALU_RGBA_SEL_C_SRC0 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_ALPHA_SEL_C_SRC0 | - R500_ALU_RGBA_A_SWIZ_0)); - - /* MAD temp2.rgb, const1.rgb, temp1.rgb, temp2.rgb */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(1) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(1) | - R500_RGB_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(1) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(1) | - R500_ALPHA_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_B_SWIZ_B_G | - R500_ALU_RGB_G_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | - R500_ALPHA_ADDRD(2) | - R500_ALPHA_SWIZ_A_0 | - R500_ALPHA_SWIZ_B_0)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_ADDRD(2) | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_ALPHA_SEL_C_SRC0 | - R500_ALU_RGBA_A_SWIZ_0)); - - /* MAD result.rgb, const2.rgb, temp0.rgb, temp2.rgb */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | - R500_INST_TEX_SEM_WAIT | - R500_INST_LAST | - R500_INST_RGB_OMASK_R | - R500_INST_RGB_OMASK_G | - R500_INST_RGB_OMASK_B | - R500_INST_ALPHA_OMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(2) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(0) | - R500_RGB_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(2) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(0) | - R500_ALPHA_ADDR2(2))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_B_SWIZ_B_G | - R500_ALU_RGB_G_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | - R500_ALPHA_ADDRD(0) | - R500_ALPHA_SWIZ_A_0 | - R500_ALPHA_SWIZ_B_0)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_ADDRD(0) | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_ALPHA_SEL_C_SRC0 | - R500_ALU_RGBA_A_SWIZ_1)); - + if (pPriv->bicubic_enabled) { + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, + ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | + (0 << R300_SKIP_DWORDS_0_SHIFT) | + (0 << R300_DST_VEC_LOC_0_SHIFT) | + R300_SIGNED_0 | + (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | + (0 << R300_SKIP_DWORDS_1_SHIFT) | + (6 << R300_DST_VEC_LOC_1_SHIFT) | + R300_SIGNED_1)); + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_1, + ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_2_SHIFT) | + (0 << R300_SKIP_DWORDS_2_SHIFT) | + (7 << R300_DST_VEC_LOC_2_SHIFT) | + R300_LAST_VEC_2 | + R300_SIGNED_2)); } else { - BEGIN_ACCEL(44); - /* 2 components: 2 for tex0/1/2 */ - OUT_ACCEL_REG(R300_RS_COUNT, - ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | - R300_RS_COUNT_HIRES_EN)); - - /* R300_INST_COUNT_RS - highest RS instruction used */ - OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); - - /* Pixel stack frame size. */ - OUT_ACCEL_REG(R300_US_PIXSIZE, 1); /* highest temp used */ - - /* FP length. */ - OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | - R500_US_CODE_END_ADDR(3))); - OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | - R500_US_CODE_RANGE_SIZE(3))); - - /* Prepare for FP emission. */ - OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); - OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_INST_INDEX(0)); - - /* tex inst */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | - R500_TEX_INST_LD | - R500_TEX_SEM_ACQUIRE | - R500_TEX_IGNORE_UNCOVERED)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | - R500_TEX_SRC_S_SWIZ_R | - R500_TEX_SRC_T_SWIZ_G | - R500_TEX_DST_ADDR(0) | - R500_TEX_DST_R_SWIZ_R | - R500_TEX_DST_G_SWIZ_G | - R500_TEX_DST_B_SWIZ_B | - R500_TEX_DST_A_SWIZ_A)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | - R500_DX_S_SWIZ_R | - R500_DX_T_SWIZ_R | - R500_DX_R_SWIZ_R | - R500_DX_Q_SWIZ_R | - R500_DY_ADDR(0) | - R500_DY_S_SWIZ_R | - R500_DY_T_SWIZ_R | - R500_DY_R_SWIZ_R | - R500_DY_Q_SWIZ_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); - - /* ALU inst */ - /* MAD temp1.rgb, const0.aaa, temp0.ggg, const0.rgb */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(0) | - R500_RGB_ADDR2(0) | - R500_RGB_ADDR2_CONST)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(0) | - R500_ALPHA_ADDR2(0) | - R500_ALPHA_ADDR2_CONST)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_A | - R500_ALU_RGB_G_SWIZ_A_A | - R500_ALU_RGB_B_SWIZ_A_A | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_G | - R500_ALU_RGB_B_SWIZ_B_G | - R500_ALU_RGB_G_SWIZ_B_G)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | - R500_ALPHA_ADDRD(1) | - R500_ALPHA_SWIZ_A_0 | - R500_ALPHA_SWIZ_B_0)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_ADDRD(1) | - R500_ALU_RGBA_SEL_C_SRC0 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_ALPHA_SEL_C_SRC0 | - R500_ALU_RGBA_A_SWIZ_0)); - - /* MAD temp1.rgb, const1.rgb, temp0.bbb, temp1.rgb */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | - R500_INST_TEX_SEM_WAIT | - R500_INST_RGB_WMASK_R | - R500_INST_RGB_WMASK_G | - R500_INST_RGB_WMASK_B | - R500_INST_ALPHA_WMASK)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(1) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(0) | - R500_RGB_ADDR2(1))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(1) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(0) | - R500_ALPHA_ADDR2(1))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_B | - R500_ALU_RGB_B_SWIZ_B_B | - R500_ALU_RGB_G_SWIZ_B_B)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | - R500_ALPHA_ADDRD(1) | - R500_ALPHA_SWIZ_A_0 | - R500_ALPHA_SWIZ_B_0)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_ADDRD(1) | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_ALPHA_SEL_C_SRC0 | - R500_ALU_RGBA_A_SWIZ_0)); - - /* MAD result.rgb, const2.rgb, temp0.rrr, temp1.rgb */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | - R500_INST_TEX_SEM_WAIT | - R500_INST_LAST | - R500_INST_RGB_OMASK_R | - R500_INST_RGB_OMASK_G | - R500_INST_RGB_OMASK_B | - R500_INST_ALPHA_OMASK | - R500_INST_RGB_CLAMP | - R500_INST_ALPHA_CLAMP)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(2) | - R500_RGB_ADDR0_CONST | - R500_RGB_ADDR1(0) | - R500_RGB_ADDR2(1))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(1) | - R500_ALPHA_ADDR0_CONST | - R500_ALPHA_ADDR1(0) | - R500_ALPHA_ADDR2(1))); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | - R500_ALU_RGB_R_SWIZ_A_R | - R500_ALU_RGB_G_SWIZ_A_G | - R500_ALU_RGB_B_SWIZ_A_B | - R500_ALU_RGB_SEL_B_SRC1 | - R500_ALU_RGB_R_SWIZ_B_R | - R500_ALU_RGB_B_SWIZ_B_R | - R500_ALU_RGB_G_SWIZ_B_R)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | - R500_ALPHA_ADDRD(1) | - R500_ALPHA_SWIZ_A_0 | - R500_ALPHA_SWIZ_B_0)); - OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | - R500_ALU_RGBA_ADDRD(1) | - R500_ALU_RGBA_SEL_C_SRC2 | - R500_ALU_RGBA_R_SWIZ_R | - R500_ALU_RGBA_G_SWIZ_G | - R500_ALU_RGBA_B_SWIZ_B | - R500_ALU_RGBA_ALPHA_SEL_C_SRC0 | - R500_ALU_RGBA_A_SWIZ_1)); + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, + ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | + (0 << R300_SKIP_DWORDS_0_SHIFT) | + (0 << R300_DST_VEC_LOC_0_SHIFT) | + R300_SIGNED_0 | + (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | + (0 << R300_SKIP_DWORDS_1_SHIFT) | + (6 << R300_DST_VEC_LOC_1_SHIFT) | + R300_LAST_VEC_1 | + R300_SIGNED_1)); } - /* Shader constants. */ - OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_CONST_INDEX(0)); + /* load the vertex shader + * We pre-load vertex programs in RADEONInit3DEngine(): + * - exa mask/Xv bicubic + * - exa no mask + * - Xv + * Here we select the offset of the vertex program we want to use + */ + if (info->accel_state->has_tcl) { + if (pPriv->bicubic_enabled) { + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, + ((0 << R300_PVS_FIRST_INST_SHIFT) | + (2 << R300_PVS_XYZW_VALID_INST_SHIFT) | + (2 << R300_PVS_LAST_INST_SHIFT))); + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, + (2 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + } else { + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, + ((5 << R300_PVS_FIRST_INST_SHIFT) | + (6 << R300_PVS_XYZW_VALID_INST_SHIFT) | + (6 << R300_PVS_LAST_INST_SHIFT))); + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, + (6 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + } + } - /* constant 0: off, yco */ - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, off[0]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, off[1]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, off[2]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, yco); - /* constant 1: uco */ - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, uco[0]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, uco[1]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, uco[2]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, gamma); - /* constant 2: vco */ - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, vco[0]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, vco[1]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, vco[2]); - OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, 0.0); + /* Position and one set of 2 texture coordinates */ + OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_0, R300_VTX_POS_PRESENT); + if (pPriv->bicubic_enabled) + OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, ((2 << R300_TEX_0_COMP_CNT_SHIFT) | + (2 << R300_TEX_1_COMP_CNT_SHIFT))); + else + OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, (2 << R300_TEX_0_COMP_CNT_SHIFT)); + + OUT_ACCEL_REG(R300_US_OUT_FMT_0, output_fmt); + FINISH_ACCEL(); + + /* setup pixel shader */ + if (IS_R300_3D) { + if (pPriv->bicubic_enabled) { + BEGIN_ACCEL(79); + + /* 4 components: 2 for tex0 and 2 for tex1 */ + OUT_ACCEL_REG(R300_RS_COUNT, ((4 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1) | R300_TX_OFFSET_RS(6)); + + /* Pixel stack frame size. */ + OUT_ACCEL_REG(R300_US_PIXSIZE, 5); + + /* Indirection levels */ + OUT_ACCEL_REG(R300_US_CONFIG, ((2 << R300_NLEVEL_SHIFT) | + R300_FIRST_TEX)); + + /* Set nodes. */ + OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | + R300_ALU_CODE_SIZE(14) | + R300_TEX_CODE_OFFSET(0) | + R300_TEX_CODE_SIZE(6))); + + /* Nodes are allocated highest first, but executed lowest first */ + OUT_ACCEL_REG(R300_US_CODE_ADDR_0, 0); + OUT_ACCEL_REG(R300_US_CODE_ADDR_1, (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(0))); + OUT_ACCEL_REG(R300_US_CODE_ADDR_2, (R300_ALU_START(1) | + R300_ALU_SIZE(9) | + R300_TEX_START(1) | + R300_TEX_SIZE(0))); + OUT_ACCEL_REG(R300_US_CODE_ADDR_3, (R300_ALU_START(11) | + R300_ALU_SIZE(2) | + R300_TEX_START(2) | + R300_TEX_SIZE(3) | + R300_RGBA_OUT)); + + /* ** BICUBIC FP ** */ + + /* texcoord0 => temp0 + * texcoord1 => temp1 */ + + // first node + /* TEX temp2, temp1.rrr0, tex1, 1D */ + OUT_ACCEL_REG(R300_US_TEX_INST(0), (R300_TEX_INST(R300_TEX_INST_LD) | + R300_TEX_ID(1) | + R300_TEX_SRC_ADDR(1) | + R300_TEX_DST_ADDR(2))); + + /* MOV temp1.r, temp1.ggg0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(0), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(0), (R300_ALU_RGB_ADDR0(1) | + R300_ALU_RGB_ADDRD(1) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(0), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(0), (R300_ALU_ALPHA_ADDRD(1) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + + // second node + /* TEX temp1, temp1, tex1, 1D */ + OUT_ACCEL_REG(R300_US_TEX_INST(1), (R300_TEX_INST(R300_TEX_INST_LD) | + R300_TEX_ID(1) | + R300_TEX_SRC_ADDR(1) | + R300_TEX_DST_ADDR(1))); + + /* MUL temp3.rg, temp2.ggg0, const0.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(1), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(1), (R300_ALU_RGB_ADDR0(2) | + R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(0)) | + R300_ALU_RGB_ADDRD(3) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(1), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(1), (R300_ALU_ALPHA_ADDRD(3) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + + /* MUL temp2.rg, temp2.rrr0, const0.rgb */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(2), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RRR) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(2), (R300_ALU_RGB_ADDR0(2) | + R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(0)) | + R300_ALU_RGB_ADDRD(2) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(2), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(2), (R300_ALU_ALPHA_ADDRD(2) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* MAD temp4.rg, temp1.ggg0, const1.rgb, temp3.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(3), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(3), (R300_ALU_RGB_ADDR0(1) | + R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | + R300_ALU_RGB_ADDR2(3) | + R300_ALU_RGB_ADDRD(4) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(3), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(3), (R300_ALU_ALPHA_ADDRD(4) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* MAD temp5.rg, temp1.ggg0, const1.rgb, temp2.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(4), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_GGG) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(4), (R300_ALU_RGB_ADDR0(1) | + R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | + R300_ALU_RGB_ADDR2(2) | + R300_ALU_RGB_ADDRD(5) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(4), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(4), (R300_ALU_ALPHA_ADDRD(5) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* MAD temp3.rg, temp1.rrr0, const1.rgb, temp3.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(5), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RRR) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(5), (R300_ALU_RGB_ADDR0(1) | + R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | + R300_ALU_RGB_ADDR2(3) | + R300_ALU_RGB_ADDRD(3) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(5), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(5), (R300_ALU_ALPHA_ADDRD(3) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* MAD temp1.rg, temp1.rrr0, const1.rgb, temp2.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(6), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RRR) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(6), (R300_ALU_RGB_ADDR0(1) | + R300_ALU_RGB_ADDR1(R300_ALU_RGB_CONST(1)) | + R300_ALU_RGB_ADDR2(2) | + R300_ALU_RGB_ADDRD(1) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(6), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(6), (R300_ALU_ALPHA_ADDRD(1) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* ADD temp1.rg, temp0.rgb0, temp1.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(7), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(7), (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR2(1) | + R300_ALU_RGB_ADDRD(1) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(7), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(7), (R300_ALU_ALPHA_ADDRD(1) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* ADD temp2.rg, temp0.rgb0, temp3.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(8), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(8), (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR2(3) | + R300_ALU_RGB_ADDRD(2) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(8), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(8), (R300_ALU_ALPHA_ADDRD(2) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* ADD temp3.rg, temp0.rgb0, temp5.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(9), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(9), (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR2(5) | + R300_ALU_RGB_ADDRD(3) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(9), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(9), (R300_ALU_ALPHA_ADDRD(3) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + /* ADD temp0.rg, temp0.rgb0, temp4.rgb0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(10), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(10), (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR2(4) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_R | R300_ALU_RGB_MASK_G))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(10), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(10), (R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + + + // third node + /* TEX temp4, temp1.rg--, tex0, 1D */ + OUT_ACCEL_REG(R300_US_TEX_INST(2), (R300_TEX_INST(R300_TEX_INST_LD) | + R300_TEX_ID(0) | + R300_TEX_SRC_ADDR(1) | + R300_TEX_DST_ADDR(4))); + + /* TEX temp3, temp3.rg--, tex0, 1D */ + OUT_ACCEL_REG(R300_US_TEX_INST(3), (R300_TEX_INST(R300_TEX_INST_LD) | + R300_TEX_ID(0) | + R300_TEX_SRC_ADDR(3) | + R300_TEX_DST_ADDR(3))); + + /* TEX temp5, temp2.rg--, tex0, 1D */ + OUT_ACCEL_REG(R300_US_TEX_INST(4), (R300_TEX_INST(R300_TEX_INST_LD) | + R300_TEX_ID(0) | + R300_TEX_SRC_ADDR(2) | + R300_TEX_DST_ADDR(5))); + + /* TEX temp0, temp0.rg--, tex0, 1D */ + OUT_ACCEL_REG(R300_US_TEX_INST(5), (R300_TEX_INST(R300_TEX_INST_LD) | + R300_TEX_ID(0) | + R300_TEX_SRC_ADDR(0) | + R300_TEX_DST_ADDR(0))); + + /* LRP temp3, temp1.bbbb, temp4, temp3 -> + * - PRESUB temps, temp4 - temp3 + * - MAD temp3, temp1.bbbb, temps, temp3 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(11), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC2_BBB) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRCP_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_SRCP_OP(R300_ALU_RGB_SRCP_OP_RGB1_MINUS_RGB0))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(11), (R300_ALU_RGB_ADDR0(3) | + R300_ALU_RGB_ADDR1(4) | + R300_ALU_RGB_ADDR2(1) | + R300_ALU_RGB_ADDRD(3) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(11), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC2_B) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_SRCP_A) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_SRC0_A))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(11), (R300_ALU_ALPHA_ADDR0(3) | + R300_ALU_ALPHA_ADDR1(4) | + R300_ALU_ALPHA_ADDR2(1) | + R300_ALU_ALPHA_ADDRD(3) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_A))); + + /* LRP temp0, temp1.bbbb, temp5, temp0 -> + * - PRESUB temps, temp5 - temp0 + * - MAD temp0, temp1.bbbb, temps, temp0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(12), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC2_BBB) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRCP_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_SRCP_OP(R300_ALU_RGB_SRCP_OP_RGB1_MINUS_RGB0) | + R300_ALU_RGB_INSERT_NOP)); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(12), (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR1(5) | + R300_ALU_RGB_ADDR2(1) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(12), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC2_B) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_SRCP_A) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_SRC0_A))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(12), (R300_ALU_ALPHA_ADDR0(0) | + R300_ALU_ALPHA_ADDR1(5) | + R300_ALU_ALPHA_ADDR2(1) | + R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_A))); + + /* LRP output, temp2.bbbb, temp3, temp0 -> + * - PRESUB temps, temp3 - temp0 + * - MAD output, temp2.bbbb, temps, temp0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(13), (R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC2_BBB) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRCP_RGB) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_SRCP_OP(R300_ALU_RGB_SRCP_OP_RGB1_MINUS_RGB0))); + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(13), (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR1(3) | + R300_ALU_RGB_ADDR2(2) | + R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_RGB))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(13), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC2_B) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_SRCP_A) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_SRC0_A))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(13), (R300_ALU_ALPHA_ADDR0(0) | + R300_ALU_ALPHA_ADDR1(3) | + R300_ALU_ALPHA_ADDR2(2) | + R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A))); + + /* Shader constants. */ + OUT_ACCEL_REG(R300_US_ALU_CONST_R(0), F_TO_24(1.0/(float)pPriv->w)); + OUT_ACCEL_REG(R300_US_ALU_CONST_G(0), 0); + OUT_ACCEL_REG(R300_US_ALU_CONST_B(0), 0); + OUT_ACCEL_REG(R300_US_ALU_CONST_A(0), 0); + + OUT_ACCEL_REG(R300_US_ALU_CONST_R(1), 0); + OUT_ACCEL_REG(R300_US_ALU_CONST_G(1), F_TO_24(1.0/(float)pPriv->h)); + OUT_ACCEL_REG(R300_US_ALU_CONST_B(1), 0); + OUT_ACCEL_REG(R300_US_ALU_CONST_A(1), 0); + + FINISH_ACCEL(); + } else if (isplanar) { + /* + * y' = y - .0625 + * u' = u - .5 + * v' = v - .5; + * + * r = 1.1643 * y' + 0.0 * u' + 1.5958 * v' + * g = 1.1643 * y' - 0.39173 * u' - 0.81290 * v' + * b = 1.1643 * y' + 2.017 * u' + 0.0 * v' + * + * DP3 might look like the straightforward solution + * but we'd need to move the texture yuv values in + * the same reg for this to work. Therefore use MADs. + * Without changing the shader at all (only the constants) + * could also provide hue/saturation/brightness/contrast control. + * + * yco = 1.1643 + * uco = 0, -0.39173, 2.017 + * vco = 1.5958, -0.8129, 0 + * off = -0.0625 * yco + -0.5 * uco[r] + -0.5 * vco[r], + * -0.0625 * yco + -0.5 * uco[g] + -0.5 * vco[g], + * -0.0625 * yco + -0.5 * uco[b] + -0.5 * vco[b], + * + * temp = MAD(yco, yuv.yyyy, off) + * temp = MAD(uco, yuv.uuuu, temp) + * result = MAD(vco, yuv.vvvv, temp) + */ + float yco = 1.1643; + float uco[3] = {0.0, -0.39173, 2.018}; + float vco[3] = {1.5958, -0.8129, 0.0}; + float off[3] = {-0.0625 * yco + -0.5 * uco[0] + -0.5 * vco[0], + -0.0625 * yco + -0.5 * uco[1] + -0.5 * vco[1], + -0.0625 * yco + -0.5 * uco[2] + -0.5 * vco[2]}; + + BEGIN_ACCEL(33); + /* 2 components: same 2 for tex0/1/2 */ + OUT_ACCEL_REG(R300_RS_COUNT, + ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0) | R300_TX_OFFSET_RS(6)); + + OUT_ACCEL_REG(R300_US_PIXSIZE, 2); /* highest temp used */ + + /* Indirection levels */ + OUT_ACCEL_REG(R300_US_CONFIG, ((0 << R300_NLEVEL_SHIFT) | + R300_FIRST_TEX)); + + OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | + R300_ALU_CODE_SIZE(3) | + R300_TEX_CODE_OFFSET(0) | + R300_TEX_CODE_SIZE(3))); + + OUT_ACCEL_REG(R300_US_CODE_ADDR_3, (R300_ALU_START(0) | + R300_ALU_SIZE(2) | + R300_TEX_START(0) | + R300_TEX_SIZE(2) | + R300_RGBA_OUT)); + + /* tex inst */ + OUT_ACCEL_REG(R300_US_TEX_INST_0, (R300_TEX_SRC_ADDR(0) | + R300_TEX_DST_ADDR(0) | + R300_TEX_ID(0) | + R300_TEX_INST(R300_TEX_INST_LD))); + OUT_ACCEL_REG(R300_US_TEX_INST_1, (R300_TEX_SRC_ADDR(0) | + R300_TEX_DST_ADDR(1) | + R300_TEX_ID(1) | + R300_TEX_INST(R300_TEX_INST_LD))); + OUT_ACCEL_REG(R300_US_TEX_INST_2, (R300_TEX_SRC_ADDR(0) | + R300_TEX_DST_ADDR(2) | + R300_TEX_ID(2) | + R300_TEX_INST(R300_TEX_INST_LD))); + + /* ALU inst */ + /* MAD temp0, const0.a, temp0, const0.rgb */ + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(0), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(0)) | + R300_ALU_RGB_ADDR1(0) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(0), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_AAA) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); + /* alpha nop, but need to set up alpha source for rgb usage */ + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(0), (R300_ALU_ALPHA_ADDR0(R300_ALU_ALPHA_CONST(0)) | + R300_ALU_ALPHA_ADDR1(0) | + R300_ALU_ALPHA_ADDR2(0) | + R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(0), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + + /* MAD const1, temp1, temp0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(1), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(1)) | + R300_ALU_RGB_ADDR1(1) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(1), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB) | + R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE))); + /* alpha nop */ + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(1), (R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_WMASK(R300_ALU_ALPHA_MASK_NONE))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(1), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0))); + + /* MAD result, const2, temp2, temp0 */ + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR(2), (R300_ALU_RGB_ADDR0(R300_ALU_RGB_CONST(2)) | + R300_ALU_RGB_ADDR1(2) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_WMASK(R300_ALU_RGB_MASK_RGB) | + R300_ALU_RGB_OMASK(R300_ALU_RGB_MASK_RGB))); + OUT_ACCEL_REG(R300_US_ALU_RGB_INST(2), (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_SRC1_RGB) | + R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_SRC2_RGB) | + R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | + R300_ALU_RGB_CLAMP)); + /* write alpha 1 */ + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR(4), (R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | + R300_ALU_ALPHA_TARGET_A)); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST(4), (R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_1_0))); + + /* Shader constants. */ + /* constant 0: off, yco */ + OUT_ACCEL_REG(R300_US_ALU_CONST_R(0), F_TO_24(off[0])); + OUT_ACCEL_REG(R300_US_ALU_CONST_G(0), F_TO_24(off[1])); + OUT_ACCEL_REG(R300_US_ALU_CONST_B(0), F_TO_24(off[2])); + OUT_ACCEL_REG(R300_US_ALU_CONST_A(0), F_TO_24(yco)); + /* constant 1: uco */ + OUT_ACCEL_REG(R300_US_ALU_CONST_R(1), F_TO_24(uco[0])); + OUT_ACCEL_REG(R300_US_ALU_CONST_G(1), F_TO_24(uco[1])); + OUT_ACCEL_REG(R300_US_ALU_CONST_B(1), F_TO_24(uco[2])); + OUT_ACCEL_REG(R300_US_ALU_CONST_A(1), F_TO_24(0.0)); + /* constant 2: vco */ + OUT_ACCEL_REG(R300_US_ALU_CONST_R(2), F_TO_24(vco[0])); + OUT_ACCEL_REG(R300_US_ALU_CONST_G(2), F_TO_24(vco[1])); + OUT_ACCEL_REG(R300_US_ALU_CONST_B(2), F_TO_24(vco[2])); + OUT_ACCEL_REG(R300_US_ALU_CONST_A(2), F_TO_24(0.0)); + + FINISH_ACCEL(); + + } else { + BEGIN_ACCEL(11); + /* 2 components: 2 for tex0 */ + OUT_ACCEL_REG(R300_RS_COUNT, + ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0) | R300_TX_OFFSET_RS(6)); + + OUT_ACCEL_REG(R300_US_PIXSIZE, 0); /* highest temp used */ + + /* Indirection levels */ + OUT_ACCEL_REG(R300_US_CONFIG, ((0 << R300_NLEVEL_SHIFT) | + R300_FIRST_TEX)); + + OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | + R300_ALU_CODE_SIZE(1) | + R300_TEX_CODE_OFFSET(0) | + R300_TEX_CODE_SIZE(1))); + + OUT_ACCEL_REG(R300_US_CODE_ADDR_3, (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(0) | + R300_RGBA_OUT)); + + /* tex inst */ + OUT_ACCEL_REG(R300_US_TEX_INST_0, (R300_TEX_SRC_ADDR(0) | + R300_TEX_DST_ADDR(0) | + R300_TEX_ID(0) | + R300_TEX_INST(R300_TEX_INST_LD))); + + /* ALU inst */ + /* RGB */ + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR_0, (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR1(0) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_OMASK((R300_ALU_RGB_MASK_R | + R300_ALU_RGB_MASK_G | + R300_ALU_RGB_MASK_B)) | + R300_ALU_RGB_TARGET_A)); + OUT_ACCEL_REG(R300_US_ALU_RGB_INST_0, (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0) | + R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | + R300_ALU_RGB_CLAMP)); + /* Alpha */ + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR_0, (R300_ALU_ALPHA_ADDR0(0) | + R300_ALU_ALPHA_ADDR1(0) | + R300_ALU_ALPHA_ADDR2(0) | + R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | + R300_ALU_ALPHA_TARGET_A | + R300_ALU_ALPHA_OMASK_W(R300_ALU_ALPHA_MASK_NONE))); + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST_0, (R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_A) | + R300_ALU_ALPHA_MOD_A(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_1_0) | + R300_ALU_ALPHA_MOD_B(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_MOD_C(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_OMOD(R300_ALU_ALPHA_OMOD_NONE) | + R300_ALU_ALPHA_CLAMP)); + FINISH_ACCEL(); + } + } else { + if (pPriv->bicubic_enabled) { + BEGIN_ACCEL(7); + + /* 4 components: 2 for tex0 and 2 for tex1 */ + OUT_ACCEL_REG(R300_RS_COUNT, + ((4 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1) | R300_TX_OFFSET_RS(6)); + + /* Pixel stack frame size. */ + OUT_ACCEL_REG(R300_US_PIXSIZE, 5); + + /* FP length. */ + OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | + R500_US_CODE_END_ADDR(13))); + OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | + R500_US_CODE_RANGE_SIZE(13))); + + /* Prepare for FP emission. */ + OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); + OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_INST_INDEX(0)); + FINISH_ACCEL(); + + BEGIN_ACCEL(89); + /* Pixel shader. + * I've gone ahead and annotated each instruction, since this + * thing is MASSIVE. :3 + * Note: In order to avoid buggies with temps and multiple + * inputs, all temps are offset by 2. temp0 -> register2. */ + + /* TEX temp2, input1.xxxx, tex1, 1D */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(1) | + R500_TEX_INST_LD | + R500_TEX_IGNORE_UNCOVERED)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(1) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_R | + R500_TEX_SRC_R_SWIZ_R | + R500_TEX_SRC_Q_SWIZ_R | + R500_TEX_DST_ADDR(2) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* TEX temp5, input1.yyyy, tex1, 1D */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(1) | + R500_TEX_INST_LD | + R500_TEX_SEM_ACQUIRE | + R500_TEX_IGNORE_UNCOVERED)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(1) | + R500_TEX_SRC_S_SWIZ_G | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_SRC_R_SWIZ_G | + R500_TEX_SRC_Q_SWIZ_G | + R500_TEX_DST_ADDR(5) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* MUL temp4, const0.x0x0, temp2.yyxx */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_ADDR0_CONST | + R500_RGB_ADDR1(2))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_ADDR0_CONST | + R500_ALPHA_ADDR1(2))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | + R500_ALU_RGB_R_SWIZ_A_R | + R500_ALU_RGB_G_SWIZ_A_0 | + R500_ALU_RGB_B_SWIZ_A_R | + R500_ALU_RGB_SEL_B_SRC1 | + R500_ALU_RGB_R_SWIZ_B_G | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(4) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SEL_A_SRC0 | + R500_ALPHA_SWIZ_A_0 | + R500_ALPHA_SEL_B_SRC1 | + R500_ALPHA_SWIZ_B_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(4) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_R_SWIZ_0 | + R500_ALU_RGBA_G_SWIZ_0 | + R500_ALU_RGBA_B_SWIZ_0 | + R500_ALU_RGBA_A_SWIZ_0)); + + /* MAD temp3, const0.0y0y, temp5.xxxx, temp4 */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_ADDR0_CONST | + R500_RGB_ADDR1(5) | + R500_RGB_ADDR2(4))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_ADDR0_CONST | + R500_ALPHA_ADDR1(5) | + R500_ALPHA_ADDR2(4))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | + R500_ALU_RGB_R_SWIZ_A_0 | + R500_ALU_RGB_G_SWIZ_A_G | + R500_ALU_RGB_B_SWIZ_A_0 | + R500_ALU_RGB_SEL_B_SRC1 | + R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_R | + R500_ALU_RGB_B_SWIZ_B_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(3) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SEL_A_SRC0 | + R500_ALPHA_SWIZ_A_G | + R500_ALPHA_SEL_B_SRC1 | + R500_ALPHA_SWIZ_B_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(3) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_SEL_C_SRC2 | + R500_ALU_RGBA_R_SWIZ_R | + R500_ALU_RGBA_G_SWIZ_G | + R500_ALU_RGBA_B_SWIZ_B | + R500_ALU_RGBA_A_SWIZ_A)); + + /* ADD temp3, temp3, input0.xyxy */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR1(3) | + R500_RGB_ADDR2(0))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR1(3) | + R500_ALPHA_ADDR2(0))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_R_SWIZ_A_1 | + R500_ALU_RGB_G_SWIZ_A_1 | + R500_ALU_RGB_B_SWIZ_A_1 | + R500_ALU_RGB_SEL_B_SRC1 | + R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(3) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SWIZ_A_1 | + R500_ALPHA_SEL_B_SRC1 | + R500_ALPHA_SWIZ_B_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(3) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_SEL_C_SRC2 | + R500_ALU_RGBA_R_SWIZ_R | + R500_ALU_RGBA_G_SWIZ_G | + R500_ALU_RGBA_B_SWIZ_R | + R500_ALU_RGBA_A_SWIZ_G)); + + /* TEX temp1, temp3.zwxy, tex0, 2D */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_IGNORE_UNCOVERED)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(3) | + R500_TEX_SRC_S_SWIZ_B | + R500_TEX_SRC_T_SWIZ_A | + R500_TEX_SRC_R_SWIZ_R | + R500_TEX_SRC_Q_SWIZ_G | + R500_TEX_DST_ADDR(1) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* TEX temp3, temp3.xyzw, tex0, 2D */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_SEM_ACQUIRE | + R500_TEX_IGNORE_UNCOVERED)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(3) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_SRC_R_SWIZ_B | + R500_TEX_SRC_Q_SWIZ_A | + R500_TEX_DST_ADDR(3) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* MAD temp4, const0.0y0y, temp5.yyyy, temp4 */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_ADDR0_CONST | + R500_RGB_ADDR1(5) | + R500_RGB_ADDR2(4))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_ADDR0_CONST | + R500_ALPHA_ADDR1(5) | + R500_ALPHA_ADDR2(4))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | + R500_ALU_RGB_R_SWIZ_A_0 | + R500_ALU_RGB_G_SWIZ_A_G | + R500_ALU_RGB_B_SWIZ_A_0 | + R500_ALU_RGB_SEL_B_SRC1 | + R500_ALU_RGB_R_SWIZ_B_G | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_G)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(4) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SEL_A_SRC0 | + R500_ALPHA_SWIZ_A_G | + R500_ALPHA_SEL_B_SRC1 | + R500_ALPHA_SWIZ_B_G)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(4) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_SEL_C_SRC2 | + R500_ALU_RGBA_R_SWIZ_R | + R500_ALU_RGBA_G_SWIZ_G | + R500_ALU_RGBA_B_SWIZ_B | + R500_ALU_RGBA_A_SWIZ_A)); + + /* ADD temp0, temp4, input0.xyxy */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR1(4) | + R500_RGB_ADDR2(0))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR1(4) | + R500_ALPHA_ADDR2(0))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_R_SWIZ_A_1 | + R500_ALU_RGB_G_SWIZ_A_1 | + R500_ALU_RGB_B_SWIZ_A_1 | + R500_ALU_RGB_SEL_B_SRC1 | + R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(0) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SWIZ_A_1 | + R500_ALPHA_SEL_B_SRC1 | + R500_ALPHA_SWIZ_B_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(0) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_SEL_C_SRC2 | + R500_ALU_RGBA_R_SWIZ_R | + R500_ALU_RGBA_G_SWIZ_G | + R500_ALU_RGBA_B_SWIZ_R | + R500_ALU_RGBA_A_SWIZ_G)); + + /* TEX temp4, temp0.zwzw, tex0, 2D */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_IGNORE_UNCOVERED)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | + R500_TEX_SRC_S_SWIZ_B | + R500_TEX_SRC_T_SWIZ_A | + R500_TEX_SRC_R_SWIZ_B | + R500_TEX_SRC_Q_SWIZ_A | + R500_TEX_DST_ADDR(4) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* TEX temp0, temp0.xyzw, tex0, 2D */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_SEM_ACQUIRE | + R500_TEX_IGNORE_UNCOVERED)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_SRC_R_SWIZ_B | + R500_TEX_SRC_Q_SWIZ_A | + R500_TEX_DST_ADDR(0) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* LRP temp3, temp2.zzzz, temp1, temp3 -> + * - PRESUB temps, temp1 - temp3 + * - MAD temp2.zzzz, temps, temp3 */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(3) | + R500_RGB_SRCP_OP_RGB1_MINUS_RGB0 | + R500_RGB_ADDR1(1) | + R500_RGB_ADDR2(2))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(3) | + R500_ALPHA_SRCP_OP_A1_MINUS_A0 | + R500_ALPHA_ADDR1(1) | + R500_ALPHA_ADDR2(2))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC2 | + R500_ALU_RGB_R_SWIZ_A_B | + R500_ALU_RGB_G_SWIZ_A_B | + R500_ALU_RGB_B_SWIZ_A_B | + R500_ALU_RGB_SEL_B_SRCP | + R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(3) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SEL_A_SRC2 | + R500_ALPHA_SWIZ_A_B | + R500_ALPHA_SEL_B_SRCP | + R500_ALPHA_SWIZ_B_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(3) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_SEL_C_SRC0 | + R500_ALU_RGBA_R_SWIZ_R | + R500_ALU_RGBA_G_SWIZ_G | + R500_ALU_RGBA_B_SWIZ_B | + R500_ALU_RGBA_A_SWIZ_A)); + + /* LRP temp0, temp2.zzzz, temp4, temp0 -> + * - PRESUB temps, temp4 - temp1 + * - MAD temp2.zzzz, temps, temp0 */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_ALU | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_SRCP_OP_RGB1_MINUS_RGB0 | + R500_RGB_ADDR1(4) | + R500_RGB_ADDR2(2))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_SRCP_OP_A1_MINUS_A0 | + R500_ALPHA_ADDR1(4) | + R500_ALPHA_ADDR2(2))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC2 | + R500_ALU_RGB_R_SWIZ_A_B | + R500_ALU_RGB_G_SWIZ_A_B | + R500_ALU_RGB_B_SWIZ_A_B | + R500_ALU_RGB_SEL_B_SRCP | + R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(0) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SEL_A_SRC2 | + R500_ALPHA_SWIZ_A_B | + R500_ALPHA_SEL_B_SRCP | + R500_ALPHA_SWIZ_B_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(0) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_SEL_C_SRC0 | + R500_ALU_RGBA_R_SWIZ_R | + R500_ALU_RGBA_G_SWIZ_G | + R500_ALU_RGBA_B_SWIZ_B | + R500_ALU_RGBA_A_SWIZ_A)); + + /* LRP output, temp5.zzzz, temp3, temp0 -> + * - PRESUB temps, temp3 - temp0 + * - MAD temp5.zzzz, temps, temp0 */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | + R500_INST_LAST | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK | + R500_INST_RGB_OMASK_R | + R500_INST_RGB_OMASK_G | + R500_INST_RGB_OMASK_B | + R500_INST_ALPHA_OMASK)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_SRCP_OP_RGB1_MINUS_RGB0 | + R500_RGB_ADDR1(3) | + R500_RGB_ADDR2(5))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_SRCP_OP_A1_MINUS_A0 | + R500_ALPHA_ADDR1(3) | + R500_ALPHA_ADDR2(5))); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC2 | + R500_ALU_RGB_R_SWIZ_A_B | + R500_ALU_RGB_G_SWIZ_A_B | + R500_ALU_RGB_B_SWIZ_A_B | + R500_ALU_RGB_SEL_B_SRCP | + R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDRD(0) | + R500_ALPHA_OP_MAD | + R500_ALPHA_SEL_A_SRC2 | + R500_ALPHA_SWIZ_A_B | + R500_ALPHA_SEL_B_SRCP | + R500_ALPHA_SWIZ_B_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_ADDRD(0) | + R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_SEL_C_SRC0 | + R500_ALU_RGBA_R_SWIZ_R | + R500_ALU_RGBA_G_SWIZ_G | + R500_ALU_RGBA_B_SWIZ_B | + R500_ALU_RGBA_A_SWIZ_A)); + + /* Shader constants. */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_CONST_INDEX(0)); + + /* const0 = {1 / texture[0].width, 1 / texture[0].height, 0, 0} */ + OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, (1.0/(float)pPriv->w)); + OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, (1.0/(float)pPriv->h)); + OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, 0x0); + OUT_ACCEL_REG_F(R500_GA_US_VECTOR_DATA, 0x0); + + FINISH_ACCEL(); + + } else { + BEGIN_ACCEL(19); + /* 2 components: 2 for tex0 */ + OUT_ACCEL_REG(R300_RS_COUNT, + ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0) | R300_TX_OFFSET_RS(6)); + + /* Pixel stack frame size. */ + OUT_ACCEL_REG(R300_US_PIXSIZE, 0); /* highest temp used */ + + /* FP length. */ + OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | + R500_US_CODE_END_ADDR(1))); + OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | + R500_US_CODE_RANGE_SIZE(1))); + + /* Prepare for FP emission. */ + OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); + OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, R500_US_VECTOR_INST_INDEX(0)); + + /* tex inst */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_SEM_ACQUIRE | + R500_TEX_IGNORE_UNCOVERED)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_DST_ADDR(0) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | + R500_DX_S_SWIZ_R | + R500_DX_T_SWIZ_R | + R500_DX_R_SWIZ_R | + R500_DX_Q_SWIZ_R | + R500_DY_ADDR(0) | + R500_DY_S_SWIZ_R | + R500_DY_T_SWIZ_R | + R500_DY_R_SWIZ_R | + R500_DY_Q_SWIZ_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* ALU inst */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | + R500_INST_TEX_SEM_WAIT | + R500_INST_LAST | + R500_INST_RGB_OMASK_R | + R500_INST_RGB_OMASK_G | + R500_INST_RGB_OMASK_B | + R500_INST_ALPHA_OMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_ADDR1(0) | + R500_RGB_ADDR1_CONST | + R500_RGB_ADDR2(0) | + R500_RGB_ADDR2_CONST)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_ADDR1(0) | + R500_ALPHA_ADDR1_CONST | + R500_ALPHA_ADDR2(0) | + R500_ALPHA_ADDR2_CONST)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | + R500_ALU_RGB_R_SWIZ_A_R | + R500_ALU_RGB_G_SWIZ_A_G | + R500_ALU_RGB_B_SWIZ_A_B | + R500_ALU_RGB_SEL_B_SRC0 | + R500_ALU_RGB_R_SWIZ_B_1 | + R500_ALU_RGB_B_SWIZ_B_1 | + R500_ALU_RGB_G_SWIZ_B_1)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | + R500_ALPHA_SWIZ_A_A | + R500_ALPHA_SWIZ_B_1)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_R_SWIZ_0 | + R500_ALU_RGBA_G_SWIZ_0 | + R500_ALU_RGBA_B_SWIZ_0 | + R500_ALU_RGBA_A_SWIZ_0)); + FINISH_ACCEL(); + } + } + + BEGIN_ACCEL(6); + OUT_ACCEL_REG(R300_TX_INVALTAGS, 0); + OUT_ACCEL_REG(R300_TX_ENABLE, txenable); + + OUT_ACCEL_REG(R300_RB3D_COLOROFFSET0, dst_offset); + OUT_ACCEL_REG(R300_RB3D_COLORPITCH0, colorpitch); + + blendcntl = RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO; + /* no need to enable blending */ + OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, blendcntl); + + OUT_ACCEL_REG(R300_VAP_VTX_SIZE, vtx_count); + FINISH_ACCEL(); + + } else { + + /* Same for R100/R200 */ + switch (pPixmap->drawable.bitsPerPixel) { + case 16: + if (pPixmap->drawable.depth == 15) + dst_format = RADEON_COLOR_FORMAT_ARGB1555; + else + dst_format = RADEON_COLOR_FORMAT_RGB565; + break; + case 32: + dst_format = RADEON_COLOR_FORMAT_ARGB8888; + break; + default: + return; + } + + if (pPriv->planar_hw && (pPriv->id == FOURCC_I420 || pPriv->id == FOURCC_YV12)) { + isplanar = TRUE; + } + + if (isplanar) { + txformat = RADEON_TXFORMAT_I8; + } else { + if (pPriv->id == FOURCC_UYVY) + txformat = RADEON_TXFORMAT_YVYU422; + else + txformat = RADEON_TXFORMAT_VYUY422; + } + + txformat |= RADEON_TXFORMAT_NON_POWER2; + + colorpitch = dst_pitch >> pixel_shift; + + if (RADEONTilingEnabled(pScrn, pPixmap)) + colorpitch |= RADEON_COLOR_TILE_ENABLE; + + BEGIN_ACCEL(4); + + OUT_ACCEL_REG(RADEON_RB3D_CNTL, + dst_format /*| RADEON_ALPHA_BLEND_ENABLE*/); + OUT_ACCEL_REG(RADEON_RB3D_COLOROFFSET, dst_offset); + + OUT_ACCEL_REG(RADEON_RB3D_COLORPITCH, colorpitch); + + OUT_ACCEL_REG(RADEON_RB3D_BLENDCNTL, + RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO); FINISH_ACCEL(); + + + if ((info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280) || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_R200)) { + + info->accel_state->texW[0] = pPriv->w; + info->accel_state->texH[0] = pPriv->h; + + if (isplanar) { + /* note: in contrast to r300, use input biasing on uv components */ + float yco = 1.1643; + float yoff = -0.0625 * yco; + float uco[3] = {0.0, -0.39173, 2.018}; + float vco[3] = {1.5958, -0.8129, 0.0}; + + /* need 2 texcoord sets (even though they are identical) due + to denormalization! hw apparently can't premultiply + same coord set by different texture size */ + vtx_count = 6; + + txformat0 = (((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) | + (((((pPriv->h + 1 ) >> 1) - 1) & 0x7ff) << RADEON_TEX_VSIZE_SHIFT)); + txpitch = ((pPriv->src_pitch >> 1) + 63) & ~63; + txpitch -= 32; + txfilter = R200_MAG_FILTER_LINEAR | + R200_MIN_FILTER_LINEAR | + R200_CLAMP_S_CLAMP_LAST | + R200_CLAMP_T_CLAMP_LAST; + + BEGIN_ACCEL(36); + + OUT_ACCEL_REG(RADEON_PP_CNTL, + RADEON_TEX_0_ENABLE | RADEON_TEX_1_ENABLE | RADEON_TEX_2_ENABLE | + RADEON_TEX_BLEND_0_ENABLE | RADEON_TEX_BLEND_1_ENABLE | + RADEON_TEX_BLEND_2_ENABLE); + + OUT_ACCEL_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); + OUT_ACCEL_REG(R200_SE_VTX_FMT_1, + (2 << R200_VTX_TEX0_COMP_CNT_SHIFT) | + (2 << R200_VTX_TEX1_COMP_CNT_SHIFT)); + + OUT_ACCEL_REG(R200_PP_TXFILTER_0, txfilter); + OUT_ACCEL_REG(R200_PP_TXFORMAT_0, txformat); + OUT_ACCEL_REG(R200_PP_TXFORMAT_X_0, 0); + OUT_ACCEL_REG(R200_PP_TXSIZE_0, + (pPriv->w - 1) | + ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(R200_PP_TXPITCH_0, pPriv->src_pitch - 32); + OUT_ACCEL_REG(R200_PP_TXOFFSET_0, pPriv->src_offset); + + OUT_ACCEL_REG(R200_PP_TXFILTER_1, txfilter); + OUT_ACCEL_REG(R200_PP_TXFORMAT_1, txformat | R200_TXFORMAT_ST_ROUTE_STQ1); + OUT_ACCEL_REG(R200_PP_TXFORMAT_X_1, 0); + OUT_ACCEL_REG(R200_PP_TXSIZE_1, txformat0); + OUT_ACCEL_REG(R200_PP_TXPITCH_1, txpitch); + OUT_ACCEL_REG(R200_PP_TXOFFSET_1, pPriv->src_offset + pPriv->planeu_offset); + + OUT_ACCEL_REG(R200_PP_TXFILTER_2, txfilter); + OUT_ACCEL_REG(R200_PP_TXFORMAT_2, txformat | R200_TXFORMAT_ST_ROUTE_STQ1); + OUT_ACCEL_REG(R200_PP_TXFORMAT_X_2, 0); + OUT_ACCEL_REG(R200_PP_TXSIZE_2, txformat0); + OUT_ACCEL_REG(R200_PP_TXPITCH_2, txpitch); + OUT_ACCEL_REG(R200_PP_TXOFFSET_2, pPriv->src_offset + pPriv->planev_offset); + + /* similar to r300 code. Note the big problem is that hardware constants + * are 8 bits only, representing 0.0-1.0. We can get that up (using bias + * + scale) to -1.0-1.0 (but precision will suffer). AFAIK the hw actually + * has 12 bits fractional precision (plus 1 sign bit, 3 range bits) but + * the constants not. To get larger range can use output scale, but for + * that 2.018 value we need a total scale by 8, which means the constants + * really have no accuracy whatsoever (5 fractional bits only). + * The only direct way to get high precision "constants" into the fragment + * pipe I know of is to use the texcoord interpolator (not color, this one + * is 8 bit only too), which seems a bit expensive. We're lucky though it + * seems the values we need seem to fit better than worst case (get about + * 6 fractional bits for this instead of 5, at least when not correcting for + * hue/saturation/contrast/brightness, which is the same as for vco - yco and + * yoff get 8 fractional bits). + * + * A higher precision (8 fractional bits) version might just put uco into + * a texcoord, and calculate a new vcoconst in the shader, like so: + * cohelper = {1.0, 0.0, 0.0} - shouldn't use 0.5 since not exactly representable + * vco = {1.5958 - 1.0, -0.8129 + 1.0, 1.0} + * vcocalc = ADD temp, bias/scale(cohelper), vco + * would in total use 4 tex units, 4 instructions which seems fairly + * balanced for this architecture (instead of 3 + 3 for the solution here) + * + * temp = MAD(yco, yuv.yyyy, yoff) + * temp = MAD(uco, yuv.uuuu, temp) + * result = MAD(vco, yuv.vvvv, temp) + * + * note first mad produces actually scalar, hence we transform + * it into a dp2a to get 8 bit precision of yco instead of 7 - + * That's assuming hw correctly expands consts to internal precision. + * (y * 1 + y * (yco - 1) + yoff) + * temp = DP2A / 2 (yco, yuv.yyyy, yoff) + * temp = MAD (uco / 4, yuv.uuuu * 2, temp) + * result = MAD x2 (vco / 2, yuv.vvvv, temp) + * + * vco, uco need bias (and hence scale too) + * + */ + + /* MAD temp0 / 2, const0.a * 2, temp0, -const0.rgb */ + OUT_ACCEL_REG(R200_PP_TXCBLEND_0, + R200_TXC_ARG_A_TFACTOR_COLOR | + R200_TXC_ARG_B_R0_COLOR | + R200_TXC_ARG_C_TFACTOR_COLOR | + R200_TXC_NEG_ARG_C | + R200_TXC_OP_DOT2_ADD); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_0, + (0 << R200_TXC_TFACTOR_SEL_SHIFT) | + R200_TXC_SCALE_INV2 | + R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R0); + OUT_ACCEL_REG(R200_PP_TXABLEND_0, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_ZERO | + R200_TXA_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXABLEND2_0, + R200_TXA_OUTPUT_REG_NONE); + + /* MAD temp0, (const1 - 0.5) * 2, (temp1 - 0.5) * 2, temp0 */ + OUT_ACCEL_REG(R200_PP_TXCBLEND_1, + R200_TXC_ARG_A_TFACTOR_COLOR | + R200_TXC_BIAS_ARG_A | + R200_TXC_SCALE_ARG_A | + R200_TXC_ARG_B_R1_COLOR | + R200_TXC_BIAS_ARG_B | + R200_TXC_SCALE_ARG_B | + R200_TXC_ARG_C_R0_COLOR | + R200_TXC_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_1, + (1 << R200_TXC_TFACTOR_SEL_SHIFT) | + R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R0); + OUT_ACCEL_REG(R200_PP_TXABLEND_1, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_ZERO | + R200_TXA_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXABLEND2_1, + R200_TXA_OUTPUT_REG_NONE); + + /* MAD temp0 x 2, (const2 - 0.5) * 2, (temp2 - 0.5), temp0 */ + OUT_ACCEL_REG(R200_PP_TXCBLEND_2, + R200_TXC_ARG_A_TFACTOR_COLOR | + R200_TXC_BIAS_ARG_A | + R200_TXC_SCALE_ARG_A | + R200_TXC_ARG_B_R2_COLOR | + R200_TXC_BIAS_ARG_B | + R200_TXC_ARG_C_R0_COLOR | + R200_TXC_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_2, + (2 << R200_TXC_TFACTOR_SEL_SHIFT) | + R200_TXC_SCALE_2X | + R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); + OUT_ACCEL_REG(R200_PP_TXABLEND_2, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_ZERO | + R200_TXA_COMP_ARG_C | + R200_TXA_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXABLEND2_2, + R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); + + /* shader constants */ + OUT_ACCEL_REG(R200_PP_TFACTOR_0, float4touint(1.0, /* src range [1, 2] */ + yco - 1.0, + -yoff, /* range [-1, 0] */ + 0.0)); + OUT_ACCEL_REG(R200_PP_TFACTOR_1, float4touint(uco[0] * 0.125 + 0.5, /* range [-4, 4] */ + uco[1] * 0.125 + 0.5, + uco[2] * 0.125 + 0.5, + 0.0)); + OUT_ACCEL_REG(R200_PP_TFACTOR_2, float4touint(vco[0] * 0.25 + 0.5, /* range [-2, 2] */ + vco[1] * 0.25 + 0.5, + vco[2] * 0.25 + 0.5, + 0.0)); + + FINISH_ACCEL(); + } + else if (info->ChipFamily == CHIP_FAMILY_RV250) { + /* fix up broken packed yuv - shader same as above except + yuv compoents are all in same reg */ + float yco = 1.1643; + float yoff = -0.0625 * yco; + float uco[3] = {0.0, -0.39173, 2.018}; + float vco[3] = {1.5958, -0.8129, 0.0}; + + txformat0 = (((((pPriv->w + 1 ) >> 1) - 1) & 0x7ff) | + (((((pPriv->h + 1 ) >> 1 ) - 1) & 0x7ff) << RADEON_TEX_VSIZE_SHIFT)); + txpitch = ((pPriv->src_pitch >> 1) + 63) & ~63; + txpitch -= 32; + txfilter = R200_MAG_FILTER_LINEAR | + R200_MIN_FILTER_LINEAR | + R200_CLAMP_S_CLAMP_LAST | + R200_CLAMP_T_CLAMP_LAST; + + BEGIN_ACCEL(24); + + OUT_ACCEL_REG(RADEON_PP_CNTL, + RADEON_TEX_0_ENABLE | + RADEON_TEX_BLEND_0_ENABLE | RADEON_TEX_BLEND_1_ENABLE | + RADEON_TEX_BLEND_2_ENABLE); + + OUT_ACCEL_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); + OUT_ACCEL_REG(R200_SE_VTX_FMT_1, + (2 << R200_VTX_TEX0_COMP_CNT_SHIFT)); + + OUT_ACCEL_REG(R200_PP_TXFILTER_0, txfilter); + OUT_ACCEL_REG(R200_PP_TXFORMAT_0, txformat); + OUT_ACCEL_REG(R200_PP_TXFORMAT_X_0, 0); + OUT_ACCEL_REG(R200_PP_TXSIZE_0, + (pPriv->w - 1) | + ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(R200_PP_TXPITCH_0, pPriv->src_pitch - 32); + OUT_ACCEL_REG(R200_PP_TXOFFSET_0, pPriv->src_offset); + + /* MAD temp1 / 2, const0.a * 2, temp0.ggg, -const0.rgb */ + OUT_ACCEL_REG(R200_PP_TXCBLEND_0, + R200_TXC_ARG_A_TFACTOR_COLOR | + R200_TXC_ARG_B_R0_COLOR | + R200_TXC_ARG_C_TFACTOR_COLOR | + R200_TXC_NEG_ARG_C | + R200_TXC_OP_DOT2_ADD); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_0, + (0 << R200_TXC_TFACTOR_SEL_SHIFT) | + R200_TXC_SCALE_INV2 | + (R200_TXC_REPL_GREEN << R200_TXC_REPL_ARG_B_SHIFT) | + R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R1); + OUT_ACCEL_REG(R200_PP_TXABLEND_0, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_ZERO | + R200_TXA_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXABLEND2_0, + R200_TXA_OUTPUT_REG_NONE); + + /* MAD temp1, (const1 - 0.5) * 2, (temp0.rrr - 0.5) * 2, temp1 */ + OUT_ACCEL_REG(R200_PP_TXCBLEND_1, + R200_TXC_ARG_A_TFACTOR_COLOR | + R200_TXC_BIAS_ARG_A | + R200_TXC_SCALE_ARG_A | + R200_TXC_ARG_B_R0_COLOR | + R200_TXC_BIAS_ARG_B | + R200_TXC_SCALE_ARG_B | + R200_TXC_ARG_C_R1_COLOR | + R200_TXC_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_1, + (1 << R200_TXC_TFACTOR_SEL_SHIFT) | + (R200_TXC_REPL_BLUE << R200_TXC_REPL_ARG_B_SHIFT) | + R200_TXC_CLAMP_8_8 | R200_TXC_OUTPUT_REG_R1); + OUT_ACCEL_REG(R200_PP_TXABLEND_1, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_ZERO | + R200_TXA_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXABLEND2_1, + R200_TXA_OUTPUT_REG_NONE); + + /* MAD temp0 x 2, (const2 - 0.5) * 2, (temp0.bbb - 0.5), temp1 */ + OUT_ACCEL_REG(R200_PP_TXCBLEND_2, + R200_TXC_ARG_A_TFACTOR_COLOR | + R200_TXC_BIAS_ARG_A | + R200_TXC_SCALE_ARG_A | + R200_TXC_ARG_B_R0_COLOR | + R200_TXC_BIAS_ARG_B | + R200_TXC_ARG_C_R1_COLOR | + R200_TXC_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_2, + (2 << R200_TXC_TFACTOR_SEL_SHIFT) | + R200_TXC_SCALE_2X | + (R200_TXC_REPL_RED << R200_TXC_REPL_ARG_B_SHIFT) | + R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); + OUT_ACCEL_REG(R200_PP_TXABLEND_2, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_ZERO | + R200_TXA_COMP_ARG_C | + R200_TXA_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXABLEND2_2, + R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); + + /* shader constants */ + OUT_ACCEL_REG(R200_PP_TFACTOR_0, float4touint(1.0, /* src range [1, 2] */ + yco - 1.0, + -yoff, /* range [-1, 0] */ + 0.0)); + OUT_ACCEL_REG(R200_PP_TFACTOR_1, float4touint(uco[0] * 0.125 + 0.5, /* range [-4, 4] */ + uco[1] * 0.125 + 0.5, + uco[2] * 0.125 + 0.5, + 0.0)); + OUT_ACCEL_REG(R200_PP_TFACTOR_2, float4touint(vco[0] * 0.25 + 0.5, /* range [-2, 2] */ + vco[1] * 0.25 + 0.5, + vco[2] * 0.25 + 0.5, + 0.0)); + + FINISH_ACCEL(); + } + else { + BEGIN_ACCEL(13); + OUT_ACCEL_REG(RADEON_PP_CNTL, + RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE); + + OUT_ACCEL_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); + OUT_ACCEL_REG(R200_SE_VTX_FMT_1, + (2 << R200_VTX_TEX0_COMP_CNT_SHIFT)); + + OUT_ACCEL_REG(R200_PP_TXFILTER_0, + R200_MAG_FILTER_LINEAR | + R200_MIN_FILTER_LINEAR | + R200_CLAMP_S_CLAMP_LAST | + R200_CLAMP_T_CLAMP_LAST | + R200_YUV_TO_RGB); + OUT_ACCEL_REG(R200_PP_TXFORMAT_0, txformat); + OUT_ACCEL_REG(R200_PP_TXFORMAT_X_0, 0); + OUT_ACCEL_REG(R200_PP_TXSIZE_0, + (pPriv->w - 1) | + ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(R200_PP_TXPITCH_0, pPriv->src_pitch - 32); + + OUT_ACCEL_REG(R200_PP_TXOFFSET_0, pPriv->src_offset); + + OUT_ACCEL_REG(R200_PP_TXCBLEND_0, + R200_TXC_ARG_A_ZERO | + R200_TXC_ARG_B_ZERO | + R200_TXC_ARG_C_R0_COLOR | + R200_TXC_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_0, + R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); + OUT_ACCEL_REG(R200_PP_TXABLEND_0, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_R0_ALPHA | + R200_TXA_OP_MADD); + OUT_ACCEL_REG(R200_PP_TXABLEND2_0, + R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); + FINISH_ACCEL(); + } + } else { + + info->accel_state->texW[0] = 1; + info->accel_state->texH[0] = 1; + + BEGIN_ACCEL(9); + + OUT_ACCEL_REG(RADEON_PP_CNTL, + RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE); + + OUT_ACCEL_REG(RADEON_SE_VTX_FMT, (RADEON_SE_VTX_FMT_XY | + RADEON_SE_VTX_FMT_ST0)); + + OUT_ACCEL_REG(RADEON_PP_TXFILTER_0, + RADEON_MAG_FILTER_LINEAR | + RADEON_MIN_FILTER_LINEAR | + RADEON_CLAMP_S_CLAMP_LAST | + RADEON_CLAMP_T_CLAMP_LAST | + RADEON_YUV_TO_RGB); + OUT_ACCEL_REG(RADEON_PP_TXFORMAT_0, txformat); + OUT_ACCEL_REG(RADEON_PP_TXOFFSET_0, pPriv->src_offset); + OUT_ACCEL_REG(RADEON_PP_TXCBLEND_0, + RADEON_COLOR_ARG_A_ZERO | + RADEON_COLOR_ARG_B_ZERO | + RADEON_COLOR_ARG_C_T0_COLOR | + RADEON_BLEND_CTL_ADD | + RADEON_CLAMP_TX); + OUT_ACCEL_REG(RADEON_PP_TXABLEND_0, + RADEON_ALPHA_ARG_A_ZERO | + RADEON_ALPHA_ARG_B_ZERO | + RADEON_ALPHA_ARG_C_T0_ALPHA | + RADEON_BLEND_CTL_ADD | + RADEON_CLAMP_TX); + + OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_0, + (pPriv->w - 1) | + ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_0, + pPriv->src_pitch - 32); + FINISH_ACCEL(); + } } - BEGIN_ACCEL_RELOC(6, 2); - OUT_ACCEL_REG(R300_TX_INVALTAGS, 0); - OUT_ACCEL_REG(R300_TX_ENABLE, txenable); - - EMIT_WRITE_OFFSET(R300_RB3D_COLOROFFSET0, 0, pPixmap); - EMIT_COLORPITCH(R300_RB3D_COLORPITCH0, colorpitch, pPixmap); - - /* no need to enable blending */ - OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO); - - OUT_ACCEL_REG(R300_VAP_VTX_SIZE, pPriv->vtx_count); - FINISH_ACCEL(); - if (pPriv->vsync) { - xf86CrtcPtr crtc; - if (pPriv->desired_crtc) - crtc = pPriv->desired_crtc; - else - crtc = radeon_pick_best_crtc(pScrn, - pPriv->drw_x, - pPriv->drw_x + pPriv->dst_w, - pPriv->drw_y, - pPriv->drw_y + pPriv->dst_h); - if (crtc) + xf86CrtcPtr crtc = radeon_xv_pick_best_crtc(pScrn, + pPriv->drw_x, + pPriv->drw_x + pPriv->dst_w, + pPriv->drw_y, + pPriv->drw_y + pPriv->dst_h); + if (crtc) { + RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; + FUNC_NAME(RADEONWaitForVLine)(pScrn, pPixmap, - crtc, + radeon_crtc->crtc_id, pPriv->drw_y - crtc->y, (pPriv->drw_y - crtc->y) + pPriv->dst_h); + } } - - return TRUE; -} - -static void -FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - PixmapPtr pPixmap = pPriv->pPixmap; - int dstxoff, dstyoff; - BoxPtr pBox = REGION_RECTS(&pPriv->clip); - int nBox = REGION_NUM_RECTS(&pPriv->clip); - ACCEL_PREAMBLE(); - -#ifdef COMPOSITE - dstxoff = -pPixmap->screen_x + pPixmap->drawable.x; - dstyoff = -pPixmap->screen_y + pPixmap->drawable.y; -#else - dstxoff = 0; - dstyoff = 0; -#endif - - if (!FUNC_NAME(R500PrepareTexturedVideo)(pScrn, pPriv)) - return; - /* * Rendering of the actual polygon is done in two different * ways depending on chip generation: @@ -4124,83 +2021,199 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) while (nBox--) { int srcX, srcY, srcw, srch; int dstX, dstY, dstw, dsth; -#ifdef ACCEL_CP - int draw_size = 3 * pPriv->vtx_count + 4 + 2 + 3; - - if (draw_size > radeon_cs_space_remaining(pScrn)) { - if (info->cs) - radeon_cs_flush_indirect(pScrn); - else - RADEONCPFlushIndirect(pScrn, 1); - if (!FUNC_NAME(R500PrepareTexturedVideo)(pScrn, pPriv)) - return; - } -#endif - + Bool use_quad = FALSE; dstX = pBox->x1 + dstxoff; dstY = pBox->y1 + dstyoff; dstw = pBox->x2 - pBox->x1; dsth = pBox->y2 - pBox->y1; - srcX = pPriv->src_x; - srcX += ((pBox->x1 - pPriv->drw_x) * - pPriv->src_w) / pPriv->dst_w; - srcY = pPriv->src_y; - srcY += ((pBox->y1 - pPriv->drw_y) * - pPriv->src_h) / pPriv->dst_h; + srcX = ((pBox->x1 - pPriv->drw_x) * + pPriv->src_w) / pPriv->dst_w; + srcY = ((pBox->y1 - pPriv->drw_y) * + pPriv->src_h) / pPriv->dst_h; srcw = (pPriv->src_w * dstw) / pPriv->dst_w; srch = (pPriv->src_h * dsth) / pPriv->dst_h; - BEGIN_ACCEL(2); - OUT_ACCEL_REG(R300_SC_SCISSOR0, (((dstX) << R300_SCISSOR_X_SHIFT) | - ((dstY) << R300_SCISSOR_Y_SHIFT))); - OUT_ACCEL_REG(R300_SC_SCISSOR1, (((dstX + dstw - 1) << R300_SCISSOR_X_SHIFT) | - ((dstY + dsth - 1) << R300_SCISSOR_Y_SHIFT))); - FINISH_ACCEL(); - -#ifdef ACCEL_CP - BEGIN_RING(3 * pPriv->vtx_count + 4); - OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, - 3 * pPriv->vtx_count)); - OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST | - RADEON_CP_VC_CNTL_PRIM_WALK_RING | - (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); -#else /* ACCEL_CP */ - BEGIN_ACCEL(2 + pPriv->vtx_count * 3); - OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_TRIANGLE_LIST | - RADEON_VF_PRIM_WALK_DATA | - (3 << RADEON_VF_NUM_VERTICES_SHIFT))); +#if 0 + ErrorF("dst: %d, %d, %d, %d\n", dstX, dstY, dstw, dsth); + ErrorF("src: %d, %d, %d, %d\n", srcX, srcY, srcw, srch); #endif - if (pPriv->bicubic_enabled) { - VTX_OUT_6((float)dstX, (float)dstY, - (float)srcX / pPriv->w, (float)srcY / pPriv->h, - (float)srcX + 0.5, (float)srcY + 0.5); - VTX_OUT_6((float)dstX, (float)(dstY + dstw + dsth), - (float)srcX / pPriv->w, ((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) / pPriv->h, - (float)srcX + 0.5, (float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0) + 0.5); - VTX_OUT_6((float)(dstX + dstw + dsth), (float)dstY, - ((float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0)) / pPriv->w, - (float)srcY / pPriv->h, - (float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0) + 0.5, - (float)srcY + 0.5); - } else { + + if (IS_R300_3D || IS_R500_3D) { + if (IS_R300_3D && ((dstw+dsth) > 2880)) + use_quad = TRUE; /* - * Render a big, scissored triangle. This means - * increasing the triangle size and adjusting - * texture coordinates. + * Set up the scissor area to that of the output size. */ - VTX_OUT_4((float)dstX, (float)dstY, - (float)srcX / pPriv->w, (float)srcY / pPriv->h); - VTX_OUT_4((float)dstX, (float)(dstY + dsth + dstw), - (float)srcX / pPriv->w, ((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) / pPriv->h); - VTX_OUT_4((float)(dstX + dstw + dsth), (float)dstY, - ((float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0)) / pPriv->w, - (float)srcY / pPriv->h); + BEGIN_ACCEL(2); + if (IS_R300_3D) { + /* R300 has an offset */ + OUT_ACCEL_REG(R300_SC_SCISSOR0, (((dstX + 1088) << R300_SCISSOR_X_SHIFT) | + ((dstY + 1088) << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, (((dstX + dstw + 1088 - 1) << R300_SCISSOR_X_SHIFT) | + ((dstY + dsth + 1088 - 1) << R300_SCISSOR_Y_SHIFT))); + } else { + OUT_ACCEL_REG(R300_SC_SCISSOR0, (((dstX) << R300_SCISSOR_X_SHIFT) | + ((dstY) << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, (((dstX + dstw - 1) << R300_SCISSOR_X_SHIFT) | + ((dstY + dsth - 1) << R300_SCISSOR_Y_SHIFT))); + } + FINISH_ACCEL(); } - /* flushing is pipelined, free/finish is not */ - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); +#ifdef ACCEL_CP + if (info->ChipFamily < CHIP_FAMILY_R200) { + BEGIN_RING(3 * vtx_count + 3); + OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD, + 3 * vtx_count + 1)); + OUT_RING(RADEON_CP_VC_FRMT_XY | + RADEON_CP_VC_FRMT_ST0); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + RADEON_CP_VC_CNTL_MAOS_ENABLE | + RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | + (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } else if (IS_R300_3D || IS_R500_3D) { + if (use_quad) { + BEGIN_RING(4 * vtx_count + 4); + OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, + 4 * vtx_count)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } else { + BEGIN_RING(3 * vtx_count + 4); + OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, + 3 * vtx_count)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_TRI_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } + } else { + BEGIN_RING(3 * vtx_count + 2); + OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, + 3 * vtx_count)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } +#else /* ACCEL_CP */ + if (IS_R300_3D || IS_R500_3D) { + if (use_quad) + BEGIN_ACCEL(2 + vtx_count * 4); + else + BEGIN_ACCEL(2 + vtx_count * 3); + } else + BEGIN_ACCEL(1 + vtx_count * 3); + + if (info->ChipFamily < CHIP_FAMILY_R200) + OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST | + RADEON_VF_PRIM_WALK_DATA | + RADEON_VF_RADEON_MODE | + (3 << RADEON_VF_NUM_VERTICES_SHIFT))); + else if (IS_R300_3D || IS_R500_3D) { + if (use_quad) + OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_QUAD_LIST | + RADEON_VF_PRIM_WALK_DATA | + (4 << RADEON_VF_NUM_VERTICES_SHIFT))); + else + OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_TRIANGLE_LIST | + RADEON_VF_PRIM_WALK_DATA | + (3 << RADEON_VF_NUM_VERTICES_SHIFT))); + } else + OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST | + RADEON_VF_PRIM_WALK_DATA | + (3 << RADEON_VF_NUM_VERTICES_SHIFT))); + +#endif + if (pPriv->bicubic_enabled) { + /* + * This code is only executed on >= R300, so we don't + * have to deal with the legacy handling. + */ + if (use_quad) { + VTX_OUT_FILTER((float)dstX, (float)dstY, + (float)srcX / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0], + (float)srcX + 0.5, (float)srcY + 0.5); + VTX_OUT_FILTER((float)dstX, (float)(dstY + dsth), + (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0], + (float)srcX + 0.5, (float)(srcY + srch) + 0.5); + VTX_OUT_FILTER((float)(dstX + dstw), (float)(dstY + dsth), + (float)(srcX + srcw) / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0], + (float)(srcX + srcw) + 0.5, (float)(srcY + srch) + 0.5); + VTX_OUT_FILTER((float)(dstX + dstw), (float)dstY, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0], + (float)(srcX + srcw) + 0.5, (float)srcY + 0.5); + } else { + VTX_OUT_FILTER((float)dstX, (float)dstY, + (float)srcX / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0], + (float)srcX + 0.5, (float)srcY + 0.5); + VTX_OUT_FILTER((float)dstX, (float)(dstY + dstw + dsth), + (float)srcX / info->accel_state->texW[0], ((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) / info->accel_state->texH[0], + (float)srcX + 0.5, (float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0) + 0.5); + VTX_OUT_FILTER((float)(dstX + dstw + dsth), (float)dstY, + ((float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0)) / info->accel_state->texW[0], + (float)srcY / info->accel_state->texH[0], + (float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0) + 0.5, + (float)srcY + 0.5); + } + } else { + if (IS_R300_3D || IS_R500_3D) { + if (use_quad) { + VTX_OUT((float)dstX, (float)dstY, + (float)srcX / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); + VTX_OUT((float)dstX, (float)(dstY + dsth), + (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT((float)(dstX + dstw), (float)(dstY + dsth), + (float)(srcX + srcw) / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT((float)(dstX + dstw), (float)dstY, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); + } else { + /* + * Render a big, scissored triangle. This means + * increasing the triangle size and adjusting + * texture coordinates. + */ + VTX_OUT((float)dstX, (float)dstY, + (float)srcX / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); + VTX_OUT((float)dstX, (float)(dstY + dsth + dstw), + (float)srcX / info->accel_state->texW[0], ((float)srcY + (float)srch * (((float)dstw / (float)dsth) + 1.0)) / info->accel_state->texH[0]); + + VTX_OUT((float)(dstX + dstw + dsth), (float)dstY, + ((float)srcX + (float)srcw * (((float)dsth / (float)dstw) + 1.0)) / info->accel_state->texW[0], + (float)srcY / info->accel_state->texH[0]); + } + } else if (isplanar) { + /* + * Just render a rect (using three coords). + * Filter is a bit a misnomer, it's just texcoords... + */ + VTX_OUT_FILTER((float)dstX, (float)(dstY + dsth), + (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0], + (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT_FILTER((float)(dstX + dstw), (float)(dstY + dsth), + (float)(srcX + srcw) / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0], + (float)(srcX + srcw) / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT_FILTER((float)(dstX + dstw), (float)dstY, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0], + (float)(srcX + srcw) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); + } else { + /* + * Just render a rect (using three coords). + */ + VTX_OUT((float)dstX, (float)(dstY + dsth), + (float)srcX / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT((float)(dstX + dstw), (float)(dstY + dsth), + (float)(srcX + srcw) / info->accel_state->texW[0], (float)(srcY + srch) / info->accel_state->texH[0]); + VTX_OUT((float)(dstX + dstw), (float)dstY, + (float)(srcX + srcw) / info->accel_state->texW[0], (float)srcY / info->accel_state->texH[0]); + } + } + + if (IS_R300_3D || IS_R500_3D) + /* flushing is pipelined, free/finish is not */ + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); #ifdef ACCEL_CP ADVANCE_RING(); @@ -4211,15 +2224,18 @@ FUNC_NAME(R500DisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) pBox++; } - BEGIN_ACCEL(3); - OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA); - OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); + if (IS_R300_3D || IS_R500_3D) { + BEGIN_ACCEL(3); + OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); + } else + BEGIN_ACCEL(1); OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); FINISH_ACCEL(); DamageDamageRegion(pPriv->pDraw, &pPriv->clip); } -#undef VTX_OUT_4 -#undef VTX_OUT_6 +#undef VTX_OUT +#undef VTX_OUT_FILTER #undef FUNC_NAME diff --git a/driver/xf86-video-ati/src/radeon_tv.c b/driver/xf86-video-ati/src/radeon_tv.c index 74c82db84..eef45d9ed 100644 --- a/driver/xf86-video-ati/src/radeon_tv.c +++ b/driver/xf86-video-ati/src/radeon_tv.c @@ -186,21 +186,6 @@ static const TVModeConstants availableTVModes[] = 8, /* crtcPLL_postDiv */ 1022, /* pixToTV */ }, - { /* PAL timing for 14 Mhz ref clk */ - 800, /* horResolution */ - 600, /* verResolution */ - TV_STD_PAL, /* standard */ - 1131, /* horTotal */ - 742, /* verTotal */ - 813, /* horStart */ - 840, /* horSyncStart */ - 633, /* verSyncStart */ - 708369, /* defRestart */ - 211, /* crtcPLL_N */ - 9, /* crtcPLL_M */ - 8, /* crtcPLL_postDiv */ - 759, /* pixToTV */ - }, }; #define N_AVAILABLE_MODES (sizeof(availableModes) / sizeof(availableModes[ 0 ])) @@ -640,7 +625,7 @@ static Bool RADEONInitTVRestarts(xf86OutputPtr output, RADEONSavePtr save, if (pll->reference_freq == 2700) constPtr = &availableTVModes[1]; else - constPtr = &availableTVModes[3]; + constPtr = &availableTVModes[1]; /* FIXME */ } hTotal = constPtr->horTotal; @@ -769,7 +754,7 @@ void RADEONInitTVRegisters(xf86OutputPtr output, RADEONSavePtr save, if (pll->reference_freq == 2700) constPtr = &availableTVModes[1]; else - constPtr = &availableTVModes[3]; + constPtr = &availableTVModes[1]; /* FIXME */ } save->tv_crc_cntl = 0; @@ -954,9 +939,10 @@ void RADEONInitTVRegisters(xf86OutputPtr output, RADEONSavePtr save, n = PAL_TV_PLL_N_27; p = PAL_TV_PLL_P_27; } else { - m = PAL_TV_PLL_M_14; - n = PAL_TV_PLL_N_14; - p = PAL_TV_PLL_P_14; + /* FIXME */ + m = PAL_TV_PLL_M_27; + n = PAL_TV_PLL_N_27; + p = PAL_TV_PLL_P_27; } } save->tv_pll_cntl = (m & RADEON_TV_M0LO_MASK) | @@ -1094,7 +1080,7 @@ void RADEONAdjustCrtcRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, if (pll->reference_freq == 2700) constPtr = &availableTVModes[1]; else - constPtr = &availableTVModes[3]; + constPtr = &availableTVModes[1]; /* FIXME */ } save->crtc_h_total_disp = (((constPtr->horResolution / 8) - 1) << RADEON_CRTC_H_DISP_SHIFT) | @@ -1135,7 +1121,7 @@ void RADEONAdjustPLLRegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, if (pll->reference_freq == 2700) constPtr = &availableTVModes[1]; else - constPtr = &availableTVModes[3]; + constPtr = &availableTVModes[1]; /* FIXME */ } save->htotal_cntl = (constPtr->horTotal & 0x7 /*0xf*/) | RADEON_HTOT_CNTL_VGA_EN; @@ -1198,7 +1184,7 @@ void RADEONAdjustCrtc2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, if (pll->reference_freq == 2700) constPtr = &availableTVModes[1]; else - constPtr = &availableTVModes[3]; + constPtr = &availableTVModes[1]; /* FIXME */ } save->crtc2_h_total_disp = (((constPtr->horResolution / 8) - 1) << RADEON_CRTC_H_DISP_SHIFT) | @@ -1212,7 +1198,7 @@ void RADEONAdjustCrtc2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, save->crtc2_v_total_disp = ((constPtr->verResolution - 1) << RADEON_CRTC_V_DISP_SHIFT) | ((constPtr->verTotal - 1) << RADEON_CRTC_V_TOTAL_SHIFT); - save->crtc2_v_sync_strt_wid = (save->crtc2_v_sync_strt_wid & ~RADEON_CRTC_V_SYNC_STRT) | + save->crtc_v_sync_strt_wid = (save->crtc_v_sync_strt_wid & ~RADEON_CRTC_V_SYNC_STRT) | ((constPtr->verSyncStart - 1) << RADEON_CRTC_V_SYNC_STRT_SHIFT); } @@ -1239,7 +1225,7 @@ void RADEONAdjustPLL2RegistersForTV(ScrnInfoPtr pScrn, RADEONSavePtr save, if (pll->reference_freq == 2700) constPtr = &availableTVModes[1]; else - constPtr = &availableTVModes[3]; + constPtr = &availableTVModes[1]; /* FIXME */ } save->htotal_cntl2 = (constPtr->horTotal & 0x7); /* 0xf */ diff --git a/driver/xf86-video-ati/src/radeon_tv.h b/driver/xf86-video-ati/src/radeon_tv.h index 719452dd6..8d77a771d 100644 --- a/driver/xf86-video-ati/src/radeon_tv.h +++ b/driver/xf86-video-ati/src/radeon_tv.h @@ -53,10 +53,6 @@ #define NTSC_TV_PLL_N_14 693 #define NTSC_TV_PLL_P_14 7 -#define PAL_TV_PLL_M_14 19 -#define PAL_TV_PLL_N_14 353 -#define PAL_TV_PLL_P_14 5 - #define VERT_LEAD_IN_LINES 2 #define FRAC_BITS 0xe #define FRAC_MASK 0x3fff diff --git a/driver/xf86-video-ati/src/radeon_vbo.c b/driver/xf86-video-ati/src/radeon_vbo.c deleted file mode 100644 index 767bb98ad..000000000 --- a/driver/xf86-video-ati/src/radeon_vbo.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright © 2009 Red Hat, 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 (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 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. - * - * Authors: - * Dave Airlie - * - */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include "radeon.h" -#include "radeon_bo.h" -#include "radeon_cs.h" - -#define VBO_SIZE (16*1024) - -/* KMS vertex buffer support - for R600 only but could be used on previous gpus */ - -#ifdef XF86DRM_MODE - -static struct radeon_bo *radeon_vbo_get_bo(ScrnInfoPtr pScrn); - -void radeon_vbo_put(ScrnInfoPtr pScrn, struct radeon_vbo_object *vbo) -{ - - if (vbo->vb_bo) { - radeon_bo_unmap(vbo->vb_bo); - radeon_bo_unref(vbo->vb_bo); - vbo->vb_bo = NULL; - vbo->vb_total = 0; - } - - vbo->vb_offset = 0; -} - -void radeon_vbo_get(ScrnInfoPtr pScrn, struct radeon_vbo_object *vbo) -{ - int ret; - - vbo->vb_bo = radeon_vbo_get_bo(pScrn); - if (vbo->vb_bo) { - radeon_bo_ref(vbo->vb_bo); - ret = radeon_bo_map(vbo->vb_bo, 1); - if (ret) - FatalError("Failed to map vb %d\n", ret); - } - - vbo->vb_total = VBO_SIZE; - vbo->vb_offset = 0; - vbo->vb_start_op = vbo->vb_offset; -} - -/* these functions could migrate to libdrm and - be shared with the radeon 3D driver */ -static int radeon_bo_is_idle(struct radeon_bo *bo) -{ - uint32_t domain; - int ret = radeon_bo_is_busy(bo, &domain); - return ret != -EBUSY; -} - -void radeon_vbo_init_lists(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - - accel_state->use_vbos = TRUE; - make_empty_list(&accel_state->bo_free); - make_empty_list(&accel_state->bo_wait); - make_empty_list(&accel_state->bo_reserved); -} - -void radeon_vbo_free_lists(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct radeon_dma_bo *dma_bo, *temp; - - foreach_s(dma_bo, temp, &accel_state->bo_free) { - remove_from_list(dma_bo); - radeon_bo_unref(dma_bo->bo); - free(dma_bo); - } - - foreach_s(dma_bo, temp, &accel_state->bo_wait) { - remove_from_list(dma_bo); - radeon_bo_unref(dma_bo->bo); - free(dma_bo); - } - - foreach_s(dma_bo, temp, &accel_state->bo_reserved) { - remove_from_list(dma_bo); - radeon_bo_unref(dma_bo->bo); - free(dma_bo); - } -} - -void radeon_vbo_flush_bos(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct radeon_dma_bo *dma_bo, *temp; - const int expire_at = ++accel_state->bo_free.expire_counter + DMA_BO_FREE_TIME; - const int time = accel_state->bo_free.expire_counter; - - foreach_s(dma_bo, temp, &accel_state->bo_wait) { - if (dma_bo->expire_counter == time) { - ErrorF("leaking dma buffer\n"); - while ((dma_bo->bo = radeon_bo_unref(dma_bo->bo))) {} - remove_from_list(dma_bo); - free(dma_bo); - continue; - } - - if (!radeon_bo_is_idle(dma_bo->bo)) - continue; - - if (dma_bo->bo->ptr) { - ErrorF("bo with pointer on wait list!\n"); - continue; - } - - remove_from_list(dma_bo); - dma_bo->expire_counter = expire_at; - insert_at_tail(&accel_state->bo_free, dma_bo); - } - - /* move reserved to wait list */ - foreach_s(dma_bo, temp, &accel_state->bo_reserved) { - remove_from_list(dma_bo); - dma_bo->expire_counter = expire_at; - insert_at_tail(&accel_state->bo_wait, dma_bo); - } - - /* free bos that have been unused */ - foreach_s(dma_bo, temp, &accel_state->bo_free) { - if (dma_bo->expire_counter != time) - break; - /* always keep one hanging around at end */ - if (at_end(&accel_state->bo_free, dma_bo)) { - dma_bo->expire_counter = time + DMA_BO_FREE_TIME; - break; - } - - remove_from_list(dma_bo); - radeon_bo_unref(dma_bo->bo); - free(dma_bo); - } -} - -static struct radeon_bo *radeon_vbo_get_bo(ScrnInfoPtr pScrn) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - struct radeon_accel_state *accel_state = info->accel_state; - struct radeon_dma_bo *dma_bo = NULL; - struct radeon_bo *bo; - - if (is_empty_list(&accel_state->bo_free)) { - dma_bo = calloc(1, sizeof(struct radeon_dma_bo)); - if (!dma_bo) - return NULL; - -again_alloc: - dma_bo->bo = radeon_bo_open(info->bufmgr, 0, VBO_SIZE, - 0, RADEON_GEM_DOMAIN_GTT, 0); - - if (!dma_bo->bo) { - ErrorF("failure to allocate DMA BO\n"); - return NULL; - } - insert_at_head(&accel_state->bo_reserved, dma_bo); - } else { - dma_bo = last_elem(&accel_state->bo_free); - remove_from_list(dma_bo); - insert_at_head(&accel_state->bo_reserved, dma_bo); - } - - if (is_empty_list(&accel_state->bo_reserved)) - goto again_alloc; - - bo = first_elem(&accel_state->bo_reserved)->bo; - - /* need a space check */ - if (radeon_cs_space_check_with_bo(info->cs, - bo, - RADEON_GEM_DOMAIN_GTT, 0)) - ErrorF("failed to revalidate\n"); - - return bo; -} - -#endif diff --git a/driver/xf86-video-ati/src/radeon_vbo.h b/driver/xf86-video-ati/src/radeon_vbo.h deleted file mode 100644 index 583f2626f..000000000 --- a/driver/xf86-video-ati/src/radeon_vbo.h +++ /dev/null @@ -1,53 +0,0 @@ - -#ifndef RADEON_VBO_H -#define RADEON_VBO_H - -extern void radeon_vb_no_space(ScrnInfoPtr pScrn, struct radeon_vbo_object *vbo, int vert_size); -extern void radeon_vbo_init_lists(ScrnInfoPtr pScrn); -extern void radeon_vbo_free_lists(ScrnInfoPtr pScrn); -extern void radeon_vbo_flush_bos(ScrnInfoPtr pScrn); -extern void radeon_vbo_get(ScrnInfoPtr pScrn, struct radeon_vbo_object *vbo); -extern void radeon_vbo_put(ScrnInfoPtr pScrn, struct radeon_vbo_object *vbo); - -static inline void radeon_vbo_check(ScrnInfoPtr pScrn, - struct radeon_vbo_object *vbo, - int vert_size) -{ - - if ((vbo->vb_offset + (vbo->verts_per_op * vert_size)) > vbo->vb_total) { - radeon_vb_no_space(pScrn, vbo, vert_size); - } -} - -static inline void * -radeon_vbo_space(ScrnInfoPtr pScrn, - struct radeon_vbo_object *vbo, - int vert_size) -{ -#if defined(XF86DRM_MODE) - RADEONInfoPtr info = RADEONPTR(pScrn); -#endif - void *vb; - - /* we've ran out of space in the vertex buffer - need to get a - new one */ - radeon_vbo_check(pScrn, vbo, vert_size); - - vbo->vb_op_vert_size = vert_size; -#if defined(XF86DRM_MODE) - if (info->cs) - vb = (pointer)((char *)vbo->vb_bo->ptr + vbo->vb_offset); - else -#endif - vb = (pointer)((char *)vbo->vb_ptr + vbo->vb_offset); - return vb; -} - -static inline void radeon_vbo_commit(ScrnInfoPtr pScrn, - struct radeon_vbo_object *vbo) -{ - - vbo->vb_offset += vbo->verts_per_op * vbo->vb_op_vert_size; -} - -#endif diff --git a/driver/xf86-video-ati/src/radeon_video.c b/driver/xf86-video-ati/src/radeon_video.c index 834f92460..6314eb187 100644 --- a/driver/xf86-video-ati/src/radeon_video.c +++ b/driver/xf86-video-ati/src/radeon_video.c @@ -136,33 +136,25 @@ radeon_box_area(BoxPtr box) } xf86CrtcPtr -radeon_pick_best_crtc(ScrnInfoPtr pScrn, - int x1, int x2, int y1, int y2) +radeon_xv_pick_best_crtc(ScrnInfoPtr pScrn, + int x1, int x2, int y1, int y2) { xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); int coverage, best_coverage, c; BoxRec box, crtc_box, cover_box; - RROutputPtr primary_output; - xf86CrtcPtr best_crtc = NULL, primary_crtc = NULL; + xf86CrtcPtr best_crtc = NULL; box.x1 = x1; box.x2 = x2; box.y1 = y1; box.y2 = y2; best_coverage = 0; - - /* Prefer the CRTC of the primary output */ - primary_output = RRFirstOutput(pScrn->pScreen); - if (primary_output && primary_output->crtc) - primary_crtc = primary_output->crtc->devPrivate; - for (c = 0; c < xf86_config->num_crtc; c++) { xf86CrtcPtr crtc = xf86_config->crtc[c]; radeon_crtc_box(crtc, &crtc_box); radeon_box_intersect(&cover_box, &crtc_box, &box); coverage = radeon_box_area(&cover_box); - if (coverage > best_coverage || - (coverage == best_coverage && crtc == primary_crtc)) { + if (coverage > best_coverage) { best_crtc = crtc; best_coverage = coverage; } @@ -279,24 +271,20 @@ void RADEONInitVideo(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; RADEONInfoPtr info = RADEONPTR(pScrn); - RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL; XF86VideoAdaptorPtr overlayAdaptor = NULL, texturedAdaptor = NULL; int num_adaptors; - /* no overlay or 3D on RN50 */ - if (info->ChipFamily == CHIP_FAMILY_RV100 && !pRADEONEnt->HasCRTC2) - return; num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); - newAdaptors = malloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *)); + newAdaptors = xalloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *)); if (newAdaptors == NULL) return; memcpy(newAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr)); adaptors = newAdaptors; - if (!IS_AVIVO_VARIANT && !info->kms_enabled) { + if (!IS_AVIVO_VARIANT) { overlayAdaptor = RADEONSetupImageVideo(pScreen); if (overlayAdaptor != NULL) { adaptors[num_adaptors++] = overlayAdaptor; @@ -323,18 +311,8 @@ void RADEONInitVideo(ScreenPtr pScreen) if(num_adaptors) xf86XVScreenInit(pScreen, adaptors, num_adaptors); - if(texturedAdaptor) { - XF86MCAdaptorPtr xvmcAdaptor = RADEONCreateAdaptorXvMC(pScreen, texturedAdaptor->name); - if(xvmcAdaptor) { - if(!xf86XvMCScreenInit(pScreen, 1, &xvmcAdaptor)) - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Failed to initialize extension.\n"); - else - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Extension initialized.\n"); - } - } - if(newAdaptors) - free(newAdaptors); + xfree(newAdaptors); } @@ -343,7 +321,7 @@ static XF86VideoEncodingRec DummyEncoding = { 0, "XV_IMAGE", - 2047, 2047, + 2048, 2048, {1, 1} }; @@ -352,7 +330,7 @@ static XF86VideoEncodingRec DummyEncoding = static XF86VideoEncodingRec InputVideoEncodings[] = { - { 0, "XV_IMAGE", 2047,2047,{1,1}}, + { 0, "XV_IMAGE", 2048,2048,{1,1}}, { 1, "pal-composite", 720, 288, { 1, 50 }}, { 2, "pal-tuner", 720, 288, { 1, 50 }}, { 3, "pal-svideo", 720, 288, { 1, 50 }}, @@ -563,6 +541,18 @@ static XF86ImageRec Images[NUM_IMAGES] = #endif +/* Reference color space transform data */ +typedef struct tagREF_TRANSFORM +{ + float RefLuma; + float RefRCb; + float RefRCr; + float RefGCb; + float RefGCr; + float RefBCb; + float RefBCr; +} REF_TRANSFORM; + /* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces */ static REF_TRANSFORM trans[2] = { @@ -570,6 +560,7 @@ static REF_TRANSFORM trans[2] = {1.1678, 0.0, 1.7980, -0.2139, -0.5345, 2.1186, 0.0} /* BT.709 */ }; + /* Gamma curve definition for preset gammas */ typedef struct tagGAMMA_CURVE_R100 { @@ -1422,7 +1413,7 @@ static void RADEONSetupTheatre(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Unsupported reference clock frequency, Rage Theatre disabled\n"); t->theatre_num=-1; - free(pPriv->theatre); + xfree(pPriv->theatre); pPriv->theatre = NULL; return; } @@ -1441,9 +1432,9 @@ RADEONAllocAdaptor(ScrnInfoPtr pScrn) if(!(adapt = xf86XVAllocateVideoAdaptorRec(pScrn))) return NULL; - if(!(pPriv = calloc(1, sizeof(RADEONPortPrivRec) + sizeof(DevUnion)))) + if(!(pPriv = xcalloc(1, sizeof(RADEONPortPrivRec) + sizeof(DevUnion)))) { - free(adapt); + xfree(adapt); return NULL; } @@ -1533,8 +1524,6 @@ RADEONAllocAdaptor(ScrnInfoPtr pScrn) RADEONVIP_init(pScrn, pPriv); info->adaptor = adapt; - info->xv_max_width = 2047; - info->xv_max_height = 2047; if(!xf86LoadSubModule(pScrn,"theatre_detect")) { @@ -1556,7 +1545,7 @@ RADEONAllocAdaptor(ScrnInfoPtr pScrn) if(!xf86LoadSubModule(pScrn,"theatre")) { xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Unable to load Rage Theatre module\n"); - free(pPriv->theatre); + xfree(pPriv->theatre); goto skip_theatre; } break; @@ -1566,7 +1555,7 @@ RADEONAllocAdaptor(ScrnInfoPtr pScrn) if(!xf86LoadSubModule(pScrn,"theatre200")) { xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Unable to load Rage Theatre module\n"); - free(pPriv->theatre); + xfree(pPriv->theatre); goto skip_theatre; } pPriv->theatre->microc_path = info->RageTheatreMicrocPath; @@ -1576,7 +1565,7 @@ RADEONAllocAdaptor(ScrnInfoPtr pScrn) default: { xf86DrvMsg(pScrn->scrnIndex,X_ERROR,"Unknown Theatre chip\n"); - free(pPriv->theatre); + xfree(pPriv->theatre); goto skip_theatre; } } @@ -1587,7 +1576,7 @@ RADEONAllocAdaptor(ScrnInfoPtr pScrn) xf86_InitTheatre(pPriv->theatre); if(pPriv->theatre->mode == MODE_UNINITIALIZED) { - free(pPriv->theatre); + Xfree(pPriv->theatre); pPriv->theatre = NULL; xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Rage Theatre disabled\n"); /* Here the modules must be unloaded */ @@ -1663,23 +1652,6 @@ RADEONSetupImageVideo(ScreenPtr pScreen) return adapt; } -void -RADEONFreeVideoMemory(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) -{ - RADEONInfoPtr info = RADEONPTR(pScrn); - - if (pPriv->video_memory != NULL) { - radeon_legacy_free_memory(pScrn, pPriv->video_memory); - pPriv->video_memory = NULL; - - if (info->cs && pPriv->textured) { - pPriv->src_bo[0] = NULL; - radeon_legacy_free_memory(pScrn, pPriv->src_bo[1]); - pPriv->src_bo[1] = NULL; - } - } -} - void RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup) { @@ -1689,7 +1661,14 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup) if (pPriv->textured) { if (cleanup) { - RADEONFreeVideoMemory(pScrn, pPriv); + if (pPriv->bicubic_memory != NULL) { + radeon_legacy_free_memory(pScrn, pPriv->bicubic_memory); + pPriv->bicubic_memory = NULL; + } + if (pPriv->video_memory != NULL) { + radeon_legacy_free_memory(pScrn, pPriv->video_memory); + pPriv->video_memory = NULL; + } } return; } @@ -1711,7 +1690,10 @@ RADEONStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup) if(pPriv->uda1380 != NULL) xf86_uda1380_mute(pPriv->uda1380, TRUE); if(pPriv->i2c != NULL) RADEON_board_setmisc(pPriv); } - RADEONFreeVideoMemory(pScrn, pPriv); + if (pPriv->video_memory != NULL) { + radeon_legacy_free_memory(pScrn, pPriv->video_memory); + pPriv->video_memory = NULL; + } pPriv->videoStatus = 0; } else { if(pPriv->videoStatus & CLIENT_VIDEO_ON) { @@ -1735,6 +1717,12 @@ RADEONSetPortAttribute(ScrnInfoPtr pScrn, RADEON_SYNC(info, pScrn); +#define RTFSaturation(a) (1.0 + ((a)*1.0)/1000.0) +#define RTFBrightness(a) (((a)*1.0)/2000.0) +#define RTFIntensity(a) (((a)*1.0)/2000.0) +#define RTFContrast(a) (1.0 + ((a)*1.0)/1000.0) +#define RTFHue(a) (((a)*3.1416)/1000.0) + if(attribute == xvAutopaintColorkey) { pPriv->autopaint_colorkey = ClipValue (value, 0, 1); @@ -2233,41 +2221,36 @@ RADEONCopyData( else #endif /* XF86DRI */ { - int swap = RADEON_HOST_DATA_SWAP_NONE; - #if X_BYTE_ORDER == X_BIG_ENDIAN - if (info->kms_enabled) { - switch(bpp) { - case 2: - swap = RADEON_HOST_DATA_SWAP_16BIT; - break; - case 4: - swap = RADEON_HOST_DATA_SWAP_32BIT; - break; - } - } else { - switch (pScrn->bitsPerPixel) { - case 16: - swap = RADEON_HOST_DATA_SWAP_16BIT; - break; - case 32: - swap = RADEON_HOST_DATA_SWAP_32BIT; - break; - } - } -#endif + unsigned char *RADEONMMIO = info->MMIO; + unsigned int swapper = info->ModeReg->surface_cntl & + ~(RADEON_NONSURF_AP0_SWP_32BPP | RADEON_NONSURF_AP1_SWP_32BPP | + RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP1_SWP_16BPP); + switch(bpp) { + case 2: + swapper |= RADEON_NONSURF_AP0_SWP_16BPP + | RADEON_NONSURF_AP1_SWP_16BPP; + break; + case 4: + swapper |= RADEON_NONSURF_AP0_SWP_32BPP + | RADEON_NONSURF_AP1_SWP_32BPP; + break; + } + OUTREG(RADEON_SURFACE_CNTL, swapper); +#endif w *= bpp; - if (dstPitch == w && dstPitch == srcPitch) - RADEONCopySwap(dst, src, h * dstPitch, swap); - else { - while (h--) { - RADEONCopySwap(dst, src, w, swap); - src += srcPitch; - dst += dstPitch; - } + while (h--) { + memcpy(dst, src, w); + src += srcPitch; + dst += dstPitch; } + +#if X_BYTE_ORDER == X_BIG_ENDIAN + /* restore byte swapping */ + OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); +#endif } } @@ -2322,10 +2305,9 @@ RADEONCopyRGB24Data( { #if X_BYTE_ORDER == X_BIG_ENDIAN unsigned char *RADEONMMIO = info->MMIO; - - if (!info->kms_enabled) - OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl & - ~(RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP0_SWP_32BPP)); + OUTREG(RADEON_SURFACE_CNTL, (info->ModeReg->surface_cntl + | RADEON_NONSURF_AP0_SWP_32BPP) + & ~RADEON_NONSURF_AP0_SWP_16BPP); #endif for (j = 0; j < h; j++) { @@ -2333,15 +2315,13 @@ RADEONCopyRGB24Data( sptr = src + j * srcPitch; for (i = 0; i < w; i++, sptr += 3) { - dptr[i] = cpu_to_le32((sptr[2] << 16) | (sptr[1] << 8) | sptr[0]); + dptr[i] = (sptr[2] << 16) | (sptr[1] << 8) | sptr[0]; } } #if X_BYTE_ORDER == X_BIG_ENDIAN - if (!info->kms_enabled) { - /* restore byte swapping */ - OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); - } + /* restore byte swapping */ + OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); #endif } } @@ -2420,10 +2400,9 @@ RADEONCopyMungedData( #if X_BYTE_ORDER == X_BIG_ENDIAN unsigned char *RADEONMMIO = info->MMIO; - - if (!info->kms_enabled) - OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl & - ~(RADEON_NONSURF_AP0_SWP_16BPP | RADEON_NONSURF_AP0_SWP_32BPP)); + OUTREG(RADEON_SURFACE_CNTL, (info->ModeReg->surface_cntl + | RADEON_NONSURF_AP0_SWP_32BPP) + & ~RADEON_NONSURF_AP0_SWP_16BPP); #endif w /= 2; @@ -2435,16 +2414,16 @@ RADEONCopyMungedData( i = w; while( i > 4 ) { - dst[0] = cpu_to_le32(s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24)); - dst[1] = cpu_to_le32(s1[2] | (s1[3] << 16) | (s3[1] << 8) | (s2[1] << 24)); - dst[2] = cpu_to_le32(s1[4] | (s1[5] << 16) | (s3[2] << 8) | (s2[2] << 24)); - dst[3] = cpu_to_le32(s1[6] | (s1[7] << 16) | (s3[3] << 8) | (s2[3] << 24)); + dst[0] = s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24); + dst[1] = s1[2] | (s1[3] << 16) | (s3[1] << 8) | (s2[1] << 24); + dst[2] = s1[4] | (s1[5] << 16) | (s3[2] << 8) | (s2[2] << 24); + dst[3] = s1[6] | (s1[7] << 16) | (s3[3] << 8) | (s2[3] << 24); dst += 4; s2 += 4; s3 += 4; s1 += 8; i -= 4; } while( i-- ) { - dst[0] = cpu_to_le32(s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24)); + dst[0] = s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24); dst++; s2++; s3++; s1 += 2; } @@ -2458,10 +2437,8 @@ RADEONCopyMungedData( } } #if X_BYTE_ORDER == X_BIG_ENDIAN - if (!info->kms_enabled) { - /* restore byte swapping */ - OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); - } + /* restore byte swapping */ + OUTREG(RADEON_SURFACE_CNTL, info->ModeReg->surface_cntl); #endif } } @@ -2788,7 +2765,7 @@ RADEONDisplayVideo( OUTREG(RADEON_OV0_P3_X_START_END, (src_w + leftuv - 1) | (leftuv << 16)); if (info->ModeReg->ov0_base_addr != (info->fbLocation + base_offset)) { ErrorF("Changing OV0_BASE_ADDR from 0x%08x to 0x%08x\n", - info->ModeReg->ov0_base_addr, (uint32_t)info->fbLocation + base_offset); + info->ModeReg->ov0_base_addr, info->fbLocation + base_offset); info->ModeReg->ov0_base_addr = info->fbLocation + base_offset; OUTREG(RADEON_OV0_BASE_ADDR, info->ModeReg->ov0_base_addr); } @@ -2943,7 +2920,7 @@ RADEONPutImage( case FOURCC_RGB16: case FOURCC_RGBT16: dstPitch = width * 2; - srcPitch = RADEON_ALIGN(width * 2, 4); + srcPitch = (width * 2 + 3) & ~3; break; case FOURCC_YV12: case FOURCC_I420: @@ -2954,12 +2931,12 @@ RADEONPutImage( /* need 16bytes alignment for u,v plane, so 2 times that for width but blitter needs 64bytes alignment. 128byte is a waste but dstpitch for uv planes needs to be dstpitch yplane >> 1 for now. */ - dstPitch = (RADEON_ALIGN(width, 128)); - srcPitch = RADEON_ALIGN(width, 4); + dstPitch = ((width + 127) & ~127); + srcPitch = (width + 3) & ~3; } else { dstPitch = width * 2; - srcPitch = RADEON_ALIGN(width, 4); + srcPitch = (width + 3) & ~3; idconv = FOURCC_YUY2; } break; @@ -2974,20 +2951,19 @@ RADEONPutImage( #ifdef XF86DRI if (info->directRenderingEnabled && info->DMAForXv) { /* The upload blit only supports multiples of 64 bytes */ - dstPitch = RADEON_ALIGN(dstPitch, 64); + dstPitch = (dstPitch + 63) & ~63; } else #endif /* The overlay only supports multiples of 16 bytes */ - dstPitch = RADEON_ALIGN(dstPitch, 16); + dstPitch = (dstPitch + 15) & ~15; new_size = dstPitch * height; if (idconv == FOURCC_YV12 || id == FOURCC_I420) { - new_size += (dstPitch >> 1) * (RADEON_ALIGN(height, 2)); + new_size += (dstPitch >> 1) * ((height + 1) & ~1); } pPriv->video_offset = radeon_legacy_allocate_memory(pScrn, &pPriv->video_memory, (pPriv->doubleBuffer ? - (new_size * 2) : new_size), 64, - RADEON_GEM_DOMAIN_VRAM); + (new_size * 2) : new_size), 64); if (pPriv->video_offset == 0) return BadAlloc; @@ -2996,7 +2972,7 @@ RADEONPutImage( /* copy data */ top = ya >> 16; left = (xa >> 16) & ~1; - npixels = ((xb + 0xffff) >> 16) - left; + npixels = ((((xb + 0xffff) >> 16) + 1) & ~1) - left; offset = (pPriv->video_offset) + (top * dstPitch); @@ -3018,9 +2994,9 @@ RADEONPutImage( /* meh. Such a mess just for someone who wants to watch half the video clipped */ top &= ~1; /* odd number of pixels? That may not work correctly */ - srcPitch2 = RADEON_ALIGN(width >> 1, 4); + srcPitch2 = ((width >> 1) + 3) & ~3; /* odd number of lines? Maybe... */ - s2offset = srcPitch * (RADEON_ALIGN(height, 2)); + s2offset = srcPitch * ((height + 1) & ~1); s3offset = s2offset + srcPitch2 * ((height + 1) >> 1); s2offset += (top >> 1) * srcPitch2 + (left >> 1); s3offset += (top >> 1) * srcPitch2 + (left >> 1); @@ -3043,7 +3019,7 @@ RADEONPutImage( } else { s2offset = srcPitch * height; - srcPitch2 = RADEON_ALIGN(width >> 1, 4); + srcPitch2 = ((width >> 1) + 3) & ~3; s3offset = (srcPitch2 * (height >> 1)) + s2offset; top &= ~1; dst_start += left << 1; @@ -3055,7 +3031,7 @@ RADEONPutImage( s2offset = s3offset; s3offset = tmp; } - nlines = ((yb + 0xffff) >> 16) - top; + nlines = ((((yb + 0xffff) >> 16) + 1) & ~1) - top; RADEONCopyMungedData(pScrn, buf + (top * srcPitch) + left, buf + s2offset, buf + s3offset, dst_start, srcPitch, srcPitch2, dstPitch, nlines, npixels); @@ -3117,24 +3093,23 @@ RADEONQueryImageAttributes( unsigned short *w, unsigned short *h, int *pitches, int *offsets ){ - const RADEONInfoRec * const info = RADEONPTR(pScrn); int size, tmp; - if(*w > info->xv_max_width) *w = info->xv_max_width; - if(*h > info->xv_max_height) *h = info->xv_max_height; + if(*w > 2048) *w = 2048; + if(*h > 2048) *h = 2048; - *w = RADEON_ALIGN(*w, 2); + *w = (*w + 1) & ~1; if(offsets) offsets[0] = 0; switch(id) { case FOURCC_YV12: case FOURCC_I420: - *h = RADEON_ALIGN(*h, 2); - size = RADEON_ALIGN(*w, 4); + *h = (*h + 1) & ~1; + size = (*w + 3) & ~3; if(pitches) pitches[0] = size; size *= *h; if(offsets) offsets[1] = size; - tmp = RADEON_ALIGN(*w >> 1, 4); + tmp = ((*w >> 1) + 3) & ~3; if(pitches) pitches[1] = pitches[2] = tmp; tmp *= (*h >> 1); size += tmp; @@ -3181,7 +3156,10 @@ RADEONVideoTimerCallback(ScrnInfoPtr pScrn, Time now) } } else { /* FREE_TIMER */ if(pPriv->freeTime < now) { - RADEONFreeVideoMemory(pScrn, pPriv); + if (pPriv->video_memory != NULL) { + radeon_legacy_free_memory(pScrn, pPriv->video_memory); + pPriv->video_memory = NULL; + } pPriv->videoStatus = 0; info->VideoTimerCallback = NULL; } @@ -3210,30 +3188,29 @@ RADEONAllocateSurface( if((w > 1024) || (h > 1024)) return BadAlloc; - w = RADEON_ALIGN(w, 2); - pitch = RADEON_ALIGN(w << 1, 16); + w = (w + 1) & ~1; + pitch = ((w << 1) + 15) & ~15; size = pitch * h; - offset = radeon_legacy_allocate_memory(pScrn, &surface_memory, size, 64, - RADEON_GEM_DOMAIN_VRAM); + offset = radeon_legacy_allocate_memory(pScrn, &surface_memory, size, 64); if (offset == 0) return BadAlloc; surface->width = w; surface->height = h; - if(!(surface->pitches = malloc(sizeof(int)))) { + if(!(surface->pitches = xalloc(sizeof(int)))) { radeon_legacy_free_memory(pScrn, surface_memory); return BadAlloc; } - if(!(surface->offsets = malloc(sizeof(int)))) { - free(surface->pitches); + if(!(surface->offsets = xalloc(sizeof(int)))) { + xfree(surface->pitches); radeon_legacy_free_memory(pScrn, surface_memory); return BadAlloc; } - if(!(pPriv = malloc(sizeof(OffscreenPrivRec)))) { - free(surface->pitches); - free(surface->offsets); + if(!(pPriv = xalloc(sizeof(OffscreenPrivRec)))) { + xfree(surface->pitches); + xfree(surface->offsets); radeon_legacy_free_memory(pScrn, surface_memory); return BadAlloc; } @@ -3277,9 +3254,9 @@ RADEONFreeSurface( RADEONStopSurface(surface); radeon_legacy_free_memory(pScrn, pPriv->surface_memory); pPriv->surface_memory = NULL; - free(surface->pitches); - free(surface->offsets); - free(surface->devPrivate.ptr); + xfree(surface->pitches); + xfree(surface->offsets); + xfree(surface->devPrivate.ptr); return Success; } @@ -3394,7 +3371,7 @@ RADEONInitOffscreenImages(ScreenPtr pScreen) XF86OffscreenImagePtr offscreenImages; /* need to free this someplace */ - if (!(offscreenImages = malloc(sizeof(XF86OffscreenImageRec)))) + if (!(offscreenImages = xalloc(sizeof(XF86OffscreenImageRec)))) return; offscreenImages[0].image = &Images[0]; @@ -3406,8 +3383,8 @@ RADEONInitOffscreenImages(ScreenPtr pScreen) offscreenImages[0].stop = RADEONStopSurface; offscreenImages[0].setAttribute = RADEONSetSurfaceAttribute; offscreenImages[0].getAttribute = RADEONGetSurfaceAttribute; - offscreenImages[0].max_width = 2047; - offscreenImages[0].max_height = 2047; + offscreenImages[0].max_width = 2048; + offscreenImages[0].max_height = 2048; offscreenImages[0].num_attributes = NUM_ATTRIBUTES; offscreenImages[0].attributes = Attributes; @@ -3527,21 +3504,21 @@ RADEONPutVideo( case FOURCC_YV12: case FOURCC_I420: top &= ~1; - dstPitch = RADEON_ALIGN(width << 1, 16); - srcPitch = RADEON_ALIGN(width, 4); + dstPitch = ((width << 1) + 15) & ~15; + srcPitch = (width + 3) & ~3; s2offset = srcPitch * height; - srcPitch2 = RADEON_ALIGN(width >> 1, 4); + srcPitch2 = ((width >> 1) + 3) & ~3; s3offset = (srcPitch2 * (height >> 1)) + s2offset; break; case FOURCC_UYVY: case FOURCC_YUY2: default: - dstPitch = RADEON_ALIGN(width<<1, 16); + dstPitch = ((width<<1) + 15) & ~15; srcPitch = (width<<1); break; } #else - dstPitch = RADEON_ALIGN(width << 1, 16); + dstPitch = ((width<<1) + 15) & ~15; srcPitch = (width<<1); #endif @@ -3553,8 +3530,7 @@ RADEONPutVideo( pPriv->video_offset = radeon_legacy_allocate_memory(pScrn, &pPriv->video_memory, (pPriv->doubleBuffer ? - (new_size * 2) : new_size), 64, - RADEON_GEM_DOMAIN_GTT); + (new_size * 2) : new_size), 64); if (pPriv->video_offset == 0) return BadAlloc; @@ -3569,20 +3545,20 @@ RADEONPutVideo( switch(pPriv->overlay_deinterlacing_method){ case METHOD_BOB: case METHOD_SINGLE: - offset1 = RADEON_ALIGN(pPriv->video_offset, 0x10); - offset2 = RADEON_ALIGN(pPriv->video_offset + new_size, 0x10); + offset1 = (pPriv->video_offset + 0xf) & (~0xf); + offset2 = (pPriv->video_offset + new_size + 0xf) & (~0xf); offset3 = offset1; offset4 = offset2; break; case METHOD_WEAVE: - offset1 = RADEON_ALIGN(pPriv->video_offset, 0x10); + offset1 = (pPriv->video_offset + 0xf) & (~0xf); offset2 = offset1+dstPitch; - offset3 = RADEON_ALIGN(pPriv->video_offset + 2 * new_size, 0x10); + offset3 = (pPriv->video_offset + 2 * new_size + 0xf) & (~0xf); offset4 = offset3+dstPitch; break; default: - offset1 = RADEON_ALIGN(pPriv->video_offset, 0x10); - offset2 = RADEON_ALIGN(pPriv->video_offset + new_size, 0x10); + offset1 = (pPriv->video_offset + 0xf) & (~0xf); + offset2 = (pPriv->video_offset + new_size + 0xf) & (~0xf); offset3 = offset1; offset4 = offset2; } @@ -3605,7 +3581,7 @@ RADEONPutVideo( vbi_end = 20; } - vbi_offset0 = RADEON_ALIGN(pPriv->video_offset + mult * new_size * bpp, 0x10); + vbi_offset0 = (pPriv->video_offset + mult * new_size * bpp + 0xf) & (~0xf); vbi_offset1 = vbi_offset0 + dstPitch*20; OUTREG(RADEON_CAP0_VBI0_OFFSET, vbi_offset0+display_base); OUTREG(RADEON_CAP0_VBI1_OFFSET, vbi_offset1+display_base); diff --git a/driver/xf86-video-ati/src/radeon_video.h b/driver/xf86-video-ati/src/radeon_video.h index 684cb9e7e..449800254 100644 --- a/driver/xf86-video-ati/src/radeon_video.h +++ b/driver/xf86-video-ati/src/radeon_video.h @@ -15,8 +15,6 @@ #include "bicubic_table.h" -#include - #define ClipValue(v,min,max) ((v) < (min) ? (min) : (v) > (max) ? (max) : (v)) /* Xvideo port struct */ @@ -92,10 +90,14 @@ typedef struct { void *video_memory; int video_offset; + Bool planar_hw; + Bool planar_state; int planeu_offset; int planev_offset; /* bicubic filtering */ + void *bicubic_memory; + int bicubic_offset; Bool bicubic_enabled; uint32_t bicubic_src_offset; int bicubic_state; @@ -118,32 +120,12 @@ typedef struct { int src_w, src_h, dst_w, dst_h; int w, h; int drw_x, drw_y; - int src_x, src_y; int vsync; - Bool is_planar; - int vtx_count; - int hw_align; - - struct radeon_bo *src_bo[2]; } RADEONPortPrivRec, *RADEONPortPrivPtr; -/* Reference color space transform data */ -typedef struct tagREF_TRANSFORM -{ - float RefLuma; - float RefRCb; - float RefRCr; - float RefGCb; - float RefGCr; - float RefBCb; - float RefBCr; -} REF_TRANSFORM; - -#define RTFSaturation(a) (1.0 + ((a)*1.0)/1000.0) -#define RTFBrightness(a) (((a)*1.0)/2000.0) -#define RTFIntensity(a) (((a)*1.0)/2000.0) -#define RTFContrast(a) (1.0 + ((a)*1.0)/1000.0) -#define RTFHue(a) (((a)*3.1416)/1000.0) +xf86CrtcPtr +radeon_xv_pick_best_crtc(ScrnInfoPtr pScrn, + int x1, int x2, int y1, int y2); void RADEONInitI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); void RADEONResetI2C(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); @@ -153,7 +135,6 @@ void RADEONVIP_reset(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); int RADEONSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer); int RADEONGetPortAttribute(ScrnInfoPtr, Atom ,INT32 *, pointer); -void RADEONFreeVideoMemory(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv); void RADEONStopVideo(ScrnInfoPtr, pointer, Bool); void RADEONQueryBestSize(ScrnInfoPtr, Bool, short, short, short, short, unsigned int *, unsigned int *, pointer); @@ -163,9 +144,6 @@ int RADEONQueryImageAttributes(ScrnInfoPtr, int, unsigned short *, XF86VideoAdaptorPtr RADEONSetupImageTexturedVideo(ScreenPtr pScreen); -XF86MCAdaptorPtr -RADEONCreateAdaptorXvMC(ScreenPtr pScreen, char *xv_adaptor_name); - void RADEONCopyData(ScrnInfoPtr pScrn, unsigned char *src, unsigned char *dst, diff --git a/driver/xf86-video-ati/src/radeon_vip.c b/driver/xf86-video-ati/src/radeon_vip.c index 845707890..05b90f199 100644 --- a/driver/xf86-video-ati/src/radeon_vip.c +++ b/driver/xf86-video-ati/src/radeon_vip.c @@ -349,7 +349,7 @@ void RADEONVIP_reset(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) void RADEONVIP_init(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) { - pPriv->VIP=calloc(1,sizeof(GENERIC_BUS_Rec)); + pPriv->VIP=xcalloc(1,sizeof(GENERIC_BUS_Rec)); pPriv->VIP->scrnIndex=pScrn->scrnIndex; pPriv->VIP->DriverPrivate.ptr=pPriv; pPriv->VIP->ioctl=RADEONVIP_ioctl; diff --git a/driver/xf86-video-ati/src/radeon_xvmc.c b/driver/xf86-video-ati/src/radeon_xvmc.c deleted file mode 100644 index 0f5431869..000000000 --- a/driver/xf86-video-ati/src/radeon_xvmc.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2010 Christian König - * - * 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 (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 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. - * - * - * Based on vl_hwmc.c from xf86-video-nouveau - * - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include "radeon_video.h" - -#include -#include -#include -#include "fourcc.h" - -#define FOURCC_RGB 0x0000003 - -static int subpicture_index_list[] = -{ - FOURCC_RGB, - FOURCC_IA44, - FOURCC_AI44 -}; - -static XF86MCImageIDList subpicture_list = -{ - 3, - subpicture_index_list -}; - -static XF86MCSurfaceInfoRec yv12_mpeg2_surface = -{ - FOURCC_YV12, - XVMC_CHROMA_FORMAT_420, - 0, - 2048, - 2048, - 2048, - 2048, - XVMC_IDCT | XVMC_MOCOMP | XVMC_MPEG_2, - XVMC_SUBPICTURE_INDEPENDENT_SCALING | XVMC_BACKEND_SUBPICTURE, - &subpicture_list -}; - -static XF86MCSurfaceInfoPtr surfaces[] = -{ - (XF86MCSurfaceInfoPtr)&yv12_mpeg2_surface, -}; - -static XF86ImageRec rgb_subpicture = -{ - FOURCC_RGB, - XvRGB, - LSBFirst, - { - 'R', 'G', 'B', 0x00, - 0x00,0x00,0x00,0x10,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71 - }, - 32, - XvPacked, - 1, - 24, 0x00FF0000, 0x0000FF00, 0x000000FF, - 0, 0, 0, - 0, 0, 0, - 0, 0, 0, - { - 'B','G','R','X', - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - }, - XvTopToBottom -}; - -static XF86ImageRec ia44_subpicture = XVIMAGE_IA44; -static XF86ImageRec ai44_subpicture = XVIMAGE_AI44; - -static XF86ImagePtr subpictures[] = -{ - (XF86ImagePtr)&rgb_subpicture, - (XF86ImagePtr)&ia44_subpicture, - (XF86ImagePtr)&ai44_subpicture -}; - -static XF86MCAdaptorRec adaptor_template = -{ - "", - 1, - surfaces, - 3, - subpictures, - (xf86XvMCCreateContextProcPtr)NULL, - (xf86XvMCDestroyContextProcPtr)NULL, - (xf86XvMCCreateSurfaceProcPtr)NULL, - (xf86XvMCDestroySurfaceProcPtr)NULL, - (xf86XvMCCreateSubpictureProcPtr)NULL, - (xf86XvMCDestroySubpictureProcPtr)NULL -}; - -XF86MCAdaptorPtr -RADEONCreateAdaptorXvMC(ScreenPtr pScreen, char *xv_adaptor_name) -{ - XF86MCAdaptorPtr adaptor; - ScrnInfoPtr pScrn; - - assert(pScreen); - - pScrn = xf86Screens[pScreen->myNum]; - adaptor = xf86XvMCCreateAdaptorRec(); - - if (!adaptor) - { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "[XvMC] Memory allocation failed.\n"); - return NULL; - } - - *adaptor = adaptor_template; - adaptor->name = xv_adaptor_name; - - xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[XvMC] Associated with %s.\n", adaptor->name); - - return adaptor; -} diff --git a/driver/xf86-video-ati/src/simple_list.h b/driver/xf86-video-ati/src/simple_list.h deleted file mode 100644 index ff7f88823..000000000 --- a/driver/xf86-video-ati/src/simple_list.h +++ /dev/null @@ -1,202 +0,0 @@ -/** - * \file simple_list.h - * Simple macros for type-safe, intrusive lists. - * - * Intended to work with a list sentinal which is created as an empty - * list. Insert & delete are O(1). - * - * \author - * (C) 1997, Keith Whitwell - */ - -/* - * Mesa 3-D graphics library - * Version: 3.5 - * - * Copyright (C) 1999-2001 Brian Paul 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 - * 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 - * BRIAN PAUL 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. - */ - - -#ifndef _SIMPLE_LIST_H -#define _SIMPLE_LIST_H - -struct simple_node { - struct simple_node *next; - struct simple_node *prev; -}; - -/** - * Remove an element from list. - * - * \param elem element to remove. - */ -#define remove_from_list(elem) \ -do { \ - (elem)->next->prev = (elem)->prev; \ - (elem)->prev->next = (elem)->next; \ -} while (0) - -/** - * Insert an element to the list head. - * - * \param list list. - * \param elem element to insert. - */ -#define insert_at_head(list, elem) \ -do { \ - (elem)->prev = list; \ - (elem)->next = (list)->next; \ - (list)->next->prev = elem; \ - (list)->next = elem; \ -} while(0) - -/** - * Insert an element to the list tail. - * - * \param list list. - * \param elem element to insert. - */ -#define insert_at_tail(list, elem) \ -do { \ - (elem)->next = list; \ - (elem)->prev = (list)->prev; \ - (list)->prev->next = elem; \ - (list)->prev = elem; \ -} while(0) - -/** - * Move an element to the list head. - * - * \param list list. - * \param elem element to move. - */ -#define move_to_head(list, elem) \ -do { \ - remove_from_list(elem); \ - insert_at_head(list, elem); \ -} while (0) - -/** - * Move an element to the list tail. - * - * \param list list. - * \param elem element to move. - */ -#define move_to_tail(list, elem) \ -do { \ - remove_from_list(elem); \ - insert_at_tail(list, elem); \ -} while (0) - -/** - * Make a empty list empty. - * - * \param sentinal list (sentinal element). - */ -#define make_empty_list(sentinal) \ -do { \ - (sentinal)->next = sentinal; \ - (sentinal)->prev = sentinal; \ -} while (0) - -/** - * Get list first element. - * - * \param list list. - * - * \return pointer to first element. - */ -#define first_elem(list) ((list)->next) - -/** - * Get list last element. - * - * \param list list. - * - * \return pointer to last element. - */ -#define last_elem(list) ((list)->prev) - -/** - * Get next element. - * - * \param elem element. - * - * \return pointer to next element. - */ -#define next_elem(elem) ((elem)->next) - -/** - * Get previous element. - * - * \param elem element. - * - * \return pointer to previous element. - */ -#define prev_elem(elem) ((elem)->prev) - -/** - * Test whether element is at end of the list. - * - * \param list list. - * \param elem element. - * - * \return non-zero if element is at end of list, or zero otherwise. - */ -#define at_end(list, elem) ((elem) == (list)) - -/** - * Test if a list is empty. - * - * \param list list. - * - * \return non-zero if list empty, or zero otherwise. - */ -#define is_empty_list(list) ((list)->next == (list)) - -/** - * Walk through the elements of a list. - * - * \param ptr pointer to the current element. - * \param list list. - * - * \note It should be followed by a { } block or a single statement, as in a \c - * for loop. - */ -#define foreach(ptr, list) \ - for( ptr=(list)->next ; ptr!=list ; ptr=(ptr)->next ) - -/** - * Walk through the elements of a list. - * - * Same as #foreach but lets you unlink the current value during a list - * traversal. Useful for freeing a list, element by element. - * - * \param ptr pointer to the current element. - * \param t temporary pointer. - * \param list list. - * - * \note It should be followed by a { } block or a single statement, as in a \c - * for loop. - */ -#define foreach_s(ptr, t, list) \ - for(ptr=(list)->next,t=(ptr)->next; list != ptr; ptr=t, t=(t)->next) - -#endif diff --git a/driver/xf86-video-ati/src/theatre.c b/driver/xf86-video-ati/src/theatre.c index fc68f275b..ad055c5ac 100644 --- a/driver/xf86-video-ati/src/theatre.c +++ b/driver/xf86-video-ati/src/theatre.c @@ -46,7 +46,7 @@ TheatrePtr DetectTheatre(GENERIC_BUS_Ptr b) return NULL; } - t = calloc(1,sizeof(TheatreRec)); + t = xcalloc(1,sizeof(TheatreRec)); t->VIP = b; t->theatre_num = -1; t->mode=MODE_UNINITIALIZED; @@ -81,7 +81,7 @@ TheatrePtr DetectTheatre(GENERIC_BUS_Ptr b) if(t->theatre_num < 0) { - free(t); + xfree(t); return NULL; } diff --git a/driver/xf86-video-ati/src/theatre200.c b/driver/xf86-video-ati/src/theatre200.c index 4a65b0213..6097eebaa 100644 --- a/driver/xf86-video-ati/src/theatre200.c +++ b/driver/xf86-video-ati/src/theatre200.c @@ -22,8 +22,9 @@ * authorization from the author. * * $Log: theatre200.c,v $ - * Revision 1.4 2012/01/25 21:33:35 matthieu - * Update to xf86-video-ati 6.14.3. Tested by many. + * Revision 1.5 2012/02/06 22:53:13 matthieu + * Revert the update to xf86-video-ati 6.14.3. Requested by espie@ + * who experiemnts regressions with this driver. * * Revision 1.3 2009/08/25 18:51:45 matthieu * update do xf86-video-ati 6.12.2 @@ -170,7 +171,7 @@ static int microc_load (char* micro_path, char* micro_type, struct rt200_microc_ { int ret; - curr_seg = (struct rt200_microc_seg*)malloc(sizeof(struct rt200_microc_seg)); + curr_seg = (struct rt200_microc_seg*)Xalloc(sizeof(struct rt200_microc_seg)); if (curr_seg == NULL) { ERROR_0("Cannot allocate memory\n"); @@ -186,7 +187,7 @@ static int microc_load (char* micro_path, char* micro_type, struct rt200_microc_ goto fail_exit; } - curr_seg->data = (unsigned char*)malloc(curr_seg->num_bytes); + curr_seg->data = (unsigned char*)Xalloc(curr_seg->num_bytes); if (curr_seg->data == NULL) { ERROR_0("cannot allocate memory\n"); @@ -249,7 +250,7 @@ static int microc_load (char* micro_path, char* micro_type, struct rt200_microc_ for (i = 0; i < microc_headp->num_seg; i++) { - curr_seg = (struct rt200_microc_seg*)malloc(sizeof(struct rt200_microc_seg)); + curr_seg = (struct rt200_microc_seg*)Xalloc(sizeof(struct rt200_microc_seg)); if (curr_seg == NULL) { ERROR_0("Cannot allocate memory\n"); @@ -270,7 +271,7 @@ static int microc_load (char* micro_path, char* micro_type, struct rt200_microc_ goto fail_exit; } - curr_seg->data = (unsigned char*)malloc(curr_seg->num_bytes); + curr_seg->data = (unsigned char*)Xalloc(curr_seg->num_bytes); if (curr_seg->data == NULL) { ERROR_0("cannot allocate memory\n"); @@ -326,10 +327,10 @@ fail_exit: curr_seg = seg_list; while(curr_seg) { - free(curr_seg->data); + Xfree(curr_seg->data); prev_seg = curr_seg; curr_seg = curr_seg->next; - free(prev_seg); + Xfree(prev_seg); } fclose(file); @@ -343,10 +344,10 @@ static void microc_clean(struct rt200_microc_data* microc_datap, int screen) while(seg_list) { - free(seg_list->data); + Xfree(seg_list->data); prev_seg = seg_list; seg_list = seg_list->next; - free(prev_seg); + Xfree(prev_seg); } } diff --git a/driver/xf86-video-ati/src/theatre_detect.c b/driver/xf86-video-ati/src/theatre_detect.c index 2f3384d9e..ad96b0cf7 100644 --- a/driver/xf86-video-ati/src/theatre_detect.c +++ b/driver/xf86-video-ati/src/theatre_detect.c @@ -22,8 +22,9 @@ * authorization from the author. * * $Log: theatre_detect.c,v $ - * Revision 1.4 2012/01/25 21:33:35 matthieu - * Update to xf86-video-ati 6.14.3. Tested by many. + * Revision 1.5 2012/02/06 22:53:13 matthieu + * Revert the update to xf86-video-ati 6.14.3. Requested by espie@ + * who experiemnts regressions with this driver. * * Revision 1.3 2009/08/25 18:51:45 matthieu * update do xf86-video-ati 6.12.2 @@ -87,7 +88,7 @@ _X_EXPORT TheatrePtr DetectTheatre(GENERIC_BUS_Ptr b) return NULL; } - t = calloc(1,sizeof(TheatreRec)); + t = xcalloc(1,sizeof(TheatreRec)); t->VIP = b; t->theatre_num = -1; t->mode=MODE_UNINITIALIZED; @@ -121,7 +122,7 @@ _X_EXPORT TheatrePtr DetectTheatre(GENERIC_BUS_Ptr b) if(t->theatre_num < 0) { - free(t); + xfree(t); return NULL; } diff --git a/driver/xf86-video-radeonhd/src/AtomBios/CD_Operations.c b/driver/xf86-video-radeonhd/src/AtomBios/CD_Operations.c new file mode 100644 index 000000000..1e48f815a --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/CD_Operations.c @@ -0,0 +1,954 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/** + +Module Name: + + CD_Operations.c + +Abstract: + + Functions Implementing Command Operations and other common functions + +Revision History: + + NEG:27.09.2002 Initiated. +--*/ +#define __SW_4 + +#include "Decoder.h" +#include "atombios.h" + + + +VOID PutDataRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID PutDataPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID PutDataWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID PutDataFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID PutDataPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID PutDataMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +UINT32 GetParametersDirect32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersDirect16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersDirect8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +UINT32 GetParametersRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +VOID SkipParameters16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID SkipParameters8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +UINT32 GetParametersIndirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +UINT32 GetParametersDirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +UINT16* GetDataMasterTablePointer(DEVICE_DATA STACK_BASED* pDeviceData); +UINT8 GetTrueIndexInMasterTable(PARSER_TEMP_DATA STACK_BASED * pParserTempData, UINT8 IndexInMasterTable); + + +WRITE_IO_FUNCTION WritePCIFunctions[8] = { + WritePCIReg32, + WritePCIReg16, WritePCIReg16, WritePCIReg16, + WritePCIReg8,WritePCIReg8,WritePCIReg8,WritePCIReg8 +}; +WRITE_IO_FUNCTION WriteIOFunctions[8] = { + WriteSysIOReg32, + WriteSysIOReg16,WriteSysIOReg16,WriteSysIOReg16, + WriteSysIOReg8,WriteSysIOReg8,WriteSysIOReg8,WriteSysIOReg8 +}; +READ_IO_FUNCTION ReadPCIFunctions[8] = { + (READ_IO_FUNCTION)ReadPCIReg32, + (READ_IO_FUNCTION)ReadPCIReg16, + (READ_IO_FUNCTION)ReadPCIReg16, + (READ_IO_FUNCTION)ReadPCIReg16, + (READ_IO_FUNCTION)ReadPCIReg8, + (READ_IO_FUNCTION)ReadPCIReg8, + (READ_IO_FUNCTION)ReadPCIReg8, + (READ_IO_FUNCTION)ReadPCIReg8 +}; +READ_IO_FUNCTION ReadIOFunctions[8] = { + (READ_IO_FUNCTION)ReadSysIOReg32, + (READ_IO_FUNCTION)ReadSysIOReg16, + (READ_IO_FUNCTION)ReadSysIOReg16, + (READ_IO_FUNCTION)ReadSysIOReg16, + (READ_IO_FUNCTION)ReadSysIOReg8, + (READ_IO_FUNCTION)ReadSysIOReg8, + (READ_IO_FUNCTION)ReadSysIOReg8, + (READ_IO_FUNCTION)ReadSysIOReg8 +}; +READ_IO_FUNCTION GetParametersDirectArray[8]={ + GetParametersDirect32, + GetParametersDirect16,GetParametersDirect16,GetParametersDirect16, + GetParametersDirect8,GetParametersDirect8,GetParametersDirect8, + GetParametersDirect8 +}; + +COMMANDS_DECODER PutDataFunctions[6] = { + PutDataRegister, + PutDataPS, + PutDataWS, + PutDataFB, + PutDataPLL, + PutDataMC +}; +CD_GET_PARAMETERS GetDestination[6] = { + GetParametersRegister, + GetParametersPS, + GetParametersWS, + GetParametersFB, + GetParametersPLL, + GetParametersMC +}; + +COMMANDS_DECODER SkipDestination[6] = { + SkipParameters16, + SkipParameters8, + SkipParameters8, + SkipParameters8, + SkipParameters8, + SkipParameters8 +}; + +CD_GET_PARAMETERS GetSource[8] = { + GetParametersRegister, + GetParametersPS, + GetParametersWS, + GetParametersFB, + GetParametersIndirect, + GetParametersDirect, + GetParametersPLL, + GetParametersMC +}; + +UINT32 AlignmentMask[8] = {0xFFFFFFFF,0xFFFF,0xFFFF,0xFFFF,0xFF,0xFF,0xFF,0xFF}; +UINT8 SourceAlignmentShift[8] = {0,0,8,16,0,8,16,24}; +UINT8 DestinationAlignmentShift[4] = {0,8,16,24}; + +#define INDIRECTIO_ID 1 +#define INDIRECTIO_END_OF_ID 9 + +VOID IndirectIOCommand(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID IndirectIOCommand_MOVE(PARSER_TEMP_DATA STACK_BASED * pParserTempData, UINT32 temp); +VOID IndirectIOCommand_MOVE_INDEX(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID IndirectIOCommand_MOVE_ATTR(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID IndirectIOCommand_MOVE_DATA(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID IndirectIOCommand_SET(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +VOID IndirectIOCommand_CLEAR(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + +INDIRECT_IO_PARSER_COMMANDS IndirectIOParserCommands[10]={ + {IndirectIOCommand,1}, + {IndirectIOCommand,2}, + {ReadIndReg32,3}, + {WriteIndReg32,3}, + {IndirectIOCommand_CLEAR,3}, + {IndirectIOCommand_SET,3}, + {IndirectIOCommand_MOVE_INDEX,4}, + {IndirectIOCommand_MOVE_ATTR,4}, + {IndirectIOCommand_MOVE_DATA,4}, + {IndirectIOCommand,3} +}; + + +VOID IndirectIOCommand(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ +} + + +VOID IndirectIOCommand_MOVE_INDEX(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[3]); + pParserTempData->IndirectData |=(((pParserTempData->Index >> pParserTempData->IndirectIOTablePointer[2]) & + (0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1]))) << pParserTempData->IndirectIOTablePointer[3]); +} + +VOID IndirectIOCommand_MOVE_ATTR(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[3]); + pParserTempData->IndirectData |=(((pParserTempData->AttributesData >> pParserTempData->IndirectIOTablePointer[2]) + & (0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1]))) << pParserTempData->IndirectIOTablePointer[3]); +} + +VOID IndirectIOCommand_MOVE_DATA(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[3]); + pParserTempData->IndirectData |=(((pParserTempData->DestData32 >> pParserTempData->IndirectIOTablePointer[2]) + & (0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1]))) << pParserTempData->IndirectIOTablePointer[3]); +} + + +VOID IndirectIOCommand_SET(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->IndirectData |= ((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[2]); +} + +VOID IndirectIOCommand_CLEAR(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->IndirectData &= ~((0xFFFFFFFF >> (32-pParserTempData->IndirectIOTablePointer[1])) << pParserTempData->IndirectIOTablePointer[2]); +} + + +UINT32 IndirectInputOutput(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + // if ((pParserTempData->IndirectData & 0x7f)==INDIRECT_IO_MM) pParserTempData->IndirectData|=pParserTempData->CurrentPortID; +// pParserTempData->IndirectIOTablePointer=pParserTempData->IndirectIOTable; + while (*pParserTempData->IndirectIOTablePointer) + { + if ((pParserTempData->IndirectIOTablePointer[0] == INDIRECTIO_ID) && + (pParserTempData->IndirectIOTablePointer[1] == pParserTempData->IndirectData)) + { + pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; + while (*pParserTempData->IndirectIOTablePointer != INDIRECTIO_END_OF_ID) + { + IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].func(pParserTempData); + pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; + } + pParserTempData->IndirectIOTablePointer-=*(UINT16*)(pParserTempData->IndirectIOTablePointer+1); + pParserTempData->IndirectIOTablePointer++; + return pParserTempData->IndirectData; + } else pParserTempData->IndirectIOTablePointer+=IndirectIOParserCommands[*pParserTempData->IndirectIOTablePointer].csize; + } + return 0; +} + + + +VOID PutDataRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.WordXX.PA_Destination; + pParserTempData->Index+=pParserTempData->CurrentRegBlock; + switch(pParserTempData->Multipurpose.CurrentPort){ + case ATI_RegsPort: + if (pParserTempData->CurrentPortID == INDIRECT_IO_MM) + { + if (pParserTempData->Index==0) pParserTempData->DestData32 <<= 2; + WriteReg32( pParserTempData); + } else + { + pParserTempData->IndirectData=pParserTempData->CurrentPortID+INDIRECT_IO_WRITE; + IndirectInputOutput(pParserTempData); + } + break; + case PCI_Port: + WritePCIFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); + break; + case SystemIO_Port: + WriteIOFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); + break; + } +} + +VOID PutDataPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + *(pParserTempData->pDeviceData->pParameterSpace+pParserTempData->pCmd->Parameters.ByteXX.PA_Destination)= + pParserTempData->DestData32; +} + +VOID PutDataWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + if (pParserTempData->pCmd->Parameters.ByteXX.PA_Destination < WS_QUOTIENT_C) + *(pParserTempData->pWorkingTableData->pWorkSpace+pParserTempData->pCmd->Parameters.ByteXX.PA_Destination) = pParserTempData->DestData32; + else + switch (pParserTempData->pCmd->Parameters.ByteXX.PA_Destination) + { + case WS_REMINDER_C: + pParserTempData->MultiplicationOrDivision.Division.Reminder32=pParserTempData->DestData32; + break; + case WS_QUOTIENT_C: + pParserTempData->MultiplicationOrDivision.Division.Quotient32=pParserTempData->DestData32; + break; + case WS_DATAPTR_C: +#ifndef UEFI_BUILD + pParserTempData->CurrentDataBlock=(UINT16)pParserTempData->DestData32; +#else + pParserTempData->CurrentDataBlock=(UINTN)pParserTempData->DestData32; +#endif + break; + case WS_SHIFT_C: + pParserTempData->Shift2MaskConverter=(UINT8)pParserTempData->DestData32; + break; + case WS_FB_WINDOW_C: + pParserTempData->CurrentFB_Window=pParserTempData->DestData32; + break; + case WS_ATTRIBUTES_C: + pParserTempData->AttributesData=(UINT16)pParserTempData->DestData32; + break; + } + +} + +VOID PutDataFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.ByteXX.PA_Destination; + //Make an Index from address first, then add to the Index + pParserTempData->Index+=(pParserTempData->CurrentFB_Window>>2); + WriteFrameBuffer32(pParserTempData); +} + +VOID PutDataPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.ByteXX.PA_Destination; + WritePLL32( pParserTempData ); +} + +VOID PutDataMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=(UINT32)pParserTempData->pCmd->Parameters.ByteXX.PA_Destination; + WriteMC32( pParserTempData ); +} + + +VOID SkipParameters8(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); +} + +VOID SkipParameters16(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); +} + + +UINT32 GetParametersRegister(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=*(UINT16*)pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); + pParserTempData->Index+=pParserTempData->CurrentRegBlock; + switch(pParserTempData->Multipurpose.CurrentPort) + { + case PCI_Port: + return ReadPCIFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); + case SystemIO_Port: + return ReadIOFunctions[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); + case ATI_RegsPort: + default: + if (pParserTempData->CurrentPortID == INDIRECT_IO_MM) return ReadReg32( pParserTempData ); + else + { + pParserTempData->IndirectData=pParserTempData->CurrentPortID+INDIRECT_IO_READ; + return IndirectInputOutput(pParserTempData); + } + } +} + +UINT32 GetParametersPS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); + return *(pParserTempData->pDeviceData->pParameterSpace+pParserTempData->Index); +} + +UINT32 GetParametersWS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); + if (pParserTempData->Index < WS_QUOTIENT_C) + return *(pParserTempData->pWorkingTableData->pWorkSpace+pParserTempData->Index); + else + switch (pParserTempData->Index) + { + case WS_REMINDER_C: + return pParserTempData->MultiplicationOrDivision.Division.Reminder32; + case WS_QUOTIENT_C: + return pParserTempData->MultiplicationOrDivision.Division.Quotient32; + case WS_DATAPTR_C: + return (UINT32)pParserTempData->CurrentDataBlock; + case WS_OR_MASK_C: + return ((UINT32)1) << pParserTempData->Shift2MaskConverter; + case WS_AND_MASK_C: + return ~(((UINT32)1) << pParserTempData->Shift2MaskConverter); + case WS_FB_WINDOW_C: + return pParserTempData->CurrentFB_Window; + case WS_ATTRIBUTES_C: + return pParserTempData->AttributesData; + } + return 0; + +} + +UINT32 GetParametersFB(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); + pParserTempData->Index+=(pParserTempData->CurrentFB_Window>>2); + return ReadFrameBuffer32(pParserTempData); +} + +UINT32 GetParametersPLL(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); + return ReadPLL32( pParserTempData ); +} + +UINT32 GetParametersMC(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=*pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); + return ReadMC32( pParserTempData ); +} + + +UINT32 GetParametersIndirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Index=*(UINT16*)pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); + return *(UINT32*)(RELATIVE_TO_BIOS_IMAGE(pParserTempData->Index)+pParserTempData->CurrentDataBlock); +} + +UINT32 GetParametersDirect8(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->CD_Mask.SrcAlignment=alignmentByte0; + pParserTempData->Index=*(UINT8*)pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT8); + return pParserTempData->Index; +} + +UINT32 GetParametersDirect16(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->CD_Mask.SrcAlignment=alignmentLowerWord; + pParserTempData->Index=*(UINT16*)pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); + return pParserTempData->Index; +} + +UINT32 GetParametersDirect32(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->CD_Mask.SrcAlignment=alignmentDword; + pParserTempData->Index=*(UINT32*)pParserTempData->pWorkingTableData->IP; + pParserTempData->pWorkingTableData->IP+=sizeof(UINT32); + return pParserTempData->Index; +} + + +UINT32 GetParametersDirect(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + return GetParametersDirectArray[pParserTempData->pCmd->Header.Attribute.SourceAlignment](pParserTempData); +} + + +VOID CommonSourceDataTransformation(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->SourceData32 <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; +} + +VOID CommonOperationDataTransformation(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->DestData32 >>= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; + pParserTempData->DestData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; +} + +VOID ProcessMove(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + if (pParserTempData->CD_Mask.SrcAlignment!=alignmentDword) + { + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + } else + { + SkipDestination[pParserTempData->ParametersType.Destination](pParserTempData); + } + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + + if (pParserTempData->CD_Mask.SrcAlignment!=alignmentDword) + { + pParserTempData->DestData32 &= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]); + CommonSourceDataTransformation(pParserTempData); + pParserTempData->DestData32 |= pParserTempData->SourceData32; + } else + { + pParserTempData->DestData32=pParserTempData->SourceData32; + } + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessMask(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetParametersDirect(pParserTempData); + pParserTempData->Index=GetParametersDirect(pParserTempData); + pParserTempData->SourceData32 <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; + pParserTempData->SourceData32 |= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]); + pParserTempData->DestData32 &= pParserTempData->SourceData32; + pParserTempData->Index &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->Index <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; + pParserTempData->DestData32 |= pParserTempData->Index; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessAnd(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->SourceData32 <<= DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]; + pParserTempData->SourceData32 |= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << DestinationAlignmentShift[pParserTempData->CD_Mask.DestAlignment]); + pParserTempData->DestData32 &= pParserTempData->SourceData32; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessOr(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonSourceDataTransformation(pParserTempData); + pParserTempData->DestData32 |= pParserTempData->SourceData32; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessXor(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonSourceDataTransformation(pParserTempData); + pParserTempData->DestData32 ^= pParserTempData->SourceData32; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessShl(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonSourceDataTransformation(pParserTempData); + pParserTempData->DestData32 <<= pParserTempData->SourceData32; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessShr(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonSourceDataTransformation(pParserTempData); + pParserTempData->DestData32 >>= pParserTempData->SourceData32; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + + +VOID ProcessADD(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonSourceDataTransformation(pParserTempData); + pParserTempData->DestData32 += pParserTempData->SourceData32; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessSUB(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonSourceDataTransformation(pParserTempData); + pParserTempData->DestData32 -= pParserTempData->SourceData32; + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessMUL(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonOperationDataTransformation(pParserTempData); + pParserTempData->MultiplicationOrDivision.Multiplication.Low32Bit=pParserTempData->DestData32 * pParserTempData->SourceData32; +} + +VOID ProcessDIV(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + + CommonOperationDataTransformation(pParserTempData); + pParserTempData->MultiplicationOrDivision.Division.Quotient32= + pParserTempData->DestData32 / pParserTempData->SourceData32; + pParserTempData->MultiplicationOrDivision.Division.Reminder32= + pParserTempData->DestData32 % pParserTempData->SourceData32; +} + + +VOID ProcessCompare(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + + CommonOperationDataTransformation(pParserTempData); + + // Here we just set flags based on evaluation + if (pParserTempData->DestData32==pParserTempData->SourceData32) + pParserTempData->CompareFlags = Equal; + else + pParserTempData->CompareFlags = + (UINT8)((pParserTempData->DestData32SourceData32) ? Below : Above); + +} + +VOID ProcessClear(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->DestData32 &= ~(AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]); + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); + +} + +VOID ProcessShift(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + UINT32 mask = AlignmentMask[pParserTempData->CD_Mask.SrcAlignment] << SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetParametersDirect8(pParserTempData); + + // save original value of the destination + pParserTempData->Index = pParserTempData->DestData32 & ~mask; + pParserTempData->DestData32 &= mask; + + if (pParserTempData->pCmd->Header.Opcode < SHIFT_RIGHT_REG_OPCODE) + pParserTempData->DestData32 <<= pParserTempData->SourceData32; else + pParserTempData->DestData32 >>= pParserTempData->SourceData32; + + // Clear any bits shifted out of masked area... + pParserTempData->DestData32 &= mask; + // ... and restore the area outside of masked with original values + pParserTempData->DestData32 |= pParserTempData->Index; + + // write data back + PutDataFunctions[pParserTempData->ParametersType.Destination](pParserTempData); +} + +VOID ProcessTest(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->DestData32=GetDestination[pParserTempData->ParametersType.Destination](pParserTempData); + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + CommonOperationDataTransformation(pParserTempData); + pParserTempData->CompareFlags = + (UINT8)((pParserTempData->DestData32 & pParserTempData->SourceData32) ? NotEqual : Equal); + +} + +VOID ProcessSetFB_Base(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->CurrentFB_Window=pParserTempData->SourceData32; +} + +VOID ProcessSwitch(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ + pParserTempData->SourceData32=GetSource[pParserTempData->ParametersType.Source](pParserTempData); + pParserTempData->SourceData32 >>= SourceAlignmentShift[pParserTempData->CD_Mask.SrcAlignment]; + pParserTempData->SourceData32 &= AlignmentMask[pParserTempData->CD_Mask.SrcAlignment]; + while ( *(UINT16*)pParserTempData->pWorkingTableData->IP != (((UINT16)NOP_OPCODE << 8)+NOP_OPCODE)) + { + if (*pParserTempData->pWorkingTableData->IP == 'c') + { + pParserTempData->pWorkingTableData->IP++; + pParserTempData->DestData32=GetParametersDirect(pParserTempData); + pParserTempData->Index=GetParametersDirect16(pParserTempData); + if (pParserTempData->SourceData32 == pParserTempData->DestData32) + { + pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(pParserTempData->Index); + return; + } + } + } + pParserTempData->pWorkingTableData->IP+=sizeof(UINT16); +} + + +VOID cmdSetDataBlock(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + UINT8 value; + UINT16* pMasterDataTable; + value=((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; + if (value == 0) pParserTempData->CurrentDataBlock=0; else + { + if (value == DB_CURRENT_COMMAND_TABLE) + { + pParserTempData->CurrentDataBlock= (UINT16)(pParserTempData->pWorkingTableData->pTableHead-pParserTempData->pDeviceData->pBIOS_Image); + } else + { + pMasterDataTable = GetDataMasterTablePointer(pParserTempData->pDeviceData); + pParserTempData->CurrentDataBlock= (TABLE_UNIT_TYPE)((PTABLE_UNIT_TYPE)pMasterDataTable)[value]; + } + } + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); +} + +VOID cmdSet_ATI_Port(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Multipurpose.CurrentPort=ATI_RegsPort; + pParserTempData->CurrentPortID = (UINT8)((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.WordXX.PA_Destination; + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); +} + +VOID cmdSet_Reg_Block(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->CurrentRegBlock = ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.WordXX.PA_Destination; + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); +} + + +//Atavism!!! Review!!! +VOID cmdSet_X_Port(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ + pParserTempData->Multipurpose.CurrentPort=pParserTempData->ParametersType.Destination; + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_ONLY); + +} + +VOID cmdDelay_Millisec(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ + pParserTempData->SourceData32 = + ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; + DelayMilliseconds(pParserTempData); + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); +} +VOID cmdDelay_Microsec(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ + pParserTempData->SourceData32 = + ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; + DelayMicroseconds(pParserTempData); + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); +} + +VOID ProcessPostChar(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->SourceData32 = + ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; + PostCharOutput(pParserTempData); + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); +} + +VOID ProcessDebug(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->SourceData32 = + ((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.ByteXX.PA_Destination; + CallerDebugFunc(pParserTempData); + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); +} + + +VOID ProcessDS(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->pWorkingTableData->IP+=((COMMAND_TYPE_1*)pParserTempData->pWorkingTableData->IP)->Parameters.WordXX.PA_Destination+sizeof(COMMAND_TYPE_OPCODE_OFFSET16); +} + + +VOID cmdCall_Table(PARSER_TEMP_DATA STACK_BASED * pParserTempData){ + UINT16* MasterTableOffset; + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_VALUE_BYTE); + MasterTableOffset = GetCommandMasterTablePointer(pParserTempData->pDeviceData); + if(((PTABLE_UNIT_TYPE)MasterTableOffset)[((COMMAND_TYPE_OPCODE_VALUE_BYTE*)pParserTempData->pCmd)->Value]!=0 ) // if the offset is not ZERO + { + pParserTempData->CommandSpecific.IndexInMasterTable=GetTrueIndexInMasterTable(pParserTempData,((COMMAND_TYPE_OPCODE_VALUE_BYTE*)pParserTempData->pCmd)->Value); + pParserTempData->Multipurpose.PS_SizeInDwordsUsedByCallingTable = + (((ATOM_COMMON_ROM_COMMAND_TABLE_HEADER *)pParserTempData->pWorkingTableData->pTableHead)->TableAttribute.PS_SizeInBytes>>2); + pParserTempData->pDeviceData->pParameterSpace+= + pParserTempData->Multipurpose.PS_SizeInDwordsUsedByCallingTable; + pParserTempData->Status=CD_CALL_TABLE; + pParserTempData->pCmd=(GENERIC_ATTRIBUTE_COMMAND*)MasterTableOffset; + } +} + + +VOID cmdNOP_(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ +} + + +static VOID NotImplemented(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + pParserTempData->Status = CD_NOT_IMPLEMENTED; +} + + +VOID ProcessJump(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + if ((pParserTempData->ParametersType.Destination == NoCondition) || + (pParserTempData->ParametersType.Destination == pParserTempData->CompareFlags )) + { + + pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(((COMMAND_TYPE_OPCODE_OFFSET16*)pParserTempData->pWorkingTableData->IP)->CD_Offset16); + } else + { + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); + } +} + +VOID ProcessJumpE(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + if ((pParserTempData->CompareFlags == Equal) || + (pParserTempData->CompareFlags == pParserTempData->ParametersType.Destination)) + { + + pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(((COMMAND_TYPE_OPCODE_OFFSET16*)pParserTempData->pWorkingTableData->IP)->CD_Offset16); + } else + { + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); + } +} + +VOID ProcessJumpNE(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + if (pParserTempData->CompareFlags != Equal) + { + + pParserTempData->pWorkingTableData->IP= RELATIVE_TO_TABLE(((COMMAND_TYPE_OPCODE_OFFSET16*)pParserTempData->pWorkingTableData->IP)->CD_Offset16); + } else + { + pParserTempData->pWorkingTableData->IP+=sizeof(COMMAND_TYPE_OPCODE_OFFSET16); + } +} + + + +COMMANDS_PROPERTIES CallTable[] = +{ + { NULL, 0,0}, + { ProcessMove, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessMove, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessMove, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessMove, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessMove, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessMove, destMC, sizeof(COMMAND_HEADER)}, + { ProcessAnd, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessAnd, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessAnd, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessAnd, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessAnd, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessAnd, destMC, sizeof(COMMAND_HEADER)}, + { ProcessOr, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessOr, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessOr, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessOr, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessOr, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessOr, destMC, sizeof(COMMAND_HEADER)}, + { ProcessShift, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessShift, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessShift, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessShift, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessShift, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessShift, destMC, sizeof(COMMAND_HEADER)}, + { ProcessShift, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessShift, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessShift, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessShift, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessShift, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessShift, destMC, sizeof(COMMAND_HEADER)}, + { ProcessMUL, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessMUL, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessMUL, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessMUL, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessMUL, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessMUL, destMC, sizeof(COMMAND_HEADER)}, + { ProcessDIV, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessDIV, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessDIV, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessDIV, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessDIV, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessDIV, destMC, sizeof(COMMAND_HEADER)}, + { ProcessADD, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessADD, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessADD, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessADD, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessADD, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessADD, destMC, sizeof(COMMAND_HEADER)}, + { ProcessSUB, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessSUB, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessSUB, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessSUB, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessSUB, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessSUB, destMC, sizeof(COMMAND_HEADER)}, + { cmdSet_ATI_Port, ATI_RegsPort, 0}, + { cmdSet_X_Port, PCI_Port, 0}, + { cmdSet_X_Port, SystemIO_Port, 0}, + { cmdSet_Reg_Block, 0, 0}, + { ProcessSetFB_Base,0, sizeof(COMMAND_HEADER)}, + { ProcessCompare, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessCompare, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessCompare, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessCompare, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessCompare, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessCompare, destMC, sizeof(COMMAND_HEADER)}, + { ProcessSwitch, 0, sizeof(COMMAND_HEADER)}, + { ProcessJump, NoCondition, 0}, + { ProcessJump, Equal, 0}, + { ProcessJump, Below, 0}, + { ProcessJump, Above, 0}, + { ProcessJumpE, Below, 0}, + { ProcessJumpE, Above, 0}, + { ProcessJumpNE, 0, 0}, + { ProcessTest, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessTest, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessTest, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessTest, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessTest, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessTest, destMC, sizeof(COMMAND_HEADER)}, + { cmdDelay_Millisec,0, 0}, + { cmdDelay_Microsec,0, 0}, + { cmdCall_Table, 0, 0}, + /*cmdRepeat*/ { NotImplemented, 0, 0}, + { ProcessClear, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessClear, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessClear, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessClear, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessClear, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessClear, destMC, sizeof(COMMAND_HEADER)}, + { cmdNOP_, 0, sizeof(COMMAND_TYPE_OPCODE_ONLY)}, + /*cmdEOT*/ { cmdNOP_, 0, sizeof(COMMAND_TYPE_OPCODE_ONLY)}, + { ProcessMask, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessMask, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessMask, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessMask, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessMask, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessMask, destMC, sizeof(COMMAND_HEADER)}, + /*cmdPost_Card*/ { ProcessPostChar, 0, 0}, + /*cmdBeep*/ { NotImplemented, 0, 0}, + /*cmdSave_Reg*/ { NotImplemented, 0, 0}, + /*cmdRestore_Reg*/{ NotImplemented, 0, 0}, + { cmdSetDataBlock, 0, 0}, + { ProcessXor, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessXor, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessXor, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessXor, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessXor, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessXor, destMC, sizeof(COMMAND_HEADER)}, + + { ProcessShl, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessShl, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessShl, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessShl, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessShl, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessShl, destMC, sizeof(COMMAND_HEADER)}, + + { ProcessShr, destRegister, sizeof(COMMAND_HEADER)}, + { ProcessShr, destParamSpace, sizeof(COMMAND_HEADER)}, + { ProcessShr, destWorkSpace, sizeof(COMMAND_HEADER)}, + { ProcessShr, destFrameBuffer, sizeof(COMMAND_HEADER)}, + { ProcessShr, destPLL, sizeof(COMMAND_HEADER)}, + { ProcessShr, destMC, sizeof(COMMAND_HEADER)}, + /*cmdDebug*/ { ProcessDebug, 0, 0}, + { ProcessDS, 0, 0}, + +}; + +// EOF diff --git a/driver/xf86-video-radeonhd/src/AtomBios/Decoder.c b/driver/xf86-video-radeonhd/src/AtomBios/Decoder.c new file mode 100644 index 000000000..95908d5fe --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/Decoder.c @@ -0,0 +1,235 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/** + +Module Name: + + Decoder.c + +Abstract: + + Commands Decoder + +Revision History: + + NEG:24.09.2002 Initiated. +--*/ +//#include "AtomBios.h" +#include "Decoder.h" +#include "atombios.h" +#include "CD_binding.h" +#include "CD_Common_Types.h" + +#ifndef DISABLE_EASF + #include "easf.h" +#endif + + + +#define INDIRECT_IO_TABLE (((UINT16)&((ATOM_MASTER_LIST_OF_DATA_TABLES*)0)->IndirectIOAccess)/sizeof(TABLE_UNIT_TYPE) ) +extern COMMANDS_PROPERTIES CallTable[]; + + +UINT8 ProcessCommandProperties(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ + UINT8 opcode=((COMMAND_HEADER*)pParserTempData->pWorkingTableData->IP)->Opcode; + pParserTempData->pWorkingTableData->IP+=CallTable[opcode].headersize; + pParserTempData->ParametersType.Destination=CallTable[opcode].destination; + pParserTempData->ParametersType.Source = pParserTempData->pCmd->Header.Attribute.Source; + pParserTempData->CD_Mask.SrcAlignment=pParserTempData->pCmd->Header.Attribute.SourceAlignment; + pParserTempData->CD_Mask.DestAlignment=pParserTempData->pCmd->Header.Attribute.DestinationAlignment; + return opcode; +} + +UINT16* GetCommandMasterTablePointer(DEVICE_DATA STACK_BASED* pDeviceData) +{ + UINT16 *MasterTableOffset; +#ifndef DISABLE_EASF + if (pDeviceData->format == TABLE_FORMAT_EASF) + { + /* + make MasterTableOffset point to EASF_ASIC_SETUP_TABLE structure, including usSize. + */ + MasterTableOffset = (UINT16 *) (pDeviceData->pBIOS_Image+((EASF_ASIC_DESCRIPTOR*)pDeviceData->pBIOS_Image)->usAsicSetupTable_Offset); + } else +#endif + { +#ifndef UEFI_BUILD + MasterTableOffset = (UINT16 *)(*(UINT16 *)(pDeviceData->pBIOS_Image+OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER) + pDeviceData->pBIOS_Image); + MasterTableOffset = (UINT16 *)((ULONG)((ATOM_ROM_HEADER *)MasterTableOffset)->usMasterCommandTableOffset + pDeviceData->pBIOS_Image ); + MasterTableOffset =(UINT16 *) &(((ATOM_MASTER_COMMAND_TABLE *)MasterTableOffset)->ListOfCommandTables); +#else + MasterTableOffset = (UINT16 *)(&(GetCommandMasterTable( )->ListOfCommandTables)); +#endif + } + return MasterTableOffset; +} + +UINT16* GetDataMasterTablePointer(DEVICE_DATA STACK_BASED* pDeviceData) +{ + UINT16 *MasterTableOffset; + +#ifndef UEFI_BUILD + MasterTableOffset = (UINT16 *)(*(UINT16 *)(pDeviceData->pBIOS_Image+OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER) + pDeviceData->pBIOS_Image); + MasterTableOffset = (UINT16 *)((ULONG)((ATOM_ROM_HEADER *)MasterTableOffset)->usMasterDataTableOffset + pDeviceData->pBIOS_Image ); + MasterTableOffset =(UINT16 *) &(((ATOM_MASTER_DATA_TABLE *)MasterTableOffset)->ListOfDataTables); +#else + MasterTableOffset = (UINT16 *)(&(GetDataMasterTable( )->ListOfDataTables)); +#endif + return MasterTableOffset; +} + + +UINT8 GetTrueIndexInMasterTable(PARSER_TEMP_DATA STACK_BASED * pParserTempData, UINT8 IndexInMasterTable) +{ +#ifndef DISABLE_EASF + UINT16 i; + if ( pParserTempData->pDeviceData->format == TABLE_FORMAT_EASF) + { +/* + Consider EASF_ASIC_SETUP_TABLE structure pointed by pParserTempData->pCmd as UINT16[] + ((UINT16*)pParserTempData->pCmd)[0] = EASF_ASIC_SETUP_TABLE.usSize; + ((UINT16*)pParserTempData->pCmd)[1+n*4] = usFunctionID; + usFunctionID has to be shifted left by 2 before compare it to the value provided by caller. +*/ + for (i=1; (i < ((UINT16*)pParserTempData->pCmd)[0] >> 1);i+=4) + if ((UINT8)(((UINT16*)pParserTempData->pCmd)[i] << 2)==(IndexInMasterTable & EASF_TABLE_INDEX_MASK)) return (i+1+(IndexInMasterTable & EASF_TABLE_ATTR_MASK)); + return 1; + } else +#endif + { + return IndexInMasterTable; + } +} + +CD_STATUS ParseTable(DEVICE_DATA STACK_BASED* pDeviceData, UINT8 IndexInMasterTable) +{ + PARSER_TEMP_DATA ParserTempData; + WORKING_TABLE_DATA STACK_BASED* prevWorkingTableData; + + ParserTempData.pDeviceData=(DEVICE_DATA*)pDeviceData; +#ifndef DISABLE_EASF + if (pDeviceData->format == TABLE_FORMAT_EASF) + { + ParserTempData.IndirectIOTablePointer = 0; + } else +#endif + { + ParserTempData.pCmd=(GENERIC_ATTRIBUTE_COMMAND*)GetDataMasterTablePointer(pDeviceData); + ParserTempData.IndirectIOTablePointer=(UINT8*)((ULONG)(((PTABLE_UNIT_TYPE)ParserTempData.pCmd)[INDIRECT_IO_TABLE]) + pDeviceData->pBIOS_Image); + ParserTempData.IndirectIOTablePointer+=sizeof(ATOM_COMMON_TABLE_HEADER); + } + + ParserTempData.pCmd=(GENERIC_ATTRIBUTE_COMMAND*)GetCommandMasterTablePointer(pDeviceData); + IndexInMasterTable=GetTrueIndexInMasterTable((PARSER_TEMP_DATA STACK_BASED *)&ParserTempData,IndexInMasterTable); + if(((PTABLE_UNIT_TYPE)ParserTempData.pCmd)[IndexInMasterTable]!=0 ) // if the offset is not ZERO + { + ParserTempData.CommandSpecific.IndexInMasterTable=IndexInMasterTable; + ParserTempData.Multipurpose.CurrentPort=ATI_RegsPort; + ParserTempData.CurrentPortID=INDIRECT_IO_MM; + ParserTempData.CurrentRegBlock=0; + ParserTempData.CurrentFB_Window=0; + prevWorkingTableData=NULL; + ParserTempData.Status=CD_CALL_TABLE; + + do{ + + if (ParserTempData.Status==CD_CALL_TABLE) + { + IndexInMasterTable=ParserTempData.CommandSpecific.IndexInMasterTable; + if(((PTABLE_UNIT_TYPE)ParserTempData.pCmd)[IndexInMasterTable]!=0) // if the offset is not ZERO + { +#ifndef UEFI_BUILD + ParserTempData.pWorkingTableData =(WORKING_TABLE_DATA STACK_BASED*) AllocateWorkSpace(pDeviceData, + ((ATOM_COMMON_ROM_COMMAND_TABLE_HEADER*)(((PTABLE_UNIT_TYPE)ParserTempData.pCmd)[IndexInMasterTable]+pDeviceData->pBIOS_Image))->TableAttribute.WS_SizeInBytes+sizeof(WORKING_TABLE_DATA)); +#else + ParserTempData.pWorkingTableData =(WORKING_TABLE_DATA STACK_BASED*) AllocateWorkSpace(pDeviceData, + ((ATOM_COMMON_ROM_COMMAND_TABLE_HEADER*)(((PTABLE_UNIT_TYPE)ParserTempData.pCmd)[IndexInMasterTable]))->TableAttribute.WS_SizeInBytes+sizeof(WORKING_TABLE_DATA)); +#endif + if (ParserTempData.pWorkingTableData!=NULL) + { + ParserTempData.pWorkingTableData->pWorkSpace=(WORKSPACE_POINTER STACK_BASED*)((UINT8*)ParserTempData.pWorkingTableData+sizeof(WORKING_TABLE_DATA)); +#ifndef UEFI_BUILD + ParserTempData.pWorkingTableData->pTableHead = (UINT8 *)(((PTABLE_UNIT_TYPE)ParserTempData.pCmd)[IndexInMasterTable]+pDeviceData->pBIOS_Image); +#else + ParserTempData.pWorkingTableData->pTableHead = (UINT8 *)(((PTABLE_UNIT_TYPE)ParserTempData.pCmd)[IndexInMasterTable]); +#endif + ParserTempData.pWorkingTableData->IP=((UINT8*)ParserTempData.pWorkingTableData->pTableHead)+sizeof(ATOM_COMMON_ROM_COMMAND_TABLE_HEADER); + ParserTempData.pWorkingTableData->prevWorkingTableData=prevWorkingTableData; + prevWorkingTableData=ParserTempData.pWorkingTableData; + ParserTempData.Status = CD_SUCCESS; + } else ParserTempData.Status = CD_UNEXPECTED_BEHAVIOR; + } else ParserTempData.Status = CD_EXEC_TABLE_NOT_FOUND; + } + if (!CD_ERROR(ParserTempData.Status)) + { + ParserTempData.Status = CD_SUCCESS; + while (!CD_ERROR_OR_COMPLETED(ParserTempData.Status)) + { + + if (IS_COMMAND_VALID(((COMMAND_HEADER*)ParserTempData.pWorkingTableData->IP)->Opcode)) + { + ParserTempData.pCmd = (GENERIC_ATTRIBUTE_COMMAND*)ParserTempData.pWorkingTableData->IP; + + if (IS_END_OF_TABLE(((COMMAND_HEADER*)ParserTempData.pWorkingTableData->IP)->Opcode)) + { + ParserTempData.Status=CD_COMPLETED; + prevWorkingTableData=ParserTempData.pWorkingTableData->prevWorkingTableData; + + FreeWorkSpace(pDeviceData, ParserTempData.pWorkingTableData); + ParserTempData.pWorkingTableData=prevWorkingTableData; + if (prevWorkingTableData!=NULL) + { + ParserTempData.pDeviceData->pParameterSpace-= + (((ATOM_COMMON_ROM_COMMAND_TABLE_HEADER*)ParserTempData.pWorkingTableData-> + pTableHead)->TableAttribute.PS_SizeInBytes>>2); + } + // if there is a parent table where to return, then restore PS_pointer to the original state + } + else + { + IndexInMasterTable=ProcessCommandProperties((PARSER_TEMP_DATA STACK_BASED *)&ParserTempData); + (*CallTable[IndexInMasterTable].function)((PARSER_TEMP_DATA STACK_BASED *)&ParserTempData); +#if (PARSER_TYPE!=DRIVER_TYPE_PARSER) + BIOS_STACK_MODIFIER(); +#endif + } + } + else + { + ParserTempData.Status=CD_INVALID_OPCODE; + break; + } + + } // while + } // if + else + break; + } while (prevWorkingTableData!=NULL); + if (ParserTempData.Status == CD_COMPLETED) return CD_SUCCESS; + return ParserTempData.Status; + } else return CD_SUCCESS; +} + +// EOF + diff --git a/driver/xf86-video-radeonhd/src/AtomBios/hwserv_drv.c b/driver/xf86-video-radeonhd/src/AtomBios/hwserv_drv.c new file mode 100644 index 000000000..a5f5a5b80 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/hwserv_drv.c @@ -0,0 +1,348 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/** + +Module Name: + + hwserv_drv.c + +Abstract: + + Functions defined in the Command Decoder Specification document + +Revision History: + + NEG:27.09.2002 Initiated. +--*/ +#include "CD_binding.h" +#include "CD_hw_services.h" + +//trace settings +#if DEBUG_OUTPUT_DEVICE & 1 + #define TRACE_USING_STDERR //define it to use stderr as trace output, +#endif +#if DEBUG_OUTPUT_DEVICE & 2 + #define TRACE_USING_RS232 +#endif +#if DEBUG_OUTPUT_DEVICE & 4 + #define TRACE_USING_LPT +#endif + + +#if DEBUG_PARSER == 4 + #define IO_TRACE //IO access trace switch, undefine it to turn off + #define PCI_TRACE //PCI access trace switch, undefine it to turn off + #define MEM_TRACE //MEM access trace switch, undefine it to turn off +#endif + +UINT32 CailReadATIRegister(VOID*,UINT32); +VOID CailWriteATIRegister(VOID*,UINT32,UINT32); +VOID* CailAllocateMemory(VOID*,UINT16); +VOID CailReleaseMemory(VOID *,VOID *); +VOID CailDelayMicroSeconds(VOID *,UINT32 ); +VOID CailReadPCIConfigData(VOID*,VOID*,UINT32,UINT16); +VOID CailWritePCIConfigData(VOID*,VOID*,UINT32,UINT16); +UINT32 CailReadFBData(VOID*,UINT32); +VOID CailWriteFBData(VOID*,UINT32,UINT32); +ULONG CailReadPLL(VOID *Context ,ULONG Address); +VOID CailWritePLL(VOID *Context,ULONG Address,ULONG Data); +ULONG CailReadMC(VOID *Context ,ULONG Address); +VOID CailWriteMC(VOID *Context ,ULONG Address,ULONG Data); + + +#if DEBUG_PARSER>0 +VOID CailVideoDebugPrint(VOID*,ULONG_PTR, UINT16); +#endif +// Delay function +#if ( defined ENABLE_PARSER_DELAY || defined ENABLE_ALL_SERVICE_FUNCTIONS ) + +VOID DelayMilliseconds(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailDelayMicroSeconds(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->SourceData32*1000); +} + +VOID DelayMicroseconds(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailDelayMicroSeconds(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->SourceData32); +} +#endif + +VOID PostCharOutput(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ +} + +VOID CallerDebugFunc(PARSER_TEMP_DATA STACK_BASED * pParserTempData) +{ +} + + +// PCI READ Access + +#if ( defined ENABLE_PARSER_PCIREAD8 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +UINT8 ReadPCIReg8(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + UINT8 rvl; + CailReadPCIConfigData(pWorkingTableData->pDeviceData->CAIL,&rvl,pWorkingTableData->Index,sizeof(UINT8)); + return rvl; +} +#endif + + +#if ( defined ENABLE_PARSER_PCIREAD16 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +UINT16 ReadPCIReg16(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + UINT16 rvl; + CailReadPCIConfigData(pWorkingTableData->pDeviceData->CAIL,&rvl,pWorkingTableData->Index,sizeof(UINT16)); + return rvl; + +} +#endif + + + +#if ( defined ENABLE_PARSER_PCIREAD32 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +UINT32 ReadPCIReg32 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + UINT32 rvl; + CailReadPCIConfigData(pWorkingTableData->pDeviceData->CAIL,&rvl,pWorkingTableData->Index,sizeof(UINT32)); + return rvl; +} +#endif + + +// PCI WRITE Access + +#if ( defined ENABLE_PARSER_PCIWRITE8 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +VOID WritePCIReg8 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + CailWritePCIConfigData(pWorkingTableData->pDeviceData->CAIL,&(pWorkingTableData->DestData32),pWorkingTableData->Index,sizeof(UINT8)); + +} + +#endif + + +#if ( defined ENABLE_PARSER_PCIWRITE16 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +VOID WritePCIReg16 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + CailWritePCIConfigData(pWorkingTableData->pDeviceData->CAIL,&(pWorkingTableData->DestData32),pWorkingTableData->Index,sizeof(UINT16)); +} + +#endif + + +#if ( defined ENABLE_PARSER_PCIWRITE32 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +VOID WritePCIReg32 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailWritePCIConfigData(pWorkingTableData->pDeviceData->CAIL,&(pWorkingTableData->DestData32),pWorkingTableData->Index,sizeof(UINT32)); +} +#endif + + + + +// System IO Access +#if ( defined ENABLE_PARSER_SYS_IOREAD8 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +UINT8 ReadSysIOReg8 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + UINT8 rvl; + rvl=0; + //rvl= (UINT8) ReadGenericPciCfg(dev,reg,sizeof(UINT8)); + return rvl; +} +#endif + + +#if ( defined ENABLE_PARSER_SYS_IOREAD16 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +UINT16 ReadSysIOReg16(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + UINT16 rvl; + rvl=0; + //rvl= (UINT16) ReadGenericPciCfg(dev,reg,sizeof(UINT16)); + return rvl; + +} +#endif + + + +#if ( defined ENABLE_PARSER_SYS_IOREAD32 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +UINT32 ReadSysIOReg32 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + UINT32 rvl; + rvl=0; + //rvl= (UINT32) ReadGenericPciCfg(dev,reg,sizeof(UINT32)); + return rvl; +} +#endif + + +// PCI WRITE Access + +#if ( defined ENABLE_PARSER_SYS_IOWRITE8 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +VOID WriteSysIOReg8 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + //WriteGenericPciCfg(dev,reg,sizeof(UINT8),(UINT32)value); +} + +#endif + + +#if ( defined ENABLE_PARSER_SYS_IOWRITE16 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +VOID WriteSysIOReg16 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + //WriteGenericPciCfg(dev,reg,sizeof(UINT16),(UINT32)value); +} + +#endif + + +#if ( defined ENABLE_PARSER_SYS_IOWRITE32 || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +VOID WriteSysIOReg32 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + //WriteGenericPciCfg(dev,reg,sizeof(UINT32),(UINT32)value); +} +#endif + +// ATI Registers Memory Mapped Access + +#if ( defined ENABLE_PARSER_REGISTERS_MEMORY_ACCESS || defined ENABLE_ALL_SERVICE_FUNCTIONS) + +UINT32 ReadReg32 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + return CailReadATIRegister(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->Index); +} + +VOID WriteReg32(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailWriteATIRegister(pWorkingTableData->pDeviceData->CAIL,(UINT16)pWorkingTableData->Index,pWorkingTableData->DestData32 ); +} + + +VOID ReadIndReg32 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + pWorkingTableData->IndirectData = CailReadATIRegister(pWorkingTableData->pDeviceData->CAIL,*(UINT16*)(pWorkingTableData->IndirectIOTablePointer+1)); +} + +VOID WriteIndReg32(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailWriteATIRegister(pWorkingTableData->pDeviceData->CAIL,*(UINT16*)(pWorkingTableData->IndirectIOTablePointer+1),pWorkingTableData->IndirectData ); +} + +#endif + +// ATI Registers IO Mapped Access + +#if ( defined ENABLE_PARSER_REGISTERS_IO_ACCESS || defined ENABLE_ALL_SERVICE_FUNCTIONS ) +UINT32 ReadRegIO (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + //return CailReadATIRegister(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->Index); + return 0; +} +VOID WriteRegIO(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + // return CailWriteATIRegister(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->Index,pWorkingTableData->DestData32 ); +} +#endif + +// access to Frame buffer, dummy function, need more information to implement it +UINT32 ReadFrameBuffer32 (PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + + return CailReadFBData(pWorkingTableData->pDeviceData->CAIL, (pWorkingTableData->Index <<2 )); + +} + +VOID WriteFrameBuffer32(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailWriteFBData(pWorkingTableData->pDeviceData->CAIL,(pWorkingTableData->Index <<2), pWorkingTableData->DestData32); + +} + + +VOID *AllocateMemory(DEVICE_DATA *pDeviceData , UINT16 MemSize) +{ + if(MemSize) + return(CailAllocateMemory(pDeviceData->CAIL,MemSize)); + else + return NULL; +} + + +VOID ReleaseMemory(DEVICE_DATA *pDeviceData , WORKING_TABLE_DATA* pWorkingTableData) +{ + if( pWorkingTableData) + CailReleaseMemory(pDeviceData->CAIL, pWorkingTableData); +} + + +UINT32 ReadMC32(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + UINT32 ReadData; + ReadData=(UINT32)CailReadMC(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->Index); + return ReadData; +} + +VOID WriteMC32(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailWriteMC(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->Index,pWorkingTableData->DestData32); +} + +UINT32 ReadPLL32(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + UINT32 ReadData; + ReadData=(UINT32)CailReadPLL(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->Index); + return ReadData; + +} + +VOID WritePLL32(PARSER_TEMP_DATA STACK_BASED * pWorkingTableData) +{ + CailWritePLL(pWorkingTableData->pDeviceData->CAIL,pWorkingTableData->Index,pWorkingTableData->DestData32); + +} + + + +#if DEBUG_PARSER>0 +VOID CD_print_string (DEVICE_DATA *pDeviceData, UINT8 *str) +{ + CailVideoDebugPrint( pDeviceData->CAIL, (ULONG_PTR) str, PARSER_STRINGS); +} + +VOID CD_print_value (DEVICE_DATA *pDeviceData, ULONG_PTR value, UINT16 value_type ) +{ + CailVideoDebugPrint( pDeviceData->CAIL, (ULONG_PTR)value, value_type); +} + +#endif + +// EOF diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Common_Types.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Common_Types.h new file mode 100644 index 000000000..32d01ef9f --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Common_Types.h @@ -0,0 +1,156 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/*++ + +Module Name: + + CD_Common_Types.h + +Abstract: + + Defines common data types to use across platforms/SW components + +Revision History: + + NEG:17.09.2002 Initiated. +--*/ +#ifndef _COMMON_TYPES_H_ + #define _COMMON_TYPES_H_ + + #ifndef LINUX + #if _MSC_EXTENSIONS + + // + // use Microsoft* C complier dependent interger width types + // + // typedef unsigned __int64 uint64_t; + // typedef __int64 int64_t; + typedef unsigned __int32 uint32_t; + typedef __int32 int32_t; +#elif defined (__linux__) || defined (__NetBSD__) \ + || defined(__sun) || defined(__OpenBSD__) \ + || defined (__FreeBSD__) || defined(__DragonFly__) || defined(__GLIBC__) + typedef unsigned int uint32_t; + typedef int int32_t; + #else + typedef unsigned long uint32_t; + typedef signed long int32_t; + #endif + typedef unsigned char uint8_t; +#if (defined(__sun) && defined(_CHAR_IS_SIGNED)) + typedef char int8_t; +#else + typedef signed char int8_t; +#endif + typedef unsigned short uint16_t; + typedef signed short int16_t; + #endif +#ifndef UEFI_BUILD + typedef signed int intn_t; + typedef unsigned int uintn_t; +#else +#ifndef EFIX64 + typedef signed int intn_t; + typedef unsigned int uintn_t; +#endif +#endif +#ifndef FGL_LINUX +#pragma warning ( disable : 4142 ) +#endif + + +#ifndef VOID +typedef void VOID; +#endif +#ifndef UEFI_BUILD + typedef intn_t INTN; + typedef uintn_t UINTN; +#else +#ifndef EFIX64 + typedef intn_t INTN; + typedef uintn_t UINTN; +#endif +#endif +#ifndef BOOLEAN +typedef uint8_t BOOLEAN; +#endif +#ifndef INT8 +typedef int8_t INT8; +#endif +#ifndef UINT8 +typedef uint8_t UINT8; +#endif +#ifndef INT16 +typedef int16_t INT16; +#endif +#ifndef UINT16 +typedef uint16_t UINT16; +#endif +#ifndef INT32 +typedef int32_t INT32; +#endif +#ifndef UINT32 +typedef uint32_t UINT32; +#endif +//typedef int64_t INT64; +//typedef uint64_t UINT64; +typedef uint8_t CHAR8; +typedef uint16_t CHAR16; +#ifndef USHORT +typedef UINT16 USHORT; +#endif +#ifndef UCHAR +typedef UINT8 UCHAR; +#endif +#ifndef ULONG +typedef UINT32 ULONG; +#endif + +#ifndef _WIN64 +#ifndef ULONG_PTR +typedef unsigned long ULONG_PTR; +#endif // ULONG_PTR +#endif // _WIN64 + +//#define FAR __far +#ifndef TRUE + #define TRUE ((BOOLEAN) 1 == 1) +#endif + +#ifndef FALSE + #define FALSE ((BOOLEAN) 0 == 1) +#endif + +#ifndef NULL + #define NULL ((VOID *) 0) +#endif + +//typedef UINTN CD_STATUS; + + +#ifndef FGL_LINUX +#pragma warning ( default : 4142 ) +#endif +#endif // _COMMON_TYPES_H_ + +// EOF diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Definitions.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Definitions.h new file mode 100644 index 000000000..98fd49546 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Definitions.h @@ -0,0 +1,49 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/*++ + +Module Name: + +CD_Definitions.h + +Abstract: + +Defines Script Language commands + +Revision History: + +NEG:27.08.2002 Initiated. +--*/ + +#include "CD_Structs.h" +#ifndef _CD_DEFINITIONS_H +#define _CD_DEFINITIONS_H_ +#ifdef DRIVER_PARSER +VOID *AllocateMemory(VOID *, UINT16); +VOID ReleaseMemory(DEVICE_DATA * , WORKING_TABLE_DATA* ); +#endif +CD_STATUS ParseTable(DEVICE_DATA* pDeviceData, UINT8 IndexInMasterTable); +//CD_STATUS CD_MainLoop(PARSER_TEMP_DATA_POINTER pParserTempData); +CD_STATUS Main_Loop(DEVICE_DATA* pDeviceData,UINT16 *MasterTableOffset,UINT8 IndexInMasterTable); +UINT16* GetCommandMasterTablePointer(DEVICE_DATA* pDeviceData); +#endif //CD_DEFINITIONS diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Opcodes.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Opcodes.h new file mode 100644 index 000000000..2f3bec5fa --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Opcodes.h @@ -0,0 +1,181 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/*++ + +Module Name: + +CD_OPCODEs.h + +Abstract: + +Defines Command Decoder OPCODEs + +Revision History: + +NEG:24.09.2002 Initiated. +--*/ +#ifndef _CD_OPCODES_H_ +#define _CD_OPCODES_H_ + +typedef enum _OPCODE { + Reserved_00= 0, // 0 = 0x00 + // MOVE_ group + MOVE_REG_OPCODE, // 1 = 0x01 + FirstValidCommand=MOVE_REG_OPCODE, + MOVE_PS_OPCODE, // 2 = 0x02 + MOVE_WS_OPCODE, // 3 = 0x03 + MOVE_FB_OPCODE, // 4 = 0x04 + MOVE_PLL_OPCODE, // 5 = 0x05 + MOVE_MC_OPCODE, // 6 = 0x06 + // Logic group + AND_REG_OPCODE, // 7 = 0x07 + AND_PS_OPCODE, // 8 = 0x08 + AND_WS_OPCODE, // 9 = 0x09 + AND_FB_OPCODE, // 10 = 0x0A + AND_PLL_OPCODE, // 11 = 0x0B + AND_MC_OPCODE, // 12 = 0x0C + OR_REG_OPCODE, // 13 = 0x0D + OR_PS_OPCODE, // 14 = 0x0E + OR_WS_OPCODE, // 15 = 0x0F + OR_FB_OPCODE, // 16 = 0x10 + OR_PLL_OPCODE, // 17 = 0x11 + OR_MC_OPCODE, // 18 = 0x12 + SHIFT_LEFT_REG_OPCODE, // 19 = 0x13 + SHIFT_LEFT_PS_OPCODE, // 20 = 0x14 + SHIFT_LEFT_WS_OPCODE, // 21 = 0x15 + SHIFT_LEFT_FB_OPCODE, // 22 = 0x16 + SHIFT_LEFT_PLL_OPCODE, // 23 = 0x17 + SHIFT_LEFT_MC_OPCODE, // 24 = 0x18 + SHIFT_RIGHT_REG_OPCODE, // 25 = 0x19 + SHIFT_RIGHT_PS_OPCODE, // 26 = 0x1A + SHIFT_RIGHT_WS_OPCODE, // 27 = 0x1B + SHIFT_RIGHT_FB_OPCODE, // 28 = 0x1C + SHIFT_RIGHT_PLL_OPCODE, // 29 = 0x1D + SHIFT_RIGHT_MC_OPCODE, // 30 = 0x1E + // Arithmetic group + MUL_REG_OPCODE, // 31 = 0x1F + MUL_PS_OPCODE, // 32 = 0x20 + MUL_WS_OPCODE, // 33 = 0x21 + MUL_FB_OPCODE, // 34 = 0x22 + MUL_PLL_OPCODE, // 35 = 0x23 + MUL_MC_OPCODE, // 36 = 0x24 + DIV_REG_OPCODE, // 37 = 0x25 + DIV_PS_OPCODE, // 38 = 0x26 + DIV_WS_OPCODE, // 39 = 0x27 + DIV_FB_OPCODE, // 40 = 0x28 + DIV_PLL_OPCODE, // 41 = 0x29 + DIV_MC_OPCODE, // 42 = 0x2A + ADD_REG_OPCODE, // 43 = 0x2B + ADD_PS_OPCODE, // 44 = 0x2C + ADD_WS_OPCODE, // 45 = 0x2D + ADD_FB_OPCODE, // 46 = 0x2E + ADD_PLL_OPCODE, // 47 = 0x2F + ADD_MC_OPCODE, // 48 = 0x30 + SUB_REG_OPCODE, // 49 = 0x31 + SUB_PS_OPCODE, // 50 = 0x32 + SUB_WS_OPCODE, // 51 = 0x33 + SUB_FB_OPCODE, // 52 = 0x34 + SUB_PLL_OPCODE, // 53 = 0x35 + SUB_MC_OPCODE, // 54 = 0x36 + // Control grouop + SET_ATI_PORT_OPCODE, // 55 = 0x37 + SET_PCI_PORT_OPCODE, // 56 = 0x38 + SET_SYS_IO_PORT_OPCODE, // 57 = 0x39 + SET_REG_BLOCK_OPCODE, // 58 = 0x3A + SET_FB_BASE_OPCODE, // 59 = 0x3B + COMPARE_REG_OPCODE, // 60 = 0x3C + COMPARE_PS_OPCODE, // 61 = 0x3D + COMPARE_WS_OPCODE, // 62 = 0x3E + COMPARE_FB_OPCODE, // 63 = 0x3F + COMPARE_PLL_OPCODE, // 64 = 0x40 + COMPARE_MC_OPCODE, // 65 = 0x41 + SWITCH_OPCODE, // 66 = 0x42 + JUMP__OPCODE, // 67 = 0x43 + JUMP_EQUAL_OPCODE, // 68 = 0x44 + JUMP_BELOW_OPCODE, // 69 = 0x45 + JUMP_ABOVE_OPCODE, // 70 = 0x46 + JUMP_BELOW_OR_EQUAL_OPCODE, // 71 = 0x47 + JUMP_ABOVE_OR_EQUAL_OPCODE, // 72 = 0x48 + JUMP_NOT_EQUAL_OPCODE, // 73 = 0x49 + TEST_REG_OPCODE, // 74 = 0x4A + TEST_PS_OPCODE, // 75 = 0x4B + TEST_WS_OPCODE, // 76 = 0x4C + TEST_FB_OPCODE, // 77 = 0x4D + TEST_PLL_OPCODE, // 78 = 0x4E + TEST_MC_OPCODE, // 79 = 0x4F + DELAY_MILLISEC_OPCODE, // 80 = 0x50 + DELAY_MICROSEC_OPCODE, // 81 = 0x51 + CALL_TABLE_OPCODE, // 82 = 0x52 + REPEAT_OPCODE, // 83 = 0x53 + // Miscellaneous group + CLEAR_REG_OPCODE, // 84 = 0x54 + CLEAR_PS_OPCODE, // 85 = 0x55 + CLEAR_WS_OPCODE, // 86 = 0x56 + CLEAR_FB_OPCODE, // 87 = 0x57 + CLEAR_PLL_OPCODE, // 88 = 0x58 + CLEAR_MC_OPCODE, // 89 = 0x59 + NOP_OPCODE, // 90 = 0x5A + EOT_OPCODE, // 91 = 0x5B + MASK_REG_OPCODE, // 92 = 0x5C + MASK_PS_OPCODE, // 93 = 0x5D + MASK_WS_OPCODE, // 94 = 0x5E + MASK_FB_OPCODE, // 95 = 0x5F + MASK_PLL_OPCODE, // 96 = 0x60 + MASK_MC_OPCODE, // 97 = 0x61 + // BIOS dedicated group + POST_CARD_OPCODE, // 98 = 0x62 + BEEP_OPCODE, // 99 = 0x63 + SAVE_REG_OPCODE, // 100 = 0x64 + RESTORE_REG_OPCODE, // 101 = 0x65 + SET_DATA_BLOCK_OPCODE, // 102 = 0x66 + + XOR_REG_OPCODE, // 103 = 0x67 + XOR_PS_OPCODE, // 104 = 0x68 + XOR_WS_OPCODE, // 105 = 0x69 + XOR_FB_OPCODE, // 106 = 0x6a + XOR_PLL_OPCODE, // 107 = 0x6b + XOR_MC_OPCODE, // 108 = 0x6c + + SHL_REG_OPCODE, // 109 = 0x6d + SHL_PS_OPCODE, // 110 = 0x6e + SHL_WS_OPCODE, // 111 = 0x6f + SHL_FB_OPCODE, // 112 = 0x70 + SHL_PLL_OPCODE, // 113 = 0x71 + SHL_MC_OPCODE, // 114 = 0x72 + + SHR_REG_OPCODE, // 115 = 0x73 + SHR_PS_OPCODE, // 116 = 0x74 + SHR_WS_OPCODE, // 117 = 0x75 + SHR_FB_OPCODE, // 118 = 0x76 + SHR_PLL_OPCODE, // 119 = 0x77 + SHR_MC_OPCODE, // 120 = 0x78 + + DEBUG_OPCODE, // 121 = 0x79 + CTB_DS_OPCODE, // 122 = 0x7A + + LastValidCommand = CTB_DS_OPCODE, + // Extension specificaTOR + Extension = 0x80, // 128 = 0x80 // Next byte is an OPCODE as well + Reserved_FF = 255 // 255 = 0xFF +}OPCODE; +#endif // _CD_OPCODES_H_ diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Structs.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Structs.h new file mode 100644 index 000000000..c43f81dbf --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_Structs.h @@ -0,0 +1,464 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/*++ + +Module Name: + +CD_Struct.h + +Abstract: + +Defines Script Language commands + +Revision History: + +NEG:26.08.2002 Initiated. +--*/ + +#include "CD_binding.h" +#ifndef _CD_STRUCTS_H_ +#define _CD_STRUCTS_H_ + +#ifdef UEFI_BUILD +typedef UINT16** PTABLE_UNIT_TYPE; +typedef UINTN TABLE_UNIT_TYPE; +#else +typedef UINT16* PTABLE_UNIT_TYPE; +typedef UINT16 TABLE_UNIT_TYPE; +#endif + +#include //This important file is dynamically generated based on the ASIC!!!! + +#define PARSER_MAJOR_REVISION 5 +#define PARSER_MINOR_REVISION 0 + +//#include "atombios.h" +#if (PARSER_TYPE==DRIVER_TYPE_PARSER) +#ifdef FGL_LINUX +#pragma pack(push,1) +#else +#pragma pack(push) +#pragma pack(1) +#endif +#endif + +#include "CD_Common_Types.h" +#include "CD_Opcodes.h" +typedef UINT16 WORK_SPACE_SIZE; +typedef enum _CD_STATUS{ + CD_SUCCESS, + CD_CALL_TABLE, + CD_COMPLETED=0x10, + CD_GENERAL_ERROR=0x80, + CD_INVALID_OPCODE, + CD_NOT_IMPLEMENTED, + CD_EXEC_TABLE_NOT_FOUND, + CD_EXEC_PARAMETER_ERROR, + CD_EXEC_PARSER_ERROR, + CD_INVALID_DESTINATION_TYPE, + CD_UNEXPECTED_BEHAVIOR, + CD_INVALID_SWITCH_OPERAND_SIZE +}CD_STATUS; + +#define PARSER_STRINGS 0 +#define PARSER_DEC 1 +#define PARSER_HEX 2 + +#define DB_CURRENT_COMMAND_TABLE 0xFF + +#define TABLE_FORMAT_BIOS 0 +#define TABLE_FORMAT_EASF 1 + +#define EASF_TABLE_INDEX_MASK 0xfc +#define EASF_TABLE_ATTR_MASK 0x03 + +#define CD_ERROR(a) (((INTN) (a)) > CD_COMPLETED) +#define CD_ERROR_OR_COMPLETED(a) (((INTN) (a)) > CD_SUCCESS) + + +#if (BIOS_PARSER==1) +#ifdef _H2INC +#define STACK_BASED +#else +extern __segment farstack; +#define STACK_BASED __based(farstack) +#endif +#else +#define STACK_BASED +#endif + +typedef enum _COMPARE_FLAGS{ + Below, + Equal, + Above, + NotEqual, + Overflow, + NoCondition +}COMPARE_FLAGS; + +typedef UINT16 IO_BASE_ADDR; + +typedef struct _BUS_DEV_FUNC_PCI_ADDR{ + UINT8 Register; + UINT8 Function; + UINT8 Device; + UINT8 Bus; +} BUS_DEV_FUNC_PCI_ADDR; + +typedef struct _BUS_DEV_FUNC{ + UINT8 Function : 3; + UINT8 Device : 5; + UINT8 Bus; +} BUS_DEV_FUNC; + +#ifndef UEFI_BUILD +typedef struct _PCI_CONFIG_ACCESS_CF8{ + UINT32 Reg : 8; + UINT32 Func : 3; + UINT32 Dev : 5; + UINT32 Bus : 8; + UINT32 Reserved: 7; + UINT32 Enable : 1; +} PCI_CONFIG_ACCESS_CF8; +#endif + +typedef enum _MEM_RESOURCE { + Stack_Resource, + FrameBuffer_Resource, + BIOS_Image_Resource +}MEM_RESOURCE; + +typedef enum _PORTS{ + ATI_RegsPort, + PCI_Port, + SystemIO_Port +}PORTS; + +typedef enum _OPERAND_TYPE { + typeRegister, + typeParamSpace, + typeWorkSpace, + typeFrameBuffer, + typeIndirect, + typeDirect, + typePLL, + typeMC +}OPERAND_TYPE; + +typedef enum _DESTINATION_OPERAND_TYPE { + destRegister, + destParamSpace, + destWorkSpace, + destFrameBuffer, + destPLL, + destMC +}DESTINATION_OPERAND_TYPE; + +typedef enum _SOURCE_OPERAND_TYPE { + sourceRegister, + sourceParamSpace, + sourceWorkSpace, + sourceFrameBuffer, + sourceIndirect, + sourceDirect, + sourcePLL, + sourceMC +}SOURCE_OPERAND_TYPE; + +typedef enum _ALIGNMENT_TYPE { + alignmentDword, + alignmentLowerWord, + alignmentMiddleWord, + alignmentUpperWord, + alignmentByte0, + alignmentByte1, + alignmentByte2, + alignmentByte3 +}ALIGNMENT_TYPE; + + +#define INDIRECT_IO_READ 0 +#define INDIRECT_IO_WRITE 0x80 +#define INDIRECT_IO_MM 0 +#define INDIRECT_IO_PLL 1 +#define INDIRECT_IO_MC 2 + +typedef struct _PARAMETERS_TYPE{ + UINT8 Destination; + UINT8 Source; +}PARAMETERS_TYPE; +/* The following structures don't used to allocate any type of objects(variables). + they are serve the only purpose: Get proper access to data(commands), found in the tables*/ +typedef struct _PA_BYTE_BYTE{ + UINT8 PA_Destination; + UINT8 PA_Source; + UINT8 PA_Padding[8]; +}PA_BYTE_BYTE; +typedef struct _PA_BYTE_WORD{ + UINT8 PA_Destination; + UINT16 PA_Source; + UINT8 PA_Padding[7]; +}PA_BYTE_WORD; +typedef struct _PA_BYTE_DWORD{ + UINT8 PA_Destination; + UINT32 PA_Source; + UINT8 PA_Padding[5]; +}PA_BYTE_DWORD; +typedef struct _PA_WORD_BYTE{ + UINT16 PA_Destination; + UINT8 PA_Source; + UINT8 PA_Padding[7]; +}PA_WORD_BYTE; +typedef struct _PA_WORD_WORD{ + UINT16 PA_Destination; + UINT16 PA_Source; + UINT8 PA_Padding[6]; +}PA_WORD_WORD; +typedef struct _PA_WORD_DWORD{ + UINT16 PA_Destination; + UINT32 PA_Source; + UINT8 PA_Padding[4]; +}PA_WORD_DWORD; +typedef struct _PA_WORD_XX{ + UINT16 PA_Destination; + UINT8 PA_Padding[8]; +}PA_WORD_XX; +typedef struct _PA_BYTE_XX{ + UINT8 PA_Destination; + UINT8 PA_Padding[9]; +}PA_BYTE_XX; +/*The following 6 definitions used for Mask operation*/ +typedef struct _PA_BYTE_BYTE_BYTE{ + UINT8 PA_Destination; + UINT8 PA_AndMaskByte; + UINT8 PA_OrMaskByte; + UINT8 PA_Padding[7]; +}PA_BYTE_BYTE_BYTE; +typedef struct _PA_BYTE_WORD_WORD{ + UINT8 PA_Destination; + UINT16 PA_AndMaskWord; + UINT16 PA_OrMaskWord; + UINT8 PA_Padding[5]; +}PA_BYTE_WORD_WORD; +typedef struct _PA_BYTE_DWORD_DWORD{ + UINT8 PA_Destination; + UINT32 PA_AndMaskDword; + UINT32 PA_OrMaskDword; + UINT8 PA_Padding; +}PA_BYTE_DWORD_DWORD; +typedef struct _PA_WORD_BYTE_BYTE{ + UINT16 PA_Destination; + UINT8 PA_AndMaskByte; + UINT8 PA_OrMaskByte; + UINT8 PA_Padding[6]; +}PA_WORD_BYTE_BYTE; +typedef struct _PA_WORD_WORD_WORD{ + UINT16 PA_Destination; + UINT16 PA_AndMaskWord; + UINT16 PA_OrMaskWord; + UINT8 PA_Padding[4]; +}PA_WORD_WORD_WORD; +typedef struct _PA_WORD_DWORD_DWORD{ + UINT16 PA_Destination; + UINT32 PA_AndMaskDword; + UINT32 PA_OrMaskDword; +}PA_WORD_DWORD_DWORD; + + +typedef union _PARAMETER_ACCESS { + PA_BYTE_XX ByteXX; + PA_BYTE_BYTE ByteByte; + PA_BYTE_WORD ByteWord; + PA_BYTE_DWORD ByteDword; + PA_WORD_BYTE WordByte; + PA_WORD_WORD WordWord; + PA_WORD_DWORD WordDword; + PA_WORD_XX WordXX; +/*The following 6 definitions used for Mask operation*/ + PA_BYTE_BYTE_BYTE ByteByteAndByteOr; + PA_BYTE_WORD_WORD ByteWordAndWordOr; + PA_BYTE_DWORD_DWORD ByteDwordAndDwordOr; + PA_WORD_BYTE_BYTE WordByteAndByteOr; + PA_WORD_WORD_WORD WordWordAndWordOr; + PA_WORD_DWORD_DWORD WordDwordAndDwordOr; +}PARAMETER_ACCESS; + +typedef struct _COMMAND_ATTRIBUTE { + UINT8 Source:3; + UINT8 SourceAlignment:3; + UINT8 DestinationAlignment:2; +}COMMAND_ATTRIBUTE; + +typedef struct _SOURCE_DESTINATION_ALIGNMENT{ + UINT8 DestAlignment; + UINT8 SrcAlignment; +}SOURCE_DESTINATION_ALIGNMENT; +typedef struct _MULTIPLICATION_RESULT{ + UINT32 Low32Bit; + UINT32 High32Bit; +}MULTIPLICATION_RESULT; +typedef struct _DIVISION_RESULT{ + UINT32 Quotient32; + UINT32 Reminder32; +}DIVISION_RESULT; +typedef union _DIVISION_MULTIPLICATION_RESULT{ + MULTIPLICATION_RESULT Multiplication; + DIVISION_RESULT Division; +}DIVISION_MULTIPLICATION_RESULT; +typedef struct _COMMAND_HEADER { + UINT8 Opcode; + COMMAND_ATTRIBUTE Attribute; +}COMMAND_HEADER; + +typedef struct _GENERIC_ATTRIBUTE_COMMAND{ + COMMAND_HEADER Header; + PARAMETER_ACCESS Parameters; +} GENERIC_ATTRIBUTE_COMMAND; + +typedef struct _COMMAND_TYPE_1{ + UINT8 Opcode; + PARAMETER_ACCESS Parameters; +} COMMAND_TYPE_1; + +typedef struct _COMMAND_TYPE_OPCODE_OFFSET16{ + UINT8 Opcode; + UINT16 CD_Offset16; +} COMMAND_TYPE_OPCODE_OFFSET16; + +typedef struct _COMMAND_TYPE_OPCODE_OFFSET32{ + UINT8 Opcode; + UINT32 CD_Offset32; +} COMMAND_TYPE_OPCODE_OFFSET32; + +typedef struct _COMMAND_TYPE_OPCODE_VALUE_BYTE{ + UINT8 Opcode; + UINT8 Value; +} COMMAND_TYPE_OPCODE_VALUE_BYTE; + +typedef union _COMMAND_SPECIFIC_UNION{ + UINT8 ContinueSwitch; + UINT8 ControlOperandSourcePosition; + UINT8 IndexInMasterTable; +} COMMAND_SPECIFIC_UNION; + + +typedef struct _CD_GENERIC_BYTE{ + UINT16 CommandType:3; + UINT16 CurrentParameterSize:3; + UINT16 CommandAccessType:3; + UINT16 CurrentPort:2; + UINT16 PS_SizeInDwordsUsedByCallingTable:5; +}CD_GENERIC_BYTE; + +typedef UINT8 COMMAND_TYPE_OPCODE_ONLY; + +typedef UINT8 COMMAND_HEADER_POINTER; + + +#if (PARSER_TYPE==BIOS_TYPE_PARSER) + +typedef struct _DEVICE_DATA { + UINT32 STACK_BASED *pParameterSpace; + UINT8 *pBIOS_Image; + UINT8 format; +#if (IO_INTERFACE==PARSER_INTERFACE) + IO_BASE_ADDR IOBase; +#endif +} DEVICE_DATA; + +#else + +typedef struct _DEVICE_DATA { + UINT32 *pParameterSpace; + VOID *CAIL; + UINT8 *pBIOS_Image; + UINT32 format; +} DEVICE_DATA; + +#endif + +struct _PARSER_TEMP_DATA; +typedef UINT32 WORKSPACE_POINTER; + +struct _WORKING_TABLE_DATA{ + UINT8 * pTableHead; + COMMAND_HEADER_POINTER * IP; // Commands pointer + WORKSPACE_POINTER STACK_BASED * pWorkSpace; + struct _WORKING_TABLE_DATA STACK_BASED * prevWorkingTableData; +}; + + + +typedef struct _PARSER_TEMP_DATA{ + DEVICE_DATA STACK_BASED *pDeviceData; + struct _WORKING_TABLE_DATA STACK_BASED *pWorkingTableData; + UINT32 SourceData32; + UINT32 DestData32; + DIVISION_MULTIPLICATION_RESULT MultiplicationOrDivision; + UINT32 Index; + UINT32 CurrentFB_Window; + UINT32 IndirectData; + UINT16 CurrentRegBlock; + TABLE_UNIT_TYPE CurrentDataBlock; + UINT16 AttributesData; +// UINT8 *IndirectIOTable; + UINT8 *IndirectIOTablePointer; + GENERIC_ATTRIBUTE_COMMAND *pCmd; //CurrentCommand; + SOURCE_DESTINATION_ALIGNMENT CD_Mask; + PARAMETERS_TYPE ParametersType; + CD_GENERIC_BYTE Multipurpose; + UINT8 CompareFlags; + COMMAND_SPECIFIC_UNION CommandSpecific; + CD_STATUS Status; + UINT8 Shift2MaskConverter; + UINT8 CurrentPortID; +} PARSER_TEMP_DATA; + + +typedef struct _WORKING_TABLE_DATA WORKING_TABLE_DATA; + + + +typedef VOID (*COMMANDS_DECODER)(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +typedef VOID (*WRITE_IO_FUNCTION)(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +typedef UINT32 (*READ_IO_FUNCTION)(PARSER_TEMP_DATA STACK_BASED * pParserTempData); +typedef UINT32 (*CD_GET_PARAMETERS)(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +typedef struct _COMMANDS_PROPERTIES +{ + COMMANDS_DECODER function; + UINT8 destination; + UINT8 headersize; +} COMMANDS_PROPERTIES; + +typedef struct _INDIRECT_IO_PARSER_COMMANDS +{ + COMMANDS_DECODER func; + UINT8 csize; +} INDIRECT_IO_PARSER_COMMANDS; + +#if (PARSER_TYPE==DRIVER_TYPE_PARSER) +#pragma pack(pop) +#endif + +#endif diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_binding.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_binding.h new file mode 100644 index 000000000..7b021d3ed --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_binding.h @@ -0,0 +1,46 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef NT_BUILD +#ifdef LH_BUILD +#include +#else +#include +#endif // LH_BUILD +#endif // NT_BUILD + + +#if ((defined DBG) || (defined DEBUG)) +#define DEBUG_PARSER 1 // enable parser debug output +#endif + +#define USE_SWITCH_COMMAND 1 +#define DRIVER_TYPE_PARSER 0x48 + +#define PARSER_TYPE DRIVER_TYPE_PARSER + +#define AllocateWorkSpace(x,y) AllocateMemory(pDeviceData,y) +#define FreeWorkSpace(x,y) ReleaseMemory(x,y) + +#define RELATIVE_TO_BIOS_IMAGE( x ) ((ULONG_PTR)x + (ULONG_PTR)((DEVICE_DATA*)pParserTempData->pDeviceData->pBIOS_Image)) +#define RELATIVE_TO_TABLE( x ) (x + (UCHAR *)(pParserTempData->pWorkingTableData->pTableHead)) + diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_hw_services.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_hw_services.h new file mode 100644 index 000000000..529fde590 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/CD_hw_services.h @@ -0,0 +1,318 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _HW_SERVICES_INTERFACE_ +#define _HW_SERVICES_INTERFACE_ + +#include "CD_Common_Types.h" +#include "CD_Structs.h" + + +// CD - from Command Decoder +typedef UINT16 CD_REG_INDEX; +typedef UINT8 CD_PCI_OFFSET; +typedef UINT16 CD_FB_OFFSET; +typedef UINT16 CD_SYS_IO_PORT; +typedef UINT8 CD_MEM_TYPE; +typedef UINT8 CD_MEM_SIZE; + +typedef VOID * CD_VIRT_ADDR; +typedef UINT32 CD_PHYS_ADDR; +typedef UINT32 CD_IO_ADDR; + +/***********************ATI Registers access routines**************************/ + + VOID ReadIndReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WriteIndReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + UINT32 ReadReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WriteReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + UINT32 ReadPLL32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WritePLL32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + UINT32 ReadMC32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WriteMC32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +/************************PCI Registers access routines*************************/ + + UINT8 ReadPCIReg8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + UINT16 ReadPCIReg16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + UINT32 ReadPCIReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WritePCIReg8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WritePCIReg16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WritePCIReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +/***************************Frame buffer access routines************************/ + + UINT32 ReadFrameBuffer32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WriteFrameBuffer32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +/******************System IO Registers access routines********************/ + + UINT8 ReadSysIOReg8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + UINT16 ReadSysIOReg16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + UINT32 ReadSysIOReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WriteSysIOReg8(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WriteSysIOReg16(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID WriteSysIOReg32(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + +/****************************Delay routines****************************************/ + + VOID DelayMicroseconds(PARSER_TEMP_DATA STACK_BASED * pParserTempData); // take WORKING_TABLE_DATA->SourceData32 as a delay value + + VOID DelayMilliseconds(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID PostCharOutput(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + VOID CallerDebugFunc(PARSER_TEMP_DATA STACK_BASED * pParserTempData); + + +//************************Tracing/Debugging routines and macroses******************/ +#define KEYPRESSED -1 + +#if (DEBUG_PARSER != 0) + +#ifdef DRIVER_PARSER + +VOID CD_print_string (DEVICE_DATA STACK_BASED *pDeviceData, UINT8 *str); +VOID CD_print_value (DEVICE_DATA STACK_BASED *pDeviceData, ULONG_PTR value, UINT16 value_type ); + +// Level 1 : can use WorkingTableData or pDeviceData +#define CD_TRACE_DL1(string) CD_print_string(pDeviceData, string); +#define CD_TRACETAB_DL1(string) CD_TRACE_DL1("\n");CD_TRACE_DL1(string) +#define CD_TRACEDEC_DL1(value) CD_print_value( pDeviceData, (ULONG_PTR)value, PARSER_DEC); +#define CD_TRACEHEX_DL1(value) CD_print_value( pDeviceData, (ULONG_PTR)value, PARSER_HEX); + +// Level 2:can use pWorkingTableData +#define CD_TRACE_DL2(string) CD_print_string( pWorkingTableData->pParserTempData->pDeviceData, string); +#define CD_TRACETAB_DL2(string) CD_TRACE_DL2("\n");CD_TRACE_DL2(string) +#define CD_TRACEDEC_DL2(value) CD_print_value( pWorkingTableData->pParserTempData->pDeviceData, (ULONG_PTR)value, PARSER_DEC); +#define CD_TRACEHEX_DL2(value) CD_print_value( pWorkingTableData->pParserTempData->pDeviceData, (ULONG_PTR)value, PARSER_HEX); + +// Level 3:can use pWorkingTableData +#define CD_TRACE_DL3(string) CD_print_string( pWorkingTableData->pParserTempData->pDeviceData, string); +#define CD_TRACETAB_DL3(string) CD_TRACE_DL3("\n");CD_TRACE_DL3(string) +#define CD_TRACEDEC_DL3(value) CD_print_value( pWorkingTableData->pParserTempData->pDeviceData, value, PARSER_DEC); +#define CD_TRACEHEX_DL3(value) CD_print_value( pWorkingTableData->pParserTempData->pDeviceData, value, PARSER_HEX); + +#define CD_TRACE(string) +#define CD_WAIT(what) +#define CD_BREAKPOINT() + +#else + + +VOID CD_assert (UINT8 *file, INTN lineno); //output file/line to debug console +VOID CD_postcode(UINT8 value); //output post code to debug console +VOID CD_print (UINT8 *str); //output text to debug console +VOID CD_print_dec(UINTN value); //output value in decimal format to debug console +VOID CD_print_hex(UINT32 value, UINT8 len); //output value in hexadecimal format to debug console +VOID CD_print_buf(UINT8 *p, UINTN len); //output dump of memory to debug console +VOID CD_wait(INT32 what); //wait for KEYPRESSED=-1 or Delay value expires +VOID CD_breakpoint(); //insert int3 opcode or 0xF1 (for American Arium) + +#define CD_ASSERT(condition) if(!(condition)) CD_assert(__FILE__, __LINE__) +#define CD_POSTCODE(value) CD_postcode(value) +#define CD_TRACE(string) CD_print(string) +#define CD_TRACETAB(string) CD_print(string) +#define CD_TRACEDEC(value) CD_print_dec( (UINTN)(value)) +#define CD_TRACEHEX(value) CD_print_hex( (UINT32)(value), sizeof(value) ) +#define CD_TRACEBUF(pointer, len) CD_print_buf( (UINT8 *)(pointer), (UINTN) len) +#define CD_WAIT(what) CD_wait((INT32)what) +#define CD_BREAKPOINT() CD_breakpoint() + +#if (DEBUG_PARSER == 4) +#define CD_ASSERT_DL4(condition) if(!(condition)) CD_assert(__FILE__, __LINE__) +#define CD_POSTCODE_DL4(value) CD_postcode(value) +#define CD_TRACE_DL4(string) CD_print(string) +#define CD_TRACETAB_DL4(string) CD_print("\n\t\t");CD_print(string) +#define CD_TRACEDEC_DL4(value) CD_print_dec( (UINTN)(value)) +#define CD_TRACEHEX_DL4(value) CD_print_hex( (UINT32)(value), sizeof(value) ) +#define CD_TRACEBUF_DL4(pointer, len) CD_print_buf( (UINT8 *)(pointer), (UINTN) len) +#define CD_WAIT_DL4(what) CD_wait((INT32)what) +#define CD_BREAKPOINT_DL4() CD_breakpoint() +#else +#define CD_ASSERT_DL4(condition) +#define CD_POSTCODE_DL4(value) +#define CD_TRACE_DL4(string) +#define CD_TRACETAB_DL4(string) +#define CD_TRACEDEC_DL4(value) +#define CD_TRACEHEX_DL4(value) +#define CD_TRACEBUF_DL4(pointer, len) +#define CD_WAIT_DL4(what) +#define CD_BREAKPOINT_DL4() +#endif + +#if (DEBUG_PARSER >= 3) +#define CD_ASSERT_DL3(condition) if(!(condition)) CD_assert(__FILE__, __LINE__) +#define CD_POSTCODE_DL3(value) CD_postcode(value) +#define CD_TRACE_DL3(string) CD_print(string) +#define CD_TRACETAB_DL3(string) CD_print("\n\t\t");CD_print(string) +#define CD_TRACEDEC_DL3(value) CD_print_dec( (UINTN)(value)) +#define CD_TRACEHEX_DL3(value) CD_print_hex( (UINT32)(value), sizeof(value) ) +#define CD_TRACEBUF_DL3(pointer, len) CD_print_buf( (UINT8 *)(pointer), (UINTN) len) +#define CD_WAIT_DL3(what) CD_wait((INT32)what) +#define CD_BREAKPOINT_DL3() CD_breakpoint() +#else +#define CD_ASSERT_DL3(condition) +#define CD_POSTCODE_DL3(value) +#define CD_TRACE_DL3(string) +#define CD_TRACETAB_DL3(string) +#define CD_TRACEDEC_DL3(value) +#define CD_TRACEHEX_DL3(value) +#define CD_TRACEBUF_DL3(pointer, len) +#define CD_WAIT_DL3(what) +#define CD_BREAKPOINT_DL3() +#endif + + +#if (DEBUG_PARSER >= 2) +#define CD_ASSERT_DL2(condition) if(!(condition)) CD_assert(__FILE__, __LINE__) +#define CD_POSTCODE_DL2(value) CD_postcode(value) +#define CD_TRACE_DL2(string) CD_print(string) +#define CD_TRACETAB_DL2(string) CD_print("\n\t");CD_print(string) +#define CD_TRACEDEC_DL2(value) CD_print_dec( (UINTN)(value)) +#define CD_TRACEHEX_DL2(value) CD_print_hex( (UINT32)(value), sizeof(value) ) +#define CD_TRACEBUF_DL2(pointer, len) CD_print_buf( (UINT8 *)(pointer), (UINTN) len) +#define CD_WAIT_DL2(what) CD_wait((INT32)what) +#define CD_BREAKPOINT_DL2() CD_breakpoint() +#else +#define CD_ASSERT_DL2(condition) +#define CD_POSTCODE_DL2(value) +#define CD_TRACE_DL2(string) +#define CD_TRACETAB_DL2(string) +#define CD_TRACEDEC_DL2(value) +#define CD_TRACEHEX_DL2(value) +#define CD_TRACEBUF_DL2(pointer, len) +#define CD_WAIT_DL2(what) +#define CD_BREAKPOINT_DL2() +#endif + + +#if (DEBUG_PARSER >= 1) +#define CD_ASSERT_DL1(condition) if(!(condition)) CD_assert(__FILE__, __LINE__) +#define CD_POSTCODE_DL1(value) CD_postcode(value) +#define CD_TRACE_DL1(string) CD_print(string) +#define CD_TRACETAB_DL1(string) CD_print("\n");CD_print(string) +#define CD_TRACEDEC_DL1(value) CD_print_dec( (UINTN)(value)) +#define CD_TRACEHEX_DL1(value) CD_print_hex( (UINT32)(value), sizeof(value) ) +#define CD_TRACEBUF_DL1(pointer, len) CD_print_buf( (UINT8 *)(pointer), (UINTN) len) +#define CD_WAIT_DL1(what) CD_wait((INT32)what) +#define CD_BREAKPOINT_DL1() CD_breakpoint() +#else +#define CD_ASSERT_DL1(condition) +#define CD_POSTCODE_DL1(value) +#define CD_TRACE_DL1(string) +#define CD_TRACETAB_DL1(string) +#define CD_TRACEDEC_DL1(value) +#define CD_TRACEHEX_DL1(value) +#define CD_TRACEBUF_DL1(pointer, len) +#define CD_WAIT_DL1(what) +#define CD_BREAKPOINT_DL1() +#endif + +#endif //#ifdef DRIVER_PARSER + + +#else + +#define CD_ASSERT(condition) +#define CD_POSTCODE(value) +#define CD_TRACE(string) +#define CD_TRACEDEC(value) +#define CD_TRACEHEX(value) +#define CD_TRACEBUF(pointer, len) +#define CD_WAIT(what) +#define CD_BREAKPOINT() + +#define CD_ASSERT_DL4(condition) +#define CD_POSTCODE_DL4(value) +#define CD_TRACE_DL4(string) +#define CD_TRACETAB_DL4(string) +#define CD_TRACEDEC_DL4(value) +#define CD_TRACEHEX_DL4(value) +#define CD_TRACEBUF_DL4(pointer, len) +#define CD_WAIT_DL4(what) +#define CD_BREAKPOINT_DL4() + +#define CD_ASSERT_DL3(condition) +#define CD_POSTCODE_DL3(value) +#define CD_TRACE_DL3(string) +#define CD_TRACETAB_DL3(string) +#define CD_TRACEDEC_DL3(value) +#define CD_TRACEHEX_DL3(value) +#define CD_TRACEBUF_DL3(pointer, len) +#define CD_WAIT_DL3(what) +#define CD_BREAKPOINT_DL3() + +#define CD_ASSERT_DL2(condition) +#define CD_POSTCODE_DL2(value) +#define CD_TRACE_DL2(string) +#define CD_TRACETAB_DL2(string) +#define CD_TRACEDEC_DL2(value) +#define CD_TRACEHEX_DL2(value) +#define CD_TRACEBUF_DL2(pointer, len) +#define CD_WAIT_DL2(what) +#define CD_BREAKPOINT_DL2() + +#define CD_ASSERT_DL1(condition) +#define CD_POSTCODE_DL1(value) +#define CD_TRACE_DL1(string) +#define CD_TRACETAB_DL1(string) +#define CD_TRACEDEC_DL1(value) +#define CD_TRACEHEX_DL1(value) +#define CD_TRACEBUF_DL1(pointer, len) +#define CD_WAIT_DL1(what) +#define CD_BREAKPOINT_DL1() + + +#endif //#if (DEBUG_PARSER > 0) + + +#ifdef CHECKSTACK +VOID CD_fillstack(UINT16 size); +UINT16 CD_checkstack(UINT16 size); +#define CD_CHECKSTACK(stacksize) CD_checkstack(stacksize) +#define CD_FILLSTACK(stacksize) CD_fillstack(stacksize) +#else +#define CD_CHECKSTACK(stacksize) 0 +#define CD_FILLSTACK(stacksize) +#endif + + +#endif diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/Decoder.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/Decoder.h new file mode 100644 index 000000000..24c25fc29 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/Decoder.h @@ -0,0 +1,86 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/*++ + +Module Name: + +Decoder.h + +Abstract: + +Includes all helper headers + +Revision History: + +NEG:27.08.2002 Initiated. +--*/ +#ifndef _DECODER_H_ +#define _DECODER_H_ +#define WS_QUOTIENT_C 64 +#define WS_REMINDER_C (WS_QUOTIENT_C+1) +#define WS_DATAPTR_C (WS_REMINDER_C+1) +#define WS_SHIFT_C (WS_DATAPTR_C+1) +#define WS_OR_MASK_C (WS_SHIFT_C+1) +#define WS_AND_MASK_C (WS_OR_MASK_C+1) +#define WS_FB_WINDOW_C (WS_AND_MASK_C+1) +#define WS_ATTRIBUTES_C (WS_FB_WINDOW_C+1) +#define PARSER_VERSION_MAJOR 0x00000000 +#define PARSER_VERSION_MINOR 0x0000000E +#define PARSER_VERSION (PARSER_VERSION_MAJOR | PARSER_VERSION_MINOR) +#include "CD_binding.h" +#include "CD_Common_Types.h" +#include "CD_hw_services.h" +#include "CD_Structs.h" +#include "CD_Definitions.h" +#include "CD_Opcodes.h" + +#define SOURCE_ONLY_CMD_TYPE 0//0xFE +#define SOURCE_DESTINATION_CMD_TYPE 1//0xFD +#define DESTINATION_ONLY_CMD_TYPE 2//0xFC + +#define ACCESS_TYPE_BYTE 0//0xF9 +#define ACCESS_TYPE_WORD 1//0xF8 +#define ACCESS_TYPE_DWORD 2//0xF7 +#define SWITCH_TYPE_ACCESS 3//0xF6 + +#define CD_CONTINUE 0//0xFB +#define CD_STOP 1//0xFA + + +#define IS_END_OF_TABLE(cmd) ((cmd) == EOT_OPCODE) +#define IS_COMMAND_VALID(cmd) (((cmd)<=LastValidCommand)&&((cmd)>=FirstValidCommand)) +#define IS_IT_SHIFT_COMMAND(Opcode) ((Opcode<=SHIFT_RIGHT_MC_OPCODE)&&(Opcode>=SHIFT_LEFT_REG_OPCODE)) +#define IS_IT_XXXX_COMMAND(Group, Opcode) ((Opcode<=Group##_MC_OPCODE)&&(Opcode>=Group##_REG_OPCODE)) +#define CheckCaseAndAdjustIP_Macro(size) \ + if (pParserTempData->SourceData32==(UINT32)((CASE_OFFSET*)pParserTempData->pWorkingTableData->IP)->XX_Access.size##.Access.Value){\ + pParserTempData->CommandSpecific.ContinueSwitch = CD_STOP;\ + pParserTempData->pWorkingTableData->IP =(COMMAND_HEADER_POINTER *) RELATIVE_TO_TABLE(((CASE_OFFSET*)pParserTempData->pWorkingTableData->IP)->XX_Access.size##.Access.JumpOffset);\ + }else{\ + pParserTempData->pWorkingTableData->IP+=(sizeof (CASE_##size##ACCESS)\ + +sizeof(((CASE_OFFSET*)pParserTempData->pWorkingTableData->IP)->CaseSignature));\ + } + +#endif +/* pWorkingTableData->pCmd->Header.Attribute.SourceAlignment=alignmentLowerWord;\*/ + +// EOF diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/ObjectID.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/ObjectID.h new file mode 100644 index 000000000..849e74956 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/ObjectID.h @@ -0,0 +1,518 @@ +/* +* Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. +*/ +/* based on stg/asic_reg/drivers/inc/asic_reg/ObjectID.h ver 23 */ + +#ifndef _OBJECTID_H +#define _OBJECTID_H + +#if defined(_X86_) +#pragma pack(1) +#endif + +/****************************************************/ +/* Graphics Object Type Definition */ +/****************************************************/ +#define GRAPH_OBJECT_TYPE_NONE 0x0 +#define GRAPH_OBJECT_TYPE_GPU 0x1 +#define GRAPH_OBJECT_TYPE_ENCODER 0x2 +#define GRAPH_OBJECT_TYPE_CONNECTOR 0x3 +#define GRAPH_OBJECT_TYPE_ROUTER 0x4 +/* deleted */ + +/****************************************************/ +/* Encoder Object ID Definition */ +/****************************************************/ +#define ENCODER_OBJECT_ID_NONE 0x00 + +/* Radeon Class Display Hardware */ +#define ENCODER_OBJECT_ID_INTERNAL_LVDS 0x01 +#define ENCODER_OBJECT_ID_INTERNAL_TMDS1 0x02 +#define ENCODER_OBJECT_ID_INTERNAL_TMDS2 0x03 +#define ENCODER_OBJECT_ID_INTERNAL_DAC1 0x04 +#define ENCODER_OBJECT_ID_INTERNAL_DAC2 0x05 /* TV/CV DAC */ +#define ENCODER_OBJECT_ID_INTERNAL_SDVOA 0x06 +#define ENCODER_OBJECT_ID_INTERNAL_SDVOB 0x07 + +/* External Third Party Encoders */ +#define ENCODER_OBJECT_ID_SI170B 0x08 +#define ENCODER_OBJECT_ID_CH7303 0x09 +#define ENCODER_OBJECT_ID_CH7301 0x0A +#define ENCODER_OBJECT_ID_INTERNAL_DVO1 0x0B /* This belongs to Radeon Class Display Hardware */ +#define ENCODER_OBJECT_ID_EXTERNAL_SDVOA 0x0C +#define ENCODER_OBJECT_ID_EXTERNAL_SDVOB 0x0D +#define ENCODER_OBJECT_ID_TITFP513 0x0E +#define ENCODER_OBJECT_ID_INTERNAL_LVTM1 0x0F /* not used for Radeon */ +#define ENCODER_OBJECT_ID_VT1623 0x10 +#define ENCODER_OBJECT_ID_HDMI_SI1930 0x11 +#define ENCODER_OBJECT_ID_HDMI_INTERNAL 0x12 +/* Kaleidoscope (KLDSCP) Class Display Hardware (internal) */ +#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 0x13 +#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 0x14 +#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 0x15 +#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 0x16 /* Shared with CV/TV and CRT */ +#define ENCODER_OBJECT_ID_SI178 0X17 /* External TMDS (dual link, no HDCP.) */ +#define ENCODER_OBJECT_ID_MVPU_FPGA 0x18 /* MVPU FPGA chip */ +#define ENCODER_OBJECT_ID_INTERNAL_DDI 0x19 +#define ENCODER_OBJECT_ID_VT1625 0x1A +#define ENCODER_OBJECT_ID_HDMI_SI1932 0x1B +#define ENCODER_OBJECT_ID_DP_AN9801 0x1C +#define ENCODER_OBJECT_ID_DP_DP501 0x1D +#define ENCODER_OBJECT_ID_INTERNAL_UNIPHY 0x1E +#define ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA 0x1F +#define ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 0x20 +#define ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 0x21 + +#define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF + +/****************************************************/ +/* Connector Object ID Definition */ +/****************************************************/ +#define CONNECTOR_OBJECT_ID_NONE 0x00 +#define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I 0x01 +#define CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I 0x02 +#define CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D 0x03 +#define CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D 0x04 +#define CONNECTOR_OBJECT_ID_VGA 0x05 +#define CONNECTOR_OBJECT_ID_COMPOSITE 0x06 +#define CONNECTOR_OBJECT_ID_SVIDEO 0x07 +#define CONNECTOR_OBJECT_ID_YPbPr 0x08 +#define CONNECTOR_OBJECT_ID_D_CONNECTOR 0x09 +#define CONNECTOR_OBJECT_ID_9PIN_DIN 0x0A /* Supports both CV & TV */ +#define CONNECTOR_OBJECT_ID_SCART 0x0B +#define CONNECTOR_OBJECT_ID_HDMI_TYPE_A 0x0C +#define CONNECTOR_OBJECT_ID_HDMI_TYPE_B 0x0D +#define CONNECTOR_OBJECT_ID_LVDS 0x0E +#define CONNECTOR_OBJECT_ID_7PIN_DIN 0x0F +#define CONNECTOR_OBJECT_ID_PCIE_CONNECTOR 0x10 +#define CONNECTOR_OBJECT_ID_CROSSFIRE 0x11 +#define CONNECTOR_OBJECT_ID_HARDCODE_DVI 0x12 +#define CONNECTOR_OBJECT_ID_DISPLAYPORT 0x13 + +/* deleted */ + +/****************************************************/ +/* Router Object ID Definition */ +/****************************************************/ +#define ROUTER_OBJECT_ID_NONE 0x00 +#define ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL 0x01 + +/****************************************************/ +// Graphics Object ENUM ID Definition */ +/****************************************************/ +#define GRAPH_OBJECT_ENUM_ID1 0x01 +#define GRAPH_OBJECT_ENUM_ID2 0x02 +#define GRAPH_OBJECT_ENUM_ID3 0x03 +#define GRAPH_OBJECT_ENUM_ID4 0x04 +#define GRAPH_OBJECT_ENUM_ID5 0x05 +#define GRAPH_OBJECT_ENUM_ID6 0x06 + +/****************************************************/ +/* Graphics Object ID Bit definition */ +/****************************************************/ +#define OBJECT_ID_MASK 0x00FF +#define ENUM_ID_MASK 0x0700 +#define RESERVED1_ID_MASK 0x0800 +#define OBJECT_TYPE_MASK 0x7000 +#define RESERVED2_ID_MASK 0x8000 + +#define OBJECT_ID_SHIFT 0x00 +#define ENUM_ID_SHIFT 0x08 +#define OBJECT_TYPE_SHIFT 0x0C + + +/****************************************************/ +/* Graphics Object family definition */ +/****************************************************/ +#define CONSTRUCTOBJECTFAMILYID(GRAPHICS_OBJECT_TYPE, GRAPHICS_OBJECT_ID) (GRAPHICS_OBJECT_TYPE << OBJECT_TYPE_SHIFT | \ + GRAPHICS_OBJECT_ID << OBJECT_ID_SHIFT) +/****************************************************/ +/* GPU Object ID definition - Shared with BIOS */ +/****************************************************/ +#define GPU_ENUM_ID1 ( GRAPH_OBJECT_TYPE_GPU << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT) + +/****************************************************/ +/* Encoder Object ID definition - Shared with BIOS */ +/****************************************************/ +/* +#define ENCODER_INTERNAL_LVDS_ENUM_ID1 0x2101 +#define ENCODER_INTERNAL_TMDS1_ENUM_ID1 0x2102 +#define ENCODER_INTERNAL_TMDS2_ENUM_ID1 0x2103 +#define ENCODER_INTERNAL_DAC1_ENUM_ID1 0x2104 +#define ENCODER_INTERNAL_DAC2_ENUM_ID1 0x2105 +#define ENCODER_INTERNAL_SDVOA_ENUM_ID1 0x2106 +#define ENCODER_INTERNAL_SDVOB_ENUM_ID1 0x2107 +#define ENCODER_SIL170B_ENUM_ID1 0x2108 +#define ENCODER_CH7303_ENUM_ID1 0x2109 +#define ENCODER_CH7301_ENUM_ID1 0x210A +#define ENCODER_INTERNAL_DVO1_ENUM_ID1 0x210B +#define ENCODER_EXTERNAL_SDVOA_ENUM_ID1 0x210C +#define ENCODER_EXTERNAL_SDVOB_ENUM_ID1 0x210D +#define ENCODER_TITFP513_ENUM_ID1 0x210E +#define ENCODER_INTERNAL_LVTM1_ENUM_ID1 0x210F +#define ENCODER_VT1623_ENUM_ID1 0x2110 +#define ENCODER_HDMI_SI1930_ENUM_ID1 0x2111 +#define ENCODER_HDMI_INTERNAL_ENUM_ID1 0x2112 +#define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 0x2113 +#define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 0x2114 +#define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 0x2115 +#define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 0x2116 +#define ENCODER_SI178_ENUM_ID1 0x2117 +#define ENCODER_MVPU_FPGA_ENUM_ID1 0x2118 +#define ENCODER_INTERNAL_DDI_ENUM_ID1 0x2119 +#define ENCODER_VT1625_ENUM_ID1 0x211A +#define ENCODER_HDMI_SI1932_ENUM_ID1 0x211B +#define ENCODER_ENCODER_DP_AN9801_ENUM_ID1 0x211C +#define ENCODER_DP_DP501_ENUM_ID1 0x211D +#define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 0x211E +*/ +#define ENCODER_INTERNAL_LVDS_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_LVDS << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_TMDS1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_TMDS1 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_TMDS2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_TMDS2 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_DAC1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_DAC1 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_DAC2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_DAC2 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_SDVOA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_SDVOA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_SDVOA << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_SDVOB_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_SDVOB << OBJECT_ID_SHIFT) + +#define ENCODER_SIL170B_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_SI170B << OBJECT_ID_SHIFT) + +#define ENCODER_CH7303_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_CH7303 << OBJECT_ID_SHIFT) + +#define ENCODER_CH7301_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_CH7301 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_DVO1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_DVO1 << OBJECT_ID_SHIFT) + +#define ENCODER_EXTERNAL_SDVOA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) + +#define ENCODER_EXTERNAL_SDVOA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_EXTERNAL_SDVOA << OBJECT_ID_SHIFT) + + +#define ENCODER_EXTERNAL_SDVOB_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_EXTERNAL_SDVOB << OBJECT_ID_SHIFT) + + +#define ENCODER_TITFP513_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_TITFP513 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_LVTM1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_LVTM1 << OBJECT_ID_SHIFT) + +#define ENCODER_VT1623_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_VT1623 << OBJECT_ID_SHIFT) + +#define ENCODER_HDMI_SI1930_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_HDMI_SI1930 << OBJECT_ID_SHIFT) + +#define ENCODER_HDMI_INTERNAL_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_HDMI_INTERNAL << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) + + +#define ENCODER_INTERNAL_KLDSCP_TMDS1_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_TMDS1 << OBJECT_ID_SHIFT) + + +#define ENCODER_INTERNAL_KLDSCP_DVO1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_KLDSCP_DAC1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_KLDSCP_DAC2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2 << OBJECT_ID_SHIFT) // Shared with CV/TV and CRT + +#define ENCODER_SI178_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_SI178 << OBJECT_ID_SHIFT) + +#define ENCODER_MVPU_FPGA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_MVPU_FPGA << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_DDI_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_DDI << OBJECT_ID_SHIFT) + +#define ENCODER_VT1625_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_VT1625 << OBJECT_ID_SHIFT) + +#define ENCODER_HDMI_SI1932_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_HDMI_SI1932 << OBJECT_ID_SHIFT) + +#define ENCODER_DP_DP501_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_DP_DP501 << OBJECT_ID_SHIFT) + +#define ENCODER_DP_AN9801_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_DP_AN9801 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_UNIPHY_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_UNIPHY_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_UNIPHY << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_KLDSCP_LVTMA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_UNIPHY1_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_UNIPHY1_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_UNIPHY1 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_UNIPHY2_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) + +#define ENCODER_INTERNAL_UNIPHY2_ENUM_ID2 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_INTERNAL_UNIPHY2 << OBJECT_ID_SHIFT) + +#define ENCODER_GENERAL_EXTERNAL_DVO_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO << OBJECT_ID_SHIFT) + +/****************************************************/ +/* Connector Object ID definition - Shared with BIOS */ +/****************************************************/ +/* +#define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID1 0x3101 +#define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID1 0x3102 +#define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID1 0x3103 +#define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 0x3104 +#define CONNECTOR_VGA_ENUM_ID1 0x3105 +#define CONNECTOR_COMPOSITE_ENUM_ID1 0x3106 +#define CONNECTOR_SVIDEO_ENUM_ID1 0x3107 +#define CONNECTOR_YPbPr_ENUM_ID1 0x3108 +#define CONNECTOR_D_CONNECTORE_ENUM_ID1 0x3109 +#define CONNECTOR_9PIN_DIN_ENUM_ID1 0x310A +#define CONNECTOR_SCART_ENUM_ID1 0x310B +#define CONNECTOR_HDMI_TYPE_A_ENUM_ID1 0x310C +#define CONNECTOR_HDMI_TYPE_B_ENUM_ID1 0x310D +#define CONNECTOR_LVDS_ENUM_ID1 0x310E +#define CONNECTOR_7PIN_DIN_ENUM_ID1 0x310F +#define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 0x3110 +*/ +#define CONNECTOR_LVDS_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_LVDS << OBJECT_ID_SHIFT) + +#define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) + +#define CONNECTOR_SINGLE_LINK_DVI_I_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_I << OBJECT_ID_SHIFT) + +#define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) + +#define CONNECTOR_DUAL_LINK_DVI_I_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I << OBJECT_ID_SHIFT) + +#define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) + +#define CONNECTOR_SINGLE_LINK_DVI_D_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D << OBJECT_ID_SHIFT) + +#define CONNECTOR_DUAL_LINK_DVI_D_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D << OBJECT_ID_SHIFT) + +#define CONNECTOR_VGA_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) + +#define CONNECTOR_VGA_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_VGA << OBJECT_ID_SHIFT) + +#define CONNECTOR_COMPOSITE_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_COMPOSITE << OBJECT_ID_SHIFT) + +#define CONNECTOR_SVIDEO_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_SVIDEO << OBJECT_ID_SHIFT) + +#define CONNECTOR_YPbPr_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_YPbPr << OBJECT_ID_SHIFT) + +#define CONNECTOR_D_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_D_CONNECTOR << OBJECT_ID_SHIFT) + +#define CONNECTOR_9PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_9PIN_DIN << OBJECT_ID_SHIFT) + +#define CONNECTOR_SCART_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_SCART << OBJECT_ID_SHIFT) + +#define CONNECTOR_HDMI_TYPE_A_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_HDMI_TYPE_A << OBJECT_ID_SHIFT) + +#define CONNECTOR_HDMI_TYPE_B_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_HDMI_TYPE_B << OBJECT_ID_SHIFT) + +#define CONNECTOR_7PIN_DIN_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_7PIN_DIN << OBJECT_ID_SHIFT) + +#define CONNECTOR_PCIE_CONNECTOR_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) + +#define CONNECTOR_PCIE_CONNECTOR_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_PCIE_CONNECTOR << OBJECT_ID_SHIFT) + +#define CONNECTOR_CROSSFIRE_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) + +#define CONNECTOR_CROSSFIRE_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_CROSSFIRE << OBJECT_ID_SHIFT) + + +#define CONNECTOR_HARDCODE_DVI_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) + +#define CONNECTOR_HARDCODE_DVI_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_HARDCODE_DVI << OBJECT_ID_SHIFT) + +#define CONNECTOR_DISPLAYPORT_ENUM_ID1 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) + +#define CONNECTOR_DISPLAYPORT_ENUM_ID2 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID2 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) + +#define CONNECTOR_DISPLAYPORT_ENUM_ID3 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID3 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) + +#define CONNECTOR_DISPLAYPORT_ENUM_ID4 ( GRAPH_OBJECT_TYPE_CONNECTOR << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID4 << ENUM_ID_SHIFT |\ + CONNECTOR_OBJECT_ID_DISPLAYPORT << OBJECT_ID_SHIFT) + +/****************************************************/ +/* Router Object ID definition - Shared with BIOS */ +/****************************************************/ +#define ROUTER_I2C_EXTENDER_CNTL_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ROUTER << OBJECT_TYPE_SHIFT |\ + GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ + ROUTER_OBJECT_ID_I2C_EXTENDER_CNTL << OBJECT_ID_SHIFT) + +/* deleted */ + +/****************************************************/ +/* Object Cap definition - Shared with BIOS */ +/****************************************************/ +#define GRAPHICS_OBJECT_CAP_I2C 0x00000001L +#define GRAPHICS_OBJECT_CAP_TABLE_ID 0x00000002L + + +#define GRAPHICS_OBJECT_I2CCOMMAND_TABLE_ID 0x01 +#define GRAPHICS_OBJECT_HOTPLUGDETECTIONINTERUPT_TABLE_ID 0x02 +#define GRAPHICS_OBJECT_ENCODER_OUTPUT_PROTECTION_TABLE_ID 0x03 + +#if defined(_X86_) +#pragma pack() +#endif + +#endif /*GRAPHICTYPE */ + + + + diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/atombios.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/atombios.h new file mode 100644 index 000000000..3e3fc58bf --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/atombios.h @@ -0,0 +1,4944 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + + +/****************************************************************************/ +/*Portion I: Definitions shared between VBIOS and Driver */ +/****************************************************************************/ + + +#ifndef _ATOMBIOS_H +#define _ATOMBIOS_H + +#define ATOM_VERSION_MAJOR 0x00020000 +#define ATOM_VERSION_MINOR 0x00000002 + +#define ATOM_HEADER_VERSION (ATOM_VERSION_MAJOR | ATOM_VERSION_MINOR) + + +#ifdef _H2INC + #ifndef ULONG + typedef unsigned long ULONG; + #endif + + #ifndef UCHAR + typedef unsigned char UCHAR; + #endif + + #ifndef USHORT + typedef unsigned short USHORT; + #endif +#endif + +#define ATOM_DAC_A 0 +#define ATOM_DAC_B 1 +#define ATOM_EXT_DAC 2 + +#define ATOM_CRTC1 0 +#define ATOM_CRTC2 1 + +#define ATOM_DIGA 0 +#define ATOM_DIGB 1 + +#define ATOM_PPLL1 0 +#define ATOM_PPLL2 1 + +#define ATOM_SCALER1 0 +#define ATOM_SCALER2 1 + +#define ATOM_SCALER_DISABLE 0 +#define ATOM_SCALER_CENTER 1 +#define ATOM_SCALER_EXPANSION 2 +#define ATOM_SCALER_MULTI_EX 3 + +#define ATOM_DISABLE 0 +#define ATOM_ENABLE 1 +#define ATOM_LCD_BLOFF (ATOM_DISABLE+2) +#define ATOM_LCD_BLON (ATOM_ENABLE+2) +#define ATOM_LCD_BL_BRIGHTNESS_CONTROL (ATOM_ENABLE+3) +#define ATOM_LCD_SELFTEST_START (ATOM_DISABLE+5) +#define ATOM_LCD_SELFTEST_STOP (ATOM_ENABLE+5) +#define ATOM_ENCODER_INIT (ATOM_DISABLE+7) + +#define ATOM_BLANKING 1 +#define ATOM_BLANKING_OFF 0 + +#define ATOM_CURSOR1 0 +#define ATOM_CURSOR2 1 + +#define ATOM_ICON1 0 +#define ATOM_ICON2 1 + +#define ATOM_CRT1 0 +#define ATOM_CRT2 1 + +#define ATOM_TV_NTSC 1 +#define ATOM_TV_NTSCJ 2 +#define ATOM_TV_PAL 3 +#define ATOM_TV_PALM 4 +#define ATOM_TV_PALCN 5 +#define ATOM_TV_PALN 6 +#define ATOM_TV_PAL60 7 +#define ATOM_TV_SECAM 8 +#define ATOM_TV_CV 16 + +#define ATOM_DAC1_PS2 1 +#define ATOM_DAC1_CV 2 +#define ATOM_DAC1_NTSC 3 +#define ATOM_DAC1_PAL 4 + +#define ATOM_DAC2_PS2 ATOM_DAC1_PS2 +#define ATOM_DAC2_CV ATOM_DAC1_CV +#define ATOM_DAC2_NTSC ATOM_DAC1_NTSC +#define ATOM_DAC2_PAL ATOM_DAC1_PAL + +#define ATOM_PM_ON 0 +#define ATOM_PM_STANDBY 1 +#define ATOM_PM_SUSPEND 2 +#define ATOM_PM_OFF 3 + +/* Bit0:{=0:single, =1:dual}, + Bit1 {=0:666RGB, =1:888RGB}, + Bit2:3:{Grey level} + Bit4:{=0:LDI format for RGB888, =1 FPDI format for RGB888}*/ + +#define ATOM_PANEL_MISC_DUAL 0x00000001 +#define ATOM_PANEL_MISC_888RGB 0x00000002 +#define ATOM_PANEL_MISC_GREY_LEVEL 0x0000000C +#define ATOM_PANEL_MISC_FPDI 0x00000010 +#define ATOM_PANEL_MISC_GREY_LEVEL_SHIFT 2 +#define ATOM_PANEL_MISC_SPATIAL 0x00000020 +#define ATOM_PANEL_MISC_TEMPORAL 0x00000040 +#define ATOM_PANEL_MISC_API_ENABLED 0x00000080 + + +#define MEMTYPE_DDR1 "DDR1" +#define MEMTYPE_DDR2 "DDR2" +#define MEMTYPE_DDR3 "DDR3" +#define MEMTYPE_DDR4 "DDR4" + +#define ASIC_BUS_TYPE_PCI "PCI" +#define ASIC_BUS_TYPE_AGP "AGP" +#define ASIC_BUS_TYPE_PCIE "PCI_EXPRESS" + +/* Maximum size of that FireGL flag string */ + +#define ATOM_FIREGL_FLAG_STRING "FGL" //Flag used to enable FireGL Support +#define ATOM_MAX_SIZE_OF_FIREGL_FLAG_STRING 3 //sizeof( ATOM_FIREGL_FLAG_STRING ) + +#define ATOM_FAKE_DESKTOP_STRING "DSK" //Flag used to enable mobile ASIC on Desktop +#define ATOM_MAX_SIZE_OF_FAKE_DESKTOP_STRING ATOM_MAX_SIZE_OF_FIREGL_FLAG_STRING + +#define ATOM_M54T_FLAG_STRING "M54T" //Flag used to enable M54T Support +#define ATOM_MAX_SIZE_OF_M54T_FLAG_STRING 4 //sizeof( ATOM_M54T_FLAG_STRING ) + +#define HW_ASSISTED_I2C_STATUS_FAILURE 2 +#define HW_ASSISTED_I2C_STATUS_SUCCESS 1 + +#pragma pack(1) /* BIOS data must use byte aligment */ + +/* Define offset to location of ROM header. */ + +#define OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER 0x00000048L +#define OFFSET_TO_ATOM_ROM_IMAGE_SIZE 0x00000002L + +#define OFFSET_TO_ATOMBIOS_ASIC_BUS_MEM_TYPE 0x94 +#define MAXSIZE_OF_ATOMBIOS_ASIC_BUS_MEM_TYPE 20 /* including the terminator 0x0! */ +#define OFFSET_TO_GET_ATOMBIOS_STRINGS_NUMBER 0x002f +#define OFFSET_TO_GET_ATOMBIOS_STRINGS_START 0x006e + +/* Common header for all ROM Data tables. + Every table pointed _ATOM_MASTER_DATA_TABLE has this common header. + And the pointer actually points to this header. */ + +typedef struct _ATOM_COMMON_TABLE_HEADER +{ + USHORT usStructureSize; + UCHAR ucTableFormatRevision; /*Change it when the Parser is not backward compatible */ + UCHAR ucTableContentRevision; /*Change it only when the table needs to change but the firmware */ + /*Image can't be updated, while Driver needs to carry the new table! */ +}ATOM_COMMON_TABLE_HEADER; + +typedef struct _ATOM_ROM_HEADER +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR uaFirmWareSignature[4]; /*Signature to distinguish between Atombios and non-atombios, + atombios should init it as "ATOM", don't change the position */ + USHORT usBiosRuntimeSegmentAddress; + USHORT usProtectedModeInfoOffset; + USHORT usConfigFilenameOffset; + USHORT usCRC_BlockOffset; + USHORT usBIOS_BootupMessageOffset; + USHORT usInt10Offset; + USHORT usPciBusDevInitCode; + USHORT usIoBaseAddress; + USHORT usSubsystemVendorID; + USHORT usSubsystemID; + USHORT usPCI_InfoOffset; + USHORT usMasterCommandTableOffset; /*Offset for SW to get all command table offsets, Don't change the position */ + USHORT usMasterDataTableOffset; /*Offset for SW to get all data table offsets, Don't change the position */ + UCHAR ucExtendedFunctionCode; + UCHAR ucReserved; +}ATOM_ROM_HEADER; + +/*==============================Command Table Portion==================================== */ + +#ifdef UEFI_BUILD + #define UTEMP USHORT + #define USHORT void* +#endif + +/****************************************************************************/ +// Structures used in Command.mtb +/****************************************************************************/ +typedef struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES{ + USHORT ASIC_Init; //Function Table, used by various SW components,latest version 1.1 + USHORT GetDisplaySurfaceSize; //Atomic Table, Used by Bios when enabling HW ICON + USHORT ASIC_RegistersInit; //Atomic Table, indirectly used by various SW components,called from ASIC_Init + USHORT VRAM_BlockVenderDetection; //Atomic Table, used only by Bios + USHORT DIGxEncoderControl; //Only used by Bios + USHORT MemoryControllerInit; //Atomic Table, indirectly used by various SW components,called from ASIC_Init + USHORT EnableCRTCMemReq; //Function Table,directly used by various SW components,latest version 2.1 + USHORT MemoryParamAdjust; //Atomic Table, indirectly used by various SW components,called from SetMemoryClock if needed + USHORT DVOEncoderControl; //Function Table,directly used by various SW components,latest version 1.2 + USHORT GPIOPinControl; //Atomic Table, only used by Bios + USHORT SetEngineClock; //Function Table,directly used by various SW components,latest version 1.1 + USHORT SetMemoryClock; //Function Table,directly used by various SW components,latest version 1.1 + USHORT SetPixelClock; //Function Table,directly used by various SW components,latest version 1.2 + USHORT DynamicClockGating; //Atomic Table, indirectly used by various SW components,called from ASIC_Init + USHORT ResetMemoryDLL; //Atomic Table, indirectly used by various SW components,called from SetMemoryClock + USHORT ResetMemoryDevice; //Atomic Table, indirectly used by various SW components,called from SetMemoryClock + USHORT MemoryPLLInit; + USHORT AdjustDisplayPll; //only used by Bios + USHORT AdjustMemoryController; //Atomic Table, indirectly used by various SW components,called from SetMemoryClock + USHORT EnableASIC_StaticPwrMgt; //Atomic Table, only used by Bios + USHORT ASIC_StaticPwrMgtStatusChange; //Obsolete , only used by Bios + USHORT DAC_LoadDetection; //Atomic Table, directly used by various SW components,latest version 1.2 + USHORT LVTMAEncoderControl; //Atomic Table,directly used by various SW components,latest version 1.3 + USHORT LCD1OutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT DAC1EncoderControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT DAC2EncoderControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT DVOOutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT CV1OutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT GetConditionalGoldenSetting; //only used by Bios + USHORT TVEncoderControl; //Function Table,directly used by various SW components,latest version 1.1 + USHORT TMDSAEncoderControl; //Atomic Table, directly used by various SW components,latest version 1.3 + USHORT LVDSEncoderControl; //Atomic Table, directly used by various SW components,latest version 1.3 + USHORT TV1OutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT EnableScaler; //Atomic Table, used only by Bios + USHORT BlankCRTC; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT EnableCRTC; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT GetPixelClock; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT EnableVGA_Render; //Function Table,directly used by various SW components,latest version 1.1 + USHORT EnableVGA_Access; //Obsolete , only used by Bios + USHORT SetCRTC_Timing; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT SetCRTC_OverScan; //Atomic Table, used by various SW components,latest version 1.1 + USHORT SetCRTC_Replication; //Atomic Table, used only by Bios + USHORT SelectCRTC_Source; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT EnableGraphSurfaces; //Atomic Table, used only by Bios + USHORT UpdateCRTC_DoubleBufferRegisters; + USHORT LUT_AutoFill; //Atomic Table, only used by Bios + USHORT EnableHW_IconCursor; //Atomic Table, only used by Bios + USHORT GetMemoryClock; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT GetEngineClock; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT SetCRTC_UsingDTDTiming; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT ExternalEncoderControl; //Atomic Table, directly used by various SW components,latest version 2.1 + USHORT LVTMAOutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT VRAM_BlockDetectionByStrap; //Atomic Table, used only by Bios + USHORT MemoryCleanUp; //Atomic Table, only used by Bios + USHORT ProcessI2cChannelTransaction; //Function Table,only used by Bios + USHORT WriteOneByteToHWAssistedI2C; //Function Table,indirectly used by various SW components + USHORT ReadHWAssistedI2CStatus; //Atomic Table, indirectly used by various SW components + USHORT SpeedFanControl; //Function Table,indirectly used by various SW components,called from ASIC_Init + USHORT PowerConnectorDetection; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT MC_Synchronization; //Atomic Table, indirectly used by various SW components,called from SetMemoryClock + USHORT ComputeMemoryEnginePLL; //Atomic Table, indirectly used by various SW components,called from SetMemory/EngineClock + USHORT MemoryRefreshConversion; //Atomic Table, indirectly used by various SW components,called from SetMemory or SetEngineClock + USHORT VRAM_GetCurrentInfoBlock; //Atomic Table, used only by Bios + USHORT DynamicMemorySettings; //Atomic Table, indirectly used by various SW components,called from SetMemoryClock + USHORT MemoryTraining; //Atomic Table, used only by Bios + USHORT EnableSpreadSpectrumOnPPLL; //Atomic Table, directly used by various SW components,latest version 1.2 + USHORT TMDSAOutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT SetVoltage; //Function Table,directly and/or indirectly used by various SW components,latest version 1.1 + USHORT DAC1OutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT DAC2OutputControl; //Atomic Table, directly used by various SW components,latest version 1.1 + USHORT SetupHWAssistedI2CStatus; //Function Table,only used by Bios, obsolete soon.Switch to use "ReadEDIDFromHWAssistedI2C" + USHORT ClockSource; //Atomic Table, indirectly used by various SW components,called from ASIC_Init + USHORT MemoryDeviceInit; //Atomic Table, indirectly used by various SW components,called from SetMemoryClock + USHORT EnableYUV; //Atomic Table, indirectly used by various SW components,called from EnableVGARender + USHORT DIG1EncoderControl; //Atomic Table,directly used by various SW components,latest version 1.1 + USHORT DIG2EncoderControl; //Atomic Table,directly used by various SW components,latest version 1.1 + USHORT DIG1TransmitterControl; //Atomic Table,directly used by various SW components,latest version 1.1 + USHORT DIG2TransmitterControl; //Atomic Table,directly used by various SW components,latest version 1.1 + USHORT ProcessAuxChannelTransaction; //Function Table,only used by Bios + USHORT DPEncoderService; //Function Table,only used by Bios +}ATOM_MASTER_LIST_OF_COMMAND_TABLES; + +// For backward compatible +#define ReadEDIDFromHWAssistedI2C ProcessI2cChannelTransaction +#define UNIPHYTransmitterControl DIG1TransmitterControl +#define LVTMATransmitterControl DIG2TransmitterControl +#define SetCRTC_DPM_State GetConditionalGoldenSetting +#define SetUniphyInstance ASIC_StaticPwrMgtStatusChange + +typedef struct _ATOM_MASTER_COMMAND_TABLE +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_MASTER_LIST_OF_COMMAND_TABLES ListOfCommandTables; +}ATOM_MASTER_COMMAND_TABLE; + +/****************************************************************************/ +// Structures used in every command table +/****************************************************************************/ +typedef struct _ATOM_TABLE_ATTRIBUTE +{ + USHORT WS_SizeInBytes:8; //[7:0]=Size of workspace in Bytes (in multiple of a dword), + USHORT PS_SizeInBytes:7; //[14:8]=Size of parameter space in Bytes (multiple of a dword), + USHORT UpdatedByUtility:1; //[15]=Table updated by utility flag +}ATOM_TABLE_ATTRIBUTE; + +/****************************************************************************/ +// Common header for all command tables. +// Every table pointed by _ATOM_MASTER_COMMAND_TABLE has this common header. +// And the pointer actually points to this header. +/****************************************************************************/ +typedef struct _ATOM_COMMON_ROM_COMMAND_TABLE_HEADER +{ + ATOM_COMMON_TABLE_HEADER CommonHeader; + ATOM_TABLE_ATTRIBUTE TableAttribute; +}ATOM_COMMON_ROM_COMMAND_TABLE_HEADER; + + +/****************************************************************************/ +// Structures used by ComputeMemoryEnginePLLTable +/****************************************************************************/ + +#define COMPUTE_MEMORY_PLL_PARAM 1 +#define COMPUTE_ENGINE_PLL_PARAM 2 + +typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS +{ + ULONG ulClock; //When returen, it's the re-calculated clock based on given Fb_div Post_Div and ref_div + UCHAR ucAction; //0:reserved //1:Memory //2:Engine + UCHAR ucReserved; //may expand to return larger Fbdiv later + UCHAR ucFbDiv; //return value + UCHAR ucPostDiv; //return value +}COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS; + +typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V2 +{ + ULONG ulClock; //When return, [23:0] return real clock + UCHAR ucAction; //0:reserved;COMPUTE_MEMORY_PLL_PARAM:Memory;COMPUTE_ENGINE_PLL_PARAM:Engine. it return ref_div to be written to register + USHORT usFbDiv; //return Feedback value to be written to register + UCHAR ucPostDiv; //return post div to be written to register +}COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V2; +#define COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_PS_ALLOCATION COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS + + +#define SET_CLOCK_FREQ_MASK 0x00FFFFFF //Clock change tables only take bit [23:0] as the requested clock value +#define USE_NON_BUS_CLOCK_MASK 0x01000000 //Applicable to both memory and engine clock change, when set, it uses another clock as the temporary clock (engine uses memory and vice versa) +#define USE_MEMORY_SELF_REFRESH_MASK 0x02000000 //Only applicable to memory clock change, when set, using memory self refresh during clock transition +#define SKIP_INTERNAL_MEMORY_PARAMETER_CHANGE 0x04000000 //Only applicable to memory clock change, when set, the table will skip predefined internal memory parameter change +#define FIRST_TIME_CHANGE_CLOCK 0x08000000 //Applicable to both memory and engine clock change,when set, it means this is 1st time to change clock after ASIC bootup +#define SKIP_SW_PROGRAM_PLL 0x10000000 //Applicable to both memory and engine clock change, when set, it means the table will not program SPLL/MPLL +#define USE_SS_ENABLED_PIXEL_CLOCK USE_NON_BUS_CLOCK_MASK + +#define b3USE_NON_BUS_CLOCK_MASK 0x01 //Applicable to both memory and engine clock change, when set, it uses another clock as the temporary clock (engine uses memory and vice versa) +#define b3USE_MEMORY_SELF_REFRESH 0x02 //Only applicable to memory clock change, when set, using memory self refresh during clock transition +#define b3SKIP_INTERNAL_MEMORY_PARAMETER_CHANGE 0x04 //Only applicable to memory clock change, when set, the table will skip predefined internal memory parameter change +#define b3FIRST_TIME_CHANGE_CLOCK 0x08 //Applicable to both memory and engine clock change,when set, it means this is 1st time to change clock after ASIC bootup +#define b3SKIP_SW_PROGRAM_PLL 0x10 //Applicable to both memory and engine clock change, when set, it means the table will not program SPLL/MPLL + +typedef struct _ATOM_COMPUTE_CLOCK_FREQ +{ + ULONG ulClockFreq:24; // in unit of 10kHz + ULONG ulComputeClockFlag:8; // =1: COMPUTE_MEMORY_PLL_PARAM, =2: COMPUTE_ENGINE_PLL_PARAM +}ATOM_COMPUTE_CLOCK_FREQ; + +typedef struct _ATOM_S_MPLL_FB_DIVIDER +{ + USHORT usFbDivFrac; + USHORT usFbDiv; +}ATOM_S_MPLL_FB_DIVIDER; + +typedef struct _COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V3 +{ + union + { + ATOM_COMPUTE_CLOCK_FREQ ulClock; //Input Parameter + ATOM_S_MPLL_FB_DIVIDER ulFbDiv; //Output Parameter + }; + UCHAR ucRefDiv; //Output Parameter + UCHAR ucPostDiv; //Output Parameter + UCHAR ucCntlFlag; //Output Parameter + UCHAR ucReserved; +}COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_V3; + +// ucCntlFlag +#define ATOM_PLL_CNTL_FLAG_PLL_POST_DIV_EN 1 +#define ATOM_PLL_CNTL_FLAG_MPLL_VCO_MODE 2 +#define ATOM_PLL_CNTL_FLAG_FRACTION_DISABLE 4 + +typedef struct _DYNAMICE_MEMORY_SETTINGS_PARAMETER +{ + ATOM_COMPUTE_CLOCK_FREQ ulClock; + ULONG ulReserved[2]; +}DYNAMICE_MEMORY_SETTINGS_PARAMETER; + +typedef struct _DYNAMICE_ENGINE_SETTINGS_PARAMETER +{ + ATOM_COMPUTE_CLOCK_FREQ ulClock; + ULONG ulMemoryClock; + ULONG ulReserved; +}DYNAMICE_ENGINE_SETTINGS_PARAMETER; + +/****************************************************************************/ +// Structures used by SetEngineClockTable +/****************************************************************************/ +typedef struct _SET_ENGINE_CLOCK_PARAMETERS +{ + ULONG ulTargetEngineClock; //In 10Khz unit +}SET_ENGINE_CLOCK_PARAMETERS; + +typedef struct _SET_ENGINE_CLOCK_PS_ALLOCATION +{ + ULONG ulTargetEngineClock; //In 10Khz unit + COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_PS_ALLOCATION sReserved; +}SET_ENGINE_CLOCK_PS_ALLOCATION; + +/****************************************************************************/ +// Structures used by SetMemoryClockTable +/****************************************************************************/ +typedef struct _SET_MEMORY_CLOCK_PARAMETERS +{ + ULONG ulTargetMemoryClock; //In 10Khz unit +}SET_MEMORY_CLOCK_PARAMETERS; + +typedef struct _SET_MEMORY_CLOCK_PS_ALLOCATION +{ + ULONG ulTargetMemoryClock; //In 10Khz unit + COMPUTE_MEMORY_ENGINE_PLL_PARAMETERS_PS_ALLOCATION sReserved; +}SET_MEMORY_CLOCK_PS_ALLOCATION; + +/****************************************************************************/ +// Structures used by ASIC_Init.ctb +/****************************************************************************/ +typedef struct _ASIC_INIT_PARAMETERS +{ + ULONG ulDefaultEngineClock; //In 10Khz unit + ULONG ulDefaultMemoryClock; //In 10Khz unit +}ASIC_INIT_PARAMETERS; + +typedef struct _ASIC_INIT_PS_ALLOCATION +{ + ASIC_INIT_PARAMETERS sASICInitClocks; + SET_ENGINE_CLOCK_PS_ALLOCATION sReserved; //Caller doesn't need to init this structure +}ASIC_INIT_PS_ALLOCATION; + +/****************************************************************************/ +// Structure used by DynamicClockGatingTable.ctb +/****************************************************************************/ +typedef struct _DYNAMIC_CLOCK_GATING_PARAMETERS +{ + UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE + UCHAR ucPadding[3]; +}DYNAMIC_CLOCK_GATING_PARAMETERS; +#define DYNAMIC_CLOCK_GATING_PS_ALLOCATION DYNAMIC_CLOCK_GATING_PARAMETERS + +/****************************************************************************/ +// Structure used by EnableASIC_StaticPwrMgtTable.ctb +/****************************************************************************/ +typedef struct _ENABLE_ASIC_STATIC_PWR_MGT_PARAMETERS +{ + UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE + UCHAR ucPadding[3]; +}ENABLE_ASIC_STATIC_PWR_MGT_PARAMETERS; +#define ENABLE_ASIC_STATIC_PWR_MGT_PS_ALLOCATION ENABLE_ASIC_STATIC_PWR_MGT_PARAMETERS + +/****************************************************************************/ +// Structures used by DAC_LoadDetectionTable.ctb +/****************************************************************************/ +typedef struct _DAC_LOAD_DETECTION_PARAMETERS +{ + USHORT usDeviceID; //{ATOM_DEVICE_CRTx_SUPPORT,ATOM_DEVICE_TVx_SUPPORT,ATOM_DEVICE_CVx_SUPPORT} + UCHAR ucDacType; //{ATOM_DAC_A,ATOM_DAC_B, ATOM_EXT_DAC} + UCHAR ucMisc; //Valid only when table revision =1.3 and above +}DAC_LOAD_DETECTION_PARAMETERS; + +// DAC_LOAD_DETECTION_PARAMETERS.ucMisc +#define DAC_LOAD_MISC_YPrPb 0x01 + +typedef struct _DAC_LOAD_DETECTION_PS_ALLOCATION +{ + DAC_LOAD_DETECTION_PARAMETERS sDacload; + ULONG Reserved[2];// Don't set this one, allocation for EXT DAC +}DAC_LOAD_DETECTION_PS_ALLOCATION; + +/****************************************************************************/ +// Structures used by DAC1EncoderControlTable.ctb and DAC2EncoderControlTable.ctb +/****************************************************************************/ +typedef struct _DAC_ENCODER_CONTROL_PARAMETERS +{ + USHORT usPixelClock; // in 10KHz; for bios convenient + UCHAR ucDacStandard; // See definition of ATOM_DACx_xxx, For DEC3.0, bit 7 used as internal flag to indicate DAC2 (==1) or DAC1 (==0) + UCHAR ucAction; // 0: turn off encoder + // 1: setup and turn on encoder + // 7: ATOM_ENCODER_INIT Initialize DAC +}DAC_ENCODER_CONTROL_PARAMETERS; + +#define DAC_ENCODER_CONTROL_PS_ALLOCATION DAC_ENCODER_CONTROL_PARAMETERS + +/****************************************************************************/ +// Structures used by DIG1EncoderControlTable +// DIG2EncoderControlTable +// ExternalEncoderControlTable +/****************************************************************************/ +typedef struct _DIG_ENCODER_CONTROL_PARAMETERS +{ + USHORT usPixelClock; // in 10KHz; for bios convenient + UCHAR ucConfig; + // [2] Link Select: + // =0: PHY linkA if bfLane<3 + // =1: PHY linkB if bfLanes<3 + // =0: PHY linkA+B if bfLanes=3 + // [3] Transmitter Sel + // =0: UNIPHY or PCIEPHY + // =1: LVTMA + UCHAR ucAction; // =0: turn off encoder + // =1: turn on encoder + UCHAR ucEncoderMode; + // =0: DP encoder + // =1: LVDS encoder + // =2: DVI encoder + // =3: HDMI encoder + // =4: SDVO encoder + UCHAR ucLaneNum; // how many lanes to enable + UCHAR ucReserved[2]; +}DIG_ENCODER_CONTROL_PARAMETERS; +#define DIG_ENCODER_CONTROL_PS_ALLOCATION DIG_ENCODER_CONTROL_PARAMETERS +#define EXTERNAL_ENCODER_CONTROL_PARAMETER DIG_ENCODER_CONTROL_PARAMETERS + +//ucConfig +#define ATOM_ENCODER_CONFIG_DPLINKRATE_MASK 0x01 +#define ATOM_ENCODER_CONFIG_DPLINKRATE_1_62GHZ 0x00 +#define ATOM_ENCODER_CONFIG_DPLINKRATE_2_70GHZ 0x01 +#define ATOM_ENCODER_CONFIG_LINK_SEL_MASK 0x04 +#define ATOM_ENCODER_CONFIG_LINKA 0x00 +#define ATOM_ENCODER_CONFIG_LINKB 0x04 +#define ATOM_ENCODER_CONFIG_LINKA_B ATOM_TRANSMITTER_CONFIG_LINKA +#define ATOM_ENCODER_CONFIG_LINKB_A ATOM_ENCODER_CONFIG_LINKB +#define ATOM_ENCODER_CONFIG_TRANSMITTER_SEL_MASK 0x08 +#define ATOM_ENCODER_CONFIG_UNIPHY 0x00 +#define ATOM_ENCODER_CONFIG_LVTMA 0x08 +#define ATOM_ENCODER_CONFIG_TRANSMITTER1 0x00 +#define ATOM_ENCODER_CONFIG_TRANSMITTER2 0x08 +#define ATOM_ENCODER_CONFIG_DIGB 0x80 // VBIOS Internal use, outside SW should set this bit=0 +// ucAction +// ATOM_ENABLE: Enable Encoder +// ATOM_DISABLE: Disable Encoder + +//ucEncoderMode +#define ATOM_ENCODER_MODE_DP 0 +#define ATOM_ENCODER_MODE_LVDS 1 +#define ATOM_ENCODER_MODE_DVI 2 +#define ATOM_ENCODER_MODE_HDMI 3 +#define ATOM_ENCODER_MODE_SDVO 4 +#define ATOM_ENCODER_MODE_TV 13 +#define ATOM_ENCODER_MODE_CV 14 +#define ATOM_ENCODER_MODE_CRT 15 + +typedef struct _ATOM_DIG_ENCODER_CONFIG_V2 +{ + UCHAR ucDPLinkRate:1; // =0: 1.62Ghz, =1: 2.7Ghz + UCHAR ucReserved:1; + UCHAR ucLinkSel:1; // =0: linkA/C/E =1: linkB/D/F + UCHAR ucTransmitterSel:2; // =0: UniphyAB, =1: UniphyCD =2: UniphyEF + UCHAR ucReserved1:2; +}ATOM_DIG_ENCODER_CONFIG_V2; + + +typedef struct _DIG_ENCODER_CONTROL_PARAMETERS_V2 +{ + USHORT usPixelClock; // in 10KHz; for bios convenient + ATOM_DIG_ENCODER_CONFIG_V2 acConfig; + UCHAR ucAction; + UCHAR ucEncoderMode; + // =0: DP encoder + // =1: LVDS encoder + // =2: DVI encoder + // =3: HDMI encoder + // =4: SDVO encoder + UCHAR ucLaneNum; // how many lanes to enable + UCHAR ucReserved[2]; +}DIG_ENCODER_CONTROL_PARAMETERS_V2; + +//ucConfig +#define ATOM_ENCODER_CONFIG_V2_DPLINKRATE_MASK 0x01 +#define ATOM_ENCODER_CONFIG_V2_DPLINKRATE_1_62GHZ 0x00 +#define ATOM_ENCODER_CONFIG_V2_DPLINKRATE_2_70GHZ 0x01 +#define ATOM_ENCODER_CONFIG_V2_LINK_SEL_MASK 0x04 +#define ATOM_ENCODER_CONFIG_V2_LINKA 0x00 +#define ATOM_ENCODER_CONFIG_V2_LINKB 0x04 +#define ATOM_ENCODER_CONFIG_V2_TRANSMITTER_SEL_MASK 0x18 +#define ATOM_ENCODER_CONFIG_V2_TRANSMITTER1 0x00 +#define ATOM_ENCODER_CONFIG_V2_TRANSMITTER2 0x08 +#define ATOM_ENCODER_CONFIG_V2_TRANSMITTER3 0x10 + +/****************************************************************************/ +// Structures used by UNIPHYTransmitterControlTable +// LVTMATransmitterControlTable +// DVOOutputControlTable +/****************************************************************************/ +typedef struct _ATOM_DP_VS_MODE +{ + UCHAR ucLaneSel; + UCHAR ucLaneSet; +}ATOM_DP_VS_MODE; + +typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS +{ + union + { + USHORT usPixelClock; // in 10KHz; for bios convenient + USHORT usInitInfo; // when init uniphy,lower 8bit is used for connector type defined in objectid.h + ATOM_DP_VS_MODE asMode; // DP Voltage swing mode + }; + UCHAR ucConfig; + // [0]=0: 4 lane Link, + // =1: 8 lane Link ( Dual Links TMDS ) + // [1]=0: InCoherent mode + // =1: Coherent Mode + // [2] Link Select: + // =0: PHY linkA if bfLane<3 + // =1: PHY linkB if bfLanes<3 + // =0: PHY linkA+B if bfLanes=3 + // [5:4]PCIE lane Sel + // =0: lane 0~3 or 0~7 + // =1: lane 4~7 + // =2: lane 8~11 or 8~15 + // =3: lane 12~15 + UCHAR ucAction; // =0: turn off encoder + // =1: turn on encoder + UCHAR ucReserved[4]; +}DIG_TRANSMITTER_CONTROL_PARAMETERS; + +#define DIG_TRANSMITTER_CONTROL_PS_ALLOCATION DIG_TRANSMITTER_CONTROL_PARAMETERS + +//ucInitInfo +#define ATOM_TRAMITTER_INITINFO_CONNECTOR_MASK 0x00ff + +//ucConfig +#define ATOM_TRANSMITTER_CONFIG_8LANE_LINK 0x01 +#define ATOM_TRANSMITTER_CONFIG_COHERENT 0x02 +#define ATOM_TRANSMITTER_CONFIG_LINK_SEL_MASK 0x04 +#define ATOM_TRANSMITTER_CONFIG_LINKA 0x00 +#define ATOM_TRANSMITTER_CONFIG_LINKB 0x04 +#define ATOM_TRANSMITTER_CONFIG_LINKA_B 0x00 +#define ATOM_TRANSMITTER_CONFIG_LINKB_A 0x04 + +#define ATOM_TRANSMITTER_CONFIG_ENCODER_SEL_MASK 0x08 // only used when ATOM_TRANSMITTER_ACTION_ENABLE +#define ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER 0x00 // only used when ATOM_TRANSMITTER_ACTION_ENABLE +#define ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER 0x08 // only used when ATOM_TRANSMITTER_ACTION_ENABLE + +#define ATOM_TRANSMITTER_CONFIG_CLKSRC_MASK 0x30 +#define ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL 0x00 +#define ATOM_TRANSMITTER_CONFIG_CLKSRC_PCIE 0x20 +#define ATOM_TRANSMITTER_CONFIG_CLKSRC_XTALIN 0x30 +#define ATOM_TRANSMITTER_CONFIG_LANE_SEL_MASK 0xc0 +#define ATOM_TRANSMITTER_CONFIG_LANE_0_3 0x00 +#define ATOM_TRANSMITTER_CONFIG_LANE_0_7 0x00 +#define ATOM_TRANSMITTER_CONFIG_LANE_4_7 0x40 +#define ATOM_TRANSMITTER_CONFIG_LANE_8_11 0x80 +#define ATOM_TRANSMITTER_CONFIG_LANE_8_15 0x80 +#define ATOM_TRANSMITTER_CONFIG_LANE_12_15 0xc0 + +//ucAction +#define ATOM_TRANSMITTER_ACTION_DISABLE 0 +#define ATOM_TRANSMITTER_ACTION_ENABLE 1 +#define ATOM_TRANSMITTER_ACTION_LCD_BLOFF 2 +#define ATOM_TRANSMITTER_ACTION_LCD_BLON 3 +#define ATOM_TRANSMITTER_ACTION_BL_BRIGHTNESS_CONTROL 4 +#define ATOM_TRANSMITTER_ACTION_LCD_SELFTEST_START 5 +#define ATOM_TRANSMITTER_ACTION_LCD_SELFTEST_STOP 6 +#define ATOM_TRANSMITTER_ACTION_INIT 7 +#define ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT 8 +#define ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT 9 +#define ATOM_TRANSMITTER_ACTION_SETUP 10 +#define ATOM_TRANSMITTER_ACTION_SETUP_VSEMPH 11 + + +// Following are used for DigTransmitterControlTable ver1.2 +typedef struct _ATOM_DIG_TRANSMITTER_CONFIG_V2 +{ + UCHAR fDualLinkConnector:1; //bit0=1: Dual Link DVI connector + UCHAR fCoherentMode:1; //bit1=1: Coherent Mode ( for DVI/HDMI mode ) + UCHAR ucLinkSel:1; //bit2=0: Uniphy LINKA or C or E when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is A or C or E + // =1: Uniphy LINKB or D or F when fDualLinkConnector=0. when fDualLinkConnector=1, it means master link of dual link is B or D or F + UCHAR ucEncoderSel:1; //bit3=0: Data/Clk path source from DIGA( DIG inst0 ). =1: Data/clk path source from DIGB ( DIG inst1 ) + UCHAR fDPConnector:1; //bit4=0: DP connector =1: None DP connector + UCHAR ucReserved:1; + UCHAR ucTransmitterSel:2; //bit7:6: =0 Dig Transmitter 1 ( Uniphy AB ) + // =1 Dig Transmitter 2 ( Uniphy CD ) + // =2 Dig Transmitter 3 ( Uniphy EF ) +}ATOM_DIG_TRANSMITTER_CONFIG_V2; + +//ucConfig +//Bit0 +#define ATOM_TRANSMITTER_CONFIG_V2_DUAL_LINK_CONNECTOR 0x01 + +//Bit1 +#define ATOM_TRANSMITTER_CONFIG_V2_COHERENT 0x02 + +//Bit2 +#define ATOM_TRANSMITTER_CONFIG_V2_LINK_SEL_MASK 0x04 +#define ATOM_TRANSMITTER_CONFIG_V2_LINKA 0x00 +#define ATOM_TRANSMITTER_CONFIG_V2_LINKB 0x04 + +// Bit3 +#define ATOM_TRANSMITTER_CONFIG_V2_ENCODER_SEL_MASK 0x08 +#define ATOM_TRANSMITTER_CONFIG_V2_DIG1_ENCODER 0x00 // only used when ucAction == ATOM_TRANSMITTER_ACTION_ENABLE or ATOM_TRANSMITTER_ACTION_SETUP +#define ATOM_TRANSMITTER_CONFIG_V2_DIG2_ENCODER 0x08 // only used when ucAction == ATOM_TRANSMITTER_ACTION_ENABLE or ATOM_TRANSMITTER_ACTION_SETUP + +// Bit4 +#define ATOM_TRASMITTER_CONFIG_V2_DP_CONNECTOR 0x10 + +// Bit7:6 +#define ATOM_TRANSMITTER_CONFIG_V2_TRANSMITTER_SEL_MASK 0xC0 +#define ATOM_TRANSMITTER_CONFIG_V2_TRANSMITTER1 0x00 //AB +#define ATOM_TRANSMITTER_CONFIG_V2_TRANSMITTER2 0x40 //CD +#define ATOM_TRANSMITTER_CONFIG_V2_TRANSMITTER3 0x80 //EF + +typedef struct _DIG_TRANSMITTER_CONTROL_PARAMETERS_V2 +{ + union + { + USHORT usPixelClock; // in 10KHz; for bios convenient + USHORT usInitInfo; // when init uniphy,lower 8bit is used for connector type defined in objectid.h + ATOM_DP_VS_MODE asMode; // DP Voltage swing mode + }; + ATOM_DIG_TRANSMITTER_CONFIG_V2 acConfig; + UCHAR ucAction; // define as ATOM_TRANSMITER_ACTION_XXX + UCHAR ucReserved[4]; +}DIG_TRANSMITTER_CONTROL_PARAMETERS_V2; + + +/****************************************************************************/ +// Structures used by DAC1OuputControlTable +// DAC2OuputControlTable +// LVTMAOutputControlTable (Before DEC30) +// TMDSAOutputControlTable (Before DEC30) +/****************************************************************************/ +typedef struct _DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +{ + UCHAR ucAction; // Possible input:ATOM_ENABLE||ATOMDISABLE + // When the display is LCD, in addition to above: + // ATOM_LCD_BLOFF|| ATOM_LCD_BLON ||ATOM_LCD_BL_BRIGHTNESS_CONTROL||ATOM_LCD_SELFTEST_START|| + // ATOM_LCD_SELFTEST_STOP + + UCHAR aucPadding[3]; // padding to DWORD aligned +}DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS; + +#define DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS + + +#define CRT1_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define CRT1_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION + +#define CRT2_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define CRT2_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION + +#define CV1_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define CV1_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION + +#define TV1_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define TV1_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION + +#define DFP1_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define DFP1_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION + +#define DFP2_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define DFP2_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION + +#define LCD1_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define LCD1_OUTPUT_CONTROL_PS_ALLOCATION DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION + +#define DVO_OUTPUT_CONTROL_PARAMETERS DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS +#define DVO_OUTPUT_CONTROL_PS_ALLOCATION DIG_TRANSMITTER_CONTROL_PS_ALLOCATION +#define DVO_OUTPUT_CONTROL_PARAMETERS_V3 DIG_TRANSMITTER_CONTROL_PARAMETERS + +/****************************************************************************/ +// Structures used by BlankCRTCTable +/****************************************************************************/ +typedef struct _BLANK_CRTC_PARAMETERS +{ + UCHAR ucCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucBlanking; // ATOM_BLANKING or ATOM_BLANKINGOFF + USHORT usBlackColorRCr; + USHORT usBlackColorGY; + USHORT usBlackColorBCb; +}BLANK_CRTC_PARAMETERS; +#define BLANK_CRTC_PS_ALLOCATION BLANK_CRTC_PARAMETERS + +/****************************************************************************/ +// Structures used by EnableCRTCTable +// EnableCRTCMemReqTable +// UpdateCRTC_DoubleBufferRegistersTable +/****************************************************************************/ +typedef struct _ENABLE_CRTC_PARAMETERS +{ + UCHAR ucCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE + UCHAR ucPadding[2]; +}ENABLE_CRTC_PARAMETERS; +#define ENABLE_CRTC_PS_ALLOCATION ENABLE_CRTC_PARAMETERS + +/****************************************************************************/ +// Structures used by SetCRTC_OverScanTable +/****************************************************************************/ +typedef struct _SET_CRTC_OVERSCAN_PARAMETERS +{ + USHORT usOverscanRight; // right + USHORT usOverscanLeft; // left + USHORT usOverscanBottom; // bottom + USHORT usOverscanTop; // top + UCHAR ucCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucPadding[3]; +}SET_CRTC_OVERSCAN_PARAMETERS; +#define SET_CRTC_OVERSCAN_PS_ALLOCATION SET_CRTC_OVERSCAN_PARAMETERS + +/****************************************************************************/ +// Structures used by SetCRTC_ReplicationTable +/****************************************************************************/ +typedef struct _SET_CRTC_REPLICATION_PARAMETERS +{ + UCHAR ucH_Replication; // horizontal replication + UCHAR ucV_Replication; // vertical replication + UCHAR usCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucPadding; +}SET_CRTC_REPLICATION_PARAMETERS; +#define SET_CRTC_REPLICATION_PS_ALLOCATION SET_CRTC_REPLICATION_PARAMETERS + +/****************************************************************************/ +// Structures used by SelectCRTC_SourceTable +/****************************************************************************/ +typedef struct _SELECT_CRTC_SOURCE_PARAMETERS +{ + UCHAR ucCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucDevice; // ATOM_DEVICE_CRT1|ATOM_DEVICE_CRT2|.... + UCHAR ucPadding[2]; +}SELECT_CRTC_SOURCE_PARAMETERS; +#define SELECT_CRTC_SOURCE_PS_ALLOCATION SELECT_CRTC_SOURCE_PARAMETERS + +typedef struct _SELECT_CRTC_SOURCE_PARAMETERS_V2 +{ + UCHAR ucCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucEncoderID; // DAC1/DAC2/TVOUT/DIG1/DIG2/DVO + UCHAR ucEncodeMode; // Encoding mode, only valid when using DIG1/DIG2/DVO + UCHAR ucPadding; +}SELECT_CRTC_SOURCE_PARAMETERS_V2; + +//ucEncoderID +//#define ASIC_INT_DAC1_ENCODER_ID 0x00 +//#define ASIC_INT_TV_ENCODER_ID 0x02 +//#define ASIC_INT_DIG1_ENCODER_ID 0x03 +//#define ASIC_INT_DAC2_ENCODER_ID 0x04 +//#define ASIC_EXT_TV_ENCODER_ID 0x06 +//#define ASIC_INT_DVO_ENCODER_ID 0x07 +//#define ASIC_INT_DIG2_ENCODER_ID 0x09 +//#define ASIC_EXT_DIG_ENCODER_ID 0x05 + +//ucEncodeMode +//#define ATOM_ENCODER_MODE_DP 0 +//#define ATOM_ENCODER_MODE_LVDS 1 +//#define ATOM_ENCODER_MODE_DVI 2 +//#define ATOM_ENCODER_MODE_HDMI 3 +//#define ATOM_ENCODER_MODE_SDVO 4 +//#define ATOM_ENCODER_MODE_TV 13 +//#define ATOM_ENCODER_MODE_CV 14 +//#define ATOM_ENCODER_MODE_CRT 15 + +/****************************************************************************/ +// Structures used by SetPixelClockTable +// GetPixelClockTable +/****************************************************************************/ +//Major revision=1., Minor revision=1 +typedef struct _PIXEL_CLOCK_PARAMETERS +{ + USHORT usPixelClock; // in 10kHz unit; for bios convenient = (RefClk*FB_Div)/(Ref_Div*Post_Div) + // 0 means disable PPLL + USHORT usRefDiv; // Reference divider + USHORT usFbDiv; // feedback divider + UCHAR ucPostDiv; // post divider + UCHAR ucFracFbDiv; // fractional feedback divider + UCHAR ucPpll; // ATOM_PPLL1 or ATOM_PPL2 + UCHAR ucRefDivSrc; // ATOM_PJITTER or ATO_NONPJITTER + UCHAR ucCRTC; // Which CRTC uses this Ppll + UCHAR ucPadding; +}PIXEL_CLOCK_PARAMETERS; + +//Major revision=1., Minor revision=2, add ucMiscIfno +//ucMiscInfo: +#define MISC_FORCE_REPROG_PIXEL_CLOCK 0x1 +#define MISC_DEVICE_INDEX_MASK 0xF0 +#define MISC_DEVICE_INDEX_SHIFT 4 + +typedef struct _PIXEL_CLOCK_PARAMETERS_V2 +{ + USHORT usPixelClock; // in 10kHz unit; for bios convenient = (RefClk*FB_Div)/(Ref_Div*Post_Div) + // 0 means disable PPLL + USHORT usRefDiv; // Reference divider + USHORT usFbDiv; // feedback divider + UCHAR ucPostDiv; // post divider + UCHAR ucFracFbDiv; // fractional feedback divider + UCHAR ucPpll; // ATOM_PPLL1 or ATOM_PPL2 + UCHAR ucRefDivSrc; // ATOM_PJITTER or ATO_NONPJITTER + UCHAR ucCRTC; // Which CRTC uses this Ppll + UCHAR ucMiscInfo; // Different bits for different purpose, bit [7:4] as device index, bit[0]=Force prog +}PIXEL_CLOCK_PARAMETERS_V2; + +//Major revision=1., Minor revision=3, structure/definition change +//ucEncoderMode: +//ATOM_ENCODER_MODE_DP +//ATOM_ENOCDER_MODE_LVDS +//ATOM_ENOCDER_MODE_DVI +//ATOM_ENOCDER_MODE_HDMI +//ATOM_ENOCDER_MODE_SDVO +//ATOM_ENCODER_MODE_TV 13 +//ATOM_ENCODER_MODE_CV 14 +//ATOM_ENCODER_MODE_CRT 15 + +//ucDVOConfig +//#define DVO_ENCODER_CONFIG_RATE_SEL 0x01 +//#define DVO_ENCODER_CONFIG_DDR_SPEED 0x00 +//#define DVO_ENCODER_CONFIG_SDR_SPEED 0x01 +//#define DVO_ENCODER_CONFIG_OUTPUT_SEL 0x0c +//#define DVO_ENCODER_CONFIG_LOW12BIT 0x00 +//#define DVO_ENCODER_CONFIG_UPPER12BIT 0x04 +//#define DVO_ENCODER_CONFIG_24BIT 0x08 + +//ucMiscInfo: also changed, see below +#define PIXEL_CLOCK_MISC_FORCE_PROG_PPLL 0x01 +#define PIXEL_CLOCK_MISC_VGA_MODE 0x02 +#define PIXEL_CLOCK_MISC_CRTC_SEL_MASK 0x04 +#define PIXEL_CLOCK_MISC_CRTC_SEL_CRTC1 0x00 +#define PIXEL_CLOCK_MISC_CRTC_SEL_CRTC2 0x04 +#define PIXEL_CLOCK_MISC_USE_ENGINE_FOR_DISPCLK 0x08 + +typedef struct _PIXEL_CLOCK_PARAMETERS_V3 +{ + USHORT usPixelClock; // in 10kHz unit; for bios convenient = (RefClk*FB_Div)/(Ref_Div*Post_Div) + // 0 means disable PPLL. For VGA PPLL,make sure this value is not 0. + USHORT usRefDiv; // Reference divider + USHORT usFbDiv; // feedback divider + UCHAR ucPostDiv; // post divider + UCHAR ucFracFbDiv; // fractional feedback divider + UCHAR ucPpll; // ATOM_PPLL1 or ATOM_PPL2 + UCHAR ucTransmitterId; // graphic encoder id defined in objectId.h + union + { + UCHAR ucEncoderMode; // encoder type defined as ATOM_ENCODER_MODE_DP/DVI/HDMI/ + UCHAR ucDVOConfig; // when use DVO, need to know SDR/DDR, 12bit or 24bit + }; + UCHAR ucMiscInfo; // bit[0]=Force program, bit[1]= set pclk for VGA, b[2]= CRTC sel + // bit[3]=0:use PPLL for dispclk source, =1: use engine clock for dispclock source +}PIXEL_CLOCK_PARAMETERS_V3; + +#define PIXEL_CLOCK_PARAMETERS_LAST PIXEL_CLOCK_PARAMETERS_V2 +#define GET_PIXEL_CLOCK_PS_ALLOCATION PIXEL_CLOCK_PARAMETERS_LAST + +/****************************************************************************/ +// Structures used by AdjustDisplayPllTable +/****************************************************************************/ +typedef struct _ADJUST_DISPLAY_PLL_PARAMETERS +{ + USHORT usPixelClock; + UCHAR ucTransmitterID; + UCHAR ucEncodeMode; + union + { + UCHAR ucDVOConfig; //if DVO, need passing link rate and output 12bitlow or 24bit + UCHAR ucConfig; //if none DVO, not defined yet + }; + UCHAR ucReserved[3]; +}ADJUST_DISPLAY_PLL_PARAMETERS; + +#define ADJUST_DISPLAY_CONFIG_SS_ENABLE 0x10 + +#define ADJUST_DISPLAY_PLL_PS_ALLOCATION ADJUST_DISPLAY_PLL_PARAMETERS + +/****************************************************************************/ +// Structures used by EnableYUVTable +/****************************************************************************/ +typedef struct _ENABLE_YUV_PARAMETERS +{ + UCHAR ucEnable; // ATOM_ENABLE:Enable YUV or ATOM_DISABLE:Disable YUV (RGB) + UCHAR ucCRTC; // Which CRTC needs this YUV or RGB format + UCHAR ucPadding[2]; +}ENABLE_YUV_PARAMETERS; +#define ENABLE_YUV_PS_ALLOCATION ENABLE_YUV_PARAMETERS + +/****************************************************************************/ +// Structures used by GetMemoryClockTable +/****************************************************************************/ +typedef struct _GET_MEMORY_CLOCK_PARAMETERS +{ + ULONG ulReturnMemoryClock; // current memory speed in 10KHz unit +} GET_MEMORY_CLOCK_PARAMETERS; +#define GET_MEMORY_CLOCK_PS_ALLOCATION GET_MEMORY_CLOCK_PARAMETERS + +/****************************************************************************/ +// Structures used by GetEngineClockTable +/****************************************************************************/ +typedef struct _GET_ENGINE_CLOCK_PARAMETERS +{ + ULONG ulReturnEngineClock; // current engine speed in 10KHz unit +} GET_ENGINE_CLOCK_PARAMETERS; +#define GET_ENGINE_CLOCK_PS_ALLOCATION GET_ENGINE_CLOCK_PARAMETERS + +/****************************************************************************/ +// Following Structures and constant may be obsolete +/****************************************************************************/ +//Maxium 8 bytes,the data read in will be placed in the parameter space. +//Read operaion successeful when the paramter space is non-zero, otherwise read operation failed +typedef struct _READ_EDID_FROM_HW_I2C_DATA_PARAMETERS +{ + USHORT usPrescale; //Ratio between Engine clock and I2C clock + USHORT usVRAMAddress; //Adress in Frame Buffer where to pace raw EDID + USHORT usStatus; //When use output: lower byte EDID checksum, high byte hardware status + //WHen use input: lower byte as 'byte to read':currently limited to 128byte or 1byte + UCHAR ucSlaveAddr; //Read from which slave + UCHAR ucLineNumber; //Read from which HW assisted line +}READ_EDID_FROM_HW_I2C_DATA_PARAMETERS; +#define READ_EDID_FROM_HW_I2C_DATA_PS_ALLOCATION READ_EDID_FROM_HW_I2C_DATA_PARAMETERS + + +#define ATOM_WRITE_I2C_FORMAT_PSOFFSET_PSDATABYTE 0 +#define ATOM_WRITE_I2C_FORMAT_PSOFFSET_PSTWODATABYTES 1 +#define ATOM_WRITE_I2C_FORMAT_PSCOUNTER_PSOFFSET_IDDATABLOCK 2 +#define ATOM_WRITE_I2C_FORMAT_PSCOUNTER_IDOFFSET_PLUS_IDDATABLOCK 3 +#define ATOM_WRITE_I2C_FORMAT_IDCOUNTER_IDOFFSET_IDDATABLOCK 4 + +typedef struct _WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS +{ + USHORT usPrescale; //Ratio between Engine clock and I2C clock + USHORT usByteOffset; //Write to which byte + //Upper portion of usByteOffset is Format of data + //1bytePS+offsetPS + //2bytesPS+offsetPS + //blockID+offsetPS + //blockID+offsetID + //blockID+counterID+offsetID + UCHAR ucData; //PS data1 + UCHAR ucStatus; //Status byte 1=success, 2=failure, Also is used as PS data2 + UCHAR ucSlaveAddr; //Write to which slave + UCHAR ucLineNumber; //Write from which HW assisted line +}WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS; + +#define WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS + +typedef struct _SET_UP_HW_I2C_DATA_PARAMETERS +{ + USHORT usPrescale; //Ratio between Engine clock and I2C clock + UCHAR ucSlaveAddr; //Write to which slave + UCHAR ucLineNumber; //Write from which HW assisted line +}SET_UP_HW_I2C_DATA_PARAMETERS; + + +/**************************************************************************/ +#define SPEED_FAN_CONTROL_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS + +/****************************************************************************/ +// Structures used by PowerConnectorDetectionTable +/****************************************************************************/ +typedef struct _POWER_CONNECTOR_DETECTION_PARAMETERS +{ + UCHAR ucPowerConnectorStatus; //Used for return value 0: detected, 1:not detected + UCHAR ucPwrBehaviorId; + USHORT usPwrBudget; //how much power currently boot to in unit of watt +}POWER_CONNECTOR_DETECTION_PARAMETERS; + +typedef struct POWER_CONNECTOR_DETECTION_PS_ALLOCATION +{ + UCHAR ucPowerConnectorStatus; //Used for return value 0: detected, 1:not detected + UCHAR ucReserved; + USHORT usPwrBudget; //how much power currently boot to in unit of watt + WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION sReserved; +}POWER_CONNECTOR_DETECTION_PS_ALLOCATION; + +/****************************LVDS SS Command Table Definitions**********************/ + +/****************************************************************************/ +// Structures used by EnableSpreadSpectrumOnPPLLTable +/****************************************************************************/ +typedef struct _ENABLE_LVDS_SS_PARAMETERS +{ + USHORT usSpreadSpectrumPercentage; + UCHAR ucSpreadSpectrumType; //Bit1=0 Down Spread,=1 Center Spread. Bit1=1 Ext. =0 Int. Others:TBD + UCHAR ucSpreadSpectrumStepSize_Delay; //bits3:2 SS_STEP_SIZE; bit 6:4 SS_DELAY + UCHAR ucEnable; //ATOM_ENABLE or ATOM_DISABLE + UCHAR ucPadding[3]; +}ENABLE_LVDS_SS_PARAMETERS; + +//ucTableFormatRevision=1,ucTableContentRevision=2 +typedef struct _ENABLE_LVDS_SS_PARAMETERS_V2 +{ + USHORT usSpreadSpectrumPercentage; + UCHAR ucSpreadSpectrumType; //Bit1=0 Down Spread,=1 Center Spread. Bit1=1 Ext. =0 Int. Others:TBD + UCHAR ucSpreadSpectrumStep; // + UCHAR ucEnable; //ATOM_ENABLE or ATOM_DISABLE + UCHAR ucSpreadSpectrumDelay; + UCHAR ucSpreadSpectrumRange; + UCHAR ucPadding; +}ENABLE_LVDS_SS_PARAMETERS_V2; + +//This new structure is based on ENABLE_LVDS_SS_PARAMETERS but expands to SS on PPLL, so other devices can use SS. +typedef struct _ENABLE_SPREAD_SPECTRUM_ON_PPLL +{ + USHORT usSpreadSpectrumPercentage; + UCHAR ucSpreadSpectrumType; // Bit1=0 Down Spread,=1 Center Spread. Bit1=1 Ext. =0 Int. Others:TBD + UCHAR ucSpreadSpectrumStep; // + UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE + UCHAR ucSpreadSpectrumDelay; + UCHAR ucSpreadSpectrumRange; + UCHAR ucPpll; // ATOM_PPLL1/ATOM_PPLL2 +}ENABLE_SPREAD_SPECTRUM_ON_PPLL; + +#define ENABLE_SPREAD_SPECTRUM_ON_PPLL_PS_ALLOCATION ENABLE_SPREAD_SPECTRUM_ON_PPLL + +/**************************************************************************/ + +typedef struct _SET_PIXEL_CLOCK_PS_ALLOCATION +{ + PIXEL_CLOCK_PARAMETERS sPCLKInput; + ENABLE_SPREAD_SPECTRUM_ON_PPLL sReserved;//Caller doesn't need to init this portion +}SET_PIXEL_CLOCK_PS_ALLOCATION; + +#define ENABLE_VGA_RENDER_PS_ALLOCATION SET_PIXEL_CLOCK_PS_ALLOCATION + +/****************************************************************************/ +// Structures used by ### +/****************************************************************************/ +typedef struct _MEMORY_TRAINING_PARAMETERS +{ + ULONG ulTargetMemoryClock; //In 10Khz unit +}MEMORY_TRAINING_PARAMETERS; +#define MEMORY_TRAINING_PS_ALLOCATION MEMORY_TRAINING_PARAMETERS + + +/****************************LVDS and other encoder command table definitions **********************/ + + +/****************************************************************************/ +// Structures used by LVDSEncoderControlTable (Before DCE30) +// LVTMAEncoderControlTable (Before DCE30) +// TMDSAEncoderControlTable (Before DCE30) +/****************************************************************************/ +typedef struct _LVDS_ENCODER_CONTROL_PARAMETERS +{ + USHORT usPixelClock; // in 10KHz; for bios convenient + UCHAR ucMisc; // bit0=0: Enable single link + // =1: Enable dual link + // Bit1=0: 666RGB + // =1: 888RGB + UCHAR ucAction; // 0: turn off encoder + // 1: setup and turn on encoder +}LVDS_ENCODER_CONTROL_PARAMETERS; + +#define LVDS_ENCODER_CONTROL_PS_ALLOCATION LVDS_ENCODER_CONTROL_PARAMETERS + +#define TMDS1_ENCODER_CONTROL_PARAMETERS LVDS_ENCODER_CONTROL_PARAMETERS +#define TMDS1_ENCODER_CONTROL_PS_ALLOCATION TMDS1_ENCODER_CONTROL_PARAMETERS + +#define TMDS2_ENCODER_CONTROL_PARAMETERS TMDS1_ENCODER_CONTROL_PARAMETERS +#define TMDS2_ENCODER_CONTROL_PS_ALLOCATION TMDS2_ENCODER_CONTROL_PARAMETERS + + +//ucTableFormatRevision=1,ucTableContentRevision=2 +typedef struct _LVDS_ENCODER_CONTROL_PARAMETERS_V2 +{ + USHORT usPixelClock; // in 10KHz; for bios convenient + UCHAR ucMisc; // see PANEL_ENCODER_MISC_xx defintions below + UCHAR ucAction; // 0: turn off encoder + // 1: setup and turn on encoder + UCHAR ucTruncate; // bit0=0: Disable truncate + // =1: Enable truncate + // bit4=0: 666RGB + // =1: 888RGB + UCHAR ucSpatial; // bit0=0: Disable spatial dithering + // =1: Enable spatial dithering + // bit4=0: 666RGB + // =1: 888RGB + UCHAR ucTemporal; // bit0=0: Disable temporal dithering + // =1: Enable temporal dithering + // bit4=0: 666RGB + // =1: 888RGB + // bit5=0: Gray level 2 + // =1: Gray level 4 + UCHAR ucFRC; // bit4=0: 25FRC_SEL pattern E + // =1: 25FRC_SEL pattern F + // bit6:5=0: 50FRC_SEL pattern A + // =1: 50FRC_SEL pattern B + // =2: 50FRC_SEL pattern C + // =3: 50FRC_SEL pattern D + // bit7=0: 75FRC_SEL pattern E + // =1: 75FRC_SEL pattern F +}LVDS_ENCODER_CONTROL_PARAMETERS_V2; + +#define LVDS_ENCODER_CONTROL_PS_ALLOCATION_V2 LVDS_ENCODER_CONTROL_PARAMETERS_V2 + +#define TMDS1_ENCODER_CONTROL_PARAMETERS_V2 LVDS_ENCODER_CONTROL_PARAMETERS_V2 +#define TMDS1_ENCODER_CONTROL_PS_ALLOCATION_V2 TMDS1_ENCODER_CONTROL_PARAMETERS_V2 + +#define TMDS2_ENCODER_CONTROL_PARAMETERS_V2 TMDS1_ENCODER_CONTROL_PARAMETERS_V2 +#define TMDS2_ENCODER_CONTROL_PS_ALLOCATION_V2 TMDS2_ENCODER_CONTROL_PARAMETERS_V2 + +#define LVDS_ENCODER_CONTROL_PARAMETERS_V3 LVDS_ENCODER_CONTROL_PARAMETERS_V2 +#define LVDS_ENCODER_CONTROL_PS_ALLOCATION_V3 LVDS_ENCODER_CONTROL_PARAMETERS_V3 + +#define TMDS1_ENCODER_CONTROL_PARAMETERS_V3 LVDS_ENCODER_CONTROL_PARAMETERS_V3 +#define TMDS1_ENCODER_CONTROL_PS_ALLOCATION_V3 TMDS1_ENCODER_CONTROL_PARAMETERS_V3 + +#define TMDS2_ENCODER_CONTROL_PARAMETERS_V3 LVDS_ENCODER_CONTROL_PARAMETERS_V3 +#define TMDS2_ENCODER_CONTROL_PS_ALLOCATION_V3 TMDS2_ENCODER_CONTROL_PARAMETERS_V3 + +/****************************************************************************/ +// Structures used by ### +/****************************************************************************/ +typedef struct _ENABLE_EXTERNAL_TMDS_ENCODER_PARAMETERS +{ + UCHAR ucEnable; // Enable or Disable External TMDS encoder + UCHAR ucMisc; // Bit0=0:Enable Single link;=1:Enable Dual link;Bit1 {=0:666RGB, =1:888RGB} + UCHAR ucPadding[2]; +}ENABLE_EXTERNAL_TMDS_ENCODER_PARAMETERS; + +typedef struct _ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION +{ + ENABLE_EXTERNAL_TMDS_ENCODER_PARAMETERS sXTmdsEncoder; + WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION sReserved; //Caller doesn't need to init this portion +}ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION; + +#define ENABLE_EXTERNAL_TMDS_ENCODER_PARAMETERS_V2 LVDS_ENCODER_CONTROL_PARAMETERS_V2 + +typedef struct _ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION_V2 +{ + ENABLE_EXTERNAL_TMDS_ENCODER_PARAMETERS_V2 sXTmdsEncoder; + WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION sReserved; //Caller doesn't need to init this portion +}ENABLE_EXTERNAL_TMDS_ENCODER_PS_ALLOCATION_V2; + +typedef struct _EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION +{ + DIG_ENCODER_CONTROL_PARAMETERS sDigEncoder; + WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION sReserved; +}EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION; + +/****************************************************************************/ +// Structures used by DVOEncoderControlTable +/****************************************************************************/ +//ucTableFormatRevision=1,ucTableContentRevision=3 +//ucDVOConfig: +#define DVO_ENCODER_CONFIG_RATE_SEL 0x01 +#define DVO_ENCODER_CONFIG_DDR_SPEED 0x00 +#define DVO_ENCODER_CONFIG_SDR_SPEED 0x01 +#define DVO_ENCODER_CONFIG_OUTPUT_SEL 0x0c +#define DVO_ENCODER_CONFIG_LOW12BIT 0x00 +#define DVO_ENCODER_CONFIG_UPPER12BIT 0x04 +#define DVO_ENCODER_CONFIG_24BIT 0x08 + +typedef struct _DVO_ENCODER_CONTROL_PARAMETERS_V3 +{ + USHORT usPixelClock; + UCHAR ucDVOConfig; + UCHAR ucAction; //ATOM_ENABLE/ATOM_DISABLE/ATOM_HPD_INIT + UCHAR ucReseved[4]; +}DVO_ENCODER_CONTROL_PARAMETERS_V3; +#define DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 DVO_ENCODER_CONTROL_PARAMETERS_V3 + +//ucTableFormatRevision=1 +//ucTableContentRevision=3 structure is not changed but usMisc add bit 1 as another input for +// bit1=0: non-coherent mode +// =1: coherent mode + +//========================================================================================== +//Only change is here next time when changing encoder parameter definitions again! +#define LVDS_ENCODER_CONTROL_PARAMETERS_LAST LVDS_ENCODER_CONTROL_PARAMETERS_V3 +#define LVDS_ENCODER_CONTROL_PS_ALLOCATION_LAST LVDS_ENCODER_CONTROL_PARAMETERS_LAST + +#define TMDS1_ENCODER_CONTROL_PARAMETERS_LAST LVDS_ENCODER_CONTROL_PARAMETERS_V3 +#define TMDS1_ENCODER_CONTROL_PS_ALLOCATION_LAST TMDS1_ENCODER_CONTROL_PARAMETERS_LAST + +#define TMDS2_ENCODER_CONTROL_PARAMETERS_LAST LVDS_ENCODER_CONTROL_PARAMETERS_V3 +#define TMDS2_ENCODER_CONTROL_PS_ALLOCATION_LAST TMDS2_ENCODER_CONTROL_PARAMETERS_LAST + +#define DVO_ENCODER_CONTROL_PARAMETERS_LAST DVO_ENCODER_CONTROL_PARAMETERS +#define DVO_ENCODER_CONTROL_PS_ALLOCATION_LAST DVO_ENCODER_CONTROL_PS_ALLOCATION + +//========================================================================================== +#define PANEL_ENCODER_MISC_DUAL 0x01 +#define PANEL_ENCODER_MISC_COHERENT 0x02 +#define PANEL_ENCODER_MISC_TMDS_LINKB 0x04 +#define PANEL_ENCODER_MISC_HDMI_TYPE 0x08 + +#define PANEL_ENCODER_ACTION_DISABLE ATOM_DISABLE +#define PANEL_ENCODER_ACTION_ENABLE ATOM_ENABLE +#define PANEL_ENCODER_ACTION_COHERENTSEQ (ATOM_ENABLE+1) + +#define PANEL_ENCODER_TRUNCATE_EN 0x01 +#define PANEL_ENCODER_TRUNCATE_DEPTH 0x10 +#define PANEL_ENCODER_SPATIAL_DITHER_EN 0x01 +#define PANEL_ENCODER_SPATIAL_DITHER_DEPTH 0x10 +#define PANEL_ENCODER_TEMPORAL_DITHER_EN 0x01 +#define PANEL_ENCODER_TEMPORAL_DITHER_DEPTH 0x10 +#define PANEL_ENCODER_TEMPORAL_LEVEL_4 0x20 +#define PANEL_ENCODER_25FRC_MASK 0x10 +#define PANEL_ENCODER_25FRC_E 0x00 +#define PANEL_ENCODER_25FRC_F 0x10 +#define PANEL_ENCODER_50FRC_MASK 0x60 +#define PANEL_ENCODER_50FRC_A 0x00 +#define PANEL_ENCODER_50FRC_B 0x20 +#define PANEL_ENCODER_50FRC_C 0x40 +#define PANEL_ENCODER_50FRC_D 0x60 +#define PANEL_ENCODER_75FRC_MASK 0x80 +#define PANEL_ENCODER_75FRC_E 0x00 +#define PANEL_ENCODER_75FRC_F 0x80 + +/****************************************************************************/ +// Structures used by SetVoltageTable +/****************************************************************************/ +#define SET_VOLTAGE_TYPE_ASIC_VDDC 1 +#define SET_VOLTAGE_TYPE_ASIC_MVDDC 2 +#define SET_VOLTAGE_TYPE_ASIC_MVDDQ 3 +#define SET_VOLTAGE_TYPE_ASIC_VDDCI 4 +#define SET_VOLTAGE_INIT_MODE 5 +#define SET_VOLTAGE_GET_MAX_VOLTAGE 6 //Gets the Max. voltage for the soldered Asic + +#define SET_ASIC_VOLTAGE_MODE_ALL_SOURCE 0x1 +#define SET_ASIC_VOLTAGE_MODE_SOURCE_A 0x2 +#define SET_ASIC_VOLTAGE_MODE_SOURCE_B 0x4 + +#define SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE 0x0 +#define SET_ASIC_VOLTAGE_MODE_GET_GPIOVAL 0x1 +#define SET_ASIC_VOLTAGE_MODE_GET_GPIOMASK 0x2 + +typedef struct _SET_VOLTAGE_PARAMETERS +{ + UCHAR ucVoltageType; // To tell which voltage to set up, VDDC/MVDDC/MVDDQ + UCHAR ucVoltageMode; // To set all, to set source A or source B or ... + UCHAR ucVoltageIndex; // An index to tell which voltage level + UCHAR ucReserved; +}SET_VOLTAGE_PARAMETERS; + +typedef struct _SET_VOLTAGE_PARAMETERS_V2 +{ + UCHAR ucVoltageType; // To tell which voltage to set up, VDDC/MVDDC/MVDDQ + UCHAR ucVoltageMode; // Not used, maybe use for state machine for differen power mode + USHORT usVoltageLevel; // real voltage level +}SET_VOLTAGE_PARAMETERS_V2; + +typedef struct _SET_VOLTAGE_PS_ALLOCATION +{ + SET_VOLTAGE_PARAMETERS sASICSetVoltage; + WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION sReserved; +}SET_VOLTAGE_PS_ALLOCATION; + +/****************************************************************************/ +// Structures used by TVEncoderControlTable +/****************************************************************************/ +typedef struct _TV_ENCODER_CONTROL_PARAMETERS +{ + USHORT usPixelClock; // in 10KHz; for bios convenient + UCHAR ucTvStandard; // See definition "ATOM_TV_NTSC ..." + UCHAR ucAction; // 0: turn off encoder + // 1: setup and turn on encoder +}TV_ENCODER_CONTROL_PARAMETERS; + +typedef struct _TV_ENCODER_CONTROL_PS_ALLOCATION +{ + TV_ENCODER_CONTROL_PARAMETERS sTVEncoder; + WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION sReserved; // Don't set this one +}TV_ENCODER_CONTROL_PS_ALLOCATION; + +//==============================Data Table Portion==================================== + +#ifdef UEFI_BUILD + #define UTEMP USHORT + #define USHORT void* +#endif + +/****************************************************************************/ +// Structure used in Data.mtb +/****************************************************************************/ +typedef struct _ATOM_MASTER_LIST_OF_DATA_TABLES +{ + USHORT UtilityPipeLine; // Offest for the utility to get parser info,Don't change this position! + USHORT MultimediaCapabilityInfo; // Only used by MM Lib,latest version 1.1, not configuable from Bios, need to include the table to build Bios + USHORT MultimediaConfigInfo; // Only used by MM Lib,latest version 2.1, not configuable from Bios, need to include the table to build Bios + USHORT StandardVESA_Timing; // Only used by Bios + USHORT FirmwareInfo; // Shared by various SW components,latest version 1.4 + USHORT DAC_Info; // Will be obsolete from R600 + USHORT LVDS_Info; // Shared by various SW components,latest version 1.1 + USHORT TMDS_Info; // Will be obsolete from R600 + USHORT AnalogTV_Info; // Shared by various SW components,latest version 1.1 + USHORT SupportedDevicesInfo; // Will be obsolete from R600 + USHORT GPIO_I2C_Info; // Shared by various SW components,latest version 1.2 will be used from R600 + USHORT VRAM_UsageByFirmware; // Shared by various SW components,latest version 1.3 will be used from R600 + USHORT GPIO_Pin_LUT; // Shared by various SW components,latest version 1.1 + USHORT VESA_ToInternalModeLUT; // Only used by Bios + USHORT ComponentVideoInfo; // Shared by various SW components,latest version 2.1 will be used from R600 + USHORT PowerPlayInfo; // Shared by various SW components,latest version 2.1,new design from R600 + USHORT CompassionateData; // Will be obsolete from R600 + USHORT SaveRestoreInfo; // Only used by Bios + USHORT PPLL_SS_Info; // Shared by various SW components,latest version 1.2, used to call SS_Info, change to new name because of int ASIC SS info + USHORT OemInfo; // Defined and used by external SW, should be obsolete soon + USHORT XTMDS_Info; // Will be obsolete from R600 + USHORT MclkSS_Info; // Shared by various SW components,latest version 1.1, only enabled when ext SS chip is used + USHORT Object_Header; // Shared by various SW components,latest version 1.1 + USHORT IndirectIOAccess; // Only used by Bios,this table position can't change at all!! + USHORT MC_InitParameter; // Only used by command table + USHORT ASIC_VDDC_Info; // Will be obsolete from R600 + USHORT ASIC_InternalSS_Info; // New tabel name from R600, used to be called "ASIC_MVDDC_Info" + USHORT TV_VideoMode; // Only used by command table + USHORT VRAM_Info; // Only used by command table, latest version 1.3 + USHORT MemoryTrainingInfo; // Used for VBIOS and Diag utility for memory training purpose since R600. the new table rev start from 2.1 + USHORT IntegratedSystemInfo; // Shared by various SW components + USHORT ASIC_ProfilingInfo; // New table name from R600, used to be called "ASIC_VDDCI_Info" for pre-R600 + USHORT VoltageObjectInfo; // Shared by various SW components, latest version 1.1 + USHORT PowerSourceInfo; // Shared by various SW components, latest versoin 1.1 +}ATOM_MASTER_LIST_OF_DATA_TABLES; + +#ifdef UEFI_BUILD + #define USHORT UTEMP +#endif + +typedef struct _ATOM_MASTER_DATA_TABLE +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_MASTER_LIST_OF_DATA_TABLES ListOfDataTables; +}ATOM_MASTER_DATA_TABLE; + +/****************************************************************************/ +// Structure used in MultimediaCapabilityInfoTable +/****************************************************************************/ +typedef struct _ATOM_MULTIMEDIA_CAPABILITY_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulSignature; // HW info table signature string "$ATI" + UCHAR ucI2C_Type; // I2C type (normal GP_IO, ImpactTV GP_IO, Dedicated I2C pin, etc) + UCHAR ucTV_OutInfo; // Type of TV out supported (3:0) and video out crystal frequency (6:4) and TV data port (7) + UCHAR ucVideoPortInfo; // Provides the video port capabilities + UCHAR ucHostPortInfo; // Provides host port configuration information +}ATOM_MULTIMEDIA_CAPABILITY_INFO; + +/****************************************************************************/ +// Structure used in MultimediaConfigInfoTable +/****************************************************************************/ +typedef struct _ATOM_MULTIMEDIA_CONFIG_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulSignature; // MM info table signature sting "$MMT" + UCHAR ucTunerInfo; // Type of tuner installed on the adapter (4:0) and video input for tuner (7:5) + UCHAR ucAudioChipInfo; // List the audio chip type (3:0) product type (4) and OEM revision (7:5) + UCHAR ucProductID; // Defines as OEM ID or ATI board ID dependent on product type setting + UCHAR ucMiscInfo1; // Tuner voltage (1:0) HW teletext support (3:2) FM audio decoder (5:4) reserved (6) audio scrambling (7) + UCHAR ucMiscInfo2; // I2S input config (0) I2S output config (1) I2S Audio Chip (4:2) SPDIF Output Config (5) reserved (7:6) + UCHAR ucMiscInfo3; // Video Decoder Type (3:0) Video In Standard/Crystal (7:4) + UCHAR ucMiscInfo4; // Video Decoder Host Config (2:0) reserved (7:3) + UCHAR ucVideoInput0Info;// Video Input 0 Type (1:0) F/B setting (2) physical connector ID (5:3) reserved (7:6) + UCHAR ucVideoInput1Info;// Video Input 1 Type (1:0) F/B setting (2) physical connector ID (5:3) reserved (7:6) + UCHAR ucVideoInput2Info;// Video Input 2 Type (1:0) F/B setting (2) physical connector ID (5:3) reserved (7:6) + UCHAR ucVideoInput3Info;// Video Input 3 Type (1:0) F/B setting (2) physical connector ID (5:3) reserved (7:6) + UCHAR ucVideoInput4Info;// Video Input 4 Type (1:0) F/B setting (2) physical connector ID (5:3) reserved (7:6) +}ATOM_MULTIMEDIA_CONFIG_INFO; + + +/****************************************************************************/ +// Structures used in FirmwareInfoTable +/****************************************************************************/ + +// usBIOSCapability Defintion: +// Bit 0 = 0: Bios image is not Posted, =1:Bios image is Posted; +// Bit 1 = 0: Dual CRTC is not supported, =1: Dual CRTC is supported; +// Bit 2 = 0: Extended Desktop is not supported, =1: Extended Desktop is supported; +// Others: Reserved +#define ATOM_BIOS_INFO_ATOM_FIRMWARE_POSTED 0x0001 +#define ATOM_BIOS_INFO_DUAL_CRTC_SUPPORT 0x0002 +#define ATOM_BIOS_INFO_EXTENDED_DESKTOP_SUPPORT 0x0004 +#define ATOM_BIOS_INFO_MEMORY_CLOCK_SS_SUPPORT 0x0008 +#define ATOM_BIOS_INFO_ENGINE_CLOCK_SS_SUPPORT 0x0010 +#define ATOM_BIOS_INFO_BL_CONTROLLED_BY_GPU 0x0020 +#define ATOM_BIOS_INFO_WMI_SUPPORT 0x0040 +#define ATOM_BIOS_INFO_PPMODE_ASSIGNGED_BY_SYSTEM 0x0080 +#define ATOM_BIOS_INFO_HYPERMEMORY_SUPPORT 0x0100 +#define ATOM_BIOS_INFO_HYPERMEMORY_SIZE_MASK 0x1E00 +#define ATOM_BIOS_INFO_VPOST_WITHOUT_FIRST_MODE_SET 0x2000 +#define ATOM_BIOS_INFO_BIOS_SCRATCH6_SCL2_REDEFINE 0x4000 + + +#ifndef _H2INC + +//Please don't add or expand this bitfield structure below, this one will retire soon.! +typedef struct _ATOM_FIRMWARE_CAPABILITY +{ + USHORT FirmwarePosted:1; + USHORT DualCRTC_Support:1; + USHORT ExtendedDesktopSupport:1; + USHORT MemoryClockSS_Support:1; + USHORT EngineClockSS_Support:1; + USHORT GPUControlsBL:1; + USHORT WMI_SUPPORT:1; + USHORT PPMode_Assigned:1; + USHORT HyperMemory_Support:1; + USHORT HyperMemory_Size:4; + USHORT Reserved:3; +}ATOM_FIRMWARE_CAPABILITY; + +typedef union _ATOM_FIRMWARE_CAPABILITY_ACCESS +{ + ATOM_FIRMWARE_CAPABILITY sbfAccess; + USHORT susAccess; +}ATOM_FIRMWARE_CAPABILITY_ACCESS; + +#else + +typedef union _ATOM_FIRMWARE_CAPABILITY_ACCESS +{ + USHORT susAccess; +}ATOM_FIRMWARE_CAPABILITY_ACCESS; + +#endif + +typedef struct _ATOM_FIRMWARE_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulFirmwareRevision; + ULONG ulDefaultEngineClock; //In 10Khz unit + ULONG ulDefaultMemoryClock; //In 10Khz unit + ULONG ulDriverTargetEngineClock; //In 10Khz unit + ULONG ulDriverTargetMemoryClock; //In 10Khz unit + ULONG ulMaxEngineClockPLL_Output; //In 10Khz unit + ULONG ulMaxMemoryClockPLL_Output; //In 10Khz unit + ULONG ulMaxPixelClockPLL_Output; //In 10Khz unit + ULONG ulASICMaxEngineClock; //In 10Khz unit + ULONG ulASICMaxMemoryClock; //In 10Khz unit + UCHAR ucASICMaxTemperature; + UCHAR ucPadding[3]; //Don't use them + ULONG aulReservedForBIOS[3]; //Don't use them + USHORT usMinEngineClockPLL_Input; //In 10Khz unit + USHORT usMaxEngineClockPLL_Input; //In 10Khz unit + USHORT usMinEngineClockPLL_Output; //In 10Khz unit + USHORT usMinMemoryClockPLL_Input; //In 10Khz unit + USHORT usMaxMemoryClockPLL_Input; //In 10Khz unit + USHORT usMinMemoryClockPLL_Output; //In 10Khz unit + USHORT usMaxPixelClock; //In 10Khz unit, Max. Pclk + USHORT usMinPixelClockPLL_Input; //In 10Khz unit + USHORT usMaxPixelClockPLL_Input; //In 10Khz unit + USHORT usMinPixelClockPLL_Output; //In 10Khz unit, the definitions above can't change!!! + ATOM_FIRMWARE_CAPABILITY_ACCESS usFirmwareCapability; + USHORT usReferenceClock; //In 10Khz unit + USHORT usPM_RTS_Location; //RTS PM4 starting location in ROM in 1Kb unit + UCHAR ucPM_RTS_StreamSize; //RTS PM4 packets in Kb unit + UCHAR ucDesign_ID; //Indicate what is the board design + UCHAR ucMemoryModule_ID; //Indicate what is the board design +}ATOM_FIRMWARE_INFO; + +typedef struct _ATOM_FIRMWARE_INFO_V1_2 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulFirmwareRevision; + ULONG ulDefaultEngineClock; //In 10Khz unit + ULONG ulDefaultMemoryClock; //In 10Khz unit + ULONG ulDriverTargetEngineClock; //In 10Khz unit + ULONG ulDriverTargetMemoryClock; //In 10Khz unit + ULONG ulMaxEngineClockPLL_Output; //In 10Khz unit + ULONG ulMaxMemoryClockPLL_Output; //In 10Khz unit + ULONG ulMaxPixelClockPLL_Output; //In 10Khz unit + ULONG ulASICMaxEngineClock; //In 10Khz unit + ULONG ulASICMaxMemoryClock; //In 10Khz unit + UCHAR ucASICMaxTemperature; + UCHAR ucMinAllowedBL_Level; + UCHAR ucPadding[2]; //Don't use them + ULONG aulReservedForBIOS[2]; //Don't use them + ULONG ulMinPixelClockPLL_Output; //In 10Khz unit + USHORT usMinEngineClockPLL_Input; //In 10Khz unit + USHORT usMaxEngineClockPLL_Input; //In 10Khz unit + USHORT usMinEngineClockPLL_Output; //In 10Khz unit + USHORT usMinMemoryClockPLL_Input; //In 10Khz unit + USHORT usMaxMemoryClockPLL_Input; //In 10Khz unit + USHORT usMinMemoryClockPLL_Output; //In 10Khz unit + USHORT usMaxPixelClock; //In 10Khz unit, Max. Pclk + USHORT usMinPixelClockPLL_Input; //In 10Khz unit + USHORT usMaxPixelClockPLL_Input; //In 10Khz unit + USHORT usMinPixelClockPLL_Output; //In 10Khz unit - lower 16bit of ulMinPixelClockPLL_Output + ATOM_FIRMWARE_CAPABILITY_ACCESS usFirmwareCapability; + USHORT usReferenceClock; //In 10Khz unit + USHORT usPM_RTS_Location; //RTS PM4 starting location in ROM in 1Kb unit + UCHAR ucPM_RTS_StreamSize; //RTS PM4 packets in Kb unit + UCHAR ucDesign_ID; //Indicate what is the board design + UCHAR ucMemoryModule_ID; //Indicate what is the board design +}ATOM_FIRMWARE_INFO_V1_2; + +typedef struct _ATOM_FIRMWARE_INFO_V1_3 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulFirmwareRevision; + ULONG ulDefaultEngineClock; //In 10Khz unit + ULONG ulDefaultMemoryClock; //In 10Khz unit + ULONG ulDriverTargetEngineClock; //In 10Khz unit + ULONG ulDriverTargetMemoryClock; //In 10Khz unit + ULONG ulMaxEngineClockPLL_Output; //In 10Khz unit + ULONG ulMaxMemoryClockPLL_Output; //In 10Khz unit + ULONG ulMaxPixelClockPLL_Output; //In 10Khz unit + ULONG ulASICMaxEngineClock; //In 10Khz unit + ULONG ulASICMaxMemoryClock; //In 10Khz unit + UCHAR ucASICMaxTemperature; + UCHAR ucMinAllowedBL_Level; + UCHAR ucPadding[2]; //Don't use them + ULONG aulReservedForBIOS; //Don't use them + ULONG ul3DAccelerationEngineClock;//In 10Khz unit + ULONG ulMinPixelClockPLL_Output; //In 10Khz unit + USHORT usMinEngineClockPLL_Input; //In 10Khz unit + USHORT usMaxEngineClockPLL_Input; //In 10Khz unit + USHORT usMinEngineClockPLL_Output; //In 10Khz unit + USHORT usMinMemoryClockPLL_Input; //In 10Khz unit + USHORT usMaxMemoryClockPLL_Input; //In 10Khz unit + USHORT usMinMemoryClockPLL_Output; //In 10Khz unit + USHORT usMaxPixelClock; //In 10Khz unit, Max. Pclk + USHORT usMinPixelClockPLL_Input; //In 10Khz unit + USHORT usMaxPixelClockPLL_Input; //In 10Khz unit + USHORT usMinPixelClockPLL_Output; //In 10Khz unit - lower 16bit of ulMinPixelClockPLL_Output + ATOM_FIRMWARE_CAPABILITY_ACCESS usFirmwareCapability; + USHORT usReferenceClock; //In 10Khz unit + USHORT usPM_RTS_Location; //RTS PM4 starting location in ROM in 1Kb unit + UCHAR ucPM_RTS_StreamSize; //RTS PM4 packets in Kb unit + UCHAR ucDesign_ID; //Indicate what is the board design + UCHAR ucMemoryModule_ID; //Indicate what is the board design +}ATOM_FIRMWARE_INFO_V1_3; + +typedef struct _ATOM_FIRMWARE_INFO_V1_4 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulFirmwareRevision; + ULONG ulDefaultEngineClock; //In 10Khz unit + ULONG ulDefaultMemoryClock; //In 10Khz unit + ULONG ulDriverTargetEngineClock; //In 10Khz unit + ULONG ulDriverTargetMemoryClock; //In 10Khz unit + ULONG ulMaxEngineClockPLL_Output; //In 10Khz unit + ULONG ulMaxMemoryClockPLL_Output; //In 10Khz unit + ULONG ulMaxPixelClockPLL_Output; //In 10Khz unit + ULONG ulASICMaxEngineClock; //In 10Khz unit + ULONG ulASICMaxMemoryClock; //In 10Khz unit + UCHAR ucASICMaxTemperature; + UCHAR ucMinAllowedBL_Level; + USHORT usBootUpVDDCVoltage; //In MV unit + USHORT usLcdMinPixelClockPLL_Output; // In MHz unit + USHORT usLcdMaxPixelClockPLL_Output; // In MHz unit + ULONG ul3DAccelerationEngineClock;//In 10Khz unit + ULONG ulMinPixelClockPLL_Output; //In 10Khz unit + USHORT usMinEngineClockPLL_Input; //In 10Khz unit + USHORT usMaxEngineClockPLL_Input; //In 10Khz unit + USHORT usMinEngineClockPLL_Output; //In 10Khz unit + USHORT usMinMemoryClockPLL_Input; //In 10Khz unit + USHORT usMaxMemoryClockPLL_Input; //In 10Khz unit + USHORT usMinMemoryClockPLL_Output; //In 10Khz unit + USHORT usMaxPixelClock; //In 10Khz unit, Max. Pclk + USHORT usMinPixelClockPLL_Input; //In 10Khz unit + USHORT usMaxPixelClockPLL_Input; //In 10Khz unit + USHORT usMinPixelClockPLL_Output; //In 10Khz unit - lower 16bit of ulMinPixelClockPLL_Output + ATOM_FIRMWARE_CAPABILITY_ACCESS usFirmwareCapability; + USHORT usReferenceClock; //In 10Khz unit + USHORT usPM_RTS_Location; //RTS PM4 starting location in ROM in 1Kb unit + UCHAR ucPM_RTS_StreamSize; //RTS PM4 packets in Kb unit + UCHAR ucDesign_ID; //Indicate what is the board design + UCHAR ucMemoryModule_ID; //Indicate what is the board design +}ATOM_FIRMWARE_INFO_V1_4; + +#define ATOM_FIRMWARE_INFO_LAST ATOM_FIRMWARE_INFO_V1_4 + +/****************************************************************************/ +// Structures used in IntegratedSystemInfoTable +/****************************************************************************/ +#define IGP_CAP_FLAG_DYNAMIC_CLOCK_EN 0x2 +#define IGP_CAP_FLAG_AC_CARD 0x4 +#define IGP_CAP_FLAG_SDVO_CARD 0x8 +#define IGP_CAP_FLAG_POSTDIV_BY_2_MODE 0x10 + +typedef struct _ATOM_INTEGRATED_SYSTEM_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulBootUpEngineClock; //in 10kHz unit + ULONG ulBootUpMemoryClock; //in 10kHz unit + ULONG ulMaxSystemMemoryClock; //in 10kHz unit + ULONG ulMinSystemMemoryClock; //in 10kHz unit + UCHAR ucNumberOfCyclesInPeriodHi; + UCHAR ucLCDTimingSel; //=0:not valid.!=0 sel this timing descriptor from LCD EDID. + USHORT usReserved1; + USHORT usInterNBVoltageLow; //An intermidiate PMW value to set the voltage + USHORT usInterNBVoltageHigh; //Another intermidiate PMW value to set the voltage + ULONG ulReserved[2]; + + USHORT usFSBClock; //In MHz unit + USHORT usCapabilityFlag; //Bit0=1 indicates the fake HDMI support,Bit1=0/1 for Dynamic clocking dis/enable + //Bit[3:2]== 0:No PCIE card, 1:AC card, 2:SDVO card + //Bit[4]==1: P/2 mode, ==0: P/1 mode + USHORT usPCIENBCfgReg7; //bit[7:0]=MUX_Sel, bit[9:8]=MUX_SEL_LEVEL2, bit[10]=Lane_Reversal + USHORT usK8MemoryClock; //in MHz unit + USHORT usK8SyncStartDelay; //in 0.01 us unit + USHORT usK8DataReturnTime; //in 0.01 us unit + UCHAR ucMaxNBVoltage; + UCHAR ucMinNBVoltage; + UCHAR ucMemoryType; //[7:4]=1:DDR1;=2:DDR2;=3:DDR3.[3:0] is reserved + UCHAR ucNumberOfCyclesInPeriod; //CG.FVTHROT_PWM_CTRL_REG0.NumberOfCyclesInPeriod + UCHAR ucStartingPWM_HighTime; //CG.FVTHROT_PWM_CTRL_REG0.StartingPWM_HighTime + UCHAR ucHTLinkWidth; //16 bit vs. 8 bit + UCHAR ucMaxNBVoltageHigh; + UCHAR ucMinNBVoltageHigh; +}ATOM_INTEGRATED_SYSTEM_INFO; + +/* Explanation on entries in ATOM_INTEGRATED_SYSTEM_INFO +ulBootUpMemoryClock: For Intel IGP,it's the UMA system memory clock + For AMD IGP,it's 0 if no SidePort memory installed or it's the boot-up SidePort memory clock +ulMaxSystemMemoryClock: For Intel IGP,it's the Max freq from memory SPD if memory runs in ASYNC mode or otherwise (SYNC mode) it's 0 + For AMD IGP,for now this can be 0 +ulMinSystemMemoryClock: For Intel IGP,it's 133MHz if memory runs in ASYNC mode or otherwise (SYNC mode) it's 0 + For AMD IGP,for now this can be 0 + +usFSBClock: For Intel IGP,it's FSB Freq + For AMD IGP,it's HT Link Speed + +usK8MemoryClock: For AMD IGP only. For RevF CPU, set it to 200 +usK8SyncStartDelay: For AMD IGP only. Memory access latency in K8, required for watermark calculation +usK8DataReturnTime: For AMD IGP only. Memory access latency in K8, required for watermark calculation + +VC:Voltage Control +ucMaxNBVoltage: Voltage regulator dependent PWM value. Low 8 bits of the value for the max voltage.Set this one to 0xFF if VC without PWM. Set this to 0x0 if no VC at all. +ucMinNBVoltage: Voltage regulator dependent PWM value. Low 8 bits of the value for the min voltage.Set this one to 0x00 if VC without PWM or no VC at all. + +ucNumberOfCyclesInPeriod: Indicate how many cycles when PWM duty is 100%. low 8 bits of the value. +ucNumberOfCyclesInPeriodHi: Indicate how many cycles when PWM duty is 100%. high 8 bits of the value.If the PWM has an inverter,set bit [7]==1,otherwise set it 0 + +ucMaxNBVoltageHigh: Voltage regulator dependent PWM value. High 8 bits of the value for the max voltage.Set this one to 0xFF if VC without PWM. Set this to 0x0 if no VC at all. +ucMinNBVoltageHigh: Voltage regulator dependent PWM value. High 8 bits of the value for the min voltage.Set this one to 0x00 if VC without PWM or no VC at all. + + +usInterNBVoltageLow: Voltage regulator dependent PWM value. The value makes the the voltage >=Min NB voltage but <=InterNBVoltageHigh. Set this to 0x0000 if VC without PWM or no VC at all. +usInterNBVoltageHigh: Voltage regulator dependent PWM value. The value makes the the voltage >=InterNBVoltageLow but <=Max NB voltage.Set this to 0x0000 if VC without PWM or no VC at all. +*/ + + +/* +The following IGP table is introduced from RS780, which is supposed to be put by SBIOS in FB before IGP VBIOS starts VPOST; +Then VBIOS will copy the whole structure to its image so all GPU SW components can access this data structure to get whatever they need. +The enough reservation should allow us to never change table revisions. Whenever needed, a GPU SW component can use reserved portion for new data entries. + +SW components can access the IGP system infor structure in the same way as before +*/ + + +typedef struct _ATOM_INTEGRATED_SYSTEM_INFO_V2 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ULONG ulBootUpEngineClock; //in 10kHz unit + ULONG ulReserved1[2]; //must be 0x0 for the reserved + ULONG ulBootUpUMAClock; //in 10kHz unit + ULONG ulBootUpSidePortClock; //in 10kHz unit + ULONG ulMinSidePortClock; //in 10kHz unit + ULONG ulReserved2[6]; //must be 0x0 for the reserved + ULONG ulSystemConfig; //see explanation below + ULONG ulBootUpReqDisplayVector; + ULONG ulOtherDisplayMisc; + ULONG ulDDISlot1Config; + ULONG ulDDISlot2Config; + UCHAR ucMemoryType; //[3:0]=1:DDR1;=2:DDR2;=3:DDR3.[7:4] is reserved + UCHAR ucUMAChannelNumber; + UCHAR ucDockingPinBit; + UCHAR ucDockingPinPolarity; + ULONG ulDockingPinCFGInfo; + ULONG ulCPUCapInfo; + USHORT usNumberOfCyclesInPeriod; + USHORT usMaxNBVoltage; + USHORT usMinNBVoltage; + USHORT usBootUpNBVoltage; + ULONG ulHTLinkFreq; //in 10Khz + USHORT usMinHTLinkWidth; + USHORT usMaxHTLinkWidth; + USHORT usUMASyncStartDelay; + USHORT usUMADataReturnTime; + USHORT usLinkStatusZeroTime; + USHORT usReserved; + ULONG ulHighVoltageHTLinkFreq; // in 10Khz + ULONG ulLowVoltageHTLinkFreq; // in 10Khz + USHORT usMaxUpStreamHTLinkWidth; + USHORT usMaxDownStreamHTLinkWidth; + USHORT usMinUpStreamHTLinkWidth; + USHORT usMinDownStreamHTLinkWidth; + ULONG ulReserved3[97]; //must be 0x0 +}ATOM_INTEGRATED_SYSTEM_INFO_V2; + +/* +ulBootUpEngineClock: Boot-up Engine Clock in 10Khz; +ulBootUpUMAClock: Boot-up UMA Clock in 10Khz; it must be 0x0 when UMA is not present +ulBootUpSidePortClock: Boot-up SidePort Clock in 10Khz; it must be 0x0 when SidePort Memory is not present,this could be equal to or less than maximum supported Sideport memory clock + +ulSystemConfig: +Bit[0]=1: PowerExpress mode =0 Non-PowerExpress mode; +Bit[1]=1: system boots up at AMD overdrived state or user customized mode. In this case, driver will just stick to this boot-up mode. No other PowerPlay state + =0: system boots up at driver control state. Power state depends on PowerPlay table. +Bit[2]=1: PWM method is used on NB voltage control. =0: GPIO method is used. +Bit[3]=1: Only one power state(Performance) will be supported. + =0: Multiple power states supported from PowerPlay table. +Bit[4]=1: CLMC is supported and enabled on current system. + =0: CLMC is not supported or enabled on current system. SBIOS need to support HT link/freq change through ATIF interface. +Bit[5]=1: Enable CDLW for all driver control power states. Max HT width is from SBIOS, while Min HT width is determined by display requirement. + =0: CDLW is disabled. If CLMC is enabled case, Min HT width will be set equal to Max HT width. If CLMC disabled case, Max HT width will be applied. +Bit[6]=1: High Voltage requested for all power states. In this case, voltage will be forced at 1.1v and powerplay table voltage drop/throttling request will be ignored. + =0: Voltage settings is determined by powerplay table. +Bit[7]=1: Enable CLMC as hybrid Mode. CDLD and CILR will be disabled in this case and we're using legacy C1E. This is workaround for CPU(Griffin) performance issue. + =0: Enable CLMC as regular mode, CDLD and CILR will be enabled. + +ulBootUpReqDisplayVector: This dword is a bit vector indicates what display devices are requested during boot-up. Refer to ATOM_DEVICE_xxx_SUPPORT for the bit vector definitions. + +ulOtherDisplayMisc: [15:8]- Bootup LCD Expansion selection; 0-center, 1-full panel size expansion; + [7:0] - BootupTV standard selection; This is a bit vector to indicate what TV standards are supported by the system. Refer to ucTVSuppportedStd definition; + +ulDDISlot1Config: Describes the PCIE lane configuration on this DDI PCIE slot (ADD2 card) or connector (Mobile design). + [3:0] - Bit vector to indicate PCIE lane config of the DDI slot/connector on chassis (bit 0=1 lane 3:0; bit 1=1 lane 7:4; bit 2=1 lane 11:8; bit 3=1 lane 15:12) + [7:4] - Bit vector to indicate PCIE lane config of the same DDI slot/connector on docking station (bit 0=1 lane 3:0; bit 1=1 lane 7:4; bit 2=1 lane 11:8; bit 3=1 lane 15:12) + [15:8] - Lane configuration attribute; + [23:16]- Connector type, possible value: + CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D + CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D + CONNECTOR_OBJECT_ID_HDMI_TYPE_A + CONNECTOR_OBJECT_ID_DISPLAYPORT + [31:24]- Reserved + +ulDDISlot2Config: Same as Slot1. +ucMemoryType: SidePort memory type, set it to 0x0 when Sideport memory is not installed. Driver needs this info to change sideport memory clock. Not for display in CCC. +For IGP, Hypermemory is the only memory type showed in CCC. + +ucUMAChannelNumber: how many channels for the UMA; + +ulDockingPinCFGInfo: [15:0]-Bus/Device/Function # to CFG to read this Docking Pin; [31:16]-reg offset in CFG to read this pin +ucDockingPinBit: which bit in this register to read the pin status; +ucDockingPinPolarity:Polarity of the pin when docked; + +ulCPUCapInfo: [7:0]=1:Griffin;[7:0]=2:Greyhound;[7:0]=3:K8, other bits reserved for now and must be 0x0 + +usNumberOfCyclesInPeriod:Indicate how many cycles when PWM duty is 100%. +usMaxNBVoltage:Voltage regulator dependent PWM value.Set this one to 0xFF if VC without PWM. Set this to 0x0 if no VC at all. + +usMaxNBVoltage:Max. voltage control value in either PWM or GPIO mode. +usMinNBVoltage:Min. voltage control value in either PWM or GPIO mode. + GPIO mode: both usMaxNBVoltage & usMinNBVoltage have a valid value ulSystemConfig.SYSTEM_CONFIG_USE_PWM_ON_VOLTAGE=0 + PWM mode: both usMaxNBVoltage & usMinNBVoltage have a valid value ulSystemConfig.SYSTEM_CONFIG_USE_PWM_ON_VOLTAGE=1 + GPU SW don't control mode: usMaxNBVoltage & usMinNBVoltage=0 and no care about ulSystemConfig.SYSTEM_CONFIG_USE_PWM_ON_VOLTAGE + + +ulHTLinkFreq: Bootup HT link Frequency in 10Khz. +usMinHTLinkWidth: Bootup minimum HT link width. If CDLW disabled, this is equal to usMaxHTLinkWidth. + If CDLW enabled, both upstream and downstream width should be the same during bootup. +usMaxHTLinkWidth: Bootup maximum HT link width. If CDLW disabled, this is equal to usMinHTLinkWidth. + If CDLW enabled, both upstream and downstream width should be the same during bootup. + +usUMASyncStartDelay: Memory access latency, required for watermark calculation +usUMADataReturnTime: Memory access latency, required for watermark calculation +usLinkStatusZeroTime:Memory access latency required for watermark calculation, set this to 0x0 for K8 CPU, set a proper value in 0.01 the unit of us +for Griffin or Greyhound. SBIOS needs to convert to actual time by: + if T0Ttime [5:4]=00b, then usLinkStatusZeroTime=T0Ttime [3:0]*0.1us (0.0 to 1.5us) + if T0Ttime [5:4]=01b, then usLinkStatusZeroTime=T0Ttime [3:0]*0.5us (0.0 to 7.5us) + if T0Ttime [5:4]=10b, then usLinkStatusZeroTime=T0Ttime [3:0]*2.0us (0.0 to 30us) + if T0Ttime [5:4]=11b, and T0Ttime [3:0]=0x0 to 0xa, then usLinkStatusZeroTime=T0Ttime [3:0]*20us (0.0 to 200us) + +ulHighVoltageHTLinkFreq: HT link frequency for power state with low voltage. If boot up runs in HT1, this must be 0. + This must be less than or equal to ulHTLinkFreq(bootup frequency). +ulLowVoltageHTLinkFreq: HT link frequency for power state with low voltage or voltage scaling 1.0v~1.1v. If boot up runs in HT1, this must be 0. + This must be less than or equal to ulHighVoltageHTLinkFreq. + +usMaxUpStreamHTLinkWidth: Asymmetric link width support in the future, to replace usMaxHTLinkWidth. Not used for now. +usMaxDownStreamHTLinkWidth: same as above. +usMinUpStreamHTLinkWidth: Asymmetric link width support in the future, to replace usMinHTLinkWidth. Not used for now. +usMinDownStreamHTLinkWidth: same as above. +*/ + + +#define SYSTEM_CONFIG_POWEREXPRESS_ENABLE 0x00000001 +#define SYSTEM_CONFIG_RUN_AT_OVERDRIVE_ENGINE 0x00000002 +#define SYSTEM_CONFIG_USE_PWM_ON_VOLTAGE 0x00000004 +#define SYSTEM_CONFIG_PERFORMANCE_POWERSTATE_ONLY 0x00000008 +#define SYSTEM_CONFIG_CLMC_ENABLED 0x00000010 +#define SYSTEM_CONFIG_CDLW_ENABLED 0x00000020 +#define SYSTEM_CONFIG_HIGH_VOLTAGE_REQUESTED 0x00000040 +#define SYSTEM_CONFIG_CLMC_HYBRID_MODE_ENABLED 0x00000080 + +#define IGP_DDI_SLOT_LANE_CONFIG_MASK 0x000000FF + +#define b0IGP_DDI_SLOT_LANE_MAP_MASK 0x0F +#define b0IGP_DDI_SLOT_DOCKING_LANE_MAP_MASK 0xF0 +#define b0IGP_DDI_SLOT_CONFIG_LANE_0_3 0x01 +#define b0IGP_DDI_SLOT_CONFIG_LANE_4_7 0x02 +#define b0IGP_DDI_SLOT_CONFIG_LANE_8_11 0x04 +#define b0IGP_DDI_SLOT_CONFIG_LANE_12_15 0x08 + +#define IGP_DDI_SLOT_ATTRIBUTE_MASK 0x0000FF00 +#define IGP_DDI_SLOT_CONFIG_REVERSED 0x00000100 +#define b1IGP_DDI_SLOT_CONFIG_REVERSED 0x01 + +#define IGP_DDI_SLOT_CONNECTOR_TYPE_MASK 0x00FF0000 + +#define ATOM_CRT_INT_ENCODER1_INDEX 0x00000000 +#define ATOM_LCD_INT_ENCODER1_INDEX 0x00000001 +#define ATOM_TV_INT_ENCODER1_INDEX 0x00000002 +#define ATOM_DFP_INT_ENCODER1_INDEX 0x00000003 +#define ATOM_CRT_INT_ENCODER2_INDEX 0x00000004 +#define ATOM_LCD_EXT_ENCODER1_INDEX 0x00000005 +#define ATOM_TV_EXT_ENCODER1_INDEX 0x00000006 +#define ATOM_DFP_EXT_ENCODER1_INDEX 0x00000007 +#define ATOM_CV_INT_ENCODER1_INDEX 0x00000008 +#define ATOM_DFP_INT_ENCODER2_INDEX 0x00000009 +#define ATOM_CRT_EXT_ENCODER1_INDEX 0x0000000A +#define ATOM_CV_EXT_ENCODER1_INDEX 0x0000000B +#define ATOM_DFP_INT_ENCODER3_INDEX 0x0000000C +#define ATOM_DFP_INT_ENCODER4_INDEX 0x0000000D + +// define ASIC internal encoder id ( bit vector ) +#define ASIC_INT_DAC1_ENCODER_ID 0x00 +#define ASIC_INT_TV_ENCODER_ID 0x02 +#define ASIC_INT_DIG1_ENCODER_ID 0x03 +#define ASIC_INT_DAC2_ENCODER_ID 0x04 +#define ASIC_EXT_TV_ENCODER_ID 0x06 +#define ASIC_INT_DVO_ENCODER_ID 0x07 +#define ASIC_INT_DIG2_ENCODER_ID 0x09 +#define ASIC_EXT_DIG_ENCODER_ID 0x05 + +//define Encoder attribute +#define ATOM_ANALOG_ENCODER 0 +#define ATOM_DIGITAL_ENCODER 1 + +#define ATOM_DEVICE_CRT1_INDEX 0x00000000 +#define ATOM_DEVICE_LCD1_INDEX 0x00000001 +#define ATOM_DEVICE_TV1_INDEX 0x00000002 +#define ATOM_DEVICE_DFP1_INDEX 0x00000003 +#define ATOM_DEVICE_CRT2_INDEX 0x00000004 +#define ATOM_DEVICE_LCD2_INDEX 0x00000005 +#define ATOM_DEVICE_TV2_INDEX 0x00000006 +#define ATOM_DEVICE_DFP2_INDEX 0x00000007 +#define ATOM_DEVICE_CV_INDEX 0x00000008 +#define ATOM_DEVICE_DFP3_INDEX 0x00000009 +#define ATOM_DEVICE_DFP4_INDEX 0x0000000A +#define ATOM_DEVICE_DFP5_INDEX 0x0000000B +#define ATOM_DEVICE_RESERVEDC_INDEX 0x0000000C +#define ATOM_DEVICE_RESERVEDD_INDEX 0x0000000D +#define ATOM_DEVICE_RESERVEDE_INDEX 0x0000000E +#define ATOM_DEVICE_RESERVEDF_INDEX 0x0000000F +#define ATOM_MAX_SUPPORTED_DEVICE_INFO (ATOM_DEVICE_DFP3_INDEX+1) +#define ATOM_MAX_SUPPORTED_DEVICE_INFO_2 ATOM_MAX_SUPPORTED_DEVICE_INFO +#define ATOM_MAX_SUPPORTED_DEVICE_INFO_3 (ATOM_DEVICE_DFP5_INDEX + 1 ) + +#define ATOM_MAX_SUPPORTED_DEVICE (ATOM_DEVICE_RESERVEDF_INDEX+1) + +#define ATOM_DEVICE_CRT1_SUPPORT (0x1L << ATOM_DEVICE_CRT1_INDEX ) +#define ATOM_DEVICE_LCD1_SUPPORT (0x1L << ATOM_DEVICE_LCD1_INDEX ) +#define ATOM_DEVICE_TV1_SUPPORT (0x1L << ATOM_DEVICE_TV1_INDEX ) +#define ATOM_DEVICE_DFP1_SUPPORT (0x1L << ATOM_DEVICE_DFP1_INDEX) +#define ATOM_DEVICE_CRT2_SUPPORT (0x1L << ATOM_DEVICE_CRT2_INDEX ) +#define ATOM_DEVICE_LCD2_SUPPORT (0x1L << ATOM_DEVICE_LCD2_INDEX ) +#define ATOM_DEVICE_TV2_SUPPORT (0x1L << ATOM_DEVICE_TV2_INDEX ) +#define ATOM_DEVICE_DFP2_SUPPORT (0x1L << ATOM_DEVICE_DFP2_INDEX) +#define ATOM_DEVICE_CV_SUPPORT (0x1L << ATOM_DEVICE_CV_INDEX ) +#define ATOM_DEVICE_DFP3_SUPPORT (0x1L << ATOM_DEVICE_DFP3_INDEX ) +#define ATOM_DEVICE_DFP4_SUPPORT (0x1L << ATOM_DEVICE_DFP4_INDEX ) +#define ATOM_DEVICE_DFP5_SUPPORT (0x1L << ATOM_DEVICE_DFP5_INDEX ) + +#define ATOM_DEVICE_CRT_SUPPORT ATOM_DEVICE_CRT1_SUPPORT | ATOM_DEVICE_CRT2_SUPPORT +#define ATOM_DEVICE_DFP_SUPPORT ATOM_DEVICE_DFP1_SUPPORT | ATOM_DEVICE_DFP2_SUPPORT | ATOM_DEVICE_DFP3_SUPPORT | ATOM_DEVICE_DFP4_SUPPORT | ATOM_DEVICE_DFP5_SUPPORT +#define ATOM_DEVICE_TV_SUPPORT ATOM_DEVICE_TV1_SUPPORT | ATOM_DEVICE_TV2_SUPPORT +#define ATOM_DEVICE_LCD_SUPPORT ATOM_DEVICE_LCD1_SUPPORT | ATOM_DEVICE_LCD2_SUPPORT + +#define ATOM_DEVICE_CONNECTOR_TYPE_MASK 0x000000F0 +#define ATOM_DEVICE_CONNECTOR_TYPE_SHIFT 0x00000004 +#define ATOM_DEVICE_CONNECTOR_VGA 0x00000001 +#define ATOM_DEVICE_CONNECTOR_DVI_I 0x00000002 +#define ATOM_DEVICE_CONNECTOR_DVI_D 0x00000003 +#define ATOM_DEVICE_CONNECTOR_DVI_A 0x00000004 +#define ATOM_DEVICE_CONNECTOR_SVIDEO 0x00000005 +#define ATOM_DEVICE_CONNECTOR_COMPOSITE 0x00000006 +#define ATOM_DEVICE_CONNECTOR_LVDS 0x00000007 +#define ATOM_DEVICE_CONNECTOR_DIGI_LINK 0x00000008 +#define ATOM_DEVICE_CONNECTOR_SCART 0x00000009 +#define ATOM_DEVICE_CONNECTOR_HDMI_TYPE_A 0x0000000A +#define ATOM_DEVICE_CONNECTOR_HDMI_TYPE_B 0x0000000B +#define ATOM_DEVICE_CONNECTOR_CASE_1 0x0000000E +#define ATOM_DEVICE_CONNECTOR_DISPLAYPORT 0x0000000F + + +#define ATOM_DEVICE_DAC_INFO_MASK 0x0000000F +#define ATOM_DEVICE_DAC_INFO_SHIFT 0x00000000 +#define ATOM_DEVICE_DAC_INFO_NODAC 0x00000000 +#define ATOM_DEVICE_DAC_INFO_DACA 0x00000001 +#define ATOM_DEVICE_DAC_INFO_DACB 0x00000002 +#define ATOM_DEVICE_DAC_INFO_EXDAC 0x00000003 + +#define ATOM_DEVICE_I2C_ID_NOI2C 0x00000000 + +#define ATOM_DEVICE_I2C_LINEMUX_MASK 0x0000000F +#define ATOM_DEVICE_I2C_LINEMUX_SHIFT 0x00000000 + +#define ATOM_DEVICE_I2C_ID_MASK 0x00000070 +#define ATOM_DEVICE_I2C_ID_SHIFT 0x00000004 +#define ATOM_DEVICE_I2C_ID_IS_FOR_NON_MM_USE 0x00000001 +#define ATOM_DEVICE_I2C_ID_IS_FOR_MM_USE 0x00000002 +#define ATOM_DEVICE_I2C_ID_IS_FOR_SDVO_USE 0x00000003 //For IGP RS600 +#define ATOM_DEVICE_I2C_ID_IS_FOR_DAC_SCL 0x00000004 //For IGP RS690 + +#define ATOM_DEVICE_I2C_HARDWARE_CAP_MASK 0x00000080 +#define ATOM_DEVICE_I2C_HARDWARE_CAP_SHIFT 0x00000007 +#define ATOM_DEVICE_USES_SOFTWARE_ASSISTED_I2C 0x00000000 +#define ATOM_DEVICE_USES_HARDWARE_ASSISTED_I2C 0x00000001 + +// usDeviceSupport: +// Bits0 = 0 - no CRT1 support= 1- CRT1 is supported +// Bit 1 = 0 - no LCD1 support= 1- LCD1 is supported +// Bit 2 = 0 - no TV1 support= 1- TV1 is supported +// Bit 3 = 0 - no DFP1 support= 1- DFP1 is supported +// Bit 4 = 0 - no CRT2 support= 1- CRT2 is supported +// Bit 5 = 0 - no LCD2 support= 1- LCD2 is supported +// Bit 6 = 0 - no TV2 support= 1- TV2 is supported +// Bit 7 = 0 - no DFP2 support= 1- DFP2 is supported +// Bit 8 = 0 - no CV support= 1- CV is supported +// Bit 9 = 0 - no DFP3 support= 1- DFP3 is supported +// Byte1 (Supported Device Info) +// Bit 0 = = 0 - no CV support= 1- CV is supported +// +// + +// ucI2C_ConfigID +// [7:0] - I2C LINE Associate ID +// = 0 - no I2C +// [7] - HW_Cap = 1, [6:0]=HW assisted I2C ID(HW line selection) +// = 0, [6:0]=SW assisted I2C ID +// [6-4] - HW_ENGINE_ID = 1, HW engine for NON multimedia use +// = 2, HW engine for Multimedia use +// = 3-7 Reserved for future I2C engines +// [3-0] - I2C_LINE_MUX = A Mux number when it's HW assisted I2C or GPIO ID when it's SW I2C + +typedef struct _ATOM_I2C_ID_CONFIG +{ + UCHAR bfI2C_LineMux:4; + UCHAR bfHW_EngineID:3; + UCHAR bfHW_Capable:1; +}ATOM_I2C_ID_CONFIG; + +typedef union _ATOM_I2C_ID_CONFIG_ACCESS +{ + ATOM_I2C_ID_CONFIG sbfAccess; + UCHAR ucAccess; +}ATOM_I2C_ID_CONFIG_ACCESS; + +/****************************************************************************/ +// Structure used in GPIO_I2C_InfoTable +/****************************************************************************/ +typedef struct _ATOM_GPIO_I2C_ASSIGMENT +{ + USHORT usClkMaskRegisterIndex; + USHORT usClkEnRegisterIndex; + USHORT usClkY_RegisterIndex; + USHORT usClkA_RegisterIndex; + USHORT usDataMaskRegisterIndex; + USHORT usDataEnRegisterIndex; + USHORT usDataY_RegisterIndex; + USHORT usDataA_RegisterIndex; + ATOM_I2C_ID_CONFIG_ACCESS sucI2cId; + UCHAR ucClkMaskShift; + UCHAR ucClkEnShift; + UCHAR ucClkY_Shift; + UCHAR ucClkA_Shift; + UCHAR ucDataMaskShift; + UCHAR ucDataEnShift; + UCHAR ucDataY_Shift; + UCHAR ucDataA_Shift; + UCHAR ucReserved1; + UCHAR ucReserved2; +}ATOM_GPIO_I2C_ASSIGMENT; + +typedef struct _ATOM_GPIO_I2C_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_GPIO_I2C_ASSIGMENT asGPIO_Info[ATOM_MAX_SUPPORTED_DEVICE]; +}ATOM_GPIO_I2C_INFO; + +/****************************************************************************/ +// Common Structure used in other structures +/****************************************************************************/ + +#ifndef _H2INC + +//Please don't add or expand this bitfield structure below, this one will retire soon.! +typedef struct _ATOM_MODE_MISC_INFO +{ + USHORT HorizontalCutOff:1; + USHORT HSyncPolarity:1; //0=Active High, 1=Active Low + USHORT VSyncPolarity:1; //0=Active High, 1=Active Low + USHORT VerticalCutOff:1; + USHORT H_ReplicationBy2:1; + USHORT V_ReplicationBy2:1; + USHORT CompositeSync:1; + USHORT Interlace:1; + USHORT DoubleClock:1; + USHORT RGB888:1; + USHORT Reserved:6; +}ATOM_MODE_MISC_INFO; + +typedef union _ATOM_MODE_MISC_INFO_ACCESS +{ + ATOM_MODE_MISC_INFO sbfAccess; + USHORT usAccess; +}ATOM_MODE_MISC_INFO_ACCESS; + +#else + +typedef union _ATOM_MODE_MISC_INFO_ACCESS +{ + USHORT usAccess; +}ATOM_MODE_MISC_INFO_ACCESS; + +#endif + +// usModeMiscInfo- +#define ATOM_H_CUTOFF 0x01 +#define ATOM_HSYNC_POLARITY 0x02 //0=Active High, 1=Active Low +#define ATOM_VSYNC_POLARITY 0x04 //0=Active High, 1=Active Low +#define ATOM_V_CUTOFF 0x08 +#define ATOM_H_REPLICATIONBY2 0x10 +#define ATOM_V_REPLICATIONBY2 0x20 +#define ATOM_COMPOSITESYNC 0x40 +#define ATOM_INTERLACE 0x80 +#define ATOM_DOUBLE_CLOCK_MODE 0x100 +#define ATOM_RGB888_MODE 0x200 + +//usRefreshRate- +#define ATOM_REFRESH_43 43 +#define ATOM_REFRESH_47 47 +#define ATOM_REFRESH_56 56 +#define ATOM_REFRESH_60 60 +#define ATOM_REFRESH_65 65 +#define ATOM_REFRESH_70 70 +#define ATOM_REFRESH_72 72 +#define ATOM_REFRESH_75 75 +#define ATOM_REFRESH_85 85 + +// ATOM_MODE_TIMING data are exactly the same as VESA timing data. +// Translation from EDID to ATOM_MODE_TIMING, use the following formula. +// +// VESA_HTOTAL = VESA_ACTIVE + 2* VESA_BORDER + VESA_BLANK +// = EDID_HA + EDID_HBL +// VESA_HDISP = VESA_ACTIVE = EDID_HA +// VESA_HSYNC_START = VESA_ACTIVE + VESA_BORDER + VESA_FRONT_PORCH +// = EDID_HA + EDID_HSO +// VESA_HSYNC_WIDTH = VESA_HSYNC_TIME = EDID_HSPW +// VESA_BORDER = EDID_BORDER + +/****************************************************************************/ +// Structure used in SetCRTC_UsingDTDTimingTable +/****************************************************************************/ +typedef struct _SET_CRTC_USING_DTD_TIMING_PARAMETERS +{ + USHORT usH_Size; + USHORT usH_Blanking_Time; + USHORT usV_Size; + USHORT usV_Blanking_Time; + USHORT usH_SyncOffset; + USHORT usH_SyncWidth; + USHORT usV_SyncOffset; + USHORT usV_SyncWidth; + ATOM_MODE_MISC_INFO_ACCESS susModeMiscInfo; + UCHAR ucH_Border; // From DFP EDID + UCHAR ucV_Border; + UCHAR ucCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucPadding[3]; +}SET_CRTC_USING_DTD_TIMING_PARAMETERS; + +/****************************************************************************/ +// Structure used in SetCRTC_TimingTable +/****************************************************************************/ +typedef struct _SET_CRTC_TIMING_PARAMETERS +{ + USHORT usH_Total; // horizontal total + USHORT usH_Disp; // horizontal display + USHORT usH_SyncStart; // horozontal Sync start + USHORT usH_SyncWidth; // horizontal Sync width + USHORT usV_Total; // vertical total + USHORT usV_Disp; // vertical display + USHORT usV_SyncStart; // vertical Sync start + USHORT usV_SyncWidth; // vertical Sync width + ATOM_MODE_MISC_INFO_ACCESS susModeMiscInfo; + UCHAR ucCRTC; // ATOM_CRTC1 or ATOM_CRTC2 + UCHAR ucOverscanRight; // right + UCHAR ucOverscanLeft; // left + UCHAR ucOverscanBottom; // bottom + UCHAR ucOverscanTop; // top + UCHAR ucReserved; +}SET_CRTC_TIMING_PARAMETERS; +#define SET_CRTC_TIMING_PARAMETERS_PS_ALLOCATION SET_CRTC_TIMING_PARAMETERS + +/****************************************************************************/ +// Structure used in StandardVESA_TimingTable +// AnalogTV_InfoTable +// ComponentVideoInfoTable +/****************************************************************************/ +typedef struct _ATOM_MODE_TIMING +{ + USHORT usCRTC_H_Total; + USHORT usCRTC_H_Disp; + USHORT usCRTC_H_SyncStart; + USHORT usCRTC_H_SyncWidth; + USHORT usCRTC_V_Total; + USHORT usCRTC_V_Disp; + USHORT usCRTC_V_SyncStart; + USHORT usCRTC_V_SyncWidth; + USHORT usPixelClock; //in 10Khz unit + ATOM_MODE_MISC_INFO_ACCESS susModeMiscInfo; + USHORT usCRTC_OverscanRight; + USHORT usCRTC_OverscanLeft; + USHORT usCRTC_OverscanBottom; + USHORT usCRTC_OverscanTop; + USHORT usReserve; + UCHAR ucInternalModeNumber; + UCHAR ucRefreshRate; +}ATOM_MODE_TIMING; + +typedef struct _ATOM_DTD_FORMAT +{ + USHORT usPixClk; + USHORT usHActive; + USHORT usHBlanking_Time; + USHORT usVActive; + USHORT usVBlanking_Time; + USHORT usHSyncOffset; + USHORT usHSyncWidth; + USHORT usVSyncOffset; + USHORT usVSyncWidth; + USHORT usImageHSize; + USHORT usImageVSize; + UCHAR ucHBorder; + UCHAR ucVBorder; + ATOM_MODE_MISC_INFO_ACCESS susModeMiscInfo; + UCHAR ucInternalModeNumber; + UCHAR ucRefreshRate; +}ATOM_DTD_FORMAT; + +/****************************************************************************/ +// Structure used in LVDS_InfoTable +// * Need a document to describe this table +/****************************************************************************/ +#define SUPPORTED_LCD_REFRESHRATE_30Hz 0x0004 +#define SUPPORTED_LCD_REFRESHRATE_40Hz 0x0008 +#define SUPPORTED_LCD_REFRESHRATE_50Hz 0x0010 +#define SUPPORTED_LCD_REFRESHRATE_60Hz 0x0020 + +//Once DAL sees this CAP is set, it will read EDID from LCD on its own instead of using sLCDTiming in ATOM_LVDS_INFO_V12. +//Other entries in ATOM_LVDS_INFO_V12 are still valid/useful to DAL +#define LCDPANEL_CAP_READ_EDID 0x1 + +//ucTableFormatRevision=1 +//ucTableContentRevision=1 +typedef struct _ATOM_LVDS_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_DTD_FORMAT sLCDTiming; + USHORT usModePatchTableOffset; + USHORT usSupportedRefreshRate; //Refer to panel info table in ATOMBIOS extension Spec. + USHORT usOffDelayInMs; + UCHAR ucPowerSequenceDigOntoDEin10Ms; + UCHAR ucPowerSequenceDEtoBLOnin10Ms; + UCHAR ucLVDS_Misc; // Bit0:{=0:single, =1:dual},Bit1 {=0:666RGB, =1:888RGB},Bit2:3:{Grey level} + // Bit4:{=0:LDI format for RGB888, =1 FPDI format for RGB888} + // Bit5:{=0:Spatial Dithering disabled;1 Spatial Dithering enabled} + // Bit6:{=0:Temporal Dithering disabled;1 Temporal Dithering enabled} + UCHAR ucPanelDefaultRefreshRate; + UCHAR ucPanelIdentification; + UCHAR ucSS_Id; +}ATOM_LVDS_INFO; + +//ucTableFormatRevision=1 +//ucTableContentRevision=2 +typedef struct _ATOM_LVDS_INFO_V12 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_DTD_FORMAT sLCDTiming; + USHORT usExtInfoTableOffset; + USHORT usSupportedRefreshRate; //Refer to panel info table in ATOMBIOS extension Spec. + USHORT usOffDelayInMs; + UCHAR ucPowerSequenceDigOntoDEin10Ms; + UCHAR ucPowerSequenceDEtoBLOnin10Ms; + UCHAR ucLVDS_Misc; // Bit0:{=0:single, =1:dual},Bit1 {=0:666RGB, =1:888RGB},Bit2:3:{Grey level} + // Bit4:{=0:LDI format for RGB888, =1 FPDI format for RGB888} + // Bit5:{=0:Spatial Dithering disabled;1 Spatial Dithering enabled} + // Bit6:{=0:Temporal Dithering disabled;1 Temporal Dithering enabled} + UCHAR ucPanelDefaultRefreshRate; + UCHAR ucPanelIdentification; + UCHAR ucSS_Id; + USHORT usLCDVenderID; + USHORT usLCDProductID; + UCHAR ucLCDPanel_SpecialHandlingCap; + UCHAR ucPanelInfoSize; // start from ATOM_DTD_FORMAT to end of panel info, include ExtInfoTable + UCHAR ucReserved[2]; +}ATOM_LVDS_INFO_V12; + +#define ATOM_LVDS_INFO_LAST ATOM_LVDS_INFO_V12 + +typedef struct _ATOM_PATCH_RECORD_MODE +{ + UCHAR ucRecordType; + USHORT usHDisp; + USHORT usVDisp; +}ATOM_PATCH_RECORD_MODE; + +typedef struct _ATOM_LCD_RTS_RECORD +{ + UCHAR ucRecordType; + UCHAR ucRTSValue; +}ATOM_LCD_RTS_RECORD; + +//!! If the record below exits, it shoud always be the first record for easy use in command table!!! +typedef struct _ATOM_LCD_MODE_CONTROL_CAP +{ + UCHAR ucRecordType; + USHORT usLCDCap; +}ATOM_LCD_MODE_CONTROL_CAP; + +#define LCD_MODE_CAP_BL_OFF 1 +#define LCD_MODE_CAP_CRTC_OFF 2 +#define LCD_MODE_CAP_PANEL_OFF 4 + +typedef struct _ATOM_FAKE_EDID_PATCH_RECORD +{ + UCHAR ucRecordType; + UCHAR ucFakeEDIDLength; + UCHAR ucFakeEDIDString[1]; // This actually has ucFakeEdidLength elements. +} ATOM_FAKE_EDID_PATCH_RECORD; + +typedef struct _ATOM_PANEL_RESOLUTION_PATCH_RECORD +{ + UCHAR ucRecordType; + USHORT usHSize; + USHORT usVSize; +}ATOM_PANEL_RESOLUTION_PATCH_RECORD; + +#define LCD_MODE_PATCH_RECORD_MODE_TYPE 1 +#define LCD_RTS_RECORD_TYPE 2 +#define LCD_CAP_RECORD_TYPE 3 +#define LCD_FAKE_EDID_PATCH_RECORD_TYPE 4 +#define LCD_PANEL_RESOLUTION_RECORD_TYPE 5 +#define ATOM_RECORD_END_TYPE 0xFF + +/****************************Spread Spectrum Info Table Definitions **********************/ + +//ucTableFormatRevision=1 +//ucTableContentRevision=2 +typedef struct _ATOM_SPREAD_SPECTRUM_ASSIGNMENT +{ + USHORT usSpreadSpectrumPercentage; + UCHAR ucSpreadSpectrumType; //Bit1=0 Down Spread,=1 Center Spread. Bit1=1 Ext. =0 Int. Others:TBD + UCHAR ucSS_Step; + UCHAR ucSS_Delay; + UCHAR ucSS_Id; + UCHAR ucRecommandedRef_Div; + UCHAR ucSS_Range; //it was reserved for V11 +}ATOM_SPREAD_SPECTRUM_ASSIGNMENT; + +#define ATOM_MAX_SS_ENTRY 16 +#define ATOM_DP_SS_ID1 0x0f1 // SS modulation freq=30k +#define ATOM_DP_SS_ID2 0x0f2 // SS modulation freq=33k + + +#define ATOM_SS_DOWN_SPREAD_MODE_MASK 0x00000000 +#define ATOM_SS_DOWN_SPREAD_MODE 0x00000000 +#define ATOM_SS_CENTRE_SPREAD_MODE_MASK 0x00000001 +#define ATOM_SS_CENTRE_SPREAD_MODE 0x00000001 +#define ATOM_INTERNAL_SS_MASK 0x00000000 +#define ATOM_EXTERNAL_SS_MASK 0x00000002 +#define EXEC_SS_STEP_SIZE_SHIFT 2 +#define EXEC_SS_DELAY_SHIFT 4 +#define ACTIVEDATA_TO_BLON_DELAY_SHIFT 4 + +typedef struct _ATOM_SPREAD_SPECTRUM_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_SPREAD_SPECTRUM_ASSIGNMENT asSS_Info[ATOM_MAX_SS_ENTRY]; +}ATOM_SPREAD_SPECTRUM_INFO; + +/****************************************************************************/ +// Structure used in AnalogTV_InfoTable (Top level) +/****************************************************************************/ +//ucTVBootUpDefaultStd definiton: + +//ATOM_TV_NTSC 1 +//ATOM_TV_NTSCJ 2 +//ATOM_TV_PAL 3 +//ATOM_TV_PALM 4 +//ATOM_TV_PALCN 5 +//ATOM_TV_PALN 6 +//ATOM_TV_PAL60 7 +//ATOM_TV_SECAM 8 + +//ucTVSuppportedStd definition: +#define NTSC_SUPPORT 0x1 +#define NTSCJ_SUPPORT 0x2 + +#define PAL_SUPPORT 0x4 +#define PALM_SUPPORT 0x8 +#define PALCN_SUPPORT 0x10 +#define PALN_SUPPORT 0x20 +#define PAL60_SUPPORT 0x40 +#define SECAM_SUPPORT 0x80 + +#define MAX_SUPPORTED_TV_TIMING 2 + +typedef struct _ATOM_ANALOG_TV_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR ucTV_SupportedStandard; + UCHAR ucTV_BootUpDefaultStandard; + UCHAR ucExt_TV_ASIC_ID; + UCHAR ucExt_TV_ASIC_SlaveAddr; +/* ATOM_DTD_FORMAT aModeTimings[MAX_SUPPORTED_TV_TIMING]; */ + ATOM_MODE_TIMING aModeTimings[MAX_SUPPORTED_TV_TIMING]; +}ATOM_ANALOG_TV_INFO; + + +/**************************************************************************/ +// VRAM usage and their defintions + +// One chunk of VRAM used by Bios are for HWICON surfaces,EDID data. +// Current Mode timing and Dail Timing and/or STD timing data EACH device. They can be broken down as below. +// All the addresses below are the offsets from the frame buffer start.They all MUST be Dword aligned! +// To driver: The physical address of this memory portion=mmFB_START(4K aligned)+ATOMBIOS_VRAM_USAGE_START_ADDR+ATOM_x_ADDR +// To Bios: ATOMBIOS_VRAM_USAGE_START_ADDR+ATOM_x_ADDR->MM_INDEX + +#ifndef VESA_MEMORY_IN_64K_BLOCK +#define VESA_MEMORY_IN_64K_BLOCK 0x100 //256*64K=16Mb (Max. VESA memory is 16Mb!) +#endif + +#define ATOM_EDID_RAW_DATASIZE 256 //In Bytes +#define ATOM_HWICON_SURFACE_SIZE 4096 //In Bytes +#define ATOM_HWICON_INFOTABLE_SIZE 32 +#define MAX_DTD_MODE_IN_VRAM 6 +#define ATOM_DTD_MODE_SUPPORT_TBL_SIZE (MAX_DTD_MODE_IN_VRAM*28) //28= (SIZEOF ATOM_DTD_FORMAT) +#define ATOM_STD_MODE_SUPPORT_TBL_SIZE 32*8 //32 is a predefined number,8= (SIZEOF ATOM_STD_FORMAT) +#define DFP_ENCODER_TYPE_OFFSET 0x80 +#define DP_ENCODER_LANE_NUM_OFFSET 0x84 +#define DP_ENCODER_LINK_RATE_OFFSET 0x88 + +#define ATOM_HWICON1_SURFACE_ADDR 0 +#define ATOM_HWICON2_SURFACE_ADDR (ATOM_HWICON1_SURFACE_ADDR + ATOM_HWICON_SURFACE_SIZE) +#define ATOM_HWICON_INFOTABLE_ADDR (ATOM_HWICON2_SURFACE_ADDR + ATOM_HWICON_SURFACE_SIZE) +#define ATOM_CRT1_EDID_ADDR (ATOM_HWICON_INFOTABLE_ADDR + ATOM_HWICON_INFOTABLE_SIZE) +#define ATOM_CRT1_DTD_MODE_TBL_ADDR (ATOM_CRT1_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_CRT1_STD_MODE_TBL_ADDR (ATOM_CRT1_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_LCD1_EDID_ADDR (ATOM_CRT1_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_LCD1_DTD_MODE_TBL_ADDR (ATOM_LCD1_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_LCD1_STD_MODE_TBL_ADDR (ATOM_LCD1_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_TV1_DTD_MODE_TBL_ADDR (ATOM_LCD1_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_DFP1_EDID_ADDR (ATOM_TV1_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_DFP1_DTD_MODE_TBL_ADDR (ATOM_DFP1_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_DFP1_STD_MODE_TBL_ADDR (ATOM_DFP1_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_CRT2_EDID_ADDR (ATOM_DFP1_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_CRT2_DTD_MODE_TBL_ADDR (ATOM_CRT2_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_CRT2_STD_MODE_TBL_ADDR (ATOM_CRT2_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_LCD2_EDID_ADDR (ATOM_CRT2_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_LCD2_DTD_MODE_TBL_ADDR (ATOM_LCD2_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_LCD2_STD_MODE_TBL_ADDR (ATOM_LCD2_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_TV2_EDID_ADDR (ATOM_LCD2_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_TV2_DTD_MODE_TBL_ADDR (ATOM_TV2_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_TV2_STD_MODE_TBL_ADDR (ATOM_TV2_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_DFP2_EDID_ADDR (ATOM_TV2_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_DFP2_DTD_MODE_TBL_ADDR (ATOM_DFP2_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_DFP2_STD_MODE_TBL_ADDR (ATOM_DFP2_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_CV_EDID_ADDR (ATOM_DFP2_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_CV_DTD_MODE_TBL_ADDR (ATOM_CV_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_CV_STD_MODE_TBL_ADDR (ATOM_CV_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_DFP3_EDID_ADDR (ATOM_CV_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_DFP3_DTD_MODE_TBL_ADDR (ATOM_DFP3_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_DFP3_STD_MODE_TBL_ADDR (ATOM_DFP3_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_DFP4_EDID_ADDR (ATOM_DFP3_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_DFP4_DTD_MODE_TBL_ADDR (ATOM_DFP4_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_DFP4_STD_MODE_TBL_ADDR (ATOM_DFP4_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_DFP5_EDID_ADDR (ATOM_DFP4_STD_MODE_TBL_ADDR + ATOM_STD_MODE_SUPPORT_TBL_SIZE) +#define ATOM_DFP5_DTD_MODE_TBL_ADDR (ATOM_DFP5_EDID_ADDR + ATOM_EDID_RAW_DATASIZE) +#define ATOM_DFP5_STD_MODE_TBL_ADDR (ATOM_DFP5_DTD_MODE_TBL_ADDR + ATOM_DTD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_DP_TRAINING_TBL_ADDR (ATOM_DFP5_STD_MODE_TBL_ADDR+ATOM_STD_MODE_SUPPORT_TBL_SIZE) + +#define ATOM_STACK_STORAGE_START (ATOM_DP_TRAINING_TBL_ADDR+256) +#define ATOM_STACK_STORAGE_END ATOM_STACK_STORAGE_START+512 + +//The size below is in Kb! +#define ATOM_VRAM_RESERVE_SIZE ((((ATOM_STACK_STORAGE_END - ATOM_HWICON1_SURFACE_ADDR)>>10)+4)&0xFFFC) + +#define ATOM_VRAM_OPERATION_FLAGS_MASK 0xC0000000L +#define ATOM_VRAM_OPERATION_FLAGS_SHIFT 30 +#define ATOM_VRAM_BLOCK_NEEDS_NO_RESERVATION 0x1 +#define ATOM_VRAM_BLOCK_NEEDS_RESERVATION 0x0 + +/***********************************************************************************/ +// Structure used in VRAM_UsageByFirmwareTable +// Note1: This table is filled by SetBiosReservationStartInFB in CoreCommSubs.asm +// at running time. +// note2: From RV770, the memory is more than 32bit addressable, so we will change +// ucTableFormatRevision=1,ucTableContentRevision=4, the strcuture remains +// exactly same as 1.1 and 1.2 (1.3 is never in use), but ulStartAddrUsedByFirmware +// (in offset to start of memory address) is KB aligned instead of byte aligend. +/***********************************************************************************/ +#define ATOM_MAX_FIRMWARE_VRAM_USAGE_INFO 1 + +typedef struct _ATOM_FIRMWARE_VRAM_RESERVE_INFO +{ + ULONG ulStartAddrUsedByFirmware; + USHORT usFirmwareUseInKb; + USHORT usReserved; +}ATOM_FIRMWARE_VRAM_RESERVE_INFO; + +typedef struct _ATOM_VRAM_USAGE_BY_FIRMWARE +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_FIRMWARE_VRAM_RESERVE_INFO asFirmwareVramReserveInfo[ATOM_MAX_FIRMWARE_VRAM_USAGE_INFO]; +}ATOM_VRAM_USAGE_BY_FIRMWARE; + +/****************************************************************************/ +// Structure used in GPIO_Pin_LUTTable +/****************************************************************************/ +typedef struct _ATOM_GPIO_PIN_ASSIGNMENT +{ + USHORT usGpioPin_AIndex; + UCHAR ucGpioPinBitShift; + UCHAR ucGPIO_ID; +}ATOM_GPIO_PIN_ASSIGNMENT; + +typedef struct _ATOM_GPIO_PIN_LUT +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_GPIO_PIN_ASSIGNMENT asGPIO_Pin[1]; +}ATOM_GPIO_PIN_LUT; + +/****************************************************************************/ +// Structure used in ComponentVideoInfoTable +/****************************************************************************/ +#define GPIO_PIN_ACTIVE_HIGH 0x1 + +#define MAX_SUPPORTED_CV_STANDARDS 5 + +// definitions for ATOM_D_INFO.ucSettings +#define ATOM_GPIO_SETTINGS_BITSHIFT_MASK 0x1F // [4:0] +#define ATOM_GPIO_SETTINGS_RESERVED_MASK 0x60 // [6:5] = must be zeroed out +#define ATOM_GPIO_SETTINGS_ACTIVE_MASK 0x80 // [7] + +typedef struct _ATOM_GPIO_INFO +{ + USHORT usAOffset; + UCHAR ucSettings; + UCHAR ucReserved; +}ATOM_GPIO_INFO; + +// definitions for ATOM_COMPONENT_VIDEO_INFO.ucMiscInfo (bit vector) +#define ATOM_CV_RESTRICT_FORMAT_SELECTION 0x2 + +// definitions for ATOM_COMPONENT_VIDEO_INFO.uc480i/uc480p/uc720p/uc1080i +#define ATOM_GPIO_DEFAULT_MODE_EN 0x80 //[7]; +#define ATOM_GPIO_SETTING_PERMODE_MASK 0x7F //[6:0] + +// definitions for ATOM_COMPONENT_VIDEO_INFO.ucLetterBoxMode +//Line 3 out put 5V. +#define ATOM_CV_LINE3_ASPECTRATIO_16_9_GPIO_A 0x01 //represent gpio 3 state for 16:9 +#define ATOM_CV_LINE3_ASPECTRATIO_16_9_GPIO_B 0x02 //represent gpio 4 state for 16:9 +#define ATOM_CV_LINE3_ASPECTRATIO_16_9_GPIO_SHIFT 0x0 + +//Line 3 out put 2.2V +#define ATOM_CV_LINE3_ASPECTRATIO_4_3_LETBOX_GPIO_A 0x04 //represent gpio 3 state for 4:3 Letter box +#define ATOM_CV_LINE3_ASPECTRATIO_4_3_LETBOX_GPIO_B 0x08 //represent gpio 4 state for 4:3 Letter box +#define ATOM_CV_LINE3_ASPECTRATIO_4_3_LETBOX_GPIO_SHIFT 0x2 + +//Line 3 out put 0V +#define ATOM_CV_LINE3_ASPECTRATIO_4_3_GPIO_A 0x10 //represent gpio 3 state for 4:3 +#define ATOM_CV_LINE3_ASPECTRATIO_4_3_GPIO_B 0x20 //represent gpio 4 state for 4:3 +#define ATOM_CV_LINE3_ASPECTRATIO_4_3_GPIO_SHIFT 0x4 + +#define ATOM_CV_LINE3_ASPECTRATIO_MASK 0x3F // bit [5:0] + +#define ATOM_CV_LINE3_ASPECTRATIO_EXIST 0x80 //bit 7 + +//GPIO bit index in gpio setting per mode value, also represend the block no. in gpio blocks. +#define ATOM_GPIO_INDEX_LINE3_ASPECRATIO_GPIO_A 3 //bit 3 in uc480i/uc480p/uc720p/uc1080i, which represend the default gpio bit setting for the mode. +#define ATOM_GPIO_INDEX_LINE3_ASPECRATIO_GPIO_B 4 //bit 4 in uc480i/uc480p/uc720p/uc1080i, which represend the default gpio bit setting for the mode. + + +typedef struct _ATOM_COMPONENT_VIDEO_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usMask_PinRegisterIndex; + USHORT usEN_PinRegisterIndex; + USHORT usY_PinRegisterIndex; + USHORT usA_PinRegisterIndex; + UCHAR ucBitShift; + UCHAR ucPinActiveState; //ucPinActiveState: Bit0=1 active high, =0 active low + ATOM_DTD_FORMAT sReserved; // must be zeroed out + UCHAR ucMiscInfo; + UCHAR uc480i; + UCHAR uc480p; + UCHAR uc720p; + UCHAR uc1080i; + UCHAR ucLetterBoxMode; + UCHAR ucReserved[3]; + UCHAR ucNumOfWbGpioBlocks; //For Component video D-Connector support. If zere, NTSC type connector + ATOM_GPIO_INFO aWbGpioStateBlock[MAX_SUPPORTED_CV_STANDARDS]; + ATOM_DTD_FORMAT aModeTimings[MAX_SUPPORTED_CV_STANDARDS]; +}ATOM_COMPONENT_VIDEO_INFO; + +//ucTableFormatRevision=2 +//ucTableContentRevision=1 +typedef struct _ATOM_COMPONENT_VIDEO_INFO_V21 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR ucMiscInfo; + UCHAR uc480i; + UCHAR uc480p; + UCHAR uc720p; + UCHAR uc1080i; + UCHAR ucReserved; + UCHAR ucLetterBoxMode; + UCHAR ucNumOfWbGpioBlocks; //For Component video D-Connector support. If zere, NTSC type connector + ATOM_GPIO_INFO aWbGpioStateBlock[MAX_SUPPORTED_CV_STANDARDS]; + ATOM_DTD_FORMAT aModeTimings[MAX_SUPPORTED_CV_STANDARDS]; +}ATOM_COMPONENT_VIDEO_INFO_V21; + +#define ATOM_COMPONENT_VIDEO_INFO_LAST ATOM_COMPONENT_VIDEO_INFO_V21 + +/****************************************************************************/ +// Structure used in object_InfoTable +/****************************************************************************/ +typedef struct _ATOM_OBJECT_HEADER +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usDeviceSupport; + USHORT usConnectorObjectTableOffset; + USHORT usRouterObjectTableOffset; + USHORT usEncoderObjectTableOffset; + USHORT usProtectionObjectTableOffset; //only available when Protection block is independent. + USHORT usDisplayPathTableOffset; +}ATOM_OBJECT_HEADER; + + +typedef struct _ATOM_DISPLAY_OBJECT_PATH +{ + USHORT usDeviceTag; //supported device + USHORT usSize; //the size of ATOM_DISPLAY_OBJECT_PATH + USHORT usConnObjectId; //Connector Object ID + USHORT usGPUObjectId; //GPU ID + USHORT usGraphicObjIds[1]; //1st Encoder Obj source from GPU to last Graphic Obj destinate to connector. +}ATOM_DISPLAY_OBJECT_PATH; + +typedef struct _ATOM_DISPLAY_OBJECT_PATH_TABLE +{ + UCHAR ucNumOfDispPath; + UCHAR ucVersion; + UCHAR ucPadding[2]; + ATOM_DISPLAY_OBJECT_PATH asDispPath[1]; +}ATOM_DISPLAY_OBJECT_PATH_TABLE; + + +typedef struct _ATOM_OBJECT //each object has this structure +{ + USHORT usObjectID; + USHORT usSrcDstTableOffset; + USHORT usRecordOffset; //this pointing to a bunch of records defined below + USHORT usReserved; +}ATOM_OBJECT; + +typedef struct _ATOM_OBJECT_TABLE //Above 4 object table offset pointing to a bunch of objects all have this structure +{ + UCHAR ucNumberOfObjects; + UCHAR ucPadding[3]; + ATOM_OBJECT asObjects[1]; +}ATOM_OBJECT_TABLE; + +typedef struct _ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT //usSrcDstTableOffset pointing to this structure +{ + UCHAR ucNumberOfSrc; + USHORT usSrcObjectID[1]; + UCHAR ucNumberOfDst; + USHORT usDstObjectID[1]; +}ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT; + + +//Related definitions, all records are differnt but they have a commond header +typedef struct _ATOM_COMMON_RECORD_HEADER +{ + UCHAR ucRecordType; //An emun to indicate the record type + UCHAR ucRecordSize; //The size of the whole record in byte +}ATOM_COMMON_RECORD_HEADER; + + +#define ATOM_I2C_RECORD_TYPE 1 +#define ATOM_HPD_INT_RECORD_TYPE 2 +#define ATOM_OUTPUT_PROTECTION_RECORD_TYPE 3 +#define ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE 4 +#define ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD_TYPE 5 //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE +#define ATOM_ENCODER_FPGA_CONTROL_RECORD_TYPE 6 //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE +#define ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD_TYPE 7 +#define ATOM_JTAG_RECORD_TYPE 8 //Obsolete, switch to use GPIO_CNTL_RECORD_TYPE +#define ATOM_OBJECT_GPIO_CNTL_RECORD_TYPE 9 +#define ATOM_ENCODER_DVO_CF_RECORD_TYPE 10 +#define ATOM_CONNECTOR_CF_RECORD_TYPE 11 +#define ATOM_CONNECTOR_HARDCODE_DTD_RECORD_TYPE 12 +#define ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE 13 +#define ATOM_ROUTER_DDC_PATH_SELECT_RECORD_TYPE 14 +#define ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD_TYPE 15 + +//Must be updated when new record type is added,equal to that record definition! +#define ATOM_MAX_OBJECT_RECORD_NUMBER ATOM_CONNECTOR_CF_RECORD_TYPE + +typedef struct _ATOM_I2C_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + ATOM_I2C_ID_CONFIG sucI2cId; + UCHAR ucI2CAddr; //The slave address, it's 0 when the record is attached to connector for DDC +}ATOM_I2C_RECORD; + +typedef struct _ATOM_HPD_INT_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucHPDIntGPIOID; //Corresponding block in GPIO_PIN_INFO table gives the pin info + UCHAR ucPluggged_PinState; +}ATOM_HPD_INT_RECORD; + + +typedef struct _ATOM_OUTPUT_PROTECTION_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucProtectionFlag; + UCHAR ucReserved; +}ATOM_OUTPUT_PROTECTION_RECORD; + +typedef struct _ATOM_CONNECTOR_DEVICE_TAG +{ + ULONG ulACPIDeviceEnum; //Reserved for now + USHORT usDeviceID; //This Id is same as "ATOM_DEVICE_XXX_SUPPORT" + USHORT usPadding; +}ATOM_CONNECTOR_DEVICE_TAG; + +typedef struct _ATOM_CONNECTOR_DEVICE_TAG_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucNumberOfDevice; + UCHAR ucReserved; + ATOM_CONNECTOR_DEVICE_TAG asDeviceTag[1]; //This Id is same as "ATOM_DEVICE_XXX_SUPPORT", 1 is only for allocation +}ATOM_CONNECTOR_DEVICE_TAG_RECORD; + + +typedef struct _ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucConfigGPIOID; + UCHAR ucConfigGPIOState; //Set to 1 when it's active high to enable external flow in + UCHAR ucFlowinGPIPID; + UCHAR ucExtInGPIPID; +}ATOM_CONNECTOR_DVI_EXT_INPUT_RECORD; + +typedef struct _ATOM_ENCODER_FPGA_CONTROL_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucCTL1GPIO_ID; + UCHAR ucCTL1GPIOState; //Set to 1 when it's active high + UCHAR ucCTL2GPIO_ID; + UCHAR ucCTL2GPIOState; //Set to 1 when it's active high + UCHAR ucCTL3GPIO_ID; + UCHAR ucCTL3GPIOState; //Set to 1 when it's active high + UCHAR ucCTLFPGA_IN_ID; + UCHAR ucPadding[3]; +}ATOM_ENCODER_FPGA_CONTROL_RECORD; + +typedef struct _ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucGPIOID; //Corresponding block in GPIO_PIN_INFO table gives the pin info + UCHAR ucTVActiveState; //Indicating when the pin==0 or 1 when TV is connected +}ATOM_CONNECTOR_CVTV_SHARE_DIN_RECORD; + +typedef struct _ATOM_JTAG_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucTMSGPIO_ID; + UCHAR ucTMSGPIOState; //Set to 1 when it's active high + UCHAR ucTCKGPIO_ID; + UCHAR ucTCKGPIOState; //Set to 1 when it's active high + UCHAR ucTDOGPIO_ID; + UCHAR ucTDOGPIOState; //Set to 1 when it's active high + UCHAR ucTDIGPIO_ID; + UCHAR ucTDIGPIOState; //Set to 1 when it's active high + UCHAR ucPadding[2]; +}ATOM_JTAG_RECORD; + + +//The following generic object gpio pin control record type will replace JTAG_RECORD/FPGA_CONTROL_RECORD/DVI_EXT_INPUT_RECORD above gradually +typedef struct _ATOM_GPIO_PIN_CONTROL_PAIR +{ + UCHAR ucGPIOID; // GPIO_ID, find the corresponding ID in GPIO_LUT table + UCHAR ucGPIO_PinState; // Pin state showing how to set-up the pin +}ATOM_GPIO_PIN_CONTROL_PAIR; + +typedef struct _ATOM_OBJECT_GPIO_CNTL_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucFlags; // Future expnadibility + UCHAR ucNumberOfPins; // Number of GPIO pins used to control the object + ATOM_GPIO_PIN_CONTROL_PAIR asGpio[1]; // the real gpio pin pair determined by number of pins ucNumberOfPins +}ATOM_OBJECT_GPIO_CNTL_RECORD; + +//Definitions for GPIO pin state +#define GPIO_PIN_TYPE_INPUT 0x00 +#define GPIO_PIN_TYPE_OUTPUT 0x10 +#define GPIO_PIN_TYPE_HW_CONTROL 0x20 + +//For GPIO_PIN_TYPE_OUTPUT the following is defined +#define GPIO_PIN_OUTPUT_STATE_MASK 0x01 +#define GPIO_PIN_OUTPUT_STATE_SHIFT 0 +#define GPIO_PIN_STATE_ACTIVE_LOW 0x0 +#define GPIO_PIN_STATE_ACTIVE_HIGH 0x1 + +typedef struct _ATOM_ENCODER_DVO_CF_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + ULONG ulStrengthControl; // DVOA strength control for CF + UCHAR ucPadding[2]; +}ATOM_ENCODER_DVO_CF_RECORD; + +// value for ATOM_CONNECTOR_CF_RECORD.ucConnectedDvoBundle +#define ATOM_CONNECTOR_CF_RECORD_CONNECTED_UPPER12BITBUNDLEA 1 +#define ATOM_CONNECTOR_CF_RECORD_CONNECTED_LOWER12BITBUNDLEB 2 + +typedef struct _ATOM_CONNECTOR_CF_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + USHORT usMaxPixClk; + UCHAR ucFlowCntlGpioId; + UCHAR ucSwapCntlGpioId; + UCHAR ucConnectedDvoBundle; + UCHAR ucPadding; +}ATOM_CONNECTOR_CF_RECORD; + +typedef struct _ATOM_CONNECTOR_HARDCODE_DTD_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + ATOM_DTD_FORMAT asTiming; +}ATOM_CONNECTOR_HARDCODE_DTD_RECORD; + +typedef struct _ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; //ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD_TYPE + UCHAR ucSubConnectorType; //CONNECTOR_OBJECT_ID_SINGLE_LINK_DVI_D|X_ID_DUAL_LINK_DVI_D|HDMI_TYPE_A + UCHAR ucReserved; +}ATOM_CONNECTOR_PCIE_SUBCONNECTOR_RECORD; + + +typedef struct _ATOM_ROUTER_DDC_PATH_SELECT_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucMuxType; //decide the number of ucMuxState, =0, no pin state, =1: single state with complement, >1: multiple state + UCHAR ucMuxControlPin; + UCHAR ucMuxState[2]; //for alligment purpose +}ATOM_ROUTER_DDC_PATH_SELECT_RECORD; + +typedef struct _ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD +{ + ATOM_COMMON_RECORD_HEADER sheader; + UCHAR ucMuxType; + UCHAR ucMuxControlPin; + UCHAR ucMuxState[2]; //for alligment purpose +}ATOM_ROUTER_DATA_CLOCK_PATH_SELECT_RECORD; + +// define ucMuxType +#define ATOM_ROUTER_MUX_PIN_STATE_MASK 0x0f +#define ATOM_ROUTER_MUX_PIN_SINGLE_STATE_COMPLEMENT 0x01 + +/****************************************************************************/ +// ASIC voltage data table +/****************************************************************************/ +typedef struct _ATOM_VOLTAGE_INFO_HEADER +{ + USHORT usVDDCBaseLevel; //In number of 50mv unit + USHORT usReserved; //For possible extension table offset + UCHAR ucNumOfVoltageEntries; + UCHAR ucBytesPerVoltageEntry; + UCHAR ucVoltageStep; //Indicating in how many mv increament is one step, 0.5mv unit + UCHAR ucDefaultVoltageEntry; + UCHAR ucVoltageControlI2cLine; + UCHAR ucVoltageControlAddress; + UCHAR ucVoltageControlOffset; +}ATOM_VOLTAGE_INFO_HEADER; + +typedef struct _ATOM_VOLTAGE_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_VOLTAGE_INFO_HEADER viHeader; + UCHAR ucVoltageEntries[64]; //64 is for allocation, the actual number of entry is present at ucNumOfVoltageEntries*ucBytesPerVoltageEntry +}ATOM_VOLTAGE_INFO; + + +typedef struct _ATOM_VOLTAGE_FORMULA +{ + USHORT usVoltageBaseLevel; // In number of 1mv unit + USHORT usVoltageStep; // Indicating in how many mv increament is one step, 1mv unit + UCHAR ucNumOfVoltageEntries; // Number of Voltage Entry, which indicate max Voltage + UCHAR ucFlag; // bit0=0 :step is 1mv =1 0.5mv + UCHAR ucBaseVID; // if there is no lookup table, VID= BaseVID + ( Vol - BaseLevle ) /VoltageStep + UCHAR ucReserved; + UCHAR ucVIDAdjustEntries[32]; // 32 is for allocation, the actual number of entry is present at ucNumOfVoltageEntries +}ATOM_VOLTAGE_FORMULA; + +typedef struct _ATOM_VOLTAGE_CONTROL +{ + UCHAR ucVoltageControlId; //Indicate it is controlled by I2C or GPIO or HW state machine + UCHAR ucVoltageControlI2cLine; + UCHAR ucVoltageControlAddress; + UCHAR ucVoltageControlOffset; + USHORT usGpioPin_AIndex; //GPIO_PAD register index + UCHAR ucGpioPinBitShift[9]; //at most 8 pin support 255 VIDs, termintate with 0xff + UCHAR ucReserved; +}ATOM_VOLTAGE_CONTROL; + +// Define ucVoltageControlId +#define VOLTAGE_CONTROLLED_BY_HW 0x00 +#define VOLTAGE_CONTROLLED_BY_I2C_MASK 0x7F +#define VOLTAGE_CONTROLLED_BY_GPIO 0x80 +#define VOLTAGE_CONTROL_ID_LM64 0x01 //I2C control, used for R5xx Core Voltage +#define VOLTAGE_CONTROL_ID_DAC 0x02 //I2C control, used for R5xx/R6xx MVDDC,MVDDQ or VDDCI +#define VOLTAGE_CONTROL_ID_VT116xM 0x03 //I2C control, used for R6xx Core Voltage +#define VOLTAGE_CONTROL_ID_DS4402 0x04 + +typedef struct _ATOM_VOLTAGE_OBJECT +{ + UCHAR ucVoltageType; //Indicate Voltage Source: VDDC, MVDDC, MVDDQ or MVDDCI + UCHAR ucSize; //Size of Object + ATOM_VOLTAGE_CONTROL asControl; //describ how to control + ATOM_VOLTAGE_FORMULA asFormula; //Indicate How to convert real Voltage to VID +}ATOM_VOLTAGE_OBJECT; + +typedef struct _ATOM_VOLTAGE_OBJECT_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_VOLTAGE_OBJECT asVoltageObj[3]; //Info for Voltage control +}ATOM_VOLTAGE_OBJECT_INFO; + +typedef struct _ATOM_LEAKID_VOLTAGE +{ + UCHAR ucLeakageId; + UCHAR ucReserved; + USHORT usVoltage; +}ATOM_LEAKID_VOLTAGE; + +typedef struct _ATOM_ASIC_PROFILE_VOLTAGE +{ + UCHAR ucProfileId; + UCHAR ucReserved; + USHORT usSize; + USHORT usEfuseSpareStartAddr; + USHORT usFuseIndex[8]; //from LSB to MSB, Max 8bit,end of 0xffff if less than 8 efuse id, + ATOM_LEAKID_VOLTAGE asLeakVol[2]; //Leakid and relatd voltage +}ATOM_ASIC_PROFILE_VOLTAGE; + +//ucProfileId +#define ATOM_ASIC_PROFILE_ID_EFUSE_VOLTAGE 1 +#define ATOM_ASIC_PROFILE_ID_EFUSE_PERFORMANCE_VOLTAGE 1 +#define ATOM_ASIC_PROFILE_ID_EFUSE_THERMAL_VOLTAGE 2 + +typedef struct _ATOM_ASIC_PROFILING_INFO +{ + ATOM_COMMON_TABLE_HEADER asHeader; + ATOM_ASIC_PROFILE_VOLTAGE asVoltage; +}ATOM_ASIC_PROFILING_INFO; + +typedef struct _ATOM_POWER_SOURCE_OBJECT +{ + UCHAR ucPwrSrcId; // Power source + UCHAR ucPwrSensorType; // GPIO, I2C or none + UCHAR ucPwrSensId; // if GPIO detect, it is GPIO id, if I2C detect, it is I2C id + UCHAR ucPwrSensSlaveAddr; // Slave address if I2C detect + UCHAR ucPwrSensRegIndex; // I2C register Index if I2C detect + UCHAR ucPwrSensRegBitMask; // detect which bit is used if I2C detect + UCHAR ucPwrSensActiveState; // high active or low active + UCHAR ucReserve[3]; // reserve + USHORT usSensPwr; // in unit of watt +}ATOM_POWER_SOURCE_OBJECT; + +typedef struct _ATOM_POWER_SOURCE_INFO +{ + ATOM_COMMON_TABLE_HEADER asHeader; + UCHAR asPwrbehave[16]; + ATOM_POWER_SOURCE_OBJECT asPwrObj[1]; +}ATOM_POWER_SOURCE_INFO; + + +//Define ucPwrSrcId +#define POWERSOURCE_PCIE_ID1 0x00 +#define POWERSOURCE_6PIN_CONNECTOR_ID1 0x01 +#define POWERSOURCE_8PIN_CONNECTOR_ID1 0x02 +#define POWERSOURCE_6PIN_CONNECTOR_ID2 0x04 +#define POWERSOURCE_8PIN_CONNECTOR_ID2 0x08 + +//define ucPwrSensorId +#define POWER_SENSOR_ALWAYS 0x00 +#define POWER_SENSOR_GPIO 0x01 +#define POWER_SENSOR_I2C 0x02 + +/**************************************************************************/ +// This portion is only used when ext thermal chip or engine/memory clock SS chip is populated on a design +//Memory SS Info Table +//Define Memory Clock SS chip ID +#define ICS91719 1 +#define ICS91720 2 + +//Define one structure to inform SW a "block of data" writing to external SS chip via I2C protocol +typedef struct _ATOM_I2C_DATA_RECORD +{ + UCHAR ucNunberOfBytes; //Indicates how many bytes SW needs to write to the external ASIC for one block, besides to "Start" and "Stop" + UCHAR ucI2CData[1]; //I2C data in bytes, should be less than 16 bytes usually +}ATOM_I2C_DATA_RECORD; + + +//Define one structure to inform SW how many blocks of data writing to external SS chip via I2C protocol, in addition to other information +typedef struct _ATOM_I2C_DEVICE_SETUP_INFO +{ + ATOM_I2C_ID_CONFIG_ACCESS sucI2cId; //I2C line and HW/SW assisted cap. + UCHAR ucSSChipID; //SS chip being used + UCHAR ucSSChipSlaveAddr; //Slave Address to set up this SS chip + UCHAR ucNumOfI2CDataRecords; //number of data block + ATOM_I2C_DATA_RECORD asI2CData[1]; +}ATOM_I2C_DEVICE_SETUP_INFO; + +//========================================================================================== +typedef struct _ATOM_ASIC_MVDD_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_I2C_DEVICE_SETUP_INFO asI2CSetup[1]; +}ATOM_ASIC_MVDD_INFO; + +//========================================================================================== +#define ATOM_MCLK_SS_INFO ATOM_ASIC_MVDD_INFO + +//========================================================================================== +/**************************************************************************/ + +typedef struct _ATOM_ASIC_SS_ASSIGNMENT +{ + ULONG ulTargetClockRange; //Clock Out frequence (VCO ), in unit of 10Khz + USHORT usSpreadSpectrumPercentage; //in unit of 0.01% + USHORT usSpreadRateInKhz; //in unit of kHz, modulation freq + UCHAR ucClockIndication; //Indicate which clock source needs SS + UCHAR ucSpreadSpectrumMode; //Bit1=0 Down Spread,=1 Center Spread. + UCHAR ucReserved[2]; +}ATOM_ASIC_SS_ASSIGNMENT; + +//Define ucSpreadSpectrumType +#define ASIC_INTERNAL_MEMORY_SS 1 +#define ASIC_INTERNAL_ENGINE_SS 2 +#define ASIC_INTERNAL_UVD_SS 3 + +typedef struct _ATOM_ASIC_INTERNAL_SS_INFO{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_ASIC_SS_ASSIGNMENT asSpreadSpectrum[4]; +}ATOM_ASIC_INTERNAL_SS_INFO; + +//==============================Scratch Pad Definition Portion=============================== +#define ATOM_DEVICE_CONNECT_INFO_DEF 0 +#define ATOM_ROM_LOCATION_DEF 1 +#define ATOM_TV_STANDARD_DEF 2 +#define ATOM_ACTIVE_INFO_DEF 3 +#define ATOM_LCD_INFO_DEF 4 +#define ATOM_DOS_REQ_INFO_DEF 5 +#define ATOM_ACC_CHANGE_INFO_DEF 6 +#define ATOM_DOS_MODE_INFO_DEF 7 +#define ATOM_I2C_CHANNEL_STATUS_DEF 8 +#define ATOM_I2C_CHANNEL_STATUS1_DEF 9 + + +// BIOS_0_SCRATCH Definition +#define ATOM_S0_CRT1_MONO 0x00000001L +#define ATOM_S0_CRT1_COLOR 0x00000002L +#define ATOM_S0_CRT1_MASK (ATOM_S0_CRT1_MONO+ATOM_S0_CRT1_COLOR) + +#define ATOM_S0_TV1_COMPOSITE_A 0x00000004L +#define ATOM_S0_TV1_SVIDEO_A 0x00000008L +#define ATOM_S0_TV1_MASK_A (ATOM_S0_TV1_COMPOSITE_A+ATOM_S0_TV1_SVIDEO_A) + +#define ATOM_S0_CV_A 0x00000010L +#define ATOM_S0_CV_DIN_A 0x00000020L +#define ATOM_S0_CV_MASK_A (ATOM_S0_CV_A+ATOM_S0_CV_DIN_A) + + +#define ATOM_S0_CRT2_MONO 0x00000100L +#define ATOM_S0_CRT2_COLOR 0x00000200L +#define ATOM_S0_CRT2_MASK (ATOM_S0_CRT2_MONO+ATOM_S0_CRT2_COLOR) + +#define ATOM_S0_TV1_COMPOSITE 0x00000400L +#define ATOM_S0_TV1_SVIDEO 0x00000800L +#define ATOM_S0_TV1_SCART 0x00004000L +#define ATOM_S0_TV1_MASK (ATOM_S0_TV1_COMPOSITE+ATOM_S0_TV1_SVIDEO+ATOM_S0_TV1_SCART) + +#define ATOM_S0_CV 0x00001000L +#define ATOM_S0_CV_DIN 0x00002000L +#define ATOM_S0_CV_MASK (ATOM_S0_CV+ATOM_S0_CV_DIN) + +#define ATOM_S0_DFP1 0x00010000L +#define ATOM_S0_DFP2 0x00020000L +#define ATOM_S0_LCD1 0x00040000L +#define ATOM_S0_LCD2 0x00080000L +#define ATOM_S0_TV2 0x00100000L +#define ATOM_S0_DFP3 0x00200000L +#define ATOM_S0_DFP4 0x00400000L +#define ATOM_S0_DFP5 0x00800000L + +#define ATOM_S0_DFP_MASK ATOM_S0_DFP1 | ATOM_S0_DFP2 | ATOM_S0_DFP3 | ATOM_S0_DFP4 | ATOM_S0_DFP5 + +#define ATOM_S0_FAD_REGISTER_BUG 0x02000000L // If set, indicates we are running a PCIE asic with + // the FAD/HDP reg access bug. Bit is read by DAL + +#define ATOM_S0_THERMAL_STATE_MASK 0x1C000000L +#define ATOM_S0_THERMAL_STATE_SHIFT 26 + +#define ATOM_S0_SYSTEM_POWER_STATE_MASK 0xE0000000L +#define ATOM_S0_SYSTEM_POWER_STATE_SHIFT 29 + +#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_AC 1 +#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_DC 2 +#define ATOM_S0_SYSTEM_POWER_STATE_VALUE_LITEAC 3 + +//Byte aligned defintion for BIOS usage +#define ATOM_S0_CRT1_MONOb0 0x01 +#define ATOM_S0_CRT1_COLORb0 0x02 +#define ATOM_S0_CRT1_MASKb0 (ATOM_S0_CRT1_MONOb0+ATOM_S0_CRT1_COLORb0) + +#define ATOM_S0_TV1_COMPOSITEb0 0x04 +#define ATOM_S0_TV1_SVIDEOb0 0x08 +#define ATOM_S0_TV1_MASKb0 (ATOM_S0_TV1_COMPOSITEb0+ATOM_S0_TV1_SVIDEOb0) + +#define ATOM_S0_CVb0 0x10 +#define ATOM_S0_CV_DINb0 0x20 +#define ATOM_S0_CV_MASKb0 (ATOM_S0_CVb0+ATOM_S0_CV_DINb0) + +#define ATOM_S0_CRT2_MONOb1 0x01 +#define ATOM_S0_CRT2_COLORb1 0x02 +#define ATOM_S0_CRT2_MASKb1 (ATOM_S0_CRT2_MONOb1+ATOM_S0_CRT2_COLORb1) + +#define ATOM_S0_TV1_COMPOSITEb1 0x04 +#define ATOM_S0_TV1_SVIDEOb1 0x08 +#define ATOM_S0_TV1_SCARTb1 0x40 +#define ATOM_S0_TV1_MASKb1 (ATOM_S0_TV1_COMPOSITEb1+ATOM_S0_TV1_SVIDEOb1+ATOM_S0_TV1_SCARTb1) + +#define ATOM_S0_CVb1 0x10 +#define ATOM_S0_CV_DINb1 0x20 +#define ATOM_S0_CV_MASKb1 (ATOM_S0_CVb1+ATOM_S0_CV_DINb1) + +#define ATOM_S0_DFP1b2 0x01 +#define ATOM_S0_DFP2b2 0x02 +#define ATOM_S0_LCD1b2 0x04 +#define ATOM_S0_LCD2b2 0x08 +#define ATOM_S0_TV2b2 0x10 +#define ATOM_S0_DFP3b2 0x20 +#define ATOM_S0_DFP4b2 0x40 +#define ATOM_S0_DFP5b2 0x80 + +#define ATOM_S0_THERMAL_STATE_MASKb3 0x1C +#define ATOM_S0_THERMAL_STATE_SHIFTb3 2 + +#define ATOM_S0_SYSTEM_POWER_STATE_MASKb3 0xE0 +#define ATOM_S0_LCD1_SHIFT 18 + +// BIOS_1_SCRATCH Definition +#define ATOM_S1_ROM_LOCATION_MASK 0x0000FFFFL +#define ATOM_S1_PCI_BUS_DEV_MASK 0xFFFF0000L + +// BIOS_2_SCRATCH Definition +#define ATOM_S2_TV1_STANDARD_MASK 0x0000000FL +#define ATOM_S2_CURRENT_BL_LEVEL_MASK 0x0000FF00L +#define ATOM_S2_CURRENT_BL_LEVEL_SHIFT 8 + +#define ATOM_S2_CRT1_DPMS_STATE 0x00010000L +#define ATOM_S2_LCD1_DPMS_STATE 0x00020000L +#define ATOM_S2_TV1_DPMS_STATE 0x00040000L +#define ATOM_S2_DFP1_DPMS_STATE 0x00080000L +#define ATOM_S2_CRT2_DPMS_STATE 0x00100000L +#define ATOM_S2_LCD2_DPMS_STATE 0x00200000L +#define ATOM_S2_TV2_DPMS_STATE 0x00400000L +#define ATOM_S2_DFP2_DPMS_STATE 0x00800000L +#define ATOM_S2_CV_DPMS_STATE 0x01000000L +#define ATOM_S2_DFP3_DPMS_STATE 0x02000000L +#define ATOM_S2_DFP4_DPMS_STATE 0x04000000L +#define ATOM_S2_DFP5_DPMS_STATE 0x08000000L + +#define ATOM_S2_DFP_DPM_STATE ATOM_S2_DFP1_DPMS_STATE | ATOM_S2_DFP2_DPMS_STATE | ATOM_S2_DFP3_DPMS_STATE | ATOM_S2_DFP4_DPMS_STATE | ATOM_S2_DFP5_DPMS_STATE + +#define ATOM_S2_DEVICE_DPMS_STATE (ATOM_S2_CRT1_DPMS_STATE+ATOM_S2_LCD1_DPMS_STATE+ATOM_S2_TV1_DPMS_STATE+\ + ATOM_S2_DFP_DPMS_STATE+ATOM_S2_CRT2_DPMS_STATE+ATOM_S2_LCD2_DPMS_STATE+\ + ATOM_S2_TV2_DPMS_STATE+ATOM_S2_CV_DPMS_STATE + +#define ATOM_S2_FORCEDLOWPWRMODE_STATE_MASK 0x0C000000L +#define ATOM_S2_FORCEDLOWPWRMODE_STATE_MASK_SHIFT 26 +#define ATOM_S2_FORCEDLOWPWRMODE_STATE_CHANGE 0x10000000L + +#define ATOM_S2_VRI_BRIGHT_ENABLE 0x20000000L + +#define ATOM_S2_DISPLAY_ROTATION_0_DEGREE 0x0 +#define ATOM_S2_DISPLAY_ROTATION_90_DEGREE 0x1 +#define ATOM_S2_DISPLAY_ROTATION_180_DEGREE 0x2 +#define ATOM_S2_DISPLAY_ROTATION_270_DEGREE 0x3 +#define ATOM_S2_DISPLAY_ROTATION_DEGREE_SHIFT 30 +#define ATOM_S2_DISPLAY_ROTATION_ANGLE_MASK 0xC0000000L + + +//Byte aligned defintion for BIOS usage +#define ATOM_S2_TV1_STANDARD_MASKb0 0x0F +#define ATOM_S2_CURRENT_BL_LEVEL_MASKb1 0xFF +#define ATOM_S2_CRT1_DPMS_STATEb2 0x01 +#define ATOM_S2_LCD1_DPMS_STATEb2 0x02 +#define ATOM_S2_TV1_DPMS_STATEb2 0x04 +#define ATOM_S2_DFP1_DPMS_STATEb2 0x08 +#define ATOM_S2_CRT2_DPMS_STATEb2 0x10 +#define ATOM_S2_LCD2_DPMS_STATEb2 0x20 +#define ATOM_S2_TV2_DPMS_STATEb2 0x40 +#define ATOM_S2_DFP2_DPMS_STATEb2 0x80 +#define ATOM_S2_CV_DPMS_STATEb3 0x01 +#define ATOM_S2_DFP3_DPMS_STATEb3 0x02 +#define ATOM_S2_DFP4_DPMS_STATEb3 0x04 +#define ATOM_S2_DFP5_DPMS_STATEb3 0x08 + +#define ATOM_S2_DEVICE_DPMS_MASKw1 0x3FF +#define ATOM_S2_FORCEDLOWPWRMODE_STATE_MASKb3 0x0C +#define ATOM_S2_FORCEDLOWPWRMODE_STATE_CHANGEb3 0x10 +#define ATOM_S2_VRI_BRIGHT_ENABLEb3 0x20 +#define ATOM_S2_ROTATION_STATE_MASKb3 0xC0 + + +// BIOS_3_SCRATCH Definition +#define ATOM_S3_CRT1_ACTIVE 0x00000001L +#define ATOM_S3_LCD1_ACTIVE 0x00000002L +#define ATOM_S3_TV1_ACTIVE 0x00000004L +#define ATOM_S3_DFP1_ACTIVE 0x00000008L +#define ATOM_S3_CRT2_ACTIVE 0x00000010L +#define ATOM_S3_LCD2_ACTIVE 0x00000020L +#define ATOM_S3_TV2_ACTIVE 0x00000040L +#define ATOM_S3_DFP2_ACTIVE 0x00000080L +#define ATOM_S3_CV_ACTIVE 0x00000100L +#define ATOM_S3_DFP3_ACTIVE 0x00000200L +#define ATOM_S3_DFP4_ACTIVE 0x00000400L +#define ATOM_S3_DFP5_ACTIVE 0x00000800L + +#define ATOM_S3_DEVICE_ACTIVE_MASK 0x00000FFFL + +#define ATOM_S3_LCD_FULLEXPANSION_ACTIVE 0x00001000L +#define ATOM_S3_LCD_EXPANSION_ASPEC_RATIO_ACTIVE 0x00002000L + +#define ATOM_S3_CRT1_CRTC_ACTIVE 0x00010000L +#define ATOM_S3_LCD1_CRTC_ACTIVE 0x00020000L +#define ATOM_S3_TV1_CRTC_ACTIVE 0x00040000L +#define ATOM_S3_DFP1_CRTC_ACTIVE 0x00080000L +#define ATOM_S3_CRT2_CRTC_ACTIVE 0x00100000L +#define ATOM_S3_LCD2_CRTC_ACTIVE 0x00200000L +#define ATOM_S3_TV2_CRTC_ACTIVE 0x00400000L +#define ATOM_S3_DFP2_CRTC_ACTIVE 0x00800000L +#define ATOM_S3_CV_CRTC_ACTIVE 0x01000000L +#define ATOM_S3_DFP3_CRTC_ACTIVE 0x02000000L +#define ATOM_S3_DFP4_CRTC_ACTIVE 0x04000000L +#define ATOM_S3_DFP5_CRTC_ACTIVE 0x08000000L + +#define ATOM_S3_DEVICE_CRTC_ACTIVE_MASK 0x0FFF0000L +#define ATOM_S3_ASIC_GUI_ENGINE_HUNG 0x20000000L +#define ATOM_S3_ALLOW_FAST_PWR_SWITCH 0x40000000L +#define ATOM_S3_RQST_GPU_USE_MIN_PWR 0x80000000L + +//Byte aligned defintion for BIOS usage +#define ATOM_S3_CRT1_ACTIVEb0 0x01 +#define ATOM_S3_LCD1_ACTIVEb0 0x02 +#define ATOM_S3_TV1_ACTIVEb0 0x04 +#define ATOM_S3_DFP1_ACTIVEb0 0x08 +#define ATOM_S3_CRT2_ACTIVEb0 0x10 +#define ATOM_S3_LCD2_ACTIVEb0 0x20 +#define ATOM_S3_TV2_ACTIVEb0 0x40 +#define ATOM_S3_DFP2_ACTIVEb0 0x80 +#define ATOM_S3_CV_ACTIVEb1 0x01 +#define ATOM_S3_DFP3_ACTIVEb1 0x02 +#define ATOM_S3_DFP4_ACTIVEb1 0x04 +#define ATOM_S3_DFP5_ACTIVEb1 0x08 + +#define ATOM_S3_ACTIVE_CRTC1w0 0xFFF + +#define ATOM_S3_CRT1_CRTC_ACTIVEb2 0x01 +#define ATOM_S3_LCD1_CRTC_ACTIVEb2 0x02 +#define ATOM_S3_TV1_CRTC_ACTIVEb2 0x04 +#define ATOM_S3_DFP1_CRTC_ACTIVEb2 0x08 +#define ATOM_S3_CRT2_CRTC_ACTIVEb2 0x10 +#define ATOM_S3_LCD2_CRTC_ACTIVEb2 0x20 +#define ATOM_S3_TV2_CRTC_ACTIVEb2 0x40 +#define ATOM_S3_DFP2_CRTC_ACTIVEb2 0x80 +#define ATOM_S3_CV_CRTC_ACTIVEb3 0x01 +#define ATOM_S3_DFP3_CRTC_ACTIVEb3 0x02 +#define ATOM_S3_DFP4_CRTC_ACTIVEb3 0x04 +#define ATOM_S3_DFP5_CRTC_ACTIVEb3 0x08 + +#define ATOM_S3_ACTIVE_CRTC2w1 0xFFF + +#define ATOM_S3_ASIC_GUI_ENGINE_HUNGb3 0x20 +#define ATOM_S3_ALLOW_FAST_PWR_SWITCHb3 0x40 +#define ATOM_S3_RQST_GPU_USE_MIN_PWRb3 0x80 + +// BIOS_4_SCRATCH Definition +#define ATOM_S4_LCD1_PANEL_ID_MASK 0x000000FFL +#define ATOM_S4_LCD1_REFRESH_MASK 0x0000FF00L +#define ATOM_S4_LCD1_REFRESH_SHIFT 8 + +//Byte aligned defintion for BIOS usage +#define ATOM_S4_LCD1_PANEL_ID_MASKb0 0x0FF +#define ATOM_S4_LCD1_REFRESH_MASKb1 ATOM_S4_LCD1_PANEL_ID_MASKb0 +#define ATOM_S4_VRAM_INFO_MASKb2 ATOM_S4_LCD1_PANEL_ID_MASKb0 + +// BIOS_5_SCRATCH Definition, BIOS_5_SCRATCH is used by Firmware only !!!! +#define ATOM_S5_DOS_REQ_CRT1b0 0x01 +#define ATOM_S5_DOS_REQ_LCD1b0 0x02 +#define ATOM_S5_DOS_REQ_TV1b0 0x04 +#define ATOM_S5_DOS_REQ_DFP1b0 0x08 +#define ATOM_S5_DOS_REQ_CRT2b0 0x10 +#define ATOM_S5_DOS_REQ_LCD2b0 0x20 +#define ATOM_S5_DOS_REQ_TV2b0 0x40 +#define ATOM_S5_DOS_REQ_DFP2b0 0x80 +#define ATOM_S5_DOS_REQ_CVb1 0x01 +#define ATOM_S5_DOS_REQ_DFP3b1 0x02 +#define ATOM_S5_DOS_REQ_DFP4b1 0x04 +#define ATOM_S5_DOS_REQ_DFP5b1 0x08 + +#define ATOM_S5_DOS_REQ_DEVICEw0 0x03FF + +#define ATOM_S5_DOS_REQ_CRT1 0x0001 +#define ATOM_S5_DOS_REQ_LCD1 0x0002 +#define ATOM_S5_DOS_REQ_TV1 0x0004 +#define ATOM_S5_DOS_REQ_DFP1 0x0008 +#define ATOM_S5_DOS_REQ_CRT2 0x0010 +#define ATOM_S5_DOS_REQ_LCD2 0x0020 +#define ATOM_S5_DOS_REQ_TV2 0x0040 +#define ATOM_S5_DOS_REQ_DFP2 0x0080 +#define ATOM_S5_DOS_REQ_CV 0x0100 +#define ATOM_S5_DOS_REQ_DFP3 0x0200 +#define ATOM_S5_DOS_REQ_DFP4 0x0400 +#define ATOM_S5_DOS_REQ_DFP5 0x0800 + +#define ATOM_S5_DOS_FORCE_CRT1b2 ATOM_S5_DOS_REQ_CRT1b0 +#define ATOM_S5_DOS_FORCE_TV1b2 ATOM_S5_DOS_REQ_TV1b0 +#define ATOM_S5_DOS_FORCE_CRT2b2 ATOM_S5_DOS_REQ_CRT2b0 +#define ATOM_S5_DOS_FORCE_CVb3 ATOM_S5_DOS_REQ_CVb1 +#define ATOM_S5_DOS_FORCE_DEVICEw1 (ATOM_S5_DOS_FORCE_CRT1b2+ATOM_S5_DOS_FORCE_TV1b2+ATOM_S5_DOS_FORCE_CRT2b2+\ + (ATOM_S5_DOS_FORCE_CVb3<<8)) + +// BIOS_6_SCRATCH Definition +#define ATOM_S6_DEVICE_CHANGE 0x00000001L +#define ATOM_S6_SCALER_CHANGE 0x00000002L +#define ATOM_S6_LID_CHANGE 0x00000004L +#define ATOM_S6_DOCKING_CHANGE 0x00000008L +#define ATOM_S6_ACC_MODE 0x00000010L +#define ATOM_S6_EXT_DESKTOP_MODE 0x00000020L +#define ATOM_S6_LID_STATE 0x00000040L +#define ATOM_S6_DOCK_STATE 0x00000080L +#define ATOM_S6_CRITICAL_STATE 0x00000100L +#define ATOM_S6_HW_I2C_BUSY_STATE 0x00000200L +#define ATOM_S6_THERMAL_STATE_CHANGE 0x00000400L +#define ATOM_S6_INTERRUPT_SET_BY_BIOS 0x00000800L +#define ATOM_S6_REQ_LCD_EXPANSION_FULL 0x00001000L //Normal expansion Request bit for LCD +#define ATOM_S6_REQ_LCD_EXPANSION_ASPEC_RATIO 0x00002000L //Aspect ratio expansion Request bit for LCD + +#define ATOM_S6_DISPLAY_STATE_CHANGE 0x00004000L //This bit is recycled when ATOM_BIOS_INFO_BIOS_SCRATCH6_SCL2_REDEFINE is set,previously it's SCL2_H_expansion +#define ATOM_S6_I2C_STATE_CHANGE 0x00008000L //This bit is recycled,when ATOM_BIOS_INFO_BIOS_SCRATCH6_SCL2_REDEFINE is set,previously it's SCL2_V_expansion + +#define ATOM_S6_ACC_REQ_CRT1 0x00010000L +#define ATOM_S6_ACC_REQ_LCD1 0x00020000L +#define ATOM_S6_ACC_REQ_TV1 0x00040000L +#define ATOM_S6_ACC_REQ_DFP1 0x00080000L +#define ATOM_S6_ACC_REQ_CRT2 0x00100000L +#define ATOM_S6_ACC_REQ_LCD2 0x00200000L +#define ATOM_S6_ACC_REQ_TV2 0x00400000L +#define ATOM_S6_ACC_REQ_DFP2 0x00800000L +#define ATOM_S6_ACC_REQ_CV 0x01000000L +#define ATOM_S6_ACC_REQ_DFP3 0x02000000L +#define ATOM_S6_ACC_REQ_DFP4 0x04000000L +#define ATOM_S6_ACC_REQ_DFP5 0x08000000L + +#define ATOM_S6_ACC_REQ_MASK 0x0FFF0000L +#define ATOM_S6_SYSTEM_POWER_MODE_CHANGE 0x10000000L +#define ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH 0x20000000L +#define ATOM_S6_VRI_BRIGHTNESS_CHANGE 0x40000000L +#define ATOM_S6_CONFIG_DISPLAY_CHANGE_MASK 0x80000000L + +//Byte aligned defintion for BIOS usage +#define ATOM_S6_DEVICE_CHANGEb0 0x01 +#define ATOM_S6_SCALER_CHANGEb0 0x02 +#define ATOM_S6_LID_CHANGEb0 0x04 +#define ATOM_S6_DOCKING_CHANGEb0 0x08 +#define ATOM_S6_ACC_MODEb0 0x10 +#define ATOM_S6_EXT_DESKTOP_MODEb0 0x20 +#define ATOM_S6_LID_STATEb0 0x40 +#define ATOM_S6_DOCK_STATEb0 0x80 +#define ATOM_S6_CRITICAL_STATEb1 0x01 +#define ATOM_S6_HW_I2C_BUSY_STATEb1 0x02 +#define ATOM_S6_THERMAL_STATE_CHANGEb1 0x04 +#define ATOM_S6_INTERRUPT_SET_BY_BIOSb1 0x08 +#define ATOM_S6_REQ_LCD_EXPANSION_FULLb1 0x10 +#define ATOM_S6_REQ_LCD_EXPANSION_ASPEC_RATIOb1 0x20 + +#define ATOM_S6_ACC_REQ_CRT1b2 0x01 +#define ATOM_S6_ACC_REQ_LCD1b2 0x02 +#define ATOM_S6_ACC_REQ_TV1b2 0x04 +#define ATOM_S6_ACC_REQ_DFP1b2 0x08 +#define ATOM_S6_ACC_REQ_CRT2b2 0x10 +#define ATOM_S6_ACC_REQ_LCD2b2 0x20 +#define ATOM_S6_ACC_REQ_TV2b2 0x40 +#define ATOM_S6_ACC_REQ_DFP2b2 0x80 +#define ATOM_S6_ACC_REQ_CVb3 0x01 +#define ATOM_S6_ACC_REQ_DFP3b3 0x02 +#define ATOM_S6_ACC_REQ_DFP4b3 0x04 +#define ATOM_S6_ACC_REQ_DFP5b3 0x08 + +#define ATOM_S6_ACC_REQ_DEVICEw1 ATOM_S5_DOS_REQ_DEVICEw0 +#define ATOM_S6_SYSTEM_POWER_MODE_CHANGEb3 0x10 +#define ATOM_S6_ACC_BLOCK_DISPLAY_SWITCHb3 0x20 +#define ATOM_S6_VRI_BRIGHTNESS_CHANGEb3 0x40 +#define ATOM_S6_CONFIG_DISPLAY_CHANGEb3 0x80 + +#define ATOM_S6_DEVICE_CHANGE_SHIFT 0 +#define ATOM_S6_SCALER_CHANGE_SHIFT 1 +#define ATOM_S6_LID_CHANGE_SHIFT 2 +#define ATOM_S6_DOCKING_CHANGE_SHIFT 3 +#define ATOM_S6_ACC_MODE_SHIFT 4 +#define ATOM_S6_EXT_DESKTOP_MODE_SHIFT 5 +#define ATOM_S6_LID_STATE_SHIFT 6 +#define ATOM_S6_DOCK_STATE_SHIFT 7 +#define ATOM_S6_CRITICAL_STATE_SHIFT 8 +#define ATOM_S6_HW_I2C_BUSY_STATE_SHIFT 9 +#define ATOM_S6_THERMAL_STATE_CHANGE_SHIFT 10 +#define ATOM_S6_INTERRUPT_SET_BY_BIOS_SHIFT 11 +#define ATOM_S6_REQ_SCALER_SHIFT 12 +#define ATOM_S6_REQ_SCALER_ARATIO_SHIFT 13 +#define ATOM_S6_DISPLAY_STATE_CHANGE_SHIFT 14 +#define ATOM_S6_I2C_STATE_CHANGE_SHIFT 15 +#define ATOM_S6_SYSTEM_POWER_MODE_CHANGE_SHIFT 28 +#define ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH_SHIFT 29 +#define ATOM_S6_VRI_BRIGHTNESS_CHANGE_SHIFT 30 +#define ATOM_S6_CONFIG_DISPLAY_CHANGE_SHIFT 31 + +// BIOS_7_SCRATCH Definition, BIOS_7_SCRATCH is used by Firmware only !!!! +#define ATOM_S7_DOS_MODE_TYPEb0 0x03 +#define ATOM_S7_DOS_MODE_VGAb0 0x00 +#define ATOM_S7_DOS_MODE_VESAb0 0x01 +#define ATOM_S7_DOS_MODE_EXTb0 0x02 +#define ATOM_S7_DOS_MODE_PIXEL_DEPTHb0 0x0C +#define ATOM_S7_DOS_MODE_PIXEL_FORMATb0 0xF0 +#define ATOM_S7_DOS_8BIT_DAC_ENb1 0x01 +#define ATOM_S7_DOS_MODE_NUMBERw1 0x0FFFF + +#define ATOM_S7_DOS_8BIT_DAC_EN_SHIFT 8 + +// BIOS_8_SCRATCH Definition +#define ATOM_S8_I2C_CHANNEL_BUSY_MASK 0x00000FFFF +#define ATOM_S8_I2C_HW_ENGINE_BUSY_MASK 0x0FFFF0000 + +#define ATOM_S8_I2C_CHANNEL_BUSY_SHIFT 0 +#define ATOM_S8_I2C_ENGINE_BUSY_SHIFT 16 + +// BIOS_9_SCRATCH Definition +#ifndef ATOM_S9_I2C_CHANNEL_COMPLETED_MASK +#define ATOM_S9_I2C_CHANNEL_COMPLETED_MASK 0x0000FFFF +#endif +#ifndef ATOM_S9_I2C_CHANNEL_ABORTED_MASK +#define ATOM_S9_I2C_CHANNEL_ABORTED_MASK 0xFFFF0000 +#endif +#ifndef ATOM_S9_I2C_CHANNEL_COMPLETED_SHIFT +#define ATOM_S9_I2C_CHANNEL_COMPLETED_SHIFT 0 +#endif +#ifndef ATOM_S9_I2C_CHANNEL_ABORTED_SHIFT +#define ATOM_S9_I2C_CHANNEL_ABORTED_SHIFT 16 +#endif + + +#define ATOM_FLAG_SET 0x20 +#define ATOM_FLAG_CLEAR 0 +#define CLEAR_ATOM_S6_ACC_MODE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_ACC_MODE_SHIFT | ATOM_FLAG_CLEAR) +#define SET_ATOM_S6_DEVICE_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_DEVICE_CHANGE_SHIFT | ATOM_FLAG_SET) +#define SET_ATOM_S6_VRI_BRIGHTNESS_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_VRI_BRIGHTNESS_CHANGE_SHIFT | ATOM_FLAG_SET) +#define SET_ATOM_S6_SCALER_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_SCALER_CHANGE_SHIFT | ATOM_FLAG_SET) +#define SET_ATOM_S6_LID_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_LID_CHANGE_SHIFT | ATOM_FLAG_SET) + +#define SET_ATOM_S6_LID_STATE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_LID_STATE_SHIFT | ATOM_FLAG_SET) +#define CLEAR_ATOM_S6_LID_STATE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_LID_STATE_SHIFT | ATOM_FLAG_CLEAR) + +#define SET_ATOM_S6_DOCK_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_DOCKING_CHANGE_SHIFT | ATOM_FLAG_SET) +#define SET_ATOM_S6_DOCK_STATE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_DOCK_STATE_SHIFT | ATOM_FLAG_SET) +#define CLEAR_ATOM_S6_DOCK_STATE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_DOCK_STATE_SHIFT | ATOM_FLAG_CLEAR) + +#define SET_ATOM_S6_THERMAL_STATE_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_THERMAL_STATE_CHANGE_SHIFT | ATOM_FLAG_SET) +#define SET_ATOM_S6_SYSTEM_POWER_MODE_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_SYSTEM_POWER_MODE_CHANGE_SHIFT | ATOM_FLAG_SET) +#define SET_ATOM_S6_INTERRUPT_SET_BY_BIOS ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_INTERRUPT_SET_BY_BIOS_SHIFT | ATOM_FLAG_SET) + +#define SET_ATOM_S6_CRITICAL_STATE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_CRITICAL_STATE_SHIFT | ATOM_FLAG_SET) +#define CLEAR_ATOM_S6_CRITICAL_STATE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_CRITICAL_STATE_SHIFT | ATOM_FLAG_CLEAR) + +#define SET_ATOM_S6_REQ_SCALER ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_REQ_SCALER_SHIFT | ATOM_FLAG_SET) +#define CLEAR_ATOM_S6_REQ_SCALER ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_REQ_SCALER_SHIFT | ATOM_FLAG_CLEAR ) + +#define SET_ATOM_S6_REQ_SCALER_ARATIO ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_REQ_SCALER_ARATIO_SHIFT | ATOM_FLAG_SET ) +#define CLEAR_ATOM_S6_REQ_SCALER_ARATIO ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_REQ_SCALER_ARATIO_SHIFT | ATOM_FLAG_CLEAR ) + +#define SET_ATOM_S6_I2C_STATE_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_I2C_STATE_CHANGE_SHIFT | ATOM_FLAG_SET ) + +#define SET_ATOM_S6_DISPLAY_STATE_CHANGE ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_DISPLAY_STATE_CHANGE_SHIFT | ATOM_FLAG_SET ) + +#define SET_ATOM_S6_DEVICE_RECONFIG ((ATOM_ACC_CHANGE_INFO_DEF << 8 )|ATOM_S6_CONFIG_DISPLAY_CHANGE_SHIFT | ATOM_FLAG_SET) +#define CLEAR_ATOM_S0_LCD1 ((ATOM_DEVICE_CONNECT_INFO_DEF << 8 )| ATOM_S0_LCD1_SHIFT | ATOM_FLAG_CLEAR ) +#define SET_ATOM_S7_DOS_8BIT_DAC_EN ((ATOM_DOS_MODE_INFO_DEF << 8 )|ATOM_S7_DOS_8BIT_DAC_EN_SHIFT | ATOM_FLAG_SET ) +#define CLEAR_ATOM_S7_DOS_8BIT_DAC_EN ((ATOM_DOS_MODE_INFO_DEF << 8 )|ATOM_S7_DOS_8BIT_DAC_EN_SHIFT | ATOM_FLAG_CLEAR ) + +/****************************************************************************/ +//Portion II: Definitinos only used in Driver +/****************************************************************************/ + +// Macros used by driver + +#define GetIndexIntoMasterTable(MasterOrData, FieldName) (((char*)(&((ATOM_MASTER_LIST_OF_##MasterOrData##_TABLES*)0)->FieldName)-(char*)0)/sizeof(USHORT)) + +#define GET_COMMAND_TABLE_COMMANDSET_REVISION(TABLE_HEADER_OFFSET) ((((ATOM_COMMON_TABLE_HEADER*)TABLE_HEADER_OFFSET)->ucTableFormatRevision)&0x3F) +#define GET_COMMAND_TABLE_PARAMETER_REVISION(TABLE_HEADER_OFFSET) ((((ATOM_COMMON_TABLE_HEADER*)TABLE_HEADER_OFFSET)->ucTableContentRevision)&0x3F) + +#define GET_DATA_TABLE_MAJOR_REVISION GET_COMMAND_TABLE_COMMANDSET_REVISION +#define GET_DATA_TABLE_MINOR_REVISION GET_COMMAND_TABLE_PARAMETER_REVISION + +/****************************************************************************/ +//Portion III: Definitinos only used in VBIOS +/****************************************************************************/ +#define ATOM_DAC_SRC 0x80 +#define ATOM_SRC_DAC1 0 +#define ATOM_SRC_DAC2 0x80 + + +#ifdef UEFI_BUILD + #define USHORT UTEMP +#endif + +typedef struct _MEMORY_PLLINIT_PARAMETERS +{ + ULONG ulTargetMemoryClock; //In 10Khz unit + UCHAR ucAction; //not define yet + UCHAR ucFbDiv_Hi; //Fbdiv Hi byte + UCHAR ucFbDiv; //FB value + UCHAR ucPostDiv; //Post div +}MEMORY_PLLINIT_PARAMETERS; + +#define MEMORY_PLLINIT_PS_ALLOCATION MEMORY_PLLINIT_PARAMETERS + + +#define GPIO_PIN_WRITE 0x01 +#define GPIO_PIN_READ 0x00 + +typedef struct _GPIO_PIN_CONTROL_PARAMETERS +{ + UCHAR ucGPIO_ID; //return value, read from GPIO pins + UCHAR ucGPIOBitShift; //define which bit in uGPIOBitVal need to be update + UCHAR ucGPIOBitVal; //Set/Reset corresponding bit defined in ucGPIOBitMask + UCHAR ucAction; //=GPIO_PIN_WRITE: Read; =GPIO_PIN_READ: Write +}GPIO_PIN_CONTROL_PARAMETERS; + +typedef struct _ENABLE_SCALER_PARAMETERS +{ + UCHAR ucScaler; // ATOM_SCALER1, ATOM_SCALER2 + UCHAR ucEnable; // ATOM_SCALER_DISABLE or ATOM_SCALER_CENTER or ATOM_SCALER_EXPANSION + UCHAR ucTVStandard; // + UCHAR ucPadding[1]; +}ENABLE_SCALER_PARAMETERS; +#define ENABLE_SCALER_PS_ALLOCATION ENABLE_SCALER_PARAMETERS + +//ucEnable: +#define SCALER_BYPASS_AUTO_CENTER_NO_REPLICATION 0 +#define SCALER_BYPASS_AUTO_CENTER_AUTO_REPLICATION 1 +#define SCALER_ENABLE_2TAP_ALPHA_MODE 2 +#define SCALER_ENABLE_MULTITAP_MODE 3 + +typedef struct _ENABLE_HARDWARE_ICON_CURSOR_PARAMETERS +{ + ULONG usHWIconHorzVertPosn; // Hardware Icon Vertical position + UCHAR ucHWIconVertOffset; // Hardware Icon Vertical offset + UCHAR ucHWIconHorzOffset; // Hardware Icon Horizontal offset + UCHAR ucSelection; // ATOM_CURSOR1 or ATOM_ICON1 or ATOM_CURSOR2 or ATOM_ICON2 + UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE +}ENABLE_HARDWARE_ICON_CURSOR_PARAMETERS; + +typedef struct _ENABLE_HARDWARE_ICON_CURSOR_PS_ALLOCATION +{ + ENABLE_HARDWARE_ICON_CURSOR_PARAMETERS sEnableIcon; + ENABLE_CRTC_PARAMETERS sReserved; +}ENABLE_HARDWARE_ICON_CURSOR_PS_ALLOCATION; + +typedef struct _ENABLE_GRAPH_SURFACE_PARAMETERS +{ + USHORT usHight; // Image Hight + USHORT usWidth; // Image Width + UCHAR ucSurface; // Surface 1 or 2 + UCHAR ucPadding[3]; +}ENABLE_GRAPH_SURFACE_PARAMETERS; + +typedef struct _ENABLE_GRAPH_SURFACE_PARAMETERS_V1_2 +{ + USHORT usHight; // Image Hight + USHORT usWidth; // Image Width + UCHAR ucSurface; // Surface 1 or 2 + UCHAR ucEnable; // ATOM_ENABLE or ATOM_DISABLE + UCHAR ucPadding[2]; +}ENABLE_GRAPH_SURFACE_PARAMETERS_V1_2; + +typedef struct _ENABLE_GRAPH_SURFACE_PS_ALLOCATION +{ + ENABLE_GRAPH_SURFACE_PARAMETERS sSetSurface; + ENABLE_YUV_PS_ALLOCATION sReserved; // Don't set this one +}ENABLE_GRAPH_SURFACE_PS_ALLOCATION; + +typedef struct _MEMORY_CLEAN_UP_PARAMETERS +{ + USHORT usMemoryStart; //in 8Kb boundry, offset from memory base address + USHORT usMemorySize; //8Kb blocks aligned +}MEMORY_CLEAN_UP_PARAMETERS; +#define MEMORY_CLEAN_UP_PS_ALLOCATION MEMORY_CLEAN_UP_PARAMETERS + +typedef struct _GET_DISPLAY_SURFACE_SIZE_PARAMETERS +{ + USHORT usX_Size; //When use as input parameter, usX_Size indicates which CRTC + USHORT usY_Size; +}GET_DISPLAY_SURFACE_SIZE_PARAMETERS; + +typedef struct _INDIRECT_IO_ACCESS +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR IOAccessSequence[256]; +} INDIRECT_IO_ACCESS; + +#define INDIRECT_READ 0x00 +#define INDIRECT_WRITE 0x80 + +#define INDIRECT_IO_MM 0 +#define INDIRECT_IO_PLL 1 +#define INDIRECT_IO_MC 2 +#define INDIRECT_IO_PCIE 3 +#define INDIRECT_IO_PCIEP 4 +#define INDIRECT_IO_NBMISC 5 + +#define INDIRECT_IO_PLL_READ INDIRECT_IO_PLL | INDIRECT_READ +#define INDIRECT_IO_PLL_WRITE INDIRECT_IO_PLL | INDIRECT_WRITE +#define INDIRECT_IO_MC_READ INDIRECT_IO_MC | INDIRECT_READ +#define INDIRECT_IO_MC_WRITE INDIRECT_IO_MC | INDIRECT_WRITE +#define INDIRECT_IO_PCIE_READ INDIRECT_IO_PCIE | INDIRECT_READ +#define INDIRECT_IO_PCIE_WRITE INDIRECT_IO_PCIE | INDIRECT_WRITE +#define INDIRECT_IO_PCIEP_READ INDIRECT_IO_PCIEP | INDIRECT_READ +#define INDIRECT_IO_PCIEP_WRITE INDIRECT_IO_PCIEP | INDIRECT_WRITE +#define INDIRECT_IO_NBMISC_READ INDIRECT_IO_NBMISC | INDIRECT_READ +#define INDIRECT_IO_NBMISC_WRITE INDIRECT_IO_NBMISC | INDIRECT_WRITE + +typedef struct _ATOM_OEM_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_I2C_ID_CONFIG_ACCESS sucI2cId; +}ATOM_OEM_INFO; + +typedef struct _ATOM_TV_MODE +{ + UCHAR ucVMode_Num; //Video mode number + UCHAR ucTV_Mode_Num; //Internal TV mode number +}ATOM_TV_MODE; + +typedef struct _ATOM_BIOS_INT_TVSTD_MODE +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usTV_Mode_LUT_Offset; // Pointer to standard to internal number conversion table + USHORT usTV_FIFO_Offset; // Pointer to FIFO entry table + USHORT usNTSC_Tbl_Offset; // Pointer to SDTV_Mode_NTSC table + USHORT usPAL_Tbl_Offset; // Pointer to SDTV_Mode_PAL table + USHORT usCV_Tbl_Offset; // Pointer to SDTV_Mode_PAL table +}ATOM_BIOS_INT_TVSTD_MODE; + + +typedef struct _ATOM_TV_MODE_SCALER_PTR +{ + USHORT ucFilter0_Offset; //Pointer to filter format 0 coefficients + USHORT usFilter1_Offset; //Pointer to filter format 0 coefficients + UCHAR ucTV_Mode_Num; +}ATOM_TV_MODE_SCALER_PTR; + +typedef struct _ATOM_STANDARD_VESA_TIMING +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_DTD_FORMAT aModeTimings[16]; // 16 is not the real array number, just for initial allocation +}ATOM_STANDARD_VESA_TIMING; + + +typedef struct _ATOM_STD_FORMAT +{ + USHORT usSTD_HDisp; + USHORT usSTD_VDisp; + USHORT usSTD_RefreshRate; + USHORT usReserved; +}ATOM_STD_FORMAT; + +typedef struct _ATOM_VESA_TO_EXTENDED_MODE +{ + USHORT usVESA_ModeNumber; + USHORT usExtendedModeNumber; +}ATOM_VESA_TO_EXTENDED_MODE; + +typedef struct _ATOM_VESA_TO_INTENAL_MODE_LUT +{ + ATOM_COMMON_TABLE_HEADER sHeader; + ATOM_VESA_TO_EXTENDED_MODE asVESA_ToExtendedModeInfo[76]; +}ATOM_VESA_TO_INTENAL_MODE_LUT; + +/*************** ATOM Memory Related Data Structure ***********************/ +typedef struct _ATOM_MEMORY_VENDOR_BLOCK{ + UCHAR ucMemoryType; + UCHAR ucMemoryVendor; + UCHAR ucAdjMCId; + UCHAR ucDynClkId; + ULONG ulDllResetClkRange; +}ATOM_MEMORY_VENDOR_BLOCK; + + +typedef struct _ATOM_MEMORY_SETTING_ID_CONFIG{ + ULONG ulMemClockRange:24; + ULONG ucMemBlkId:8; +}ATOM_MEMORY_SETTING_ID_CONFIG; + +typedef union _ATOM_MEMORY_SETTING_ID_CONFIG_ACCESS +{ + ATOM_MEMORY_SETTING_ID_CONFIG slAccess; + ULONG ulAccess; +}ATOM_MEMORY_SETTING_ID_CONFIG_ACCESS; + + +typedef struct _ATOM_MEMORY_SETTING_DATA_BLOCK{ + ATOM_MEMORY_SETTING_ID_CONFIG_ACCESS ulMemoryID; + ULONG aulMemData[1]; +}ATOM_MEMORY_SETTING_DATA_BLOCK; + + +typedef struct _ATOM_INIT_REG_INDEX_FORMAT{ + USHORT usRegIndex; // MC register index + UCHAR ucPreRegDataLength; // offset in ATOM_INIT_REG_DATA_BLOCK.saRegDataBuf +}ATOM_INIT_REG_INDEX_FORMAT; + + +typedef struct _ATOM_INIT_REG_BLOCK{ + USHORT usRegIndexTblSize; //size of asRegIndexBuf + USHORT usRegDataBlkSize; //size of ATOM_MEMORY_SETTING_DATA_BLOCK + ATOM_INIT_REG_INDEX_FORMAT asRegIndexBuf[1]; + ATOM_MEMORY_SETTING_DATA_BLOCK asRegDataBuf[1]; +}ATOM_INIT_REG_BLOCK; + +#define END_OF_REG_INDEX_BLOCK 0x0ffff +#define END_OF_REG_DATA_BLOCK 0x00000000 +#define ATOM_INIT_REG_MASK_FLAG 0x80 +#define CLOCK_RANGE_HIGHEST 0x00ffffff + +#define VALUE_DWORD SIZEOF ULONG +#define VALUE_SAME_AS_ABOVE 0 +#define VALUE_MASK_DWORD 0x84 + +#define INDEX_ACCESS_RANGE_BEGIN (VALUE_DWORD + 1) +#define INDEX_ACCESS_RANGE_END (INDEX_ACCESS_RANGE_BEGIN + 1) +#define VALUE_INDEX_ACCESS_SINGLE (INDEX_ACCESS_RANGE_END + 1) + + +typedef struct _ATOM_MC_INIT_PARAM_TABLE +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usAdjustARB_SEQDataOffset; + USHORT usMCInitMemTypeTblOffset; + USHORT usMCInitCommonTblOffset; + USHORT usMCInitPowerDownTblOffset; + ULONG ulARB_SEQDataBuf[32]; + ATOM_INIT_REG_BLOCK asMCInitMemType; + ATOM_INIT_REG_BLOCK asMCInitCommon; +}ATOM_MC_INIT_PARAM_TABLE; + + +#define _4Mx16 0x2 +#define _4Mx32 0x3 +#define _8Mx16 0x12 +#define _8Mx32 0x13 +#define _16Mx16 0x22 +#define _16Mx32 0x23 +#define _32Mx16 0x32 +#define _32Mx32 0x33 +#define _64Mx8 0x41 +#define _64Mx16 0x42 + +#define SAMSUNG 0x1 +#define INFINEON 0x2 +#define ELPIDA 0x3 +#define ETRON 0x4 +#define NANYA 0x5 +#define HYNIX 0x6 +#define MOSEL 0x7 +#define WINBOND 0x8 +#define ESMT 0x9 +#define MICRON 0xF + +#define QIMONDA INFINEON +#define PROMOS MOSEL + +/////////////Support for GDDR5 MC uCode to reside in upper 64K of ROM///////////// + +#define UCODE_ROM_START_ADDRESS 0x1c000 +#define UCODE_SIGNATURE 0x4375434d // 'MCuC' - MC uCode + +//uCode block header for reference + +typedef struct _MCuCodeHeader +{ + ULONG ulSignature; + UCHAR ucRevision; + UCHAR ucChecksum; + UCHAR ucReserved1; + UCHAR ucReserved2; + USHORT usParametersLength; + USHORT usUCodeLength; + USHORT usReserved1; + USHORT usReserved2; +} MCuCodeHeader; + +////////////////////////////////////////////////////////////////////////////////// + +#define ATOM_MAX_NUMBER_OF_VRAM_MODULE 16 + +#define ATOM_VRAM_MODULE_MEMORY_VENDOR_ID_MASK 0xF +typedef struct _ATOM_VRAM_MODULE_V1 +{ + ULONG ulReserved; + USHORT usEMRSValue; + USHORT usMRSValue; + USHORT usReserved; + UCHAR ucExtMemoryID; // An external indicator (by hardcode, callback or pin) to tell what is the current memory module + UCHAR ucMemoryType; // [7:4]=0x1:DDR1;=0x2:DDR2;=0x3:DDR3;=0x4:DDR4;[3:0] reserved; + UCHAR ucMemoryVenderID; // Predefined,never change across designs or memory type/vender + UCHAR ucMemoryDeviceCfg; // [7:4]=0x0:4M;=0x1:8M;=0x2:16M;0x3:32M....[3:0]=0x0:x4;=0x1:x8;=0x2:x16;=0x3:x32... + UCHAR ucRow; // Number of Row,in power of 2; + UCHAR ucColumn; // Number of Column,in power of 2; + UCHAR ucBank; // Nunber of Bank; + UCHAR ucRank; // Number of Rank, in power of 2 + UCHAR ucChannelNum; // Number of channel; + UCHAR ucChannelConfig; // [3:0]=Indication of what channel combination;[4:7]=Channel bit width, in number of 2 + UCHAR ucDefaultMVDDQ_ID; // Default MVDDQ setting for this memory block, ID linking to MVDDQ info table to find real set-up data; + UCHAR ucDefaultMVDDC_ID; // Default MVDDC setting for this memory block, ID linking to MVDDC info table to find real set-up data; + UCHAR ucReserved[2]; +}ATOM_VRAM_MODULE_V1; + + +typedef struct _ATOM_VRAM_MODULE_V2 +{ + ULONG ulReserved; + ULONG ulFlags; // To enable/disable functionalities based on memory type + ULONG ulEngineClock; // Override of default engine clock for particular memory type + ULONG ulMemoryClock; // Override of default memory clock for particular memory type + USHORT usEMRS2Value; // EMRS2 Value is used for GDDR2 and GDDR4 memory type + USHORT usEMRS3Value; // EMRS3 Value is used for GDDR2 and GDDR4 memory type + USHORT usEMRSValue; + USHORT usMRSValue; + USHORT usReserved; + UCHAR ucExtMemoryID; // An external indicator (by hardcode, callback or pin) to tell what is the current memory module + UCHAR ucMemoryType; // [7:4]=0x1:DDR1;=0x2:DDR2;=0x3:DDR3;=0x4:DDR4;[3:0] - must not be used for now; + UCHAR ucMemoryVenderID; // Predefined,never change across designs or memory type/vender. If not predefined, vendor detection table gets executed + UCHAR ucMemoryDeviceCfg; // [7:4]=0x0:4M;=0x1:8M;=0x2:16M;0x3:32M....[3:0]=0x0:x4;=0x1:x8;=0x2:x16;=0x3:x32... + UCHAR ucRow; // Number of Row,in power of 2; + UCHAR ucColumn; // Number of Column,in power of 2; + UCHAR ucBank; // Nunber of Bank; + UCHAR ucRank; // Number of Rank, in power of 2 + UCHAR ucChannelNum; // Number of channel; + UCHAR ucChannelConfig; // [3:0]=Indication of what channel combination;[4:7]=Channel bit width, in number of 2 + UCHAR ucDefaultMVDDQ_ID; // Default MVDDQ setting for this memory block, ID linking to MVDDQ info table to find real set-up data; + UCHAR ucDefaultMVDDC_ID; // Default MVDDC setting for this memory block, ID linking to MVDDC info table to find real set-up data; + UCHAR ucRefreshRateFactor; + UCHAR ucReserved[3]; +}ATOM_VRAM_MODULE_V2; + + +typedef struct _ATOM_MEMORY_TIMING_FORMAT +{ + ULONG ulClkRange; // memory clock in 10kHz unit, when target memory clock is below this clock, use this memory timing + union{ + USHORT usMRS; // mode register + USHORT usDDR3_MR0; + }; + union{ + USHORT usEMRS; // extended mode register + USHORT usDDR3_MR1; + }; + UCHAR ucCL; // CAS latency + UCHAR ucWL; // WRITE Latency + UCHAR uctRAS; // tRAS + UCHAR uctRC; // tRC + UCHAR uctRFC; // tRFC + UCHAR uctRCDR; // tRCDR + UCHAR uctRCDW; // tRCDW + UCHAR uctRP; // tRP + UCHAR uctRRD; // tRRD + UCHAR uctWR; // tWR + UCHAR uctWTR; // tWTR + UCHAR uctPDIX; // tPDIX + UCHAR uctFAW; // tFAW + UCHAR uctAOND; // tAOND + union + { + struct { + UCHAR ucflag; // flag to control memory timing calculation. bit0= control EMRS2 Infineon + UCHAR ucReserved; + }; + USHORT usDDR3_MR2; + }; +}ATOM_MEMORY_TIMING_FORMAT; + + +typedef struct _ATOM_MEMORY_TIMING_FORMAT_V1 +{ + ULONG ulClkRange; // memory clock in 10kHz unit, when target memory clock is below this clock, use this memory timing + USHORT usMRS; // mode register + USHORT usEMRS; // extended mode register + UCHAR ucCL; // CAS latency + UCHAR ucWL; // WRITE Latency + UCHAR uctRAS; // tRAS + UCHAR uctRC; // tRC + UCHAR uctRFC; // tRFC + UCHAR uctRCDR; // tRCDR + UCHAR uctRCDW; // tRCDW + UCHAR uctRP; // tRP + UCHAR uctRRD; // tRRD + UCHAR uctWR; // tWR + UCHAR uctWTR; // tWTR + UCHAR uctPDIX; // tPDIX + UCHAR uctFAW; // tFAW + UCHAR uctAOND; // tAOND + UCHAR ucflag; // flag to control memory timing calculation. bit0= control EMRS2 Infineon +////////////////////////////////////GDDR parameters/////////////////////////////////// + UCHAR uctCCDL; // + UCHAR uctCRCRL; // + UCHAR uctCRCWL; // + UCHAR uctCKE; // + UCHAR uctCKRSE; // + UCHAR uctCKRSX; // + UCHAR uctFAW32; // + UCHAR ucReserved1; // + UCHAR ucReserved2; // + UCHAR ucTerminator; +}ATOM_MEMORY_TIMING_FORMAT_V1; + + +typedef struct _ATOM_MEMORY_FORMAT +{ + ULONG ulDllDisClock; // memory DLL will be disable when target memory clock is below this clock + union{ + USHORT usEMRS2Value; // EMRS2 Value is used for GDDR2 and GDDR4 memory type + USHORT usDDR3_Reserved; // Not used for DDR3 memory + }; + union{ + USHORT usEMRS3Value; // EMRS3 Value is used for GDDR2 and GDDR4 memory type + USHORT usDDR3_MR3; // Used for DDR3 memory + }; + UCHAR ucMemoryType; // [7:4]=0x1:DDR1;=0x2:DDR2;=0x3:DDR3;=0x4:DDR4;[3:0] - must not be used for now; + UCHAR ucMemoryVenderID; // Predefined,never change across designs or memory type/vender. If not predefined, vendor detection table gets executed + UCHAR ucRow; // Number of Row,in power of 2; + UCHAR ucColumn; // Number of Column,in power of 2; + UCHAR ucBank; // Nunber of Bank; + UCHAR ucRank; // Number of Rank, in power of 2 + UCHAR ucBurstSize; // burst size, 0= burst size=4 1= burst size=8 + UCHAR ucDllDisBit; // position of DLL Enable/Disable bit in EMRS ( Extended Mode Register ) + UCHAR ucRefreshRateFactor; // memory refresh rate in unit of ms + UCHAR ucDensity; // _8Mx32, _16Mx32, _16Mx16, _32Mx16 + UCHAR ucPreamble; //[7:4] Write Preamble, [3:0] Read Preamble + UCHAR ucMemAttrib; // Memory Device Addribute, like RDBI/WDBI etc + ATOM_MEMORY_TIMING_FORMAT asMemTiming[5]; //Memory Timing block sort from lower clock to higher clock +}ATOM_MEMORY_FORMAT; + + +typedef struct _ATOM_VRAM_MODULE_V3 +{ + ULONG ulChannelMapCfg; // board dependent paramenter:Channel combination + USHORT usSize; // size of ATOM_VRAM_MODULE_V3 + USHORT usDefaultMVDDQ; // board dependent parameter:Default Memory Core Voltage + USHORT usDefaultMVDDC; // board dependent parameter:Default Memory IO Voltage + UCHAR ucExtMemoryID; // An external indicator (by hardcode, callback or pin) to tell what is the current memory module + UCHAR ucChannelNum; // board dependent parameter:Number of channel; + UCHAR ucChannelSize; // board dependent parameter:32bit or 64bit + UCHAR ucVREFI; // board dependnt parameter: EXT or INT +160mv to -140mv + UCHAR ucNPL_RT; // board dependent parameter:NPL round trip delay, used for calculate memory timing parameters + UCHAR ucFlag; // To enable/disable functionalities based on memory type + ATOM_MEMORY_FORMAT asMemory; // describ all of video memory parameters from memory spec +}ATOM_VRAM_MODULE_V3; + + +//ATOM_VRAM_MODULE_V3.ucNPL_RT +#define NPL_RT_MASK 0x0f +#define BATTERY_ODT_MASK 0xc0 + +#define ATOM_VRAM_MODULE ATOM_VRAM_MODULE_V3 + +typedef struct _ATOM_VRAM_MODULE_V4 +{ + ULONG ulChannelMapCfg; // board dependent parameter: Channel combination + USHORT usModuleSize; // size of ATOM_VRAM_MODULE_V4, make it easy for VBIOS to look for next entry of VRAM_MODULE + USHORT usPrivateReserved; // BIOS internal reserved space to optimize code size, updated by the compiler, shouldn't be modified manually!! + // MC_ARB_RAMCFG (includes NOOFBANK,NOOFRANKS,NOOFROWS,NOOFCOLS) + USHORT usReserved; + UCHAR ucExtMemoryID; // An external indicator (by hardcode, callback or pin) to tell what is the current memory module + UCHAR ucMemoryType; // [7:4]=0x1:DDR1;=0x2:DDR2;=0x3:DDR3;=0x4:DDR4; 0x5:DDR5 [3:0] - Must be 0x0 for now; + UCHAR ucChannelNum; // Number of channels present in this module config + UCHAR ucChannelWidth; // 0 - 32 bits; 1 - 64 bits + UCHAR ucDensity; // _8Mx32, _16Mx32, _16Mx16, _32Mx16 + UCHAR ucFlag; // To enable/disable functionalities based on memory type + UCHAR ucMisc; // bit0: 0 - single rank; 1 - dual rank; bit2: 0 - burstlength 4, 1 - burstlength 8 + UCHAR ucVREFI; // board dependent parameter + UCHAR ucNPL_RT; // board dependent parameter:NPL round trip delay, used for calculate memory timing parameters + UCHAR ucPreamble; // [7:4] Write Preamble, [3:0] Read Preamble + UCHAR ucMemorySize; // BIOS internal reserved space to optimize code size, updated by the compiler, shouldn't be modified manually!! + // Total memory size in unit of 16MB for CONFIG_MEMSIZE - bit[23:0] zeros + UCHAR ucReserved[3]; + +//compare with V3, we flat the struct by merging ATOM_MEMORY_FORMAT (as is) into V4 as the same level + union{ + USHORT usEMRS2Value; // EMRS2 Value is used for GDDR2 and GDDR4 memory type + USHORT usDDR3_Reserved; + }; + union{ + USHORT usEMRS3Value; // EMRS3 Value is used for GDDR2 and GDDR4 memory type + USHORT usDDR3_MR3; // Used for DDR3 memory + }; + UCHAR ucMemoryVenderID; // Predefined, If not predefined, vendor detection table gets executed + UCHAR ucRefreshRateFactor; // [1:0]=RefreshFactor (00=8ms, 01=16ms, 10=32ms,11=64ms) + UCHAR ucReserved2[2]; + ATOM_MEMORY_TIMING_FORMAT asMemTiming[5];//Memory Timing block sort from lower clock to higher clock +}ATOM_VRAM_MODULE_V4; + +#define VRAM_MODULE_V4_MISC_RANK_MASK 0x3 +#define VRAM_MODULE_V4_MISC_DUAL_RANK 0x1 +#define VRAM_MODULE_V4_MISC_BL_MASK 0x4 +#define VRAM_MODULE_V4_MISC_BL8 0x4 +#define VRAM_MODULE_V4_MISC_DUAL_CS 0x10 + +typedef struct _ATOM_VRAM_MODULE_V5 +{ + ULONG ulChannelMapCfg; // board dependent parameter: Channel combination + USHORT usModuleSize; // size of ATOM_VRAM_MODULE_V4, make it easy for VBIOS to look for next entry of VRAM_MODULE + USHORT usPrivateReserved; // BIOS internal reserved space to optimize code size, updated by the compiler, shouldn't be modified manually!! + // MC_ARB_RAMCFG (includes NOOFBANK,NOOFRANKS,NOOFROWS,NOOFCOLS) + USHORT usReserved; + UCHAR ucExtMemoryID; // An external indicator (by hardcode, callback or pin) to tell what is the current memory module + UCHAR ucMemoryType; // [7:4]=0x1:DDR1;=0x2:DDR2;=0x3:DDR3;=0x4:DDR4; 0x5:DDR5 [3:0] - Must be 0x0 for now; + UCHAR ucChannelNum; // Number of channels present in this module config + UCHAR ucChannelWidth; // 0 - 32 bits; 1 - 64 bits + UCHAR ucDensity; // _8Mx32, _16Mx32, _16Mx16, _32Mx16 + UCHAR ucFlag; // To enable/disable functionalities based on memory type + UCHAR ucMisc; // bit0: 0 - single rank; 1 - dual rank; bit2: 0 - burstlength 4, 1 - burstlength 8 + UCHAR ucVREFI; // board dependent parameter + UCHAR ucNPL_RT; // board dependent parameter:NPL round trip delay, used for calculate memory timing parameters + UCHAR ucPreamble; // [7:4] Write Preamble, [3:0] Read Preamble + UCHAR ucMemorySize; // BIOS internal reserved space to optimize code size, updated by the compiler, shouldn't be modified manually!! + // Total memory size in unit of 16MB for CONFIG_MEMSIZE - bit[23:0] zeros + UCHAR ucReserved[3]; + +//compare with V3, we flat the struct by merging ATOM_MEMORY_FORMAT (as is) into V4 as the same level + USHORT usEMRS2Value; // EMRS2 Value is used for GDDR2 and GDDR4 memory type + USHORT usEMRS3Value; // EMRS3 Value is used for GDDR2 and GDDR4 memory type + UCHAR ucMemoryVenderID; // Predefined, If not predefined, vendor detection table gets executed + UCHAR ucRefreshRateFactor; // [1:0]=RefreshFactor (00=8ms, 01=16ms, 10=32ms,11=64ms) + UCHAR ucFIFODepth; // FIFO depth supposes to be detected during vendor detection, but if we dont do vendor detection we have to hardcode FIFO Depth + UCHAR ucCDR_Bandwidth; // [0:3]=Read CDR bandwidth, [4:7] - Write CDR Bandwidth + ATOM_MEMORY_TIMING_FORMAT_V1 asMemTiming[5];//Memory Timing block sort from lower clock to higher clock +}ATOM_VRAM_MODULE_V5; + +typedef struct _ATOM_VRAM_INFO_V2 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR ucNumOfVRAMModule; + ATOM_VRAM_MODULE aVramInfo[ATOM_MAX_NUMBER_OF_VRAM_MODULE]; // just for allocation, real number of blocks is in ucNumOfVRAMModule; +}ATOM_VRAM_INFO_V2; + +typedef struct _ATOM_VRAM_INFO_V3 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usMemAdjustTblOffset; // offset of ATOM_INIT_REG_BLOCK structure for memory vendor specific MC adjust setting + USHORT usMemClkPatchTblOffset; // offset of ATOM_INIT_REG_BLOCK structure for memory clock specific MC setting + USHORT usRerseved; + UCHAR aVID_PinsShift[9]; // 8 bit strap maximum+terminator + UCHAR ucNumOfVRAMModule; + ATOM_VRAM_MODULE aVramInfo[ATOM_MAX_NUMBER_OF_VRAM_MODULE]; // just for allocation, real number of blocks is in ucNumOfVRAMModule; + ATOM_INIT_REG_BLOCK asMemPatch; // for allocation + // ATOM_INIT_REG_BLOCK aMemAdjust; +}ATOM_VRAM_INFO_V3; + +#define ATOM_VRAM_INFO_LAST ATOM_VRAM_INFO_V3 + +typedef struct _ATOM_VRAM_INFO_V4 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usMemAdjustTblOffset; // offset of ATOM_INIT_REG_BLOCK structure for memory vendor specific MC adjust setting + USHORT usMemClkPatchTblOffset; // offset of ATOM_INIT_REG_BLOCK structure for memory clock specific MC setting + USHORT usRerseved; + UCHAR ucMemDQ7_0ByteRemap; // DQ line byte remap, =0: Memory Data line BYTE0, =1: BYTE1, =2: BYTE2, =3: BYTE3 + ULONG ulMemDQ7_0BitRemap; // each DQ line ( 7~0) use 3bits, like: DQ0=Bit[2:0], DQ1:[5:3], ... DQ7:[23:21] + UCHAR ucReservde[4]; + UCHAR ucNumOfVRAMModule; + ATOM_VRAM_MODULE_V4 aVramInfo[ATOM_MAX_NUMBER_OF_VRAM_MODULE]; // just for allocation, real number of blocks is in ucNumOfVRAMModule; + ATOM_INIT_REG_BLOCK asMemPatch; // for allocation + // ATOM_INIT_REG_BLOCK aMemAdjust; +}ATOM_VRAM_INFO_V4; + +typedef struct _ATOM_VRAM_GPIO_DETECTION_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR aVID_PinsShift[9]; //8 bit strap maximum+terminator +}ATOM_VRAM_GPIO_DETECTION_INFO; + + +typedef struct _ATOM_MEMORY_TRAINING_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR ucTrainingLoop; + UCHAR ucReserved[3]; + ATOM_INIT_REG_BLOCK asMemTrainingSetting; +}ATOM_MEMORY_TRAINING_INFO; + + +typedef struct SW_I2C_CNTL_DATA_PARAMETERS +{ + UCHAR ucControl; + UCHAR ucData; + UCHAR ucSatus; + UCHAR ucTemp; +} SW_I2C_CNTL_DATA_PARAMETERS; + +#define SW_I2C_CNTL_DATA_PS_ALLOCATION SW_I2C_CNTL_DATA_PARAMETERS + +typedef struct _SW_I2C_IO_DATA_PARAMETERS +{ + USHORT GPIO_Info; + UCHAR ucAct; + UCHAR ucData; + } SW_I2C_IO_DATA_PARAMETERS; + +#define SW_I2C_IO_DATA_PS_ALLOCATION SW_I2C_IO_DATA_PARAMETERS + +/****************************SW I2C CNTL DEFINITIONS**********************/ +#define SW_I2C_IO_RESET 0 +#define SW_I2C_IO_GET 1 +#define SW_I2C_IO_DRIVE 2 +#define SW_I2C_IO_SET 3 +#define SW_I2C_IO_START 4 + +#define SW_I2C_IO_CLOCK 0 +#define SW_I2C_IO_DATA 0x80 + +#define SW_I2C_IO_ZERO 0 +#define SW_I2C_IO_ONE 0x100 + +#define SW_I2C_CNTL_READ 0 +#define SW_I2C_CNTL_WRITE 1 +#define SW_I2C_CNTL_START 2 +#define SW_I2C_CNTL_STOP 3 +#define SW_I2C_CNTL_OPEN 4 +#define SW_I2C_CNTL_CLOSE 5 +#define SW_I2C_CNTL_WRITE1BIT 6 + +//==============================VESA definition Portion=============================== +#define VESA_OEM_PRODUCT_REV '01.00' +#define VESA_MODE_ATTRIBUTE_MODE_SUPPORT 0xBB //refer to VBE spec p.32, no TTY support +#define VESA_MODE_WIN_ATTRIBUTE 7 +#define VESA_WIN_SIZE 64 + +typedef struct _PTR_32_BIT_STRUCTURE +{ + USHORT Offset16; + USHORT Segment16; +} PTR_32_BIT_STRUCTURE; + +typedef union _PTR_32_BIT_UNION +{ + PTR_32_BIT_STRUCTURE SegmentOffset; + ULONG Ptr32_Bit; +} PTR_32_BIT_UNION; + +typedef struct _VBE_1_2_INFO_BLOCK_UPDATABLE +{ + UCHAR VbeSignature[4]; + USHORT VbeVersion; + PTR_32_BIT_UNION OemStringPtr; + UCHAR Capabilities[4]; + PTR_32_BIT_UNION VideoModePtr; + USHORT TotalMemory; +} VBE_1_2_INFO_BLOCK_UPDATABLE; + + +typedef struct _VBE_2_0_INFO_BLOCK_UPDATABLE +{ + VBE_1_2_INFO_BLOCK_UPDATABLE CommonBlock; + USHORT OemSoftRev; + PTR_32_BIT_UNION OemVendorNamePtr; + PTR_32_BIT_UNION OemProductNamePtr; + PTR_32_BIT_UNION OemProductRevPtr; +} VBE_2_0_INFO_BLOCK_UPDATABLE; + +typedef union _VBE_VERSION_UNION +{ + VBE_2_0_INFO_BLOCK_UPDATABLE VBE_2_0_InfoBlock; + VBE_1_2_INFO_BLOCK_UPDATABLE VBE_1_2_InfoBlock; +} VBE_VERSION_UNION; + +typedef struct _VBE_INFO_BLOCK +{ + VBE_VERSION_UNION UpdatableVBE_Info; + UCHAR Reserved[222]; + UCHAR OemData[256]; +} VBE_INFO_BLOCK; + +typedef struct _VBE_FP_INFO +{ + USHORT HSize; + USHORT VSize; + USHORT FPType; + UCHAR RedBPP; + UCHAR GreenBPP; + UCHAR BlueBPP; + UCHAR ReservedBPP; + ULONG RsvdOffScrnMemSize; + ULONG RsvdOffScrnMEmPtr; + UCHAR Reserved[14]; +} VBE_FP_INFO; + +typedef struct _VESA_MODE_INFO_BLOCK +{ +// Mandatory information for all VBE revisions + USHORT ModeAttributes; // dw ? ; mode attributes + UCHAR WinAAttributes; // db ? ; window A attributes + UCHAR WinBAttributes; // db ? ; window B attributes + USHORT WinGranularity; // dw ? ; window granularity + USHORT WinSize; // dw ? ; window size + USHORT WinASegment; // dw ? ; window A start segment + USHORT WinBSegment; // dw ? ; window B start segment + ULONG WinFuncPtr; // dd ? ; real mode pointer to window function + USHORT BytesPerScanLine;// dw ? ; bytes per scan line + +//; Mandatory information for VBE 1.2 and above + USHORT XResolution; // dw ? ; horizontal resolution in pixels or characters + USHORT YResolution; // dw ? ; vertical resolution in pixels or characters + UCHAR XCharSize; // db ? ; character cell width in pixels + UCHAR YCharSize; // db ? ; character cell height in pixels + UCHAR NumberOfPlanes; // db ? ; number of memory planes + UCHAR BitsPerPixel; // db ? ; bits per pixel + UCHAR NumberOfBanks; // db ? ; number of banks + UCHAR MemoryModel; // db ? ; memory model type + UCHAR BankSize; // db ? ; bank size in KB + UCHAR NumberOfImagePages;// db ? ; number of images + UCHAR ReservedForPageFunction;//db 1 ; reserved for page function + +//; Direct Color fields(required for direct/6 and YUV/7 memory models) + UCHAR RedMaskSize; // db ? ; size of direct color red mask in bits + UCHAR RedFieldPosition; // db ? ; bit position of lsb of red mask + UCHAR GreenMaskSize; // db ? ; size of direct color green mask in bits + UCHAR GreenFieldPosition; // db ? ; bit position of lsb of green mask + UCHAR BlueMaskSize; // db ? ; size of direct color blue mask in bits + UCHAR BlueFieldPosition; // db ? ; bit position of lsb of blue mask + UCHAR RsvdMaskSize; // db ? ; size of direct color reserved mask in bits + UCHAR RsvdFieldPosition; // db ? ; bit position of lsb of reserved mask + UCHAR DirectColorModeInfo;// db ? ; direct color mode attributes + +//; Mandatory information for VBE 2.0 and above + ULONG PhysBasePtr; // dd ? ; physical address for flat memory frame buffer + ULONG Reserved_1; // dd 0 ; reserved - always set to 0 + USHORT Reserved_2; // dw 0 ; reserved - always set to 0 + +//; Mandatory information for VBE 3.0 and above + USHORT LinBytesPerScanLine; // dw ? ; bytes per scan line for linear modes + UCHAR BnkNumberOfImagePages;// db ? ; number of images for banked modes + UCHAR LinNumberOfImagPages; // db ? ; number of images for linear modes + UCHAR LinRedMaskSize; // db ? ; size of direct color red mask(linear modes) + UCHAR LinRedFieldPosition; // db ? ; bit position of lsb of red mask(linear modes) + UCHAR LinGreenMaskSize; // db ? ; size of direct color green mask(linear modes) + UCHAR LinGreenFieldPosition;// db ? ; bit position of lsb of green mask(linear modes) + UCHAR LinBlueMaskSize; // db ? ; size of direct color blue mask(linear modes) + UCHAR LinBlueFieldPosition; // db ? ; bit position of lsb of blue mask(linear modes) + UCHAR LinRsvdMaskSize; // db ? ; size of direct color reserved mask(linear modes) + UCHAR LinRsvdFieldPosition; // db ? ; bit position of lsb of reserved mask(linear modes) + ULONG MaxPixelClock; // dd ? ; maximum pixel clock(in Hz) for graphics mode + UCHAR Reserved; // db 190 dup (0) +} VESA_MODE_INFO_BLOCK; + +// BIOS function CALLS +#define ATOM_BIOS_EXTENDED_FUNCTION_CODE 0xA0 // ATI Extended Function code +#define ATOM_BIOS_FUNCTION_COP_MODE 0x00 +#define ATOM_BIOS_FUNCTION_SHORT_QUERY1 0x04 +#define ATOM_BIOS_FUNCTION_SHORT_QUERY2 0x05 +#define ATOM_BIOS_FUNCTION_SHORT_QUERY3 0x06 +#define ATOM_BIOS_FUNCTION_GET_DDC 0x0B +#define ATOM_BIOS_FUNCTION_ASIC_DSTATE 0x0E +#define ATOM_BIOS_FUNCTION_DEBUG_PLAY 0x0F +#define ATOM_BIOS_FUNCTION_STV_STD 0x16 +#define ATOM_BIOS_FUNCTION_DEVICE_DET 0x17 +#define ATOM_BIOS_FUNCTION_DEVICE_SWITCH 0x18 + +#define ATOM_BIOS_FUNCTION_PANEL_CONTROL 0x82 +#define ATOM_BIOS_FUNCTION_OLD_DEVICE_DET 0x83 +#define ATOM_BIOS_FUNCTION_OLD_DEVICE_SWITCH 0x84 +#define ATOM_BIOS_FUNCTION_HW_ICON 0x8A +#define ATOM_BIOS_FUNCTION_SET_CMOS 0x8B +#define SUB_FUNCTION_UPDATE_DISPLAY_INFO 0x8000 // Sub function 80 +#define SUB_FUNCTION_UPDATE_EXPANSION_INFO 0x8100 // Sub function 80 + +#define ATOM_BIOS_FUNCTION_DISPLAY_INFO 0x8D +#define ATOM_BIOS_FUNCTION_DEVICE_ON_OFF 0x8E +#define ATOM_BIOS_FUNCTION_VIDEO_STATE 0x8F +#define ATOM_SUB_FUNCTION_GET_CRITICAL_STATE 0x0300 // Sub function 03 +#define ATOM_SUB_FUNCTION_GET_LIDSTATE 0x0700 // Sub function 7 +#define ATOM_SUB_FUNCTION_THERMAL_STATE_NOTICE 0x1400 // Notify caller the current thermal state +#define ATOM_SUB_FUNCTION_CRITICAL_STATE_NOTICE 0x8300 // Notify caller the current critical state +#define ATOM_SUB_FUNCTION_SET_LIDSTATE 0x8500 // Sub function 85 +#define ATOM_SUB_FUNCTION_GET_REQ_DISPLAY_FROM_SBIOS_MODE 0x8900// Sub function 89 +#define ATOM_SUB_FUNCTION_INFORM_ADC_SUPPORT 0x9400 // Notify caller that ADC is supported + + +#define ATOM_BIOS_FUNCTION_VESA_DPMS 0x4F10 // Set DPMS +#define ATOM_SUB_FUNCTION_SET_DPMS 0x0001 // BL: Sub function 01 +#define ATOM_SUB_FUNCTION_GET_DPMS 0x0002 // BL: Sub function 02 +#define ATOM_PARAMETER_VESA_DPMS_ON 0x0000 // BH Parameter for DPMS ON. +#define ATOM_PARAMETER_VESA_DPMS_STANDBY 0x0100 // BH Parameter for DPMS STANDBY +#define ATOM_PARAMETER_VESA_DPMS_SUSPEND 0x0200 // BH Parameter for DPMS SUSPEND +#define ATOM_PARAMETER_VESA_DPMS_OFF 0x0400 // BH Parameter for DPMS OFF +#define ATOM_PARAMETER_VESA_DPMS_REDUCE_ON 0x0800 // BH Parameter for DPMS REDUCE ON (NOT SUPPORTED) + +#define ATOM_BIOS_RETURN_CODE_MASK 0x0000FF00L +#define ATOM_BIOS_REG_HIGH_MASK 0x0000FF00L +#define ATOM_BIOS_REG_LOW_MASK 0x000000FFL + +// structure used for VBIOS only + +//DispOutInfoTable +typedef struct _ASIC_TRANSMITTER_INFO +{ + USHORT usTransmitterObjId; + USHORT usSupportDevice; + UCHAR ucTransmitterCmdTblId; + UCHAR ucConfig; + UCHAR ucEncoderID; //available 1st encoder ( default ) + UCHAR ucOptionEncoderID; //available 2nd encoder ( optional ) + UCHAR uc2ndEncoderID; + UCHAR ucReserved; +}ASIC_TRANSMITTER_INFO; + +typedef struct _ASIC_ENCODER_INFO +{ + UCHAR ucEncoderID; + UCHAR ucEncoderConfig; + USHORT usEncoderCmdTblId; +}ASIC_ENCODER_INFO; + +typedef struct _ATOM_DISP_OUT_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT ptrTransmitterInfo; + USHORT ptrEncoderInfo; + ASIC_TRANSMITTER_INFO asTransmitterInfo[1]; + ASIC_ENCODER_INFO asEncoderInfo[1]; +}ATOM_DISP_OUT_INFO; + +// DispDevicePriorityInfo +typedef struct _ATOM_DISPLAY_DEVICE_PRIORITY_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT asDevicePriority[16]; +}ATOM_DISPLAY_DEVICE_PRIORITY_INFO; + +//ProcessAuxChannelTransactionTable +typedef struct _PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS +{ + USHORT lpAuxRequest; + USHORT lpDataOut; + UCHAR ucChannelID; + union + { + UCHAR ucReplyStatus; + UCHAR ucDelay; + }; + UCHAR ucDataOutLen; + UCHAR ucReserved; +}PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS; + +#define PROCESS_AUX_CHANNEL_TRANSACTION_PS_ALLOCATION PROCESS_AUX_CHANNEL_TRANSACTION_PARAMETERS + +//GetSinkType + +typedef struct _DP_ENCODER_SERVICE_PARAMETERS +{ + USHORT ucLinkClock; + union + { + UCHAR ucConfig; // for DP training command + UCHAR ucI2cId; // use for GET_SINK_TYPE command + }; + UCHAR ucAction; + UCHAR ucStatus; + UCHAR ucLaneNum; + UCHAR ucReserved[2]; +}DP_ENCODER_SERVICE_PARAMETERS; + +// ucAction +#define ATOM_DP_ACTION_GET_SINK_TYPE 0x01 +#define ATOM_DP_ACTION_TRAINING_START 0x02 +#define ATOM_DP_ACTION_TRAINING_COMPLETE 0x03 +#define ATOM_DP_ACTION_TRAINING_PATTERN_SEL 0x04 +#define ATOM_DP_ACTION_SET_VSWING_PREEMP 0x05 +#define ATOM_DP_ACTION_GET_VSWING_PREEMP 0x06 +#define ATOM_DP_ACTION_BLANKING 0x07 + +// ucConfig +#define ATOM_DP_CONFIG_ENCODER_SEL_MASK 0x03 +#define ATOM_DP_CONFIG_DIG1_ENCODER 0x00 +#define ATOM_DP_CONFIG_DIG2_ENCODER 0x01 +#define ATOM_DP_CONFIG_EXTERNAL_ENCODER 0x02 +#define ATOM_DP_CONFIG_LINK_SEL_MASK 0x04 +#define ATOM_DP_CONFIG_LINK_A 0x00 +#define ATOM_DP_CONFIG_LINK_B 0x04 + +#define DP_ENCODER_SERVICE_PS_ALLOCATION WRITE_ONE_BYTE_HW_I2C_DATA_PARAMETERS + +// DP_TRAINING_TABLE +#define DPCD_SET_LINKRATE_LANENUM_PATTERN1_TBL_ADDR ATOM_DP_TRAINING_TBL_ADDR +#define DPCD_SET_SS_CNTL_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 8 ) +#define DPCD_SET_LANE_VSWING_PREEMP_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 16 ) +#define DPCD_SET_TRAINING_PATTERN0_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 24 ) +#define DPCD_SET_TRAINING_PATTERN2_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 32) +#define DPCD_GET_LINKRATE_LANENUM_SS_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 40) +#define DPCD_GET_LANE_STATUS_ADJUST_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 48) +#define DP_I2C_AUX_DDC_WRITE_START_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 60) +#define DP_I2C_AUX_DDC_WRITE_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 64) +#define DP_I2C_AUX_DDC_READ_START_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 72) +#define DP_I2C_AUX_DDC_READ_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 76) +#define DP_I2C_AUX_DDC_READ_END_TBL_ADDR (ATOM_DP_TRAINING_TBL_ADDR + 80) + + +typedef struct _PROCESS_I2C_CHANNEL_TRANSACTION_PARAMETERS +{ + UCHAR ucI2CSpeed; + union + { + UCHAR ucRegIndex; + UCHAR ucStatus; + }; + USHORT lpI2CDataOut; + UCHAR ucFlag; + UCHAR ucTransBytes; + UCHAR ucSlaveAddr; + UCHAR ucLineNumber; +}PROCESS_I2C_CHANNEL_TRANSACTION_PARAMETERS; + +#define PROCESS_I2C_CHANNEL_TRANSACTION_PS_ALLOCATION PROCESS_I2C_CHANNEL_TRANSACTION_PARAMETERS + +//ucFlag +#define HW_I2C_WRITE 1 +#define HW_I2C_READ 0 + + +/****************************************************************************/ +//Portion VI: Definitinos being oboselete +/****************************************************************************/ + +//========================================================================================== +//Remove the definitions below when driver is ready! +typedef struct _ATOM_DAC_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usMaxFrequency; // in 10kHz unit + USHORT usReserved; +}ATOM_DAC_INFO; + + +typedef struct _COMPASSIONATE_DATA +{ + ATOM_COMMON_TABLE_HEADER sHeader; + + //============================== DAC1 portion + UCHAR ucDAC1_BG_Adjustment; + UCHAR ucDAC1_DAC_Adjustment; + USHORT usDAC1_FORCE_Data; + //============================== DAC2 portion + UCHAR ucDAC2_CRT2_BG_Adjustment; + UCHAR ucDAC2_CRT2_DAC_Adjustment; + USHORT usDAC2_CRT2_FORCE_Data; + USHORT usDAC2_CRT2_MUX_RegisterIndex; + UCHAR ucDAC2_CRT2_MUX_RegisterInfo; //Bit[4:0]=Bit position,Bit[7]=1:Active High;=0 Active Low + UCHAR ucDAC2_NTSC_BG_Adjustment; + UCHAR ucDAC2_NTSC_DAC_Adjustment; + USHORT usDAC2_TV1_FORCE_Data; + USHORT usDAC2_TV1_MUX_RegisterIndex; + UCHAR ucDAC2_TV1_MUX_RegisterInfo; //Bit[4:0]=Bit position,Bit[7]=1:Active High;=0 Active Low + UCHAR ucDAC2_CV_BG_Adjustment; + UCHAR ucDAC2_CV_DAC_Adjustment; + USHORT usDAC2_CV_FORCE_Data; + USHORT usDAC2_CV_MUX_RegisterIndex; + UCHAR ucDAC2_CV_MUX_RegisterInfo; //Bit[4:0]=Bit position,Bit[7]=1:Active High;=0 Active Low + UCHAR ucDAC2_PAL_BG_Adjustment; + UCHAR ucDAC2_PAL_DAC_Adjustment; + USHORT usDAC2_TV2_FORCE_Data; +}COMPASSIONATE_DATA; + +/****************************Supported Device Info Table Definitions**********************/ +// ucConnectInfo: +// [7:4] - connector type +// = 1 - VGA connector +// = 2 - DVI-I +// = 3 - DVI-D +// = 4 - DVI-A +// = 5 - SVIDEO +// = 6 - COMPOSITE +// = 7 - LVDS +// = 8 - DIGITAL LINK +// = 9 - SCART +// = 0xA - HDMI_type A +// = 0xB - HDMI_type B +// = 0xE - Special case1 (DVI+DIN) +// Others=TBD +// [3:0] - DAC Associated +// = 0 - no DAC +// = 1 - DACA +// = 2 - DACB +// = 3 - External DAC +// Others=TBD +// + +typedef struct _ATOM_CONNECTOR_INFO +{ + UCHAR bfAssociatedDAC:4; + UCHAR bfConnectorType:4; +}ATOM_CONNECTOR_INFO; + +typedef union _ATOM_CONNECTOR_INFO_ACCESS +{ + ATOM_CONNECTOR_INFO sbfAccess; + UCHAR ucAccess; +}ATOM_CONNECTOR_INFO_ACCESS; + +typedef struct _ATOM_CONNECTOR_INFO_I2C +{ + ATOM_CONNECTOR_INFO_ACCESS sucConnectorInfo; + ATOM_I2C_ID_CONFIG_ACCESS sucI2cId; +}ATOM_CONNECTOR_INFO_I2C; + + +typedef struct _ATOM_SUPPORTED_DEVICES_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usDeviceSupport; + ATOM_CONNECTOR_INFO_I2C asConnInfo[ATOM_MAX_SUPPORTED_DEVICE_INFO]; +}ATOM_SUPPORTED_DEVICES_INFO; + +#define NO_INT_SRC_MAPPED 0xFF + +typedef struct _ATOM_CONNECTOR_INC_SRC_BITMAP +{ + UCHAR ucIntSrcBitmap; +}ATOM_CONNECTOR_INC_SRC_BITMAP; + +typedef struct _ATOM_SUPPORTED_DEVICES_INFO_2 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usDeviceSupport; + ATOM_CONNECTOR_INFO_I2C asConnInfo[ATOM_MAX_SUPPORTED_DEVICE_INFO_2]; + ATOM_CONNECTOR_INC_SRC_BITMAP asIntSrcInfo[ATOM_MAX_SUPPORTED_DEVICE_INFO_2]; +}ATOM_SUPPORTED_DEVICES_INFO_2; + +typedef struct _ATOM_SUPPORTED_DEVICES_INFO_2d1 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usDeviceSupport; + ATOM_CONNECTOR_INFO_I2C asConnInfo[ATOM_MAX_SUPPORTED_DEVICE]; + ATOM_CONNECTOR_INC_SRC_BITMAP asIntSrcInfo[ATOM_MAX_SUPPORTED_DEVICE]; +}ATOM_SUPPORTED_DEVICES_INFO_2d1; + +#define ATOM_SUPPORTED_DEVICES_INFO_LAST ATOM_SUPPORTED_DEVICES_INFO_2d1 + + + +typedef struct _ATOM_MISC_CONTROL_INFO +{ + USHORT usFrequency; + UCHAR ucPLL_ChargePump; // PLL charge-pump gain control + UCHAR ucPLL_DutyCycle; // PLL duty cycle control + UCHAR ucPLL_VCO_Gain; // PLL VCO gain control + UCHAR ucPLL_VoltageSwing; // PLL driver voltage swing control +}ATOM_MISC_CONTROL_INFO; + + +#define ATOM_MAX_MISC_INFO 4 + +typedef struct _ATOM_TMDS_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usMaxFrequency; // in 10Khz + ATOM_MISC_CONTROL_INFO asMiscInfo[ATOM_MAX_MISC_INFO]; +}ATOM_TMDS_INFO; + + +typedef struct _ATOM_ENCODER_ANALOG_ATTRIBUTE +{ + UCHAR ucTVStandard; //Same as TV standards defined above, + UCHAR ucPadding[1]; +}ATOM_ENCODER_ANALOG_ATTRIBUTE; + +typedef struct _ATOM_ENCODER_DIGITAL_ATTRIBUTE +{ + UCHAR ucAttribute; //Same as other digital encoder attributes defined above + UCHAR ucPadding[1]; +}ATOM_ENCODER_DIGITAL_ATTRIBUTE; + +typedef union _ATOM_ENCODER_ATTRIBUTE +{ + ATOM_ENCODER_ANALOG_ATTRIBUTE sAlgAttrib; + ATOM_ENCODER_DIGITAL_ATTRIBUTE sDigAttrib; +}ATOM_ENCODER_ATTRIBUTE; + + +typedef struct _DVO_ENCODER_CONTROL_PARAMETERS +{ + USHORT usPixelClock; + USHORT usEncoderID; + UCHAR ucDeviceType; //Use ATOM_DEVICE_xxx1_Index to indicate device type only. + UCHAR ucAction; //ATOM_ENABLE/ATOM_DISABLE/ATOM_HPD_INIT + ATOM_ENCODER_ATTRIBUTE usDevAttr; +}DVO_ENCODER_CONTROL_PARAMETERS; + +typedef struct _DVO_ENCODER_CONTROL_PS_ALLOCATION +{ + DVO_ENCODER_CONTROL_PARAMETERS sDVOEncoder; + WRITE_ONE_BYTE_HW_I2C_DATA_PS_ALLOCATION sReserved; //Caller doesn't need to init this portion +}DVO_ENCODER_CONTROL_PS_ALLOCATION; + + +#define ATOM_XTMDS_ASIC_SI164_ID 1 +#define ATOM_XTMDS_ASIC_SI178_ID 2 +#define ATOM_XTMDS_ASIC_TFP513_ID 3 +#define ATOM_XTMDS_SUPPORTED_SINGLELINK 0x00000001 +#define ATOM_XTMDS_SUPPORTED_DUALLINK 0x00000002 +#define ATOM_XTMDS_MVPU_FPGA 0x00000004 + + +typedef struct _ATOM_XTMDS_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usSingleLinkMaxFrequency; + ATOM_I2C_ID_CONFIG_ACCESS sucI2cId; //Point the ID on which I2C is used to control external chip + UCHAR ucXtransimitterID; + UCHAR ucSupportedLink; // Bit field, bit0=1, single link supported;bit1=1,dual link supported + UCHAR ucSequnceAlterID; // Even with the same external TMDS asic, it's possible that the program seqence alters + // due to design. This ID is used to alert driver that the sequence is not "standard"! + UCHAR ucMasterAddress; // Address to control Master xTMDS Chip + UCHAR ucSlaveAddress; // Address to control Slave xTMDS Chip +}ATOM_XTMDS_INFO; + +typedef struct _DFP_DPMS_STATUS_CHANGE_PARAMETERS +{ + UCHAR ucEnable; // ATOM_ENABLE=On or ATOM_DISABLE=Off + UCHAR ucDevice; // ATOM_DEVICE_DFP1_INDEX.... + UCHAR ucPadding[2]; +}DFP_DPMS_STATUS_CHANGE_PARAMETERS; + +/****************************Legacy Power Play Table Definitions **********************/ + +//Definitions for ulPowerPlayMiscInfo +#define ATOM_PM_MISCINFO_SPLIT_CLOCK 0x00000000L +#define ATOM_PM_MISCINFO_USING_MCLK_SRC 0x00000001L +#define ATOM_PM_MISCINFO_USING_SCLK_SRC 0x00000002L + +#define ATOM_PM_MISCINFO_VOLTAGE_DROP_SUPPORT 0x00000004L +#define ATOM_PM_MISCINFO_VOLTAGE_DROP_ACTIVE_HIGH 0x00000008L + +#define ATOM_PM_MISCINFO_LOAD_PERFORMANCE_EN 0x00000010L + +#define ATOM_PM_MISCINFO_ENGINE_CLOCK_CONTRL_EN 0x00000020L +#define ATOM_PM_MISCINFO_MEMORY_CLOCK_CONTRL_EN 0x00000040L +#define ATOM_PM_MISCINFO_PROGRAM_VOLTAGE 0x00000080L //When this bit set, ucVoltageDropIndex is not an index for GPIO pin, but a voltage ID that SW needs program + +#define ATOM_PM_MISCINFO_ASIC_REDUCED_SPEED_SCLK_EN 0x00000100L +#define ATOM_PM_MISCINFO_ASIC_DYNAMIC_VOLTAGE_EN 0x00000200L +#define ATOM_PM_MISCINFO_ASIC_SLEEP_MODE_EN 0x00000400L +#define ATOM_PM_MISCINFO_LOAD_BALANCE_EN 0x00000800L +#define ATOM_PM_MISCINFO_DEFAULT_DC_STATE_ENTRY_TRUE 0x00001000L +#define ATOM_PM_MISCINFO_DEFAULT_LOW_DC_STATE_ENTRY_TRUE 0x00002000L +#define ATOM_PM_MISCINFO_LOW_LCD_REFRESH_RATE 0x00004000L + +#define ATOM_PM_MISCINFO_DRIVER_DEFAULT_MODE 0x00008000L +#define ATOM_PM_MISCINFO_OVER_CLOCK_MODE 0x00010000L +#define ATOM_PM_MISCINFO_OVER_DRIVE_MODE 0x00020000L +#define ATOM_PM_MISCINFO_POWER_SAVING_MODE 0x00040000L +#define ATOM_PM_MISCINFO_THERMAL_DIODE_MODE 0x00080000L + +#define ATOM_PM_MISCINFO_FRAME_MODULATION_MASK 0x00300000L //0-FM Disable, 1-2 level FM, 2-4 level FM, 3-Reserved +#define ATOM_PM_MISCINFO_FRAME_MODULATION_SHIFT 20 + +#define ATOM_PM_MISCINFO_DYN_CLK_3D_IDLE 0x00400000L +#define ATOM_PM_MISCINFO_DYNAMIC_CLOCK_DIVIDER_BY_2 0x00800000L +#define ATOM_PM_MISCINFO_DYNAMIC_CLOCK_DIVIDER_BY_4 0x01000000L +#define ATOM_PM_MISCINFO_DYNAMIC_HDP_BLOCK_EN 0x02000000L //When set, Dynamic +#define ATOM_PM_MISCINFO_DYNAMIC_MC_HOST_BLOCK_EN 0x04000000L //When set, Dynamic +#define ATOM_PM_MISCINFO_3D_ACCELERATION_EN 0x08000000L //When set, This mode is for acceleated 3D mode + +#define ATOM_PM_MISCINFO_POWERPLAY_SETTINGS_GROUP_MASK 0x70000000L //1-Optimal Battery Life Group, 2-High Battery, 3-Balanced, 4-High Performance, 5- Optimal Performance (Default state with Default clocks) +#define ATOM_PM_MISCINFO_POWERPLAY_SETTINGS_GROUP_SHIFT 28 +#define ATOM_PM_MISCINFO_ENABLE_BACK_BIAS 0x80000000L + +#define ATOM_PM_MISCINFO2_SYSTEM_AC_LITE_MODE 0x00000001L +#define ATOM_PM_MISCINFO2_MULTI_DISPLAY_SUPPORT 0x00000002L +#define ATOM_PM_MISCINFO2_DYNAMIC_BACK_BIAS_EN 0x00000004L +#define ATOM_PM_MISCINFO2_FS3D_OVERDRIVE_INFO 0x00000008L +#define ATOM_PM_MISCINFO2_FORCEDLOWPWR_MODE 0x00000010L +#define ATOM_PM_MISCINFO2_VDDCI_DYNAMIC_VOLTAGE_EN 0x00000020L +#define ATOM_PM_MISCINFO2_VIDEO_PLAYBACK_CAPABLE 0x00000040L //If this bit is set in multi-pp mode, then driver will pack up one with the minior power consumption. + //If it's not set in any pp mode, driver will use its default logic to pick a pp mode in video playback +#define ATOM_PM_MISCINFO2_NOT_VALID_ON_DC 0x00000080L +#define ATOM_PM_MISCINFO2_STUTTER_MODE_EN 0x00000100L +#define ATOM_PM_MISCINFO2_UVD_SUPPORT_MODE 0x00000200L + +//ucTableFormatRevision=1 +//ucTableContentRevision=1 +typedef struct _ATOM_POWERMODE_INFO +{ + ULONG ulMiscInfo; //The power level should be arranged in ascending order + ULONG ulReserved1; // must set to 0 + ULONG ulReserved2; // must set to 0 + USHORT usEngineClock; + USHORT usMemoryClock; + UCHAR ucVoltageDropIndex; // index to GPIO table + UCHAR ucSelectedPanel_RefreshRate;// panel refresh rate + UCHAR ucMinTemperature; + UCHAR ucMaxTemperature; + UCHAR ucNumPciELanes; // number of PCIE lanes +}ATOM_POWERMODE_INFO; + +//ucTableFormatRevision=2 +//ucTableContentRevision=1 +typedef struct _ATOM_POWERMODE_INFO_V2 +{ + ULONG ulMiscInfo; //The power level should be arranged in ascending order + ULONG ulMiscInfo2; + ULONG ulEngineClock; + ULONG ulMemoryClock; + UCHAR ucVoltageDropIndex; // index to GPIO table + UCHAR ucSelectedPanel_RefreshRate;// panel refresh rate + UCHAR ucMinTemperature; + UCHAR ucMaxTemperature; + UCHAR ucNumPciELanes; // number of PCIE lanes +}ATOM_POWERMODE_INFO_V2; + +//ucTableFormatRevision=2 +//ucTableContentRevision=2 +typedef struct _ATOM_POWERMODE_INFO_V3 +{ + ULONG ulMiscInfo; //The power level should be arranged in ascending order + ULONG ulMiscInfo2; + ULONG ulEngineClock; + ULONG ulMemoryClock; + UCHAR ucVoltageDropIndex; // index to Core (VDDC) votage table + UCHAR ucSelectedPanel_RefreshRate;// panel refresh rate + UCHAR ucMinTemperature; + UCHAR ucMaxTemperature; + UCHAR ucNumPciELanes; // number of PCIE lanes + UCHAR ucVDDCI_VoltageDropIndex; // index to VDDCI votage table +}ATOM_POWERMODE_INFO_V3; + + +#define ATOM_MAX_NUMBEROF_POWER_BLOCK 8 + +#define ATOM_PP_OVERDRIVE_INTBITMAP_AUXWIN 0x01 +#define ATOM_PP_OVERDRIVE_INTBITMAP_OVERDRIVE 0x02 + +#define ATOM_PP_OVERDRIVE_THERMALCONTROLLER_LM63 0x01 +#define ATOM_PP_OVERDRIVE_THERMALCONTROLLER_ADM1032 0x02 +#define ATOM_PP_OVERDRIVE_THERMALCONTROLLER_ADM1030 0x03 +#define ATOM_PP_OVERDRIVE_THERMALCONTROLLER_MUA6649 0x04 +#define ATOM_PP_OVERDRIVE_THERMALCONTROLLER_LM64 0x05 +#define ATOM_PP_OVERDRIVE_THERMALCONTROLLER_F75375 0x06 +#define ATOM_PP_OVERDRIVE_THERMALCONTROLLER_ASC7512 0x07 // Andigilog + + +typedef struct _ATOM_POWERPLAY_INFO +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR ucOverdriveThermalController; + UCHAR ucOverdriveI2cLine; + UCHAR ucOverdriveIntBitmap; + UCHAR ucOverdriveControllerAddress; + UCHAR ucSizeOfPowerModeEntry; + UCHAR ucNumOfPowerModeEntries; + ATOM_POWERMODE_INFO asPowerPlayInfo[ATOM_MAX_NUMBEROF_POWER_BLOCK]; +}ATOM_POWERPLAY_INFO; + +typedef struct _ATOM_POWERPLAY_INFO_V2 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR ucOverdriveThermalController; + UCHAR ucOverdriveI2cLine; + UCHAR ucOverdriveIntBitmap; + UCHAR ucOverdriveControllerAddress; + UCHAR ucSizeOfPowerModeEntry; + UCHAR ucNumOfPowerModeEntries; + ATOM_POWERMODE_INFO_V2 asPowerPlayInfo[ATOM_MAX_NUMBEROF_POWER_BLOCK]; +}ATOM_POWERPLAY_INFO_V2; + +typedef struct _ATOM_POWERPLAY_INFO_V3 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR ucOverdriveThermalController; + UCHAR ucOverdriveI2cLine; + UCHAR ucOverdriveIntBitmap; + UCHAR ucOverdriveControllerAddress; + UCHAR ucSizeOfPowerModeEntry; + UCHAR ucNumOfPowerModeEntries; + ATOM_POWERMODE_INFO_V3 asPowerPlayInfo[ATOM_MAX_NUMBEROF_POWER_BLOCK]; +}ATOM_POWERPLAY_INFO_V3; + + + +/**************************************************************************/ + + +// Following definitions are for compatiblity issue in different SW components. +#define ATOM_MASTER_DATA_TABLE_REVISION 0x01 +#define Object_Info Object_Header +#define AdjustARB_SEQ MC_InitParameter +#define VRAM_GPIO_DetectionInfo VoltageObjectInfo +#define ASIC_VDDCI_Info ASIC_ProfilingInfo +#define ASIC_MVDDQ_Info MemoryTrainingInfo +#define SS_Info PPLL_SS_Info +#define ASIC_MVDDC_Info ASIC_InternalSS_Info +#define DispDevicePriorityInfo SaveRestoreInfo +#define DispOutInfo TV_VideoMode + + +#define ATOM_ENCODER_OBJECT_TABLE ATOM_OBJECT_TABLE +#define ATOM_CONNECTOR_OBJECT_TABLE ATOM_OBJECT_TABLE + +//New device naming, remove them when both DAL/VBIOS is ready +#define DFP2I_OUTPUT_CONTROL_PARAMETERS CRT1_OUTPUT_CONTROL_PARAMETERS +#define DFP2I_OUTPUT_CONTROL_PS_ALLOCATION DFP2I_OUTPUT_CONTROL_PARAMETERS + +#define DFP1X_OUTPUT_CONTROL_PARAMETERS CRT1_OUTPUT_CONTROL_PARAMETERS +#define DFP1X_OUTPUT_CONTROL_PS_ALLOCATION DFP1X_OUTPUT_CONTROL_PARAMETERS + +#define DFP1I_OUTPUT_CONTROL_PARAMETERS DFP1_OUTPUT_CONTROL_PARAMETERS +#define DFP1I_OUTPUT_CONTROL_PS_ALLOCATION DFP1_OUTPUT_CONTROL_PS_ALLOCATION + +#define ATOM_DEVICE_DFP1I_SUPPORT ATOM_DEVICE_DFP1_SUPPORT +#define ATOM_DEVICE_DFP1X_SUPPORT ATOM_DEVICE_DFP2_SUPPORT + +#define ATOM_DEVICE_DFP1I_INDEX ATOM_DEVICE_DFP1_INDEX +#define ATOM_DEVICE_DFP1X_INDEX ATOM_DEVICE_DFP2_INDEX + +#define ATOM_DEVICE_DFP2I_INDEX 0x00000009 +#define ATOM_DEVICE_DFP2I_SUPPORT (0x1L << ATOM_DEVICE_DFP2I_INDEX) + +#define ATOM_S0_DFP1I ATOM_S0_DFP1 +#define ATOM_S0_DFP1X ATOM_S0_DFP2 + +#define ATOM_S0_DFP2I 0x00200000L +#define ATOM_S0_DFP2Ib2 0x20 + +#define ATOM_S2_DFP1I_DPMS_STATE ATOM_S2_DFP1_DPMS_STATE +#define ATOM_S2_DFP1X_DPMS_STATE ATOM_S2_DFP2_DPMS_STATE + +#define ATOM_S2_DFP2I_DPMS_STATE 0x02000000L +#define ATOM_S2_DFP2I_DPMS_STATEb3 0x02 + +#define ATOM_S3_DFP2I_ACTIVEb1 0x02 + +#define ATOM_S3_DFP1I_ACTIVE ATOM_S3_DFP1_ACTIVE +#define ATOM_S3_DFP1X_ACTIVE ATOM_S3_DFP2_ACTIVE + +#define ATOM_S3_DFP2I_ACTIVE 0x00000200L + +#define ATOM_S3_DFP1I_CRTC_ACTIVE ATOM_S3_DFP1_CRTC_ACTIVE +#define ATOM_S3_DFP1X_CRTC_ACTIVE ATOM_S3_DFP2_CRTC_ACTIVE +#define ATOM_S3_DFP2I_CRTC_ACTIVE 0x02000000L + +#define ATOM_S3_DFP2I_CRTC_ACTIVEb3 0x02 +#define ATOM_S5_DOS_REQ_DFP2Ib1 0x02 + +#define ATOM_S5_DOS_REQ_DFP2I 0x0200 +#define ATOM_S6_ACC_REQ_DFP1I ATOM_S6_ACC_REQ_DFP1 +#define ATOM_S6_ACC_REQ_DFP1X ATOM_S6_ACC_REQ_DFP2 + +#define ATOM_S6_ACC_REQ_DFP2Ib3 0x02 +#define ATOM_S6_ACC_REQ_DFP2I 0x02000000L + +#define TMDS1XEncoderControl DVOEncoderControl +#define DFP1XOutputControl DVOOutputControl + +#define ExternalDFPOutputControl DFP1XOutputControl +#define EnableExternalTMDS_Encoder TMDS1XEncoderControl + +#define DFP1IOutputControl TMDSAOutputControl +#define DFP2IOutputControl LVTMAOutputControl + +#define DAC1_ENCODER_CONTROL_PARAMETERS DAC_ENCODER_CONTROL_PARAMETERS +#define DAC1_ENCODER_CONTROL_PS_ALLOCATION DAC_ENCODER_CONTROL_PS_ALLOCATION + +#define DAC2_ENCODER_CONTROL_PARAMETERS DAC_ENCODER_CONTROL_PARAMETERS +#define DAC2_ENCODER_CONTROL_PS_ALLOCATION DAC_ENCODER_CONTROL_PS_ALLOCATION + +#define ucDac1Standard ucDacStandard +#define ucDac2Standard ucDacStandard + +#define TMDS1EncoderControl TMDSAEncoderControl +#define TMDS2EncoderControl LVTMAEncoderControl + +#define DFP1OutputControl TMDSAOutputControl +#define DFP2OutputControl LVTMAOutputControl +#define CRT1OutputControl DAC1OutputControl +#define CRT2OutputControl DAC2OutputControl + +//These two lines will be removed for sure in a few days, will follow up with Michael V. +#define EnableLVDS_SS EnableSpreadSpectrumOnPPLL +#define ENABLE_LVDS_SS_PARAMETERS_V3 ENABLE_SPREAD_SPECTRUM_ON_PPLL + +/*********************************************************************************/ + +#pragma pack() // BIOS data must use byte aligment + +#endif /* _ATOMBIOS_H */ diff --git a/driver/xf86-video-radeonhd/src/AtomBios/includes/regsdef.h b/driver/xf86-video-radeonhd/src/AtomBios/includes/regsdef.h new file mode 100644 index 000000000..e557ac048 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/AtomBios/includes/regsdef.h @@ -0,0 +1,25 @@ +/* + * Copyright 2006-2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 a dummy file used by driver-parser during compilation. +//Without this file, compatibility will be broken among ASICs and BIOs vs. driver +//James H. Apr. 22/03 diff --git a/driver/xf86-video-radeonhd/src/Imakefile b/driver/xf86-video-radeonhd/src/Imakefile new file mode 100644 index 000000000..a8533c5a8 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/Imakefile @@ -0,0 +1,131 @@ +#define IHaveModules +#include +#include "../RadeonHD.tmpl" + +#define ATOM_BIOS_PARSER + +#ifdef ATOM_BIOS_PARSER +ATOM_BIOS_PARSER_SRCS = \ +rhd_atomwrapper.c \ +AtomBios/CD_Operations.c \ +AtomBios/Decoder.c \ +AtomBios/hwserv_drv.c + +ATOM_BIOS_PARSER_OBJS = \ +rhd_atomwrapper.o \ +AtomBios/CD_Operations.o \ +AtomBios/Decoder.o \ +AtomBios/hwserv_drv.o + +#endif + +SRCS = \ +rhd_atombios.c \ +rhd_i2c.c \ +rhd_crtc.c \ +rhd_connector.c \ +rhd_cursor.c \ +rhd_dac.c \ +rhd_dig.c \ +rhd_ddia.c \ +rhd_driver.c \ +rhd_edid.c \ +rhd_helper.c \ +rhd_id.c \ +rhd_lut.c \ +rhd_lvtma.c \ +rhd_mc.c \ +rhd_modes.c \ +rhd_monitor.c \ +rhd_output.c \ +rhd_pll.c \ +rhd_randr.c \ +rhd_tmds.c \ +rhd_vga.c \ +rhd_shadow.c \ +rhd_biosscratch.c \ +rhd_atomout.c \ +rhd_atompll.c \ +rhd_atomcrtc.c \ +rhd_cs.c \ +r5xx_accel.c \ +r5xx_xaa.c \ +rhd_video.c \ +radeon_textured_videofuncs.c \ +rhd_audio.c \ +rhd_hdmi.c \ +$(ATOM_BIOS_PARSER_SRCS) \ +git_version.h + +OBJS = \ +rhd_atombios.o \ +rhd_i2c.o \ +rhd_crtc.o \ +rhd_connector.o \ +rhd_cursor.o \ +rhd_dac.o \ +rhd_dig.o \ +rhd_ddia.o \ +rhd_driver.o \ +rhd_edid.o \ +rhd_helper.o \ +rhd_id.o \ +rhd_lut.o \ +rhd_lvtma.o \ +rhd_mc.o \ +rhd_modes.o \ +rhd_monitor.o \ +rhd_output.o \ +rhd_pll.o \ +rhd_randr.o \ +rhd_tmds.o \ +rhd_vga.o \ +rhd_shadow.o \ +rhd_biosscratch.o \ +rhd_atomout.o \ +rhd_atompll.o \ +rhd_atomcrtc.o \ +rhd_cs.o \ +r5xx_accel.o \ +r5xx_xaa.o \ +rhd_video.o \ +radeon_textured_videofuncs.o \ +rhd_audio.o \ +rhd_hdmi.o \ +$(ATOM_BIOS_PARSER_OBJS) + +INCLUDES = -I. -I$(XF86COMSRC) -I$(XF86OSSRC) \ + -I$(SERVERSRC)/mi \ + -I$(XF86SRC)/ramdac \ + -I$(XF86SRC)/ddc -I$(XF86SRC)/i2c \ + -I$(XF86SRC)/rac -I$(XF86SRC)/int10 -I$(SERVERSRC)/render \ + -I$(SERVERSRC)/include -I$(XINCLUDESRC) \ + -I$(SERVERSRC)/fb \ + -I$(XF86SRC) -I$(XF86OSSRC)/bus -I$(XF86SRC)/vbe \ + -I/usr/X11R6/lib64/Server/include \ + -I/usr/X11R6/lib/Server/include + +ATOM_BIOS_INCLUDES = -I./AtomBios/includes +ATOM_BIOS_DEFINES = -DATOM_BIOS=1 +XCOMM older versions always have xf86_ansic.h +XF86_ANSIC_DEFINES = -DHAVE_XF86_ANSIC_H=1 + +#ifdef ATOM_BIOS_PARSER +ATOM_BIOS_PARSER_INCLUDES = -I./AtomBios +ATOM_BIOS_PARSER_DEFINES = -DDRIVER_PARSER -DDISABLE_EASF -DENABLE_ALL_SERVICE_FUNCTIONS -DATOM_BIOS_PARSER=1 +#endif + +DEFINES = $(INCLUDES) $(ATOM_BIOS_INCLUDES) $(ATOM_BIOS_PARSER_INCLUDES) \ + $(ATOM_BIOS_DEFINES) $(ATOM_BIOS_PARSER_DEFINES) \ + $(XF86_ANSIC_DEFINES) \ + $(RHD_GIT_DEFINES) \ + $(RHD_VERSION_DEFINES) + +ObjectModuleTarget(radeonhd, $(OBJS)) +#ifdef InstallVideoObjectModule +InstallVideoObjectModule(radeonhd,$(MODULEDIR)) +#else +InstallObjectModule(radeonhd,$(MODULEDIR),drivers) +#endif + +DependTarget() diff --git a/driver/xf86-video-radeonhd/src/Makefile.am b/driver/xf86-video-radeonhd/src/Makefile.am new file mode 100644 index 000000000..49429f915 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/Makefile.am @@ -0,0 +1,206 @@ +BUILT_SOURCES = +CLEANFILES = +include $(top_srcdir)/RadeonHD.am + +EXTRA_DIST = Imakefile + +AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ @WARN_CFLAGS@ + +driversdir = ${moduledir}/drivers +drivers_LTLIBRARIES = radeonhd_drv.la + +radeonhd_drv_la_LDFLAGS = -module -avoid-version +radeonhd_drv_la_CFLAGS = $(AM_CFLAGS) @PEDANTIC_CFLAGS@ +radeonhd_drv_la_LIBADD = + +if XSERVER_LIBPCIACCESS +radeonhd_drv_la_LIBADD += @PCIACCESS_LIBS@ +endif + +radeonhd_drv_la_SOURCES = \ + atombios_rev.h \ + r5xx_3dregs.h \ + r5xx_accel.c \ + r5xx_accel.h \ + r5xx_regs.h \ + r5xx_xaa.c \ + r600_reg.h \ + r600_reg_auto_r6xx.h \ + r600_reg_r6xx.h \ + r600_reg_r7xx.h \ + r600_shader.h \ + r600_shader.c \ + r600_state.h \ + radeon_3d.c \ + radeon_textured_videofuncs.c \ + rhd_atombios.c \ + rhd_atombios.h \ + rhd_atomcrtc.c \ + rhd_atomout.c \ + rhd_atomout.h \ + rhd_atompll.c \ + rhd_audio.c \ + rhd_audio.h \ + rhd_biosscratch.c \ + rhd_biosscratch.h \ + rhd_card.h \ + rhd_connector.c \ + rhd_connector.h \ + rhd_crtc.c \ + rhd_crtc.h \ + rhd_cs.c \ + rhd_cs.h \ + rhd_cursor.c \ + rhd_cursor.h \ + rhd_dac.c \ + rhd_ddia.c \ + rhd_dig.c \ + rhd_driver.c \ + rhd_edid.c \ + rhd.h \ + rhd_hdmi.c \ + rhd_hdmi.h \ + rhd_helper.c \ + rhd_i2c.c \ + rhd_i2c.h \ + rhd_id.c \ + rhd_lut.c \ + rhd_lut.h \ + rhd_lvtma.c \ + rhd_mc.c \ + rhd_mc.h \ + rhd_modes.c \ + rhd_modes.h \ + rhd_monitor.c \ + rhd_monitor.h \ + rhd_output.c \ + rhd_output.h \ + rhd_pll.c \ + rhd_pll.h \ + rhd_pm.c \ + rhd_pm.h \ + rhd_randr.c \ + rhd_randr.h \ + rhd_regs.h \ + rhd_shadow.c \ + rhd_shadow.h \ + rhd_tmds.c \ + rhd_vga.c \ + rhd_vga.h \ + rhd_video.c \ + rhd_video.h \ + rhd_acpi.c \ + rhd_acpi.h + +nodist_radeonhd_drv_la_SOURCES = \ + git_version.h + +if USE_EXA +radeonhd_drv_la_SOURCES += r5xx_exa.c radeon_exa_render.c +endif + +if USE_DRI +radeonhd_drv_la_SOURCES += rhd_dri.c rhd_dri.h radeon_dri.h radeon_drm.h +radeonhd_drv_la_SOURCES += r6xx_accel.c r6xx_accel.h +radeonhd_drv_la_SOURCES += r600_exa.c r600_textured_videofuncs.c +radeonhd_drv_la_LIBADD += @DRI_LIBS@ +endif + +if ATOM_BIOS +radeonhd_drv_la_SOURCES += \ + AtomBios/includes/atombios.h + +INCLUDES = -I$(srcdir)/AtomBios/includes + +endif + +if ATOM_BIOS_PARSER +radeonhd_drv_la_SOURCES += \ + rhd_atomwrapper.h +endif + +if ATOM_BIOS_PARSER + +noinst_LTLIBRARIES = libatom.la +libatom_la_CFLAGS = $(AM_CFLAGS) @ATOMBIOS_CFLAGS@ -DDRIVER_PARSER -DDISABLE_EASF -DENABLE_ALL_SERVICE_FUNCTIONS +# libatom_la_LDFLAGS = -module -avoid-version + +libatom_la_SOURCES = \ + rhd_atomwrapper.c \ + rhd_atomwrapper.h \ + AtomBios/CD_Operations.c \ + AtomBios/Decoder.c \ + AtomBios/hwserv_drv.c \ + AtomBios/includes/atombios.h \ + AtomBios/includes/CD_binding.h \ + AtomBios/includes/CD_Common_Types.h \ + AtomBios/includes/CD_Definitions.h \ + AtomBios/includes/CD_hw_services.h \ + AtomBios/includes/CD_Opcodes.h \ + AtomBios/includes/CD_Structs.h \ + AtomBios/includes/Decoder.h \ + AtomBios/includes/ObjectID.h \ + AtomBios/includes/regsdef.h + +radeonhd_drv_la_LIBADD += libatom.la + +endif + +if MAINTAINER_MODE +if HAVE_SED_WITH_REASONABLE_SUBSTITUTION +SRCMAN = $(top_srcdir)/man/radeonhd.man +CLEANFILES += radeonhd.man.new +radeonhd.man.new: rhd_id.c $(SRCMAN) + $(Q)( $(SED) -n '1,/^\.\\" START_DEVICE_LIST marker - do not delete/p' "$(SRCMAN)"; \ + $(SED) -e '1,/^[ ]*\/\* START_DEVICE_LIST marker - do not delete \*\/ *$$/d' \ + -e '/^[ ]*\/\* END_DEVICE_LIST marker - do not delete \*\/ *$$/,$$d' \ + -e '/^[ ]\{1,\}xf86Msg(X_NONE,/d' \ + -e '/^[ ]\{1,\}\/\*/d' \ + -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*;\)\\n"$$/.TP 8\n.B \1\n\2/' \ + -e 's/^[ ]\{1,\}"\\t\\t\(.*\)\.\\n"\();\)\{0,1\}$$/\1/' \ + -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*\)\.\\n"\();\)\{0,1\}$$/.TP 8\n.B \1\n\2/' \ + "$(srcdir)/rhd_id.c"; \ + $(SED) -n '/^\.\\" END_DEVICE_LIST marker - do not delete/,$$p' "$(SRCMAN)" \ + ) > radeonhd.man.new + +SRCREADME = $(top_srcdir)/README +CLEANFILES += README.new +README.new: rhd_id.c $(top_srcdir)/README + $(Q)( $(SED) -n '1,/^BEGIN_DEVICE_LIST$$/p' "$(SRCREADME)"; \ + $(SED) -e '1,/^[ ]*\/\* START_DEVICE_LIST marker - do not delete \*\/ *$$/d' \ + -e '/^[ ]*\/\* END_DEVICE_LIST marker - do not delete \*\/ *$$/,$$d' \ + -e '/^[ ]\{1,\}xf86Msg(X_NONE,/d' \ + -e '/^[ ]\{1,\}\/\*/d' \ + -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*;\)\\n"$$/ * \1:\t\2/' \ + -e 's/^[ ]\{1,\}"\\t\\t\(.*\)\.\\n"\();\)\{0,1\}$$/ \t\1/' \ + -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*\)\.\\n"\();\)\{0,1\}$$/ * \1:\t\2/' \ + "$(srcdir)/rhd_id.c"; \ + $(SED) -n '/^END_DEVICE_LIST$$/,$$p' "$(SRCREADME)" \ + ) > README.new + +# Update man page and README from rhd_id.c RHDIdentify() output. +# The exit(1) makes sure the updates do not go unnoticed. +all-local: radeonhd.man.new README.new + @changed=""; \ + if diff -u "$(SRCMAN)" radeonhd.man.new; then \ + if test "x$(Q)" = "x@"; then :; else echo "radeon(4) man page is current."; fi \ + else \ + changed="$$changed $(SRCMAN)"; \ + mv -f radeonhd.man.new "$(SRCMAN)"; \ + fi; \ + if diff -u "$(SRCREADME)" README.new; then \ + if test "x$(Q)" = "x@"; then :; else echo "README file is current."; fi \ + else \ + changed="$$changed $(SRCREADME)"; \ + mv -f README.new "$(SRCREADME)"; \ + fi; \ + if test "x$$changed" = "x"; then :; else \ + echo "WARNING: Due to changes to src/rhd_id.c, some files differ from the original ones."; \ + echo " Please verify the changes to the following files"; \ + for f in $$changed; do echo " $$f"; done; \ + echo " and commit them together with your changes to"; \ + echo " $(srcdir)/rhd_id.c"; \ + exit 1; \ + fi +endif +endif diff --git a/driver/xf86-video-radeonhd/src/Makefile.in b/driver/xf86-video-radeonhd/src/Makefile.in new file mode 100644 index 000000000..43a82e0d2 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/Makefile.in @@ -0,0 +1,1148 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright (c) 2007 Hans Ulrich Niedermann +# +# This Makefile fragment is free software; the author(s) give(s) +# unlimited permission to copy, distribute and modify it. + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/RadeonHD.am +@XSERVER_LIBPCIACCESS_TRUE@am__append_1 = @PCIACCESS_LIBS@ +@USE_EXA_TRUE@am__append_2 = r5xx_exa.c radeon_exa_render.c +@USE_DRI_TRUE@am__append_3 = rhd_dri.c rhd_dri.h radeon_dri.h \ +@USE_DRI_TRUE@ radeon_drm.h r6xx_accel.c r6xx_accel.h \ +@USE_DRI_TRUE@ r600_exa.c r600_textured_videofuncs.c +@USE_DRI_TRUE@am__append_4 = @DRI_LIBS@ +@ATOM_BIOS_TRUE@am__append_5 = \ +@ATOM_BIOS_TRUE@ AtomBios/includes/atombios.h + +@ATOM_BIOS_PARSER_TRUE@am__append_6 = \ +@ATOM_BIOS_PARSER_TRUE@ rhd_atomwrapper.h + +@ATOM_BIOS_PARSER_TRUE@am__append_7 = libatom.la +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@am__append_8 = radeonhd.man.new \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ README.new +subdir = src +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; +am__installdirs = "$(DESTDIR)$(driversdir)" +driversLTLIBRARIES_INSTALL = $(INSTALL) +LTLIBRARIES = $(drivers_LTLIBRARIES) $(noinst_LTLIBRARIES) +libatom_la_LIBADD = +am__libatom_la_SOURCES_DIST = rhd_atomwrapper.c rhd_atomwrapper.h \ + AtomBios/CD_Operations.c AtomBios/Decoder.c \ + AtomBios/hwserv_drv.c AtomBios/includes/atombios.h \ + AtomBios/includes/CD_binding.h \ + AtomBios/includes/CD_Common_Types.h \ + AtomBios/includes/CD_Definitions.h \ + AtomBios/includes/CD_hw_services.h \ + AtomBios/includes/CD_Opcodes.h AtomBios/includes/CD_Structs.h \ + AtomBios/includes/Decoder.h AtomBios/includes/ObjectID.h \ + AtomBios/includes/regsdef.h +@ATOM_BIOS_PARSER_TRUE@am_libatom_la_OBJECTS = \ +@ATOM_BIOS_PARSER_TRUE@ libatom_la-rhd_atomwrapper.lo \ +@ATOM_BIOS_PARSER_TRUE@ libatom_la-CD_Operations.lo \ +@ATOM_BIOS_PARSER_TRUE@ libatom_la-Decoder.lo \ +@ATOM_BIOS_PARSER_TRUE@ libatom_la-hwserv_drv.lo +libatom_la_OBJECTS = $(am_libatom_la_OBJECTS) +@ATOM_BIOS_PARSER_TRUE@am_libatom_la_rpath = +am__DEPENDENCIES_1 = +@ATOM_BIOS_PARSER_TRUE@am__DEPENDENCIES_2 = libatom.la +radeonhd_drv_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \ + $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2) +am__radeonhd_drv_la_SOURCES_DIST = atombios_rev.h r5xx_3dregs.h \ + r5xx_accel.c r5xx_accel.h r5xx_regs.h r5xx_xaa.c r600_reg.h \ + r600_reg_auto_r6xx.h r600_reg_r6xx.h r600_reg_r7xx.h \ + r600_shader.h r600_shader.c r600_state.h radeon_3d.c \ + radeon_textured_videofuncs.c rhd_atombios.c rhd_atombios.h \ + rhd_atomcrtc.c rhd_atomout.c rhd_atomout.h rhd_atompll.c \ + rhd_audio.c rhd_audio.h rhd_biosscratch.c rhd_biosscratch.h \ + rhd_card.h rhd_connector.c rhd_connector.h rhd_crtc.c \ + rhd_crtc.h rhd_cs.c rhd_cs.h rhd_cursor.c rhd_cursor.h \ + rhd_dac.c rhd_ddia.c rhd_dig.c rhd_driver.c rhd_edid.c rhd.h \ + rhd_hdmi.c rhd_hdmi.h rhd_helper.c rhd_i2c.c rhd_i2c.h \ + rhd_id.c rhd_lut.c rhd_lut.h rhd_lvtma.c rhd_mc.c rhd_mc.h \ + rhd_modes.c rhd_modes.h rhd_monitor.c rhd_monitor.h \ + rhd_output.c rhd_output.h rhd_pll.c rhd_pll.h rhd_pm.c \ + rhd_pm.h rhd_randr.c rhd_randr.h rhd_regs.h rhd_shadow.c \ + rhd_shadow.h rhd_tmds.c rhd_vga.c rhd_vga.h rhd_video.c \ + rhd_video.h rhd_acpi.c rhd_acpi.h r5xx_exa.c \ + radeon_exa_render.c rhd_dri.c rhd_dri.h radeon_dri.h \ + radeon_drm.h r6xx_accel.c r6xx_accel.h r600_exa.c \ + r600_textured_videofuncs.c AtomBios/includes/atombios.h \ + rhd_atomwrapper.h +@USE_EXA_TRUE@am__objects_1 = radeonhd_drv_la-r5xx_exa.lo \ +@USE_EXA_TRUE@ radeonhd_drv_la-radeon_exa_render.lo +@USE_DRI_TRUE@am__objects_2 = radeonhd_drv_la-rhd_dri.lo \ +@USE_DRI_TRUE@ radeonhd_drv_la-r6xx_accel.lo \ +@USE_DRI_TRUE@ radeonhd_drv_la-r600_exa.lo \ +@USE_DRI_TRUE@ radeonhd_drv_la-r600_textured_videofuncs.lo +am__objects_3 = +am_radeonhd_drv_la_OBJECTS = radeonhd_drv_la-r5xx_accel.lo \ + radeonhd_drv_la-r5xx_xaa.lo radeonhd_drv_la-r600_shader.lo \ + radeonhd_drv_la-radeon_3d.lo \ + radeonhd_drv_la-radeon_textured_videofuncs.lo \ + radeonhd_drv_la-rhd_atombios.lo \ + radeonhd_drv_la-rhd_atomcrtc.lo radeonhd_drv_la-rhd_atomout.lo \ + radeonhd_drv_la-rhd_atompll.lo radeonhd_drv_la-rhd_audio.lo \ + radeonhd_drv_la-rhd_biosscratch.lo \ + radeonhd_drv_la-rhd_connector.lo radeonhd_drv_la-rhd_crtc.lo \ + radeonhd_drv_la-rhd_cs.lo radeonhd_drv_la-rhd_cursor.lo \ + radeonhd_drv_la-rhd_dac.lo radeonhd_drv_la-rhd_ddia.lo \ + radeonhd_drv_la-rhd_dig.lo radeonhd_drv_la-rhd_driver.lo \ + radeonhd_drv_la-rhd_edid.lo radeonhd_drv_la-rhd_hdmi.lo \ + radeonhd_drv_la-rhd_helper.lo radeonhd_drv_la-rhd_i2c.lo \ + radeonhd_drv_la-rhd_id.lo radeonhd_drv_la-rhd_lut.lo \ + radeonhd_drv_la-rhd_lvtma.lo radeonhd_drv_la-rhd_mc.lo \ + radeonhd_drv_la-rhd_modes.lo radeonhd_drv_la-rhd_monitor.lo \ + radeonhd_drv_la-rhd_output.lo radeonhd_drv_la-rhd_pll.lo \ + radeonhd_drv_la-rhd_pm.lo radeonhd_drv_la-rhd_randr.lo \ + radeonhd_drv_la-rhd_shadow.lo radeonhd_drv_la-rhd_tmds.lo \ + radeonhd_drv_la-rhd_vga.lo radeonhd_drv_la-rhd_video.lo \ + radeonhd_drv_la-rhd_acpi.lo $(am__objects_1) $(am__objects_2) \ + $(am__objects_3) $(am__objects_3) +nodist_radeonhd_drv_la_OBJECTS = +radeonhd_drv_la_OBJECTS = $(am_radeonhd_drv_la_OBJECTS) \ + $(nodist_radeonhd_drv_la_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libatom_la_SOURCES) $(radeonhd_drv_la_SOURCES) \ + $(nodist_radeonhd_drv_la_SOURCES) +DIST_SOURCES = $(am__libatom_la_SOURCES_DIST) \ + $(am__radeonhd_drv_la_SOURCES_DIST) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADMIN_MAN_DIR = @ADMIN_MAN_DIR@ +ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AM_MAKEFLAGS = @AM_MAKEFLAGS@ +APP_MAN_DIR = @APP_MAN_DIR@ +APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ +AR = @AR@ +ATOMBIOS_CFLAGS = @ATOMBIOS_CFLAGS@ +ATOM_BIOS_FALSE = @ATOM_BIOS_FALSE@ +ATOM_BIOS_PARSER_FALSE = @ATOM_BIOS_PARSER_FALSE@ +ATOM_BIOS_PARSER_TRUE = @ATOM_BIOS_PARSER_TRUE@ +ATOM_BIOS_TRUE = @ATOM_BIOS_TRUE@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ +DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ +DRIVER_NAME = @DRIVER_NAME@ +DRI_CFLAGS = @DRI_CFLAGS@ +DRI_LIBS = @DRI_LIBS@ +DSYMUTIL = @DSYMUTIL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FC = @FC@ +FFLAGS = @FFLAGS@ +FILE_MAN_DIR = @FILE_MAN_DIR@ +FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GREP = @GREP@ +HAVE_PCI_PCI_H_FALSE = @HAVE_PCI_PCI_H_FALSE@ +HAVE_PCI_PCI_H_TRUE = @HAVE_PCI_PCI_H_TRUE@ +HAVE_SED_WITH_REASONABLE_SUBSTITUTION_FALSE = @HAVE_SED_WITH_REASONABLE_SUBSTITUTION_FALSE@ +HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE = @HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@ +HAVE_XEXTPROTO_71_FALSE = @HAVE_XEXTPROTO_71_FALSE@ +HAVE_XEXTPROTO_71_TRUE = @HAVE_XEXTPROTO_71_TRUE@ +HAVE_XF86_ANSIC_H_FALSE = @HAVE_XF86_ANSIC_H_FALSE@ +HAVE_XF86_ANSIC_H_TRUE = @HAVE_XF86_ANSIC_H_TRUE@ +HAVE_ZLIB_FALSE = @HAVE_ZLIB_FALSE@ +HAVE_ZLIB_TRUE = @HAVE_ZLIB_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAN_DIR = @LIB_MAN_DIR@ +LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEFLAGS = @MAKEFLAGS@ +MAKEINFO = @MAKEINFO@ +MISC_MAN_DIR = @MISC_MAN_DIR@ +MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@ +PCIACCESS_LIBS = @PCIACCESS_LIBS@ +PCIUTILS_CFLAGS = @PCIUTILS_CFLAGS@ +PCIUTILS_LIBS = @PCIUTILS_LIBS@ +PEDANTIC_CFLAGS = @PEDANTIC_CFLAGS@ +PKG_CONFIG = @PKG_CONFIG@ +Q = @Q@ +RANDR_VERSION = @RANDR_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_DRI_FALSE = @USE_DRI_FALSE@ +USE_DRI_TRUE = @USE_DRI_TRUE@ +USE_EXA_FALSE = @USE_EXA_FALSE@ +USE_EXA_TRUE = @USE_EXA_TRUE@ +V = @V@ +VERSION = @VERSION@ +WARN_CFLAGS = @WARN_CFLAGS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XORG_CFLAGS = @XORG_CFLAGS@ +XORG_LIBS = @XORG_LIBS@ +XSERVER_LIBPCIACCESS_FALSE = @XSERVER_LIBPCIACCESS_FALSE@ +XSERVER_LIBPCIACCESS_TRUE = @XSERVER_LIBPCIACCESS_TRUE@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +moduledir = @moduledir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shavedir = @shavedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ + +# The stamp file which is never created ensures that git_version.h is updated +# before every build. Having git_version.h in foo_SOURCES ensures a recompile +# of foo-bar.c if it is newer than the foo-bar.o file. Using noinst_foo_SOURCES +# instead of foo_SOURCES prevents shipping git_version.h in dist tarballs, +# which may cause false GIT_FOO readings. +BUILT_SOURCES = git_version.stamp +CLEANFILES = git_version.h $(am__append_8) +GIT_VERSION_CMD = $(SHELL) $(top_srcdir)/git_version.sh +EXTRA_DIST = Imakefile +AM_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ @WARN_CFLAGS@ +driversdir = ${moduledir}/drivers +drivers_LTLIBRARIES = radeonhd_drv.la +radeonhd_drv_la_LDFLAGS = -module -avoid-version +radeonhd_drv_la_CFLAGS = $(AM_CFLAGS) @PEDANTIC_CFLAGS@ +radeonhd_drv_la_LIBADD = $(am__append_1) $(am__append_4) \ + $(am__append_7) +radeonhd_drv_la_SOURCES = atombios_rev.h r5xx_3dregs.h r5xx_accel.c \ + r5xx_accel.h r5xx_regs.h r5xx_xaa.c r600_reg.h \ + r600_reg_auto_r6xx.h r600_reg_r6xx.h r600_reg_r7xx.h \ + r600_shader.h r600_shader.c r600_state.h radeon_3d.c \ + radeon_textured_videofuncs.c rhd_atombios.c rhd_atombios.h \ + rhd_atomcrtc.c rhd_atomout.c rhd_atomout.h rhd_atompll.c \ + rhd_audio.c rhd_audio.h rhd_biosscratch.c rhd_biosscratch.h \ + rhd_card.h rhd_connector.c rhd_connector.h rhd_crtc.c \ + rhd_crtc.h rhd_cs.c rhd_cs.h rhd_cursor.c rhd_cursor.h \ + rhd_dac.c rhd_ddia.c rhd_dig.c rhd_driver.c rhd_edid.c rhd.h \ + rhd_hdmi.c rhd_hdmi.h rhd_helper.c rhd_i2c.c rhd_i2c.h \ + rhd_id.c rhd_lut.c rhd_lut.h rhd_lvtma.c rhd_mc.c rhd_mc.h \ + rhd_modes.c rhd_modes.h rhd_monitor.c rhd_monitor.h \ + rhd_output.c rhd_output.h rhd_pll.c rhd_pll.h rhd_pm.c \ + rhd_pm.h rhd_randr.c rhd_randr.h rhd_regs.h rhd_shadow.c \ + rhd_shadow.h rhd_tmds.c rhd_vga.c rhd_vga.h rhd_video.c \ + rhd_video.h rhd_acpi.c rhd_acpi.h $(am__append_2) \ + $(am__append_3) $(am__append_5) $(am__append_6) +nodist_radeonhd_drv_la_SOURCES = \ + git_version.h + +@ATOM_BIOS_TRUE@INCLUDES = -I$(srcdir)/AtomBios/includes +@ATOM_BIOS_PARSER_TRUE@noinst_LTLIBRARIES = libatom.la +@ATOM_BIOS_PARSER_TRUE@libatom_la_CFLAGS = $(AM_CFLAGS) @ATOMBIOS_CFLAGS@ -DDRIVER_PARSER -DDISABLE_EASF -DENABLE_ALL_SERVICE_FUNCTIONS +# libatom_la_LDFLAGS = -module -avoid-version +@ATOM_BIOS_PARSER_TRUE@libatom_la_SOURCES = \ +@ATOM_BIOS_PARSER_TRUE@ rhd_atomwrapper.c \ +@ATOM_BIOS_PARSER_TRUE@ rhd_atomwrapper.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/CD_Operations.c \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/Decoder.c \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/hwserv_drv.c \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/atombios.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/CD_binding.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/CD_Common_Types.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/CD_Definitions.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/CD_hw_services.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/CD_Opcodes.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/CD_Structs.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/Decoder.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/ObjectID.h \ +@ATOM_BIOS_PARSER_TRUE@ AtomBios/includes/regsdef.h + +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@SRCMAN = $(top_srcdir)/man/radeonhd.man +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@SRCREADME = $(top_srcdir)/README +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/RadeonHD.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-driversLTLIBRARIES: $(drivers_LTLIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(driversdir)" || $(mkdir_p) "$(DESTDIR)$(driversdir)" + @list='$(drivers_LTLIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=install $(driversLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(driversdir)/$$f'"; \ + $(LIBTOOL) --mode=install $(driversLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(driversdir)/$$f"; \ + else :; fi; \ + done + +uninstall-driversLTLIBRARIES: + @$(NORMAL_UNINSTALL) + @set -x; list='$(drivers_LTLIBRARIES)'; for p in $$list; do \ + p=$(am__strip_dir) \ + echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(driversdir)/$$p'"; \ + $(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(driversdir)/$$p"; \ + done + +clean-driversLTLIBRARIES: + -test -z "$(drivers_LTLIBRARIES)" || rm -f $(drivers_LTLIBRARIES) + @list='$(drivers_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done + +clean-noinstLTLIBRARIES: + -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) + @list='$(noinst_LTLIBRARIES)'; for p in $$list; do \ + dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \ + test "$$dir" != "$$p" || dir=.; \ + echo "rm -f \"$${dir}/so_locations\""; \ + rm -f "$${dir}/so_locations"; \ + done +libatom.la: $(libatom_la_OBJECTS) $(libatom_la_DEPENDENCIES) + $(LINK) $(am_libatom_la_rpath) $(libatom_la_LDFLAGS) $(libatom_la_OBJECTS) $(libatom_la_LIBADD) $(LIBS) +radeonhd_drv.la: $(radeonhd_drv_la_OBJECTS) $(radeonhd_drv_la_DEPENDENCIES) + $(LINK) -rpath $(driversdir) $(radeonhd_drv_la_LDFLAGS) $(radeonhd_drv_la_OBJECTS) $(radeonhd_drv_la_LIBADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libatom_la-CD_Operations.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libatom_la-Decoder.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libatom_la-hwserv_drv.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libatom_la-rhd_atomwrapper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-r5xx_accel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-r5xx_exa.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-r5xx_xaa.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-r600_exa.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-r600_shader.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-r600_textured_videofuncs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-r6xx_accel.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-radeon_3d.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-radeon_exa_render.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-radeon_textured_videofuncs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_acpi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_atombios.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_atomcrtc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_atomout.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_atompll.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_audio.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_biosscratch.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_connector.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_crtc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_cs.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_cursor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_dac.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_ddia.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_dig.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_dri.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_driver.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_edid.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_hdmi.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_helper.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_i2c.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_id.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_lut.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_lvtma.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_mc.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_modes.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_monitor.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_output.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_pll.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_pm.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_randr.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_shadow.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_tmds.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_vga.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeonhd_drv_la-rhd_video.Plo@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +libatom_la-rhd_atomwrapper.lo: rhd_atomwrapper.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -MT libatom_la-rhd_atomwrapper.lo -MD -MP -MF "$(DEPDIR)/libatom_la-rhd_atomwrapper.Tpo" -c -o libatom_la-rhd_atomwrapper.lo `test -f 'rhd_atomwrapper.c' || echo '$(srcdir)/'`rhd_atomwrapper.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libatom_la-rhd_atomwrapper.Tpo" "$(DEPDIR)/libatom_la-rhd_atomwrapper.Plo"; else rm -f "$(DEPDIR)/libatom_la-rhd_atomwrapper.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_atomwrapper.c' object='libatom_la-rhd_atomwrapper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -c -o libatom_la-rhd_atomwrapper.lo `test -f 'rhd_atomwrapper.c' || echo '$(srcdir)/'`rhd_atomwrapper.c + +libatom_la-CD_Operations.lo: AtomBios/CD_Operations.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -MT libatom_la-CD_Operations.lo -MD -MP -MF "$(DEPDIR)/libatom_la-CD_Operations.Tpo" -c -o libatom_la-CD_Operations.lo `test -f 'AtomBios/CD_Operations.c' || echo '$(srcdir)/'`AtomBios/CD_Operations.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libatom_la-CD_Operations.Tpo" "$(DEPDIR)/libatom_la-CD_Operations.Plo"; else rm -f "$(DEPDIR)/libatom_la-CD_Operations.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='AtomBios/CD_Operations.c' object='libatom_la-CD_Operations.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -c -o libatom_la-CD_Operations.lo `test -f 'AtomBios/CD_Operations.c' || echo '$(srcdir)/'`AtomBios/CD_Operations.c + +libatom_la-Decoder.lo: AtomBios/Decoder.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -MT libatom_la-Decoder.lo -MD -MP -MF "$(DEPDIR)/libatom_la-Decoder.Tpo" -c -o libatom_la-Decoder.lo `test -f 'AtomBios/Decoder.c' || echo '$(srcdir)/'`AtomBios/Decoder.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libatom_la-Decoder.Tpo" "$(DEPDIR)/libatom_la-Decoder.Plo"; else rm -f "$(DEPDIR)/libatom_la-Decoder.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='AtomBios/Decoder.c' object='libatom_la-Decoder.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -c -o libatom_la-Decoder.lo `test -f 'AtomBios/Decoder.c' || echo '$(srcdir)/'`AtomBios/Decoder.c + +libatom_la-hwserv_drv.lo: AtomBios/hwserv_drv.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -MT libatom_la-hwserv_drv.lo -MD -MP -MF "$(DEPDIR)/libatom_la-hwserv_drv.Tpo" -c -o libatom_la-hwserv_drv.lo `test -f 'AtomBios/hwserv_drv.c' || echo '$(srcdir)/'`AtomBios/hwserv_drv.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libatom_la-hwserv_drv.Tpo" "$(DEPDIR)/libatom_la-hwserv_drv.Plo"; else rm -f "$(DEPDIR)/libatom_la-hwserv_drv.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='AtomBios/hwserv_drv.c' object='libatom_la-hwserv_drv.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libatom_la_CFLAGS) $(CFLAGS) -c -o libatom_la-hwserv_drv.lo `test -f 'AtomBios/hwserv_drv.c' || echo '$(srcdir)/'`AtomBios/hwserv_drv.c + +radeonhd_drv_la-r5xx_accel.lo: r5xx_accel.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-r5xx_accel.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-r5xx_accel.Tpo" -c -o radeonhd_drv_la-r5xx_accel.lo `test -f 'r5xx_accel.c' || echo '$(srcdir)/'`r5xx_accel.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-r5xx_accel.Tpo" "$(DEPDIR)/radeonhd_drv_la-r5xx_accel.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-r5xx_accel.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='r5xx_accel.c' object='radeonhd_drv_la-r5xx_accel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-r5xx_accel.lo `test -f 'r5xx_accel.c' || echo '$(srcdir)/'`r5xx_accel.c + +radeonhd_drv_la-r5xx_xaa.lo: r5xx_xaa.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-r5xx_xaa.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-r5xx_xaa.Tpo" -c -o radeonhd_drv_la-r5xx_xaa.lo `test -f 'r5xx_xaa.c' || echo '$(srcdir)/'`r5xx_xaa.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-r5xx_xaa.Tpo" "$(DEPDIR)/radeonhd_drv_la-r5xx_xaa.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-r5xx_xaa.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='r5xx_xaa.c' object='radeonhd_drv_la-r5xx_xaa.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-r5xx_xaa.lo `test -f 'r5xx_xaa.c' || echo '$(srcdir)/'`r5xx_xaa.c + +radeonhd_drv_la-r600_shader.lo: r600_shader.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-r600_shader.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-r600_shader.Tpo" -c -o radeonhd_drv_la-r600_shader.lo `test -f 'r600_shader.c' || echo '$(srcdir)/'`r600_shader.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-r600_shader.Tpo" "$(DEPDIR)/radeonhd_drv_la-r600_shader.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-r600_shader.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='r600_shader.c' object='radeonhd_drv_la-r600_shader.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-r600_shader.lo `test -f 'r600_shader.c' || echo '$(srcdir)/'`r600_shader.c + +radeonhd_drv_la-radeon_3d.lo: radeon_3d.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-radeon_3d.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-radeon_3d.Tpo" -c -o radeonhd_drv_la-radeon_3d.lo `test -f 'radeon_3d.c' || echo '$(srcdir)/'`radeon_3d.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-radeon_3d.Tpo" "$(DEPDIR)/radeonhd_drv_la-radeon_3d.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-radeon_3d.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='radeon_3d.c' object='radeonhd_drv_la-radeon_3d.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-radeon_3d.lo `test -f 'radeon_3d.c' || echo '$(srcdir)/'`radeon_3d.c + +radeonhd_drv_la-radeon_textured_videofuncs.lo: radeon_textured_videofuncs.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-radeon_textured_videofuncs.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-radeon_textured_videofuncs.Tpo" -c -o radeonhd_drv_la-radeon_textured_videofuncs.lo `test -f 'radeon_textured_videofuncs.c' || echo '$(srcdir)/'`radeon_textured_videofuncs.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-radeon_textured_videofuncs.Tpo" "$(DEPDIR)/radeonhd_drv_la-radeon_textured_videofuncs.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-radeon_textured_videofuncs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='radeon_textured_videofuncs.c' object='radeonhd_drv_la-radeon_textured_videofuncs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-radeon_textured_videofuncs.lo `test -f 'radeon_textured_videofuncs.c' || echo '$(srcdir)/'`radeon_textured_videofuncs.c + +radeonhd_drv_la-rhd_atombios.lo: rhd_atombios.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_atombios.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_atombios.Tpo" -c -o radeonhd_drv_la-rhd_atombios.lo `test -f 'rhd_atombios.c' || echo '$(srcdir)/'`rhd_atombios.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_atombios.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_atombios.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_atombios.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_atombios.c' object='radeonhd_drv_la-rhd_atombios.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_atombios.lo `test -f 'rhd_atombios.c' || echo '$(srcdir)/'`rhd_atombios.c + +radeonhd_drv_la-rhd_atomcrtc.lo: rhd_atomcrtc.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_atomcrtc.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_atomcrtc.Tpo" -c -o radeonhd_drv_la-rhd_atomcrtc.lo `test -f 'rhd_atomcrtc.c' || echo '$(srcdir)/'`rhd_atomcrtc.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_atomcrtc.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_atomcrtc.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_atomcrtc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_atomcrtc.c' object='radeonhd_drv_la-rhd_atomcrtc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_atomcrtc.lo `test -f 'rhd_atomcrtc.c' || echo '$(srcdir)/'`rhd_atomcrtc.c + +radeonhd_drv_la-rhd_atomout.lo: rhd_atomout.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_atomout.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_atomout.Tpo" -c -o radeonhd_drv_la-rhd_atomout.lo `test -f 'rhd_atomout.c' || echo '$(srcdir)/'`rhd_atomout.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_atomout.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_atomout.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_atomout.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_atomout.c' object='radeonhd_drv_la-rhd_atomout.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_atomout.lo `test -f 'rhd_atomout.c' || echo '$(srcdir)/'`rhd_atomout.c + +radeonhd_drv_la-rhd_atompll.lo: rhd_atompll.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_atompll.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_atompll.Tpo" -c -o radeonhd_drv_la-rhd_atompll.lo `test -f 'rhd_atompll.c' || echo '$(srcdir)/'`rhd_atompll.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_atompll.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_atompll.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_atompll.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_atompll.c' object='radeonhd_drv_la-rhd_atompll.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_atompll.lo `test -f 'rhd_atompll.c' || echo '$(srcdir)/'`rhd_atompll.c + +radeonhd_drv_la-rhd_audio.lo: rhd_audio.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_audio.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_audio.Tpo" -c -o radeonhd_drv_la-rhd_audio.lo `test -f 'rhd_audio.c' || echo '$(srcdir)/'`rhd_audio.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_audio.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_audio.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_audio.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_audio.c' object='radeonhd_drv_la-rhd_audio.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_audio.lo `test -f 'rhd_audio.c' || echo '$(srcdir)/'`rhd_audio.c + +radeonhd_drv_la-rhd_biosscratch.lo: rhd_biosscratch.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_biosscratch.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_biosscratch.Tpo" -c -o radeonhd_drv_la-rhd_biosscratch.lo `test -f 'rhd_biosscratch.c' || echo '$(srcdir)/'`rhd_biosscratch.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_biosscratch.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_biosscratch.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_biosscratch.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_biosscratch.c' object='radeonhd_drv_la-rhd_biosscratch.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_biosscratch.lo `test -f 'rhd_biosscratch.c' || echo '$(srcdir)/'`rhd_biosscratch.c + +radeonhd_drv_la-rhd_connector.lo: rhd_connector.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_connector.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_connector.Tpo" -c -o radeonhd_drv_la-rhd_connector.lo `test -f 'rhd_connector.c' || echo '$(srcdir)/'`rhd_connector.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_connector.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_connector.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_connector.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_connector.c' object='radeonhd_drv_la-rhd_connector.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_connector.lo `test -f 'rhd_connector.c' || echo '$(srcdir)/'`rhd_connector.c + +radeonhd_drv_la-rhd_crtc.lo: rhd_crtc.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_crtc.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_crtc.Tpo" -c -o radeonhd_drv_la-rhd_crtc.lo `test -f 'rhd_crtc.c' || echo '$(srcdir)/'`rhd_crtc.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_crtc.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_crtc.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_crtc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_crtc.c' object='radeonhd_drv_la-rhd_crtc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_crtc.lo `test -f 'rhd_crtc.c' || echo '$(srcdir)/'`rhd_crtc.c + +radeonhd_drv_la-rhd_cs.lo: rhd_cs.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_cs.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_cs.Tpo" -c -o radeonhd_drv_la-rhd_cs.lo `test -f 'rhd_cs.c' || echo '$(srcdir)/'`rhd_cs.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_cs.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_cs.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_cs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_cs.c' object='radeonhd_drv_la-rhd_cs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_cs.lo `test -f 'rhd_cs.c' || echo '$(srcdir)/'`rhd_cs.c + +radeonhd_drv_la-rhd_cursor.lo: rhd_cursor.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_cursor.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_cursor.Tpo" -c -o radeonhd_drv_la-rhd_cursor.lo `test -f 'rhd_cursor.c' || echo '$(srcdir)/'`rhd_cursor.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_cursor.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_cursor.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_cursor.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_cursor.c' object='radeonhd_drv_la-rhd_cursor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_cursor.lo `test -f 'rhd_cursor.c' || echo '$(srcdir)/'`rhd_cursor.c + +radeonhd_drv_la-rhd_dac.lo: rhd_dac.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_dac.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_dac.Tpo" -c -o radeonhd_drv_la-rhd_dac.lo `test -f 'rhd_dac.c' || echo '$(srcdir)/'`rhd_dac.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_dac.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_dac.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_dac.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_dac.c' object='radeonhd_drv_la-rhd_dac.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_dac.lo `test -f 'rhd_dac.c' || echo '$(srcdir)/'`rhd_dac.c + +radeonhd_drv_la-rhd_ddia.lo: rhd_ddia.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_ddia.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_ddia.Tpo" -c -o radeonhd_drv_la-rhd_ddia.lo `test -f 'rhd_ddia.c' || echo '$(srcdir)/'`rhd_ddia.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_ddia.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_ddia.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_ddia.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_ddia.c' object='radeonhd_drv_la-rhd_ddia.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_ddia.lo `test -f 'rhd_ddia.c' || echo '$(srcdir)/'`rhd_ddia.c + +radeonhd_drv_la-rhd_dig.lo: rhd_dig.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_dig.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_dig.Tpo" -c -o radeonhd_drv_la-rhd_dig.lo `test -f 'rhd_dig.c' || echo '$(srcdir)/'`rhd_dig.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_dig.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_dig.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_dig.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_dig.c' object='radeonhd_drv_la-rhd_dig.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_dig.lo `test -f 'rhd_dig.c' || echo '$(srcdir)/'`rhd_dig.c + +radeonhd_drv_la-rhd_driver.lo: rhd_driver.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_driver.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_driver.Tpo" -c -o radeonhd_drv_la-rhd_driver.lo `test -f 'rhd_driver.c' || echo '$(srcdir)/'`rhd_driver.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_driver.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_driver.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_driver.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_driver.c' object='radeonhd_drv_la-rhd_driver.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_driver.lo `test -f 'rhd_driver.c' || echo '$(srcdir)/'`rhd_driver.c + +radeonhd_drv_la-rhd_edid.lo: rhd_edid.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_edid.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_edid.Tpo" -c -o radeonhd_drv_la-rhd_edid.lo `test -f 'rhd_edid.c' || echo '$(srcdir)/'`rhd_edid.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_edid.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_edid.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_edid.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_edid.c' object='radeonhd_drv_la-rhd_edid.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_edid.lo `test -f 'rhd_edid.c' || echo '$(srcdir)/'`rhd_edid.c + +radeonhd_drv_la-rhd_hdmi.lo: rhd_hdmi.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_hdmi.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_hdmi.Tpo" -c -o radeonhd_drv_la-rhd_hdmi.lo `test -f 'rhd_hdmi.c' || echo '$(srcdir)/'`rhd_hdmi.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_hdmi.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_hdmi.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_hdmi.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_hdmi.c' object='radeonhd_drv_la-rhd_hdmi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_hdmi.lo `test -f 'rhd_hdmi.c' || echo '$(srcdir)/'`rhd_hdmi.c + +radeonhd_drv_la-rhd_helper.lo: rhd_helper.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_helper.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_helper.Tpo" -c -o radeonhd_drv_la-rhd_helper.lo `test -f 'rhd_helper.c' || echo '$(srcdir)/'`rhd_helper.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_helper.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_helper.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_helper.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_helper.c' object='radeonhd_drv_la-rhd_helper.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_helper.lo `test -f 'rhd_helper.c' || echo '$(srcdir)/'`rhd_helper.c + +radeonhd_drv_la-rhd_i2c.lo: rhd_i2c.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_i2c.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_i2c.Tpo" -c -o radeonhd_drv_la-rhd_i2c.lo `test -f 'rhd_i2c.c' || echo '$(srcdir)/'`rhd_i2c.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_i2c.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_i2c.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_i2c.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_i2c.c' object='radeonhd_drv_la-rhd_i2c.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_i2c.lo `test -f 'rhd_i2c.c' || echo '$(srcdir)/'`rhd_i2c.c + +radeonhd_drv_la-rhd_id.lo: rhd_id.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_id.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_id.Tpo" -c -o radeonhd_drv_la-rhd_id.lo `test -f 'rhd_id.c' || echo '$(srcdir)/'`rhd_id.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_id.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_id.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_id.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_id.c' object='radeonhd_drv_la-rhd_id.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_id.lo `test -f 'rhd_id.c' || echo '$(srcdir)/'`rhd_id.c + +radeonhd_drv_la-rhd_lut.lo: rhd_lut.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_lut.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_lut.Tpo" -c -o radeonhd_drv_la-rhd_lut.lo `test -f 'rhd_lut.c' || echo '$(srcdir)/'`rhd_lut.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_lut.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_lut.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_lut.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_lut.c' object='radeonhd_drv_la-rhd_lut.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_lut.lo `test -f 'rhd_lut.c' || echo '$(srcdir)/'`rhd_lut.c + +radeonhd_drv_la-rhd_lvtma.lo: rhd_lvtma.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_lvtma.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_lvtma.Tpo" -c -o radeonhd_drv_la-rhd_lvtma.lo `test -f 'rhd_lvtma.c' || echo '$(srcdir)/'`rhd_lvtma.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_lvtma.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_lvtma.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_lvtma.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_lvtma.c' object='radeonhd_drv_la-rhd_lvtma.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_lvtma.lo `test -f 'rhd_lvtma.c' || echo '$(srcdir)/'`rhd_lvtma.c + +radeonhd_drv_la-rhd_mc.lo: rhd_mc.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_mc.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_mc.Tpo" -c -o radeonhd_drv_la-rhd_mc.lo `test -f 'rhd_mc.c' || echo '$(srcdir)/'`rhd_mc.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_mc.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_mc.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_mc.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_mc.c' object='radeonhd_drv_la-rhd_mc.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_mc.lo `test -f 'rhd_mc.c' || echo '$(srcdir)/'`rhd_mc.c + +radeonhd_drv_la-rhd_modes.lo: rhd_modes.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_modes.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_modes.Tpo" -c -o radeonhd_drv_la-rhd_modes.lo `test -f 'rhd_modes.c' || echo '$(srcdir)/'`rhd_modes.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_modes.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_modes.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_modes.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_modes.c' object='radeonhd_drv_la-rhd_modes.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_modes.lo `test -f 'rhd_modes.c' || echo '$(srcdir)/'`rhd_modes.c + +radeonhd_drv_la-rhd_monitor.lo: rhd_monitor.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_monitor.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_monitor.Tpo" -c -o radeonhd_drv_la-rhd_monitor.lo `test -f 'rhd_monitor.c' || echo '$(srcdir)/'`rhd_monitor.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_monitor.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_monitor.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_monitor.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_monitor.c' object='radeonhd_drv_la-rhd_monitor.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_monitor.lo `test -f 'rhd_monitor.c' || echo '$(srcdir)/'`rhd_monitor.c + +radeonhd_drv_la-rhd_output.lo: rhd_output.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_output.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_output.Tpo" -c -o radeonhd_drv_la-rhd_output.lo `test -f 'rhd_output.c' || echo '$(srcdir)/'`rhd_output.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_output.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_output.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_output.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_output.c' object='radeonhd_drv_la-rhd_output.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_output.lo `test -f 'rhd_output.c' || echo '$(srcdir)/'`rhd_output.c + +radeonhd_drv_la-rhd_pll.lo: rhd_pll.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_pll.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_pll.Tpo" -c -o radeonhd_drv_la-rhd_pll.lo `test -f 'rhd_pll.c' || echo '$(srcdir)/'`rhd_pll.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_pll.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_pll.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_pll.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_pll.c' object='radeonhd_drv_la-rhd_pll.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_pll.lo `test -f 'rhd_pll.c' || echo '$(srcdir)/'`rhd_pll.c + +radeonhd_drv_la-rhd_pm.lo: rhd_pm.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_pm.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_pm.Tpo" -c -o radeonhd_drv_la-rhd_pm.lo `test -f 'rhd_pm.c' || echo '$(srcdir)/'`rhd_pm.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_pm.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_pm.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_pm.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_pm.c' object='radeonhd_drv_la-rhd_pm.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_pm.lo `test -f 'rhd_pm.c' || echo '$(srcdir)/'`rhd_pm.c + +radeonhd_drv_la-rhd_randr.lo: rhd_randr.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_randr.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_randr.Tpo" -c -o radeonhd_drv_la-rhd_randr.lo `test -f 'rhd_randr.c' || echo '$(srcdir)/'`rhd_randr.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_randr.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_randr.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_randr.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_randr.c' object='radeonhd_drv_la-rhd_randr.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_randr.lo `test -f 'rhd_randr.c' || echo '$(srcdir)/'`rhd_randr.c + +radeonhd_drv_la-rhd_shadow.lo: rhd_shadow.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_shadow.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_shadow.Tpo" -c -o radeonhd_drv_la-rhd_shadow.lo `test -f 'rhd_shadow.c' || echo '$(srcdir)/'`rhd_shadow.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_shadow.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_shadow.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_shadow.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_shadow.c' object='radeonhd_drv_la-rhd_shadow.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_shadow.lo `test -f 'rhd_shadow.c' || echo '$(srcdir)/'`rhd_shadow.c + +radeonhd_drv_la-rhd_tmds.lo: rhd_tmds.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_tmds.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_tmds.Tpo" -c -o radeonhd_drv_la-rhd_tmds.lo `test -f 'rhd_tmds.c' || echo '$(srcdir)/'`rhd_tmds.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_tmds.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_tmds.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_tmds.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_tmds.c' object='radeonhd_drv_la-rhd_tmds.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_tmds.lo `test -f 'rhd_tmds.c' || echo '$(srcdir)/'`rhd_tmds.c + +radeonhd_drv_la-rhd_vga.lo: rhd_vga.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_vga.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_vga.Tpo" -c -o radeonhd_drv_la-rhd_vga.lo `test -f 'rhd_vga.c' || echo '$(srcdir)/'`rhd_vga.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_vga.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_vga.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_vga.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_vga.c' object='radeonhd_drv_la-rhd_vga.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_vga.lo `test -f 'rhd_vga.c' || echo '$(srcdir)/'`rhd_vga.c + +radeonhd_drv_la-rhd_video.lo: rhd_video.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_video.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_video.Tpo" -c -o radeonhd_drv_la-rhd_video.lo `test -f 'rhd_video.c' || echo '$(srcdir)/'`rhd_video.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_video.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_video.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_video.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_video.c' object='radeonhd_drv_la-rhd_video.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_video.lo `test -f 'rhd_video.c' || echo '$(srcdir)/'`rhd_video.c + +radeonhd_drv_la-rhd_acpi.lo: rhd_acpi.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_acpi.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_acpi.Tpo" -c -o radeonhd_drv_la-rhd_acpi.lo `test -f 'rhd_acpi.c' || echo '$(srcdir)/'`rhd_acpi.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_acpi.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_acpi.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_acpi.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_acpi.c' object='radeonhd_drv_la-rhd_acpi.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_acpi.lo `test -f 'rhd_acpi.c' || echo '$(srcdir)/'`rhd_acpi.c + +radeonhd_drv_la-r5xx_exa.lo: r5xx_exa.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-r5xx_exa.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-r5xx_exa.Tpo" -c -o radeonhd_drv_la-r5xx_exa.lo `test -f 'r5xx_exa.c' || echo '$(srcdir)/'`r5xx_exa.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-r5xx_exa.Tpo" "$(DEPDIR)/radeonhd_drv_la-r5xx_exa.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-r5xx_exa.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='r5xx_exa.c' object='radeonhd_drv_la-r5xx_exa.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-r5xx_exa.lo `test -f 'r5xx_exa.c' || echo '$(srcdir)/'`r5xx_exa.c + +radeonhd_drv_la-radeon_exa_render.lo: radeon_exa_render.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-radeon_exa_render.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-radeon_exa_render.Tpo" -c -o radeonhd_drv_la-radeon_exa_render.lo `test -f 'radeon_exa_render.c' || echo '$(srcdir)/'`radeon_exa_render.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-radeon_exa_render.Tpo" "$(DEPDIR)/radeonhd_drv_la-radeon_exa_render.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-radeon_exa_render.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='radeon_exa_render.c' object='radeonhd_drv_la-radeon_exa_render.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-radeon_exa_render.lo `test -f 'radeon_exa_render.c' || echo '$(srcdir)/'`radeon_exa_render.c + +radeonhd_drv_la-rhd_dri.lo: rhd_dri.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-rhd_dri.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-rhd_dri.Tpo" -c -o radeonhd_drv_la-rhd_dri.lo `test -f 'rhd_dri.c' || echo '$(srcdir)/'`rhd_dri.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-rhd_dri.Tpo" "$(DEPDIR)/radeonhd_drv_la-rhd_dri.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-rhd_dri.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='rhd_dri.c' object='radeonhd_drv_la-rhd_dri.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-rhd_dri.lo `test -f 'rhd_dri.c' || echo '$(srcdir)/'`rhd_dri.c + +radeonhd_drv_la-r6xx_accel.lo: r6xx_accel.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-r6xx_accel.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-r6xx_accel.Tpo" -c -o radeonhd_drv_la-r6xx_accel.lo `test -f 'r6xx_accel.c' || echo '$(srcdir)/'`r6xx_accel.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-r6xx_accel.Tpo" "$(DEPDIR)/radeonhd_drv_la-r6xx_accel.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-r6xx_accel.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='r6xx_accel.c' object='radeonhd_drv_la-r6xx_accel.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-r6xx_accel.lo `test -f 'r6xx_accel.c' || echo '$(srcdir)/'`r6xx_accel.c + +radeonhd_drv_la-r600_exa.lo: r600_exa.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-r600_exa.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-r600_exa.Tpo" -c -o radeonhd_drv_la-r600_exa.lo `test -f 'r600_exa.c' || echo '$(srcdir)/'`r600_exa.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-r600_exa.Tpo" "$(DEPDIR)/radeonhd_drv_la-r600_exa.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-r600_exa.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='r600_exa.c' object='radeonhd_drv_la-r600_exa.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-r600_exa.lo `test -f 'r600_exa.c' || echo '$(srcdir)/'`r600_exa.c + +radeonhd_drv_la-r600_textured_videofuncs.lo: r600_textured_videofuncs.c +@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -MT radeonhd_drv_la-r600_textured_videofuncs.lo -MD -MP -MF "$(DEPDIR)/radeonhd_drv_la-r600_textured_videofuncs.Tpo" -c -o radeonhd_drv_la-r600_textured_videofuncs.lo `test -f 'r600_textured_videofuncs.c' || echo '$(srcdir)/'`r600_textured_videofuncs.c; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/radeonhd_drv_la-r600_textured_videofuncs.Tpo" "$(DEPDIR)/radeonhd_drv_la-r600_textured_videofuncs.Plo"; else rm -f "$(DEPDIR)/radeonhd_drv_la-r600_textured_videofuncs.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='r600_textured_videofuncs.c' object='radeonhd_drv_la-r600_textured_videofuncs.lo' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(radeonhd_drv_la_CFLAGS) $(CFLAGS) -c -o radeonhd_drv_la-r600_textured_videofuncs.lo `test -f 'r600_textured_videofuncs.c' || echo '$(srcdir)/'`r600_textured_videofuncs.c + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/.. + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_FALSE@all-local: +@MAINTAINER_MODE_FALSE@all-local: +all-am: Makefile $(LTLIBRARIES) all-local +installdirs: + for dir in "$(DESTDIR)$(driversdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-driversLTLIBRARIES clean-generic clean-libtool \ + clean-noinstLTLIBRARIES mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-driversLTLIBRARIES + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-driversLTLIBRARIES uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ + clean-driversLTLIBRARIES clean-generic clean-libtool \ + clean-noinstLTLIBRARIES ctags dist-hook distclean \ + distclean-compile distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-driversLTLIBRARIES install-exec install-exec-am \ + install-info install-info-am install-man install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-driversLTLIBRARIES \ + uninstall-info-am + +git_version.stamp: + @if test -f "$(srcdir)/git_version.h"; then \ + if test -f "git_version.h"; then :; \ + else \ + cp "$(srcdir)/git_version.h" "git_version.h"; \ + fi; \ + fi + $(GIT_VERSION_CMD) -k -s $(top_srcdir) -o git_version.h + @if test -s "$(srcdir)/git_version.h"; then \ + if cmp "$(srcdir)/git_version.h" "git_version.h"; then :; \ + else \ + echo "Error: $(srcdir)/git_version.h and git_version.h differ."; \ + echo " You probably want to remove the former."; \ + exit 1; \ + fi; \ + fi + +dist-hook: git_version.stamp + if test -f "git_version.h"; then \ + $(SED) -e 's|^#undef GIT_IS_DIST.*|#define GIT_IS_DIST 1|' \ + "git_version.h" > "$(distdir)/git_version.h"; \ + fi +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@radeonhd.man.new: rhd_id.c $(SRCMAN) +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ $(Q)( $(SED) -n '1,/^\.\\" START_DEVICE_LIST marker - do not delete/p' "$(SRCMAN)"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ $(SED) -e '1,/^[ ]*\/\* START_DEVICE_LIST marker - do not delete \*\/ *$$/d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e '/^[ ]*\/\* END_DEVICE_LIST marker - do not delete \*\/ *$$/,$$d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e '/^[ ]\{1,\}xf86Msg(X_NONE,/d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e '/^[ ]\{1,\}\/\*/d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*;\)\\n"$$/.TP 8\n.B \1\n\2/' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e 's/^[ ]\{1,\}"\\t\\t\(.*\)\.\\n"\();\)\{0,1\}$$/\1/' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*\)\.\\n"\();\)\{0,1\}$$/.TP 8\n.B \1\n\2/' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ "$(srcdir)/rhd_id.c"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ $(SED) -n '/^\.\\" END_DEVICE_LIST marker - do not delete/,$$p' "$(SRCMAN)" \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ ) > radeonhd.man.new +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@README.new: rhd_id.c $(top_srcdir)/README +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ $(Q)( $(SED) -n '1,/^BEGIN_DEVICE_LIST$$/p' "$(SRCREADME)"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ $(SED) -e '1,/^[ ]*\/\* START_DEVICE_LIST marker - do not delete \*\/ *$$/d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e '/^[ ]*\/\* END_DEVICE_LIST marker - do not delete \*\/ *$$/,$$d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e '/^[ ]\{1,\}xf86Msg(X_NONE,/d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e '/^[ ]\{1,\}\/\*/d' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*;\)\\n"$$/ * \1:\t\2/' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e 's/^[ ]\{1,\}"\\t\\t\(.*\)\.\\n"\();\)\{0,1\}$$/ \t\1/' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ -e 's/^[ ]\{1,\}"\\t\([A-Z0-9]\{1,\}\) \{1,\}: \(.*\)\.\\n"\();\)\{0,1\}$$/ * \1:\t\2/' \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ "$(srcdir)/rhd_id.c"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ $(SED) -n '/^END_DEVICE_LIST$$/,$$p' "$(SRCREADME)" \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ ) > README.new + +# Update man page and README from rhd_id.c RHDIdentify() output. +# The exit(1) makes sure the updates do not go unnoticed. +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@all-local: radeonhd.man.new README.new +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ @changed=""; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ if diff -u "$(SRCMAN)" radeonhd.man.new; then \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ if test "x$(Q)" = "x@"; then :; else echo "radeon(4) man page is current."; fi \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ else \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ changed="$$changed $(SRCMAN)"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ mv -f radeonhd.man.new "$(SRCMAN)"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ fi; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ if diff -u "$(SRCREADME)" README.new; then \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ if test "x$(Q)" = "x@"; then :; else echo "README file is current."; fi \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ else \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ changed="$$changed $(SRCREADME)"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ mv -f README.new "$(SRCREADME)"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ fi; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ if test "x$$changed" = "x"; then :; else \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ echo "WARNING: Due to changes to src/rhd_id.c, some files differ from the original ones."; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ echo " Please verify the changes to the following files"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ for f in $$changed; do echo " $$f"; done; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ echo " and commit them together with your changes to"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ echo " $(srcdir)/rhd_id.c"; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ exit 1; \ +@HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@@MAINTAINER_MODE_TRUE@ fi +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/driver/xf86-video-radeonhd/src/atombios_rev.h b/driver/xf86-video-radeonhd/src/atombios_rev.h new file mode 100644 index 000000000..cb95ac20b --- /dev/null +++ b/driver/xf86-video-radeonhd/src/atombios_rev.h @@ -0,0 +1,199 @@ +/* + * Copyright 2007-2009 Luc Verhaegen + * Copyright 2007-2009 Matthias Hopf + * Copyright 2007-2009 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * Reverse engineered AtomBIOS entries. + * Plus addon information for dynamic data tables. + */ + +/* + * Dynamic data tables: + * Modify table sizes and offset positions by replacing access code + * (e.g. &d->asPowerUnknownInfo[i]) by custom code. + * d is the current data structure, data as a char *, + * start the main data structure as char *, i is counter. + * + * #pragma count ATOM_POWERPLAY_INFO_V4 asPowerIndexInfo (d->NumPowerIndexEntries) + * #pragma offset ATOM_POWERPLAY_INFO_V4 asPowerIndexInfo (data + d->OffsetPowerIndexEntries + i*d->SizeOfPowerIndexEntry) + * #pragma return ATOM_POWERPLAY_INFO_V4 - (d->OffsetPowerUnknownEntries + ATOM_MAX_NUMBEROF_POWERUNKNOWN_BLOCK_V4*d->SizeOfPowerUnknownEntry) + * + * Has to be issued *before* the offset is encountered. And outside structures. + */ + +typedef struct +{ + unsigned char u[2]; +} U16; +#define _U16(x) (((x).u[1]<<8)|(x).u[0]) + +typedef struct +{ + unsigned char u[3]; +} U24; +#define _U24(x) (((x).u[2]<<16)|((x).u[1]<<8)|(x).u[0]) + +#include /* offsetof() */ +#define COUNT_REMAINDER(s,m,e) ((((ATOM_COMMON_TABLE_HEADER*)d)->usStructureSize-offsetof(s,m)) / sizeof(e)) +#define RETURN_REMAINDER(s,m,e) (d ? (offsetof(s,m) + COUNT_REMAINDER(s,m,e) * sizeof(e)) : 0) +#define COUNT_ALL(s,e) ((((ATOM_COMMON_TABLE_HEADER*)d)->usStructureSize-sizeof(ATOM_COMMON_TABLE_HEADER)) / sizeof(e)) +#define RETURN_ALL(s,e) (d ? (sizeof(ATOM_COMMON_TABLE_HEADER) + COUNT_ALL(s,e) * sizeof(e)) : 0) + + +/* + * Dynamic additions to generic atombios.h + */ +#pragma count ATOM_GPIO_I2C_INFO asGPIO_Info COUNT_ALL (ATOM_GPIO_I2C_INFO, ATOM_GPIO_I2C_ASSIGMENT) +#pragma return ATOM_GPIO_I2C_INFO asGPIO_Info RETURN_ALL (ATOM_GPIO_I2C_INFO, ATOM_GPIO_I2C_ASSIGMENT) + +#pragma count ATOM_GPIO_PIN_LUT asGPIO_Pin COUNT_ALL (ATOM_GPIO_PIN_LUT, ATOM_GPIO_PIN_ASSIGNMENT) +#pragma return ATOM_GPIO_PIN_LUT asGPIO_Pin RETURN_ALL (ATOM_GPIO_PIN_LUT, ATOM_GPIO_PIN_ASSIGNMENT) + +#pragma count ATOM_VESA_TO_INTENAL_MODE_LUT asVESA_ToExtendedModeInfo COUNT_ALL (ATOM_VESA_TO_INTENAL_MODE_LUT, ATOM_VESA_TO_EXTENDED_MODE) +#pragma return ATOM_VESA_TO_INTENAL_MODE_LUT asVESA_ToExtendedModeInfo RETURN_ALL (ATOM_VESA_TO_INTENAL_MODE_LUT, ATOM_VESA_TO_EXTENDED_MODE) + +#pragma count ATOM_COMPONENT_VIDEO_INFO aWbGpioStateBlock (d->ucNumOfWbGpioBlocks) +#pragma count ATOM_COMPONENT_VIDEO_INFO aModeTimings COUNT_REMAINDER (ATOM_COMPONENT_VIDEO_INFO, aModeTimings[0], ATOM_DTD_FORMAT) +#pragma return ATOM_COMPONENT_VIDEO_INFO - RETURN_REMAINDER (ATOM_COMPONENT_VIDEO_INFO, aModeTimings[0], ATOM_DTD_FORMAT) +#pragma count ATOM_COMPONENT_VIDEO_INFO_V21 aWbGpioStateBlock (d->ucNumOfWbGpioBlocks) +#pragma count ATOM_COMPONENT_VIDEO_INFO_V21 aModeTimings COUNT_REMAINDER (ATOM_COMPONENT_VIDEO_INFO_V21, aModeTimings[0], ATOM_DTD_FORMAT) +#pragma return ATOM_COMPONENT_VIDEO_INFO_V21 - RETURN_REMAINDER (ATOM_COMPONENT_VIDEO_INFO_V21, aModeTimings[0], ATOM_DTD_FORMAT) + +#pragma count INDIRECT_IO_ACCESS IOAccessSequence -1 /* No useful information */ +#pragma return INDIRECT_IO_ACCESS IOAccessSequence RETURN_ALL (ATOM_INDIRECT_IO_ACCESS, UCHAR) + +#pragma offset ATOM_VRAM_INFO_V3 aVramInfo *(offset_ATOM_VRAM_INFO_V3_aVramInfo(d,i)) +#pragma count ATOM_VRAM_INFO_V3 aVramInfo (count_ATOM_VRAM_INFO_V3_aVramInfo(d)) +#pragma offset ATOM_VRAM_INFO_V3 asMemPatch *(data + d->usMemClkPatchTblOffset) +/* Needs more love */ +#pragma return ATOM_VRAM_INFO_V3 - 0 + +/* Doesn't look completely reasonable, but seems ok... */ +#pragma count ATOM_ASIC_PROFILE_VOLTAGE asLeakVol ((d->usSize - offsetof(ATOM_ASIC_PROFILE_VOLTAGE,asLeakVol)) / sizeof(ATOM_LEAKID_VOLTAGE)) + +#pragma count ATOM_VOLTAGE_FORMULA ucVIDAdjustEntries (d->ucNumOfVoltageEntries) +#pragma offset ATOM_VOLTAGE_OBJECT_INFO asVoltageObj *(offset_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(d,i)) +#pragma count ATOM_VOLTAGE_OBJECT_INFO asVoltageObj (count_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(d)) +#pragma return ATOM_VOLTAGE_OBJECT_INFO - 0 + +#pragma count ATOM_POWER_SOURCE_INFO asPwrObj COUNT_REMAINDER (ATOM_POWER_SOURCE_INFO, asPwrObj[0], ATOM_POWER_SOURCE_OBJECT) +#pragma return ATOM_POWER_SOURCE_INFO - RETURN_REMAINDER (ATOM_POWER_SOURCE_INFO, asPwrObj[0], ATOM_POWER_SOURCE_OBJECT) + +/* + * Generic atombios.h + */ +#include "atombios.h" + +static inline char *offset_ATOM_VRAM_INFO_V3_aVramInfo(ATOM_VRAM_INFO_V3 *d, int i) { + char *r = (char *)&d->aVramInfo[0]; + while (i-- > 0) + r += ((ATOM_VRAM_MODULE_V3 *)r)->usSize; + return r; +} +static inline int count_ATOM_VRAM_INFO_V3_aVramInfo(ATOM_VRAM_INFO_V3 *d) { + int i=0; + char *last = 0, *next; + while ( (next = offset_ATOM_VRAM_INFO_V3_aVramInfo(d,i)) - (char*)d < d->usMemAdjustTblOffset && next != last) { + last = next; + i++; + } + return i; +} +static inline char *offset_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(ATOM_VOLTAGE_OBJECT_INFO *d, int i) { + char *r = (char *)&d->asVoltageObj[0]; + while (i-- > 0) + r += ((ATOM_VOLTAGE_OBJECT *)r)->ucSize; + return r; +} +static inline int count_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(ATOM_VOLTAGE_OBJECT_INFO *d) { + int i=0; + char *last=0, *next; + while ( (next = offset_ATOM_VOLTAGE_OBJECT_INFO_asVoltageObj(d,i)) - (char*)d < d->sHeader.usStructureSize && next != last) { + last = next; + i++; + } + return i; +} + + +/* + * Reverse engineered tables + */ + +/* ucTableFormatRevision=4 / ucTableContentRevision=1 */ + +#pragma count ATOM_POWERINDEX_INFO_V4 Index (((ATOM_POWERPLAY_INFO_V4*)start)->SizeOfPowerIndexEntry-1) +typedef struct _ATOM_POWERINDEX_INFO_V4 +{ + UCHAR Type; + UCHAR Index[3]; +}ATOM_POWERINDEX_INFO_V4; + +typedef struct _ATOM_POWERMODE_INFO_V4 +{ + U24 engineClock; + U24 memoryClock; + U16 voltage; + U16 unknown8; + U16 unknown10; + U16 unknown12Flags; + U16 unknown14; +}ATOM_POWERMODE_INFO_V4; + +#pragma count ATOM_POWERUNKNOWN_INFO_V4 unknown (((ATOM_POWERPLAY_INFO_V4*)start)->SizeOfPowerUnknownEntry) +typedef struct _ATOM_POWERUNKNOWN_INFO_V4 +{ + UCHAR unknown[12]; +}ATOM_POWERUNKNOWN_INFO_V4; + +#pragma count ATOM_POWERPLAY_INFO_V4 asPowerIndexInfo (d->NumPowerIndexEntries) +#pragma offset ATOM_POWERPLAY_INFO_V4 asPowerIndexInfo *(data + _U16(d->OffsetPowerIndexEntries) + i*d->SizeOfPowerIndexEntry) +#pragma count ATOM_POWERPLAY_INFO_V4 asPowerModeInfo ((_U16(d->OffsetPowerUnknownEntries) - _U16(d->OffsetPowerModeEntries)) / d->SizeOfPowerModeEntry) +#pragma offset ATOM_POWERPLAY_INFO_V4 asPowerModeInfo *(data + _U16(d->OffsetPowerModeEntries) + i*d->SizeOfPowerModeEntry) +#pragma count ATOM_POWERPLAY_INFO_V4 asPowerUnknownInfo ((d->sHeader.usStructureSize - _U16(d->OffsetPowerUnknownEntries)) / d->SizeOfPowerUnknownEntry) +#pragma offset ATOM_POWERPLAY_INFO_V4 asPowerUnknownInfo *(data + _U16(d->OffsetPowerUnknownEntries) + i*d->SizeOfPowerUnknownEntry) +#pragma return ATOM_POWERPLAY_INFO_V4 - (d ? (_U16(d->OffsetPowerUnknownEntries) + ((d->sHeader.usStructureSize - _U16(d->OffsetPowerUnknownEntries)) / d->SizeOfPowerUnknownEntry)*d->SizeOfPowerUnknownEntry) : 0) + +typedef struct _ATOM_POWERPLAY_INFO_V4 +{ + ATOM_COMMON_TABLE_HEADER sHeader; + UCHAR unknown4; + UCHAR NumPowerIndexEntries; + UCHAR SizeOfPowerIndexEntry; + UCHAR SizeOfPowerModeEntry; + UCHAR SizeOfPowerUnknownEntry; + U16 OffsetPowerIndexEntries; + U16 OffsetPowerModeEntries; + U16 OffsetPowerUnknownEntries; + U16 unknown15[3]; + U16 unknownFlags; + U16 unknown23[5]; + U16 OffsetPowerModeEntries2; + U16 OffsetPowerUnknownEntries2; + UCHAR unknown37[3]; /* Only on some BIOSes (e.g. RV770) */ + ATOM_POWERINDEX_INFO_V4 asPowerIndexInfo[4]; + ATOM_POWERMODE_INFO_V4 asPowerModeInfo[10]; + ATOM_POWERUNKNOWN_INFO_V4 asPowerUnknownInfo[4]; +}ATOM_POWERPLAY_INFO_V4; + + diff --git a/driver/xf86-video-radeonhd/src/git_version.h b/driver/xf86-video-radeonhd/src/git_version.h new file mode 100644 index 000000000..86048a2c4 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/git_version.h @@ -0,0 +1,68 @@ +/* + * Basic versioning gathered from the git repository. + * Automatically generated by ../../git_version.sh. + */ + +#ifndef GIT_VERSION_H +#define GIT_VERSION_H 1 + +/* whether this is a dist tarball or not */ +#define GIT_IS_DIST 1 + +/* No errors occured while running git */ +#undef GIT_ERRORS + +/* git utilities found */ +#undef GIT_NOT_FOUND +#define GIT_VERSION "git version 1.6.0.2" + +/* git repo found */ +#define GIT_REPO 1 + +/* Git SHA ID of last commit */ +#define GIT_SHAID "8cbff7bf" + +/* Branch this tree is on */ +#define GIT_BRANCH "master" + +/* SHA-ID uniquely defines the state of this code */ +#undef GIT_DIRTY + +/* Define GIT_MESSAGE such that + * printf("%s: built from %s", argv[0], GIT_MESSAGE); + * forms a proper sentence. + */ + +#ifdef GIT_DIRTY +# define GIT_DIRTY_MSG " + changes" +#else /* !GIT_DIRTY */ +# define GIT_DIRTY_MSG "" +#endif /* GIT_DIRTY */ + +#ifdef GIT_ERRORS +# define GIT_ERROR_MSG " with error: " GIT_ERRORS +#else /* !GIT_ERRORS */ +# define GIT_ERROR_MSG "" +#endif /* GIT_ERRORS */ + +#ifdef GIT_IS_DIST +# define GIT_DIST_MSG "dist of " +#else /* !GIT_IS_DIST */ +# define GIT_DIST_MSG "" +#endif /* GIT_IS_DIST */ + +#ifdef GIT_REPO +# ifdef GIT_NOT_FOUND +# define GIT_MESSAGE GIT_DIST_MSG "git sources without git: " GIT_NOT_FOUND +# else /* !GIT_NOT_FOUND */ +# define GIT_MESSAGE \ + GIT_DIST_MSG \ + "git branch " GIT_BRANCH ", " \ + "commit " GIT_SHAID GIT_DIRTY_MSG \ + GIT_ERROR_MSG +# endif /* GIT_NOT_FOUND */ +#else /* !GIT_REPO */ +# define GIT_MESSAGE GIT_DIST_MSG "non-git sources" GIT_ERROR_MSG +#endif /* GIT_REPO */ + +#endif /* GIT_VERSION_H */ diff --git a/driver/xf86-video-radeonhd/src/r5xx_3dregs.h b/driver/xf86-video-radeonhd/src/r5xx_3dregs.h new file mode 100644 index 000000000..2f13db943 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r5xx_3dregs.h @@ -0,0 +1,1352 @@ +/* BROKEN DISCLAIMER */ + +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and + * VA Linux Systems Inc., Fremont, California. + * + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ + +#ifndef HAVE_R5XX_3DREGS_H +#define HAVE_R5XX_3DREGS_H 1 + +/* PLL register i cannot find any documentation on */ +#define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */ + +#define R300_DST_PIPE_CONFIG 0x170c +# define R300_PIPE_AUTO_CONFIG (1 << 31) + +#define RADEON_WAIT_UNTIL 0x1720 +# define RADEON_WAIT_CRTC_PFLIP (1 << 0) +# define RADEON_WAIT_RE_CRTC_VLINE (1 << 1) +# define RADEON_WAIT_FE_CRTC_VLINE (1 << 2) +# define RADEON_WAIT_CRTC_VLINE (1 << 3) +# define RADEON_WAIT_DMA_VID_IDLE (1 << 8) +# define RADEON_WAIT_DMA_GUI_IDLE (1 << 9) +# define RADEON_WAIT_CMDFIFO (1 << 10) /* wait for CMDFIFO_ENTRIES */ +# define RADEON_WAIT_OV0_FLIP (1 << 11) +# define RADEON_WAIT_AGP_FLUSH (1 << 13) +# define RADEON_WAIT_2D_IDLE (1 << 14) +# define RADEON_WAIT_3D_IDLE (1 << 15) +# define RADEON_WAIT_2D_IDLECLEAN (1 << 16) +# define RADEON_WAIT_3D_IDLECLEAN (1 << 17) +# define RADEON_WAIT_HOST_IDLECLEAN (1 << 18) +# define RADEON_CMDFIFO_ENTRIES_SHIFT 10 +# define RADEON_CMDFIFO_ENTRIES_MASK 0x7f +# define RADEON_WAIT_VAP_IDLE (1 << 28) +# define RADEON_WAIT_BOTH_CRTC_PFLIP (1 << 30) +# define RADEON_ENG_DISPLAY_SELECT_CRTC0 (0 << 31) +# define RADEON_ENG_DISPLAY_SELECT_CRTC1 (1 << 31) + +#define RADEON_RB3D_BLENDCNTL 0x1c20 +# define RADEON_COMB_FCN_MASK (3 << 12) +# define RADEON_COMB_FCN_ADD_CLAMP (0 << 12) +# define RADEON_COMB_FCN_ADD_NOCLAMP (1 << 12) +# define RADEON_COMB_FCN_SUB_CLAMP (2 << 12) +# define RADEON_COMB_FCN_SUB_NOCLAMP (3 << 12) +# define RADEON_SRC_BLEND_GL_ZERO (32 << 16) +# define RADEON_SRC_BLEND_GL_ONE (33 << 16) +# define RADEON_SRC_BLEND_GL_SRC_COLOR (34 << 16) +# define RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_COLOR (35 << 16) +# define RADEON_SRC_BLEND_GL_DST_COLOR (36 << 16) +# define RADEON_SRC_BLEND_GL_ONE_MINUS_DST_COLOR (37 << 16) +# define RADEON_SRC_BLEND_GL_SRC_ALPHA (38 << 16) +# define RADEON_SRC_BLEND_GL_ONE_MINUS_SRC_ALPHA (39 << 16) +# define RADEON_SRC_BLEND_GL_DST_ALPHA (40 << 16) +# define RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA (41 << 16) +# define RADEON_SRC_BLEND_GL_SRC_ALPHA_SATURATE (42 << 16) +# define RADEON_SRC_BLEND_MASK (63 << 16) +# define RADEON_DST_BLEND_GL_ZERO (32 << 24) +# define RADEON_DST_BLEND_GL_ONE (33 << 24) +# define RADEON_DST_BLEND_GL_SRC_COLOR (34 << 24) +# define RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR (35 << 24) +# define RADEON_DST_BLEND_GL_DST_COLOR (36 << 24) +# define RADEON_DST_BLEND_GL_ONE_MINUS_DST_COLOR (37 << 24) +# define RADEON_DST_BLEND_GL_SRC_ALPHA (38 << 24) +# define RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA (39 << 24) +# define RADEON_DST_BLEND_GL_DST_ALPHA (40 << 24) +# define RADEON_DST_BLEND_GL_ONE_MINUS_DST_ALPHA (41 << 24) +# define RADEON_DST_BLEND_MASK (63 << 24) + +#define R300_VAP_CNTL 0x2080 +# define R300_PVS_NUM_SLOTS_SHIFT 0 +# define R300_PVS_NUM_CNTLRS_SHIFT 4 +# define R300_PVS_NUM_FPUS_SHIFT 8 +# define R300_VF_MAX_VTX_NUM_SHIFT 18 +# define R300_GL_CLIP_SPACE_DEF (0 << 22) +# define R300_DX_CLIP_SPACE_DEF (1 << 22) +# define R500_TCL_STATE_OPTIMIZATION (1 << 23) + +#define R500_VAP_INDEX_OFFSET 0x208c + +#define R300_VAP_OUT_VTX_FMT_0 0x2090 +# define R300_VTX_POS_PRESENT (1 << 0) +# define R300_VTX_COLOR_0_PRESENT (1 << 1) +# define R300_VTX_COLOR_1_PRESENT (1 << 2) +# define R300_VTX_COLOR_2_PRESENT (1 << 3) +# define R300_VTX_COLOR_3_PRESENT (1 << 4) +# define R300_VTX_PT_SIZE_PRESENT (1 << 16) +#define R300_VAP_OUT_VTX_FMT_1 0x2094 +# define R300_TEX_0_COMP_CNT_SHIFT 0 +# define R300_TEX_1_COMP_CNT_SHIFT 3 +# define R300_TEX_2_COMP_CNT_SHIFT 6 +# define R300_TEX_3_COMP_CNT_SHIFT 9 +# define R300_TEX_4_COMP_CNT_SHIFT 12 +# define R300_TEX_5_COMP_CNT_SHIFT 15 +# define R300_TEX_6_COMP_CNT_SHIFT 18 +# define R300_TEX_7_COMP_CNT_SHIFT 21 + +#define R300_VAP_VTE_CNTL 0x20B0 +# define R300_VPORT_X_SCALE_ENA (1 << 0) +# define R300_VPORT_X_OFFSET_ENA (1 << 1) +# define R300_VPORT_Y_SCALE_ENA (1 << 2) +# define R300_VPORT_Y_OFFSET_ENA (1 << 3) +# define R300_VPORT_Z_SCALE_ENA (1 << 4) +# define R300_VPORT_Z_OFFSET_ENA (1 << 5) +# define R300_VTX_XY_FMT (1 << 8) +# define R300_VTX_Z_FMT (1 << 9) +# define R300_VTX_W0_FMT (1 << 10) +#define R300_VAP_VTX_SIZE 0x20b4 + +#define R300_VAP_CNTL_STATUS 0x2140 +# define R300_PVS_BYPASS (1 << 8) + +#define R300_VAP_PROG_STREAM_CNTL_0 0x2150 +# define R300_DATA_TYPE_0_SHIFT 0 +# define R300_DATA_TYPE_FLOAT_1 0 +# define R300_DATA_TYPE_FLOAT_2 1 +# define R300_DATA_TYPE_FLOAT_3 2 +# define R300_DATA_TYPE_FLOAT_4 3 +# define R300_DATA_TYPE_BYTE 4 +# define R300_DATA_TYPE_D3DCOLOR 5 +# define R300_DATA_TYPE_SHORT_2 6 +# define R300_DATA_TYPE_SHORT_4 7 +# define R300_DATA_TYPE_VECTOR_3_TTT 8 +# define R300_DATA_TYPE_VECTOR_3_EET 9 +# define R300_SKIP_DWORDS_0_SHIFT 4 +# define R300_DST_VEC_LOC_0_SHIFT 8 +# define R300_LAST_VEC_0 (1 << 13) +# define R300_SIGNED_0 (1 << 14) +# define R300_NORMALIZE_0 (1 << 15) +# define R300_DATA_TYPE_1_SHIFT 16 +# define R300_SKIP_DWORDS_1_SHIFT 20 +# define R300_DST_VEC_LOC_1_SHIFT 24 +# define R300_LAST_VEC_1 (1 << 29) +# define R300_SIGNED_1 (1 << 30) +# define R300_NORMALIZE_1 (1 << 31) + +#define R300_VAP_PROG_STREAM_CNTL_1 0x2154 +# define R300_DATA_TYPE_2_SHIFT 0 +# define R300_SKIP_DWORDS_2_SHIFT 4 +# define R300_DST_VEC_LOC_2_SHIFT 8 +# define R300_LAST_VEC_2 (1 << 13) +# define R300_SIGNED_2 (1 << 14) +# define R300_NORMALIZE_2 (1 << 15) +# define R300_DATA_TYPE_3_SHIFT 16 +# define R300_SKIP_DWORDS_3_SHIFT 20 +# define R300_DST_VEC_LOC_3_SHIFT 24 +# define R300_LAST_VEC_3 (1 << 29) +# define R300_SIGNED_3 (1 << 30) +# define R300_NORMALIZE_3 (1 << 31) + +#define R300_VAP_VTX_STATE_CNTL 0x2180 + +#define R300_VAP_PVS_CODE_CNTL_0 0x22D0 +# define R300_PVS_FIRST_INST_SHIFT 0 +# define R300_PVS_XYZW_VALID_INST_SHIFT 10 +# define R300_PVS_LAST_INST_SHIFT 20 +#define R300_VAP_PVS_CODE_CNTL_1 0x22D8 +# define R300_PVS_LAST_VTX_SRC_INST_SHIFT 0 + +#define R300_VAP_PSC_SGN_NORM_CNTL 0x21DC + +#define R300_VAP_PROG_STREAM_CNTL_EXT_0 0x21e0 +# define R300_SWIZZLE_SELECT_X_0_SHIFT 0 +# define R300_SWIZZLE_SELECT_Y_0_SHIFT 3 +# define R300_SWIZZLE_SELECT_Z_0_SHIFT 6 +# define R300_SWIZZLE_SELECT_W_0_SHIFT 9 +# define R300_SWIZZLE_SELECT_X 0 +# define R300_SWIZZLE_SELECT_Y 1 +# define R300_SWIZZLE_SELECT_Z 2 +# define R300_SWIZZLE_SELECT_W 3 +# define R300_SWIZZLE_SELECT_FP_ZERO 4 +# define R300_SWIZZLE_SELECT_FP_ONE 5 +# define R300_WRITE_ENA_0_SHIFT 12 +# define R300_WRITE_ENA_X 1 +# define R300_WRITE_ENA_Y 2 +# define R300_WRITE_ENA_Z 4 +# define R300_WRITE_ENA_W 8 +# define R300_SWIZZLE_SELECT_X_1_SHIFT 16 +# define R300_SWIZZLE_SELECT_Y_1_SHIFT 19 +# define R300_SWIZZLE_SELECT_Z_1_SHIFT 22 +# define R300_SWIZZLE_SELECT_W_1_SHIFT 25 +# define R300_WRITE_ENA_1_SHIFT 28 +#define R300_VAP_PROG_STREAM_CNTL_EXT_1 0x21e4 +# define R300_SWIZZLE_SELECT_X_2_SHIFT 0 +# define R300_SWIZZLE_SELECT_Y_2_SHIFT 3 +# define R300_SWIZZLE_SELECT_Z_2_SHIFT 6 +# define R300_SWIZZLE_SELECT_W_2_SHIFT 9 +# define R300_WRITE_ENA_2_SHIFT 12 +# define R300_SWIZZLE_SELECT_X_3_SHIFT 16 +# define R300_SWIZZLE_SELECT_Y_3_SHIFT 19 +# define R300_SWIZZLE_SELECT_Z_3_SHIFT 22 +# define R300_SWIZZLE_SELECT_W_3_SHIFT 25 +# define R300_WRITE_ENA_3_SHIFT 28 + +#define R300_VAP_PVS_VECTOR_INDX_REG 0x2200 +#define R300_VAP_PVS_VECTOR_DATA_REG 0x2204 + +/* PVS instructions */ +/* Opcode and dst instruction */ +#define R300_PVS_DST_OPCODE(x) (x << 0) +/* Vector ops */ +# define R300_VECTOR_NO_OP 0 +# define R300_VE_DOT_PRODUCT 1 +# define R300_VE_MULTIPLY 2 +# define R300_VE_ADD 3 +# define R300_VE_MULTIPLY_ADD 4 +# define R300_VE_DISTANCE_VECTOR 5 +# define R300_VE_FRACTION 6 +# define R300_VE_MAXIMUM 7 +# define R300_VE_MINIMUM 8 +# define R300_VE_SET_GREATER_THAN_EQUAL 9 +# define R300_VE_SET_LESS_THAN 10 +# define R300_VE_MULTIPLYX2_ADD 11 +# define R300_VE_MULTIPLY_CLAMP 12 +# define R300_VE_FLT2FIX_DX 13 +# define R300_VE_FLT2FIX_DX_RND 14 +/* R500 additions */ +# define R500_VE_PRED_SET_EQ_PUSH 15 +# define R500_VE_PRED_SET_GT_PUSH 16 +# define R500_VE_PRED_SET_GTE_PUSH 17 +# define R500_VE_PRED_SET_NEQ_PUSH 18 +# define R500_VE_COND_WRITE_EQ 19 +# define R500_VE_COND_WRITE_GT 20 +# define R500_VE_COND_WRITE_GTE 21 +# define R500_VE_COND_WRITE_NEQ 22 +# define R500_VE_COND_MUX_EQ 23 +# define R500_VE_COND_MUX_GT 24 +# define R500_VE_COND_MUX_GTE 25 +# define R500_VE_SET_GREATER_THAN 26 +# define R500_VE_SET_EQUAL 27 +# define R500_VE_SET_NOT_EQUAL 28 +/* Math ops */ +# define R300_MATH_NO_OP 0 +# define R300_ME_EXP_BASE2_DX 1 +# define R300_ME_LOG_BASE2_DX 2 +# define R300_ME_EXP_BASEE_FF 3 +# define R300_ME_LIGHT_COEFF_DX 4 +# define R300_ME_POWER_FUNC_FF 5 +# define R300_ME_RECIP_DX 6 +# define R300_ME_RECIP_FF 7 +# define R300_ME_RECIP_SQRT_DX 8 +# define R300_ME_RECIP_SQRT_FF 9 +# define R300_ME_MULTIPLY 10 +# define R300_ME_EXP_BASE2_FULL_DX 11 +# define R300_ME_LOG_BASE2_FULL_DX 12 +# define R300_ME_POWER_FUNC_FF_CLAMP_B 13 +# define R300_ME_POWER_FUNC_FF_CLAMP_B1 14 +# define R300_ME_POWER_FUNC_FF_CLAMP_01 15 +# define R300_ME_SIN 16 +# define R300_ME_COS 17 +/* R500 additions */ +# define R500_ME_LOG_BASE2_IEEE 18 +# define R500_ME_RECIP_IEEE 19 +# define R500_ME_RECIP_SQRT_IEEE 20 +# define R500_ME_PRED_SET_EQ 21 +# define R500_ME_PRED_SET_GT 22 +# define R500_ME_PRED_SET_GTE 23 +# define R500_ME_PRED_SET_NEQ 24 +# define R500_ME_PRED_SET_CLR 25 +# define R500_ME_PRED_SET_INV 26 +# define R500_ME_PRED_SET_POP 27 +# define R500_ME_PRED_SET_RESTORE 28 +/* macro */ +# define R300_PVS_MACRO_OP_2CLK_MADD 0 +# define R300_PVS_MACRO_OP_2CLK_M2X_ADD 1 +#define R300_PVS_DST_MATH_INST (1 << 6) +#define R300_PVS_DST_MACRO_INST (1 << 7) +#define R300_PVS_DST_REG_TYPE(x) (x << 8) +# define R300_PVS_DST_REG_TEMPORARY 0 +# define R300_PVS_DST_REG_A0 1 +# define R300_PVS_DST_REG_OUT 2 +# define R500_PVS_DST_REG_OUT_REPL_X 3 +# define R300_PVS_DST_REG_ALT_TEMPORARY 4 +# define R300_PVS_DST_REG_INPUT 5 +#define R300_PVS_DST_ADDR_MODE_1 (1 << 12) +#define R300_PVS_DST_OFFSET(x) (x << 13) +#define R300_PVS_DST_WE_X (1 << 20) +#define R300_PVS_DST_WE_Y (1 << 21) +#define R300_PVS_DST_WE_Z (1 << 22) +#define R300_PVS_DST_WE_W (1 << 23) +#define R300_PVS_DST_VE_SAT (1 << 24) +#define R300_PVS_DST_ME_SAT (1 << 25) +#define R300_PVS_DST_PRED_ENABLE (1 << 26) +#define R300_PVS_DST_PRED_SENSE (1 << 27) +#define R300_PVS_DST_DUAL_MATH_OP (1 << 28) +#define R300_PVS_DST_ADDR_SEL(x) (x << 29) +#define R300_PVS_DST_ADDR_MODE_0 (1 << 31) +/* src operand instruction */ +#define R300_PVS_SRC_REG_TYPE(x) (x << 0) +# define R300_PVS_SRC_REG_TEMPORARY 0 +# define R300_PVS_SRC_REG_INPUT 1 +# define R300_PVS_SRC_REG_CONSTANT 2 +# define R300_PVS_SRC_REG_ALT_TEMPORARY 3 +#define R300_SPARE_0 (1 << 2) +#define R300_PVS_SRC_ABS_XYZW (1 << 3) +#define R300_PVS_SRC_ADDR_MODE_0 (1 << 4) +#define R300_PVS_SRC_OFFSET(x) (x << 5) +#define R300_PVS_SRC_SWIZZLE_X(x) (x << 13) +#define R300_PVS_SRC_SWIZZLE_Y(x) (x << 16) +#define R300_PVS_SRC_SWIZZLE_Z(x) (x << 19) +#define R300_PVS_SRC_SWIZZLE_W(x) (x << 22) +# define R300_PVS_SRC_SELECT_X 0 +# define R300_PVS_SRC_SELECT_Y 1 +# define R300_PVS_SRC_SELECT_Z 2 +# define R300_PVS_SRC_SELECT_W 3 +# define R300_PVS_SRC_SELECT_FORCE_0 4 +# define R300_PVS_SRC_SELECT_FORCE_1 5 +#define R300_PVS_SRC_NEG_X (1 << 25) +#define R300_PVS_SRC_NEG_Y (1 << 26) +#define R300_PVS_SRC_NEG_Z (1 << 27) +#define R300_PVS_SRC_NEG_W (1 << 28) +#define R300_PVS_SRC_ADDR_SEL(x) (x << 29) +#define R300_PVS_SRC_ADDR_MODE_1 (1 << 31) + +#define R300_VAP_CLIP_CNTL 0x221c +# define R300_UCP_ENA_0 (1 << 0) +# define R300_UCP_ENA_1 (1 << 1) +# define R300_UCP_ENA_2 (1 << 2) +# define R300_UCP_ENA_3 (1 << 3) +# define R300_UCP_ENA_4 (1 << 4) +# define R300_UCP_ENA_5 (1 << 5) +# define R300_PS_UCP_MODE_SHIFT 14 +# define R300_CLIP_DISABLE (1 << 16) +# define R300_UCP_CULL_ONLY_ENA (1 << 17) +# define R300_BOUNDARY_EDGE_FLAG_ENA (1 << 18) + +#define R300_VAP_GB_VERT_CLIP_ADJ 0x2220 +#define R300_VAP_GB_VERT_DISC_ADJ 0x2224 +#define R300_VAP_GB_HORZ_CLIP_ADJ 0x2228 +#define R300_VAP_GB_HORZ_DISC_ADJ 0x222c + +#define R300_VAP_PVS_STATE_FLUSH_REG 0x2284 + +#define R300_VAP_PVS_FLOW_CNTL_OPC 0x22DC + +#define R300_GB_ENABLE 0x4008 + +#define R300_GB_MSPOS0 0x4010 +# define R300_MS_X0_SHIFT 0 +# define R300_MS_Y0_SHIFT 4 +# define R300_MS_X1_SHIFT 8 +# define R300_MS_Y1_SHIFT 12 +# define R300_MS_X2_SHIFT 16 +# define R300_MS_Y2_SHIFT 20 +# define R300_MSBD0_Y_SHIFT 24 +# define R300_MSBD0_X_SHIFT 28 +#define R300_GB_MSPOS1 0x4014 +# define R300_MS_X3_SHIFT 0 +# define R300_MS_Y3_SHIFT 4 +# define R300_MS_X4_SHIFT 8 +# define R300_MS_Y4_SHIFT 12 +# define R300_MS_X5_SHIFT 16 +# define R300_MS_Y5_SHIFT 20 +# define R300_MSBD1_SHIFT 24 + +#define R300_GB_TILE_CONFIG 0x4018 +# define R300_ENABLE_TILING (1 << 0) +# define R300_PIPE_COUNT_RV350 (0 << 1) +# define R300_PIPE_COUNT_R300 (3 << 1) +# define R300_PIPE_COUNT_R420_3P (6 << 1) +# define R300_PIPE_COUNT_R420 (7 << 1) +# define R300_TILE_SIZE_8 (0 << 4) +# define R300_TILE_SIZE_16 (1 << 4) +# define R300_TILE_SIZE_32 (2 << 4) +# define R300_SUBPIXEL_1_12 (0 << 16) +# define R300_SUBPIXEL_1_16 (1 << 16) + +#define R300_GB_SELECT 0x401c +#define R300_GB_AA_CONFIG 0x4020 + +#define R400_GB_PIPE_SELECT 0x402c + +#define R500_RS_IP_0 0x4074 +#define R500_RS_IP_1 0x4078 +# define R500_RS_IP_PTR_K0 62 +# define R500_RS_IP_PTR_K1 63 +# define R500_RS_IP_TEX_PTR_S_SHIFT 0 +# define R500_RS_IP_TEX_PTR_T_SHIFT 6 +# define R500_RS_IP_TEX_PTR_R_SHIFT 12 +# define R500_RS_IP_TEX_PTR_Q_SHIFT 18 +# define R500_RS_IP_COL_PTR_SHIFT 24 +# define R500_RS_IP_COL_FMT_SHIFT 27 +# define R500_RS_IP_COL_FMT_RGBA (0 << 27) +# define R500_RS_IP_OFFSET_EN (1 << 31) + +#define R300_TX_INVALTAGS 0x4100 +#define R300_TX_ENABLE 0x4104 +# define R300_TEX_0_ENABLE (1 << 0) +# define R300_TEX_1_ENABLE (1 << 1) + +/* R500 US has to be loaded through an index/data pair */ +#define R500_GA_US_VECTOR_INDEX 0x4250 +# define R500_US_VECTOR_INDEX(x) (x << 0) +# define R500_US_VECTOR_TYPE_INST (0 << 16) +# define R500_US_VECTOR_TYPE_CONST (1 << 16) +# define R500_US_VECTOR_CLAMP (1 << 17) +#define R500_GA_US_VECTOR_DATA 0x4254 + +#define R300_GA_ENHANCE 0x4274 +# define R300_GA_DEADLOCK_CNTL (1 << 0) +# define R300_GA_FASTSYNC_CNTL (1 << 1) + +#define R300_GA_COLOR_CONTROL 0x4278 +# define R300_RGB0_SHADING_SOLID (0 << 0) +# define R300_RGB0_SHADING_FLAT (1 << 0) +# define R300_RGB0_SHADING_GOURAUD (2 << 0) +# define R300_ALPHA0_SHADING_SOLID (0 << 2) +# define R300_ALPHA0_SHADING_FLAT (1 << 2) +# define R300_ALPHA0_SHADING_GOURAUD (2 << 2) +# define R300_RGB1_SHADING_SOLID (0 << 4) +# define R300_RGB1_SHADING_FLAT (1 << 4) +# define R300_RGB1_SHADING_GOURAUD (2 << 4) +# define R300_ALPHA1_SHADING_SOLID (0 << 6) +# define R300_ALPHA1_SHADING_FLAT (1 << 6) +# define R300_ALPHA1_SHADING_GOURAUD (2 << 6) +# define R300_RGB2_SHADING_SOLID (0 << 8) +# define R300_RGB2_SHADING_FLAT (1 << 8) +# define R300_RGB2_SHADING_GOURAUD (2 << 8) +# define R300_ALPHA2_SHADING_SOLID (0 << 10) +# define R300_ALPHA2_SHADING_FLAT (1 << 10) +# define R300_ALPHA2_SHADING_GOURAUD (2 << 10) +# define R300_RGB3_SHADING_SOLID (0 << 12) +# define R300_RGB3_SHADING_FLAT (1 << 12) +# define R300_RGB3_SHADING_GOURAUD (2 << 12) +# define R300_ALPHA3_SHADING_SOLID (0 << 14) +# define R300_ALPHA3_SHADING_FLAT (1 << 14) +# define R300_ALPHA3_SHADING_GOURAUD (2 << 14) + +#define R300_GA_POLY_MODE 0x4288 +# define R300_FRONT_PTYPE_POINT (0 << 4) +# define R300_FRONT_PTYPE_LINE (1 << 4) +# define R300_FRONT_PTYPE_TRIANGE (2 << 4) +# define R300_BACK_PTYPE_POINT (0 << 7) +# define R300_BACK_PTYPE_LINE (1 << 7) +# define R300_BACK_PTYPE_TRIANGE (2 << 7) +#define R300_GA_ROUND_MODE 0x428c +# define R300_GEOMETRY_ROUND_TRUNC (0 << 0) +# define R300_GEOMETRY_ROUND_NEAREST (1 << 0) +# define R300_COLOR_ROUND_TRUNC (0 << 2) +# define R300_COLOR_ROUND_NEAREST (1 << 2) + +#define R300_GA_OFFSET 0x4290 + +#define R300_SU_TEX_WRAP 0x42a0 +#define R300_SU_POLY_OFFSET_ENABLE 0x42b4 +#define R300_SU_CULL_MODE 0x42b8 +# define R300_CULL_FRONT (1 << 0) +# define R300_CULL_BACK (1 << 1) +# define R300_FACE_POS (0 << 2) +# define R300_FACE_NEG (1 << 2) +#define R300_SU_DEPTH_SCALE 0x42c0 +#define R300_SU_DEPTH_OFFSET 0x42c4 + +#define R500_SU_REG_DEST 0x42c8 + +#define R300_RS_COUNT 0x4300 +# define R300_RS_COUNT_IT_COUNT_SHIFT 0 +# define R300_RS_COUNT_IC_COUNT_SHIFT 7 +# define R300_RS_COUNT_HIRES_EN (1 << 18) + +#define R300_RS_INST_COUNT 0x4304 +# define R300_INST_COUNT_RS(x) (x << 0) +# define R300_RS_W_EN (1 << 4) +# define R300_TX_OFFSET_RS(x) (x << 5) + +#define R300_RS_IP_0 0x4310 +#define R300_RS_IP_1 0x4314 +# define R300_RS_TEX_PTR(x) (x << 0) +# define R300_RS_COL_PTR(x) (x << 6) +# define R300_RS_COL_FMT(x) (x << 9) +# define R300_RS_COL_FMT_RGBA 0 +# define R300_RS_COL_FMT_RGB0 2 +# define R300_RS_COL_FMT_RGB1 3 +# define R300_RS_COL_FMT_000A 4 +# define R300_RS_COL_FMT_0000 5 +# define R300_RS_COL_FMT_0001 6 +# define R300_RS_COL_FMT_111A 8 +# define R300_RS_COL_FMT_1110 9 +# define R300_RS_COL_FMT_1111 10 +# define R300_RS_SEL_S(x) (x << 13) +# define R300_RS_SEL_T(x) (x << 16) +# define R300_RS_SEL_R(x) (x << 19) +# define R300_RS_SEL_Q(x) (x << 22) +# define R300_RS_SEL_C0 0 +# define R300_RS_SEL_C1 1 +# define R300_RS_SEL_C2 2 +# define R300_RS_SEL_C3 3 +# define R300_RS_SEL_K0 4 +# define R300_RS_SEL_K1 5 + +#define R300_RS_INST_0 0x4330 +#define R300_RS_INST_1 0x4334 +# define R300_INST_TEX_ID(x) (x << 0) +# define R300_RS_INST_TEX_CN_WRITE (1 << 3) +# define R300_INST_TEX_ADDR(x) (x << 6) + +#define R500_RS_INST_0 0x4320 +#define R500_RS_INST_1 0x4324 +# define R500_RS_INST_TEX_ID_SHIFT 0 +# define R500_RS_INST_TEX_CN_WRITE (1 << 4) +# define R500_RS_INST_TEX_ADDR_SHIFT 5 +# define R500_RS_INST_COL_ID_SHIFT 12 +# define R500_RS_INST_COL_CN_NO_WRITE (0 << 16) +# define R500_RS_INST_COL_CN_WRITE (1 << 16) +# define R500_RS_INST_COL_CN_WRITE_FBUFFER (2 << 16) +# define R500_RS_INST_COL_CN_WRITE_BACKFACE (3 << 16) +# define R500_RS_INST_COL_COL_ADDR_SHIFT 18 +# define R500_RS_INST_TEX_ADJ (1 << 25) +# define R500_RS_INST_W_CN (1 << 26) + +#define R300_SC_CLIP_0_A 0x43b0 +#define R300_SC_CLIP_0_B 0x43b4 +# define R300_CLIP_X_SHIFT 0 +# define R300_CLIP_Y_SHIFT 13 +#define R300_SC_CLIP_RULE 0x43d0 + +#define R300_SC_EDGERULE 0x43a8 +#define R300_SC_SCISSOR0 0x43e0 +#define R300_SC_SCISSOR1 0x43e4 +# define R300_SCISSOR_X_SHIFT 0 +# define R300_SCISSOR_Y_SHIFT 13 + +#define R300_SC_SCREENDOOR 0x43e8 + +#define R300_TX_FILTER0_0 0x4400 +# define R300_TX_CLAMP_S(x) (x << 0) +# define R300_TX_CLAMP_T(x) (x << 3) +# define R300_TX_CLAMP_R(x) (x << 6) +# define R300_TX_CLAMP_WRAP 0 +# define R300_TX_CLAMP_MIRROR 1 +# define R300_TX_CLAMP_CLAMP_LAST 2 +# define R300_TX_CLAMP_MIRROR_CLAMP_LAST 3 +# define R300_TX_CLAMP_CLAMP_BORDER 4 +# define R300_TX_CLAMP_MIRROR_CLAMP_BORDER 5 +# define R300_TX_CLAMP_CLAMP_GL 6 +# define R300_TX_CLAMP_MIRROR_CLAMP_GL 7 +# define R300_TX_MAG_FILTER_NEAREST (1 << 9) +# define R300_TX_MIN_FILTER_NEAREST (1 << 11) +# define R300_TX_MAG_FILTER_LINEAR (2 << 9) +# define R300_TX_MIN_FILTER_LINEAR (2 << 11) +# define R300_TX_ID_SHIFT 28 + +#define R300_TX_FILTER1_0 0x4440 + +#define R300_TX_FORMAT0_0 0x4480 +# define R300_TXWIDTH_SHIFT 0 +# define R300_TXHEIGHT_SHIFT 11 +# define R300_NUM_LEVELS_SHIFT 26 +# define R300_NUM_LEVELS_MASK 0x +# define R300_TXPROJECTED (1 << 30) +# define R300_TXPITCH_EN (1 << 31) + +#define R300_TX_FORMAT1_0 0x44c0 +# define R300_TX_FORMAT_X8 0x0 +# define R300_TX_FORMAT_X16 0x1 +# define R300_TX_FORMAT_Y4X4 0x2 +# define R300_TX_FORMAT_Y8X8 0x3 +# define R300_TX_FORMAT_Y16X16 0x4 +# define R300_TX_FORMAT_Z3Y3X2 0x5 +# define R300_TX_FORMAT_Z5Y6X5 0x6 +# define R300_TX_FORMAT_Z6Y5X5 0x7 +# define R300_TX_FORMAT_Z11Y11X10 0x8 +# define R300_TX_FORMAT_Z10Y11X11 0x9 +# define R300_TX_FORMAT_W4Z4Y4X4 0xA +# define R300_TX_FORMAT_W1Z5Y5X5 0xB +# define R300_TX_FORMAT_W8Z8Y8X8 0xC +# define R300_TX_FORMAT_W2Z10Y10X10 0xD +# define R300_TX_FORMAT_W16Z16Y16X16 0xE +# define R300_TX_FORMAT_DXT1 0xF +# define R300_TX_FORMAT_DXT3 0x10 +# define R300_TX_FORMAT_DXT5 0x11 +# define R300_TX_FORMAT_D3DMFT_CxV8U8 0x12 /* no swizzle */ +# define R300_TX_FORMAT_A8R8G8B8 0x13 /* no swizzle */ +# define R300_TX_FORMAT_B8G8_B8G8 0x14 /* no swizzle */ +# define R300_TX_FORMAT_G8R8_G8B8 0x15 /* no swizzle */ +# define R300_TX_FORMAT_VYUY422 0x14 /* no swizzle */ +# define R300_TX_FORMAT_YVYU422 0x15 /* no swizzle */ +# define R300_TX_FORMAT_X24_Y8 0x1e +# define R300_TX_FORMAT_X32 0x1e + /* Floating point formats */ + /* Note - hardware supports both 16 and 32 bit floating point */ +# define R300_TX_FORMAT_FL_I16 0x18 +# define R300_TX_FORMAT_FL_I16A16 0x19 +# define R300_TX_FORMAT_FL_R16G16B16A16 0x1A +# define R300_TX_FORMAT_FL_I32 0x1B +# define R300_TX_FORMAT_FL_I32A32 0x1C +# define R300_TX_FORMAT_FL_R32G32B32A32 0x1D + /* alpha modes, convenience mostly */ + /* if you have alpha, pick constant appropriate to the + number of channels (1 for I8, 2 for I8A8, 4 for R8G8B8A8, etc */ +# define R300_TX_FORMAT_ALPHA_1CH 0x000 +# define R300_TX_FORMAT_ALPHA_2CH 0x200 +# define R300_TX_FORMAT_ALPHA_4CH 0x600 +# define R300_TX_FORMAT_ALPHA_NONE 0xA00 + /* Swizzling */ + /* constants */ +# define R300_TX_FORMAT_X 0 +# define R300_TX_FORMAT_Y 1 +# define R300_TX_FORMAT_Z 2 +# define R300_TX_FORMAT_W 3 +# define R300_TX_FORMAT_ZERO 4 +# define R300_TX_FORMAT_ONE 5 + /* 2.0*Z, everything above 1.0 is set to 0.0 */ +# define R300_TX_FORMAT_CUT_Z 6 + /* 2.0*W, everything above 1.0 is set to 0.0 */ +# define R300_TX_FORMAT_CUT_W 7 + +# define R300_TX_FORMAT_B_SHIFT 18 +# define R300_TX_FORMAT_G_SHIFT 15 +# define R300_TX_FORMAT_R_SHIFT 12 +# define R300_TX_FORMAT_A_SHIFT 9 + + /* Convenience macro to take care of layout and swizzling */ +# define R300_EASY_TX_FORMAT(B, G, R, A, FMT) ( \ + ((R300_TX_FORMAT_##B)< + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * Copyright 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 below code is a rework from code in xf86-video-ati/src/radeon_accel.c + * The original license is included below, it has the messed up disclaimer and + * an all rights reserved statement. + */ + +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and + * VA Linux Systems Inc., Fremont, California. + * + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + * + * Authors: + * Kevin E. Martin + * Rickard E. Faith + * Alan Hourihane + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_cs.h" +#include "r5xx_accel.h" +#include "r5xx_regs.h" +#include "r5xx_3dregs.h" + +/* + * Used by both XAA and EXA code. + */ +struct R5xxRop R5xxRops[] = { + { R5XX_ROP3_ZERO, R5XX_ROP3_ZERO }, /* GXclear */ + { R5XX_ROP3_DSa, R5XX_ROP3_DPa }, /* Gxand */ + { R5XX_ROP3_SDna, R5XX_ROP3_PDna }, /* GXandReverse */ + { R5XX_ROP3_S, R5XX_ROP3_P }, /* GXcopy */ + { R5XX_ROP3_DSna, R5XX_ROP3_DPna }, /* GXandInverted */ + { R5XX_ROP3_D, R5XX_ROP3_D }, /* GXnoop */ + { R5XX_ROP3_DSx, R5XX_ROP3_DPx }, /* GXxor */ + { R5XX_ROP3_DSo, R5XX_ROP3_DPo }, /* GXor */ + { R5XX_ROP3_DSon, R5XX_ROP3_DPon }, /* GXnor */ + { R5XX_ROP3_DSxn, R5XX_ROP3_PDxn }, /* GXequiv */ + { R5XX_ROP3_Dn, R5XX_ROP3_Dn }, /* GXinvert */ + { R5XX_ROP3_SDno, R5XX_ROP3_PDno }, /* GXorReverse */ + { R5XX_ROP3_Sn, R5XX_ROP3_Pn }, /* GXcopyInverted */ + { R5XX_ROP3_DSno, R5XX_ROP3_DPno }, /* GXorInverted */ + { R5XX_ROP3_DSan, R5XX_ROP3_DPan }, /* GXnand */ + { R5XX_ROP3_ONE, R5XX_ROP3_ONE } /* GXset */ +}; + +/* + * The FIFO has 64 slots. This routine waits until at least `required' + * of these slots are empty. + */ +static Bool +R5xxFIFOWait(RHDPtr rhdPtr, CARD32 required) +{ + int i; + + for (i = 0; i < R5XX_LOOP_COUNT; i++) + if (required <= + (RHDRegRead(rhdPtr, R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK)) + return TRUE; + + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Timeout 0x%08X.\n", __func__, + (unsigned int) RHDRegRead(rhdPtr, R5XX_RBBM_STATUS)); + return FALSE; +} + +/* + * Flush all dirty data in the Pixel Cache to memory. + */ +static Bool +R5xx2DFlush(int scrnIndex) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + int i; + + RHDRegMask(pScrn, R5XX_DSTCACHE_CTLSTAT, + /* Radeon code: + R5XX_RB2D_DC_FLUSH_ALL, R5XX_RB2D_DC_FLUSH_ALL */ + R5XX_DSTCACHE_FLUSH_ALL, R5XX_DSTCACHE_FLUSH_ALL); + + for (i = 0; i < R5XX_LOOP_COUNT; i++) + /* Radeon code: + & R5XX_RB2D_DC_BUSY */ + if (!(RHDRegRead(pScrn, R5XX_DSTCACHE_CTLSTAT) & R5XX_DSTCACHE_BUSY)) + return TRUE; + + xf86DrvMsg(scrnIndex, X_ERROR, "%s: Timeout 0x%08x.\n", __func__, + (unsigned int) RHDRegRead(pScrn, R5XX_DSTCACHE_CTLSTAT)); + return FALSE; +} + +/* + * Wait for the graphics engine to be completely idle: the FIFO has + * drained, the Pixel Cache is flushed, and the engine is idle. This is + * a standard "sync" function that will make the hardware "quiescent". + */ +static Bool +R5xx2DIdleLocal(int scrnIndex) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + int i; + + /* wait for fifo to clear */ + for (i = 0; i < R5XX_LOOP_COUNT; i++) + if (0x40 == (RHDRegRead(pScrn, R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK)) + break; + + if (i == R5XX_LOOP_COUNT) { + xf86DrvMsg(scrnIndex, X_ERROR, "%s: FIFO Timeout 0x%08X.\n", __func__, + (unsigned int) RHDRegRead(pScrn, R5XX_RBBM_STATUS)); + return FALSE; + } + + /* wait for engine to go idle */ + for (i = 0; i < R5XX_LOOP_COUNT; i++) + if (!(RHDRegRead(pScrn, R5XX_RBBM_STATUS) & R5XX_RBBM_ACTIVE)) + break; + + if (i == R5XX_LOOP_COUNT) { + xf86DrvMsg(scrnIndex, X_ERROR, "%s: Idle Timeout 0x%08X.\n", __func__, + (unsigned int) RHDRegRead(pScrn, R5XX_RBBM_STATUS)); + return FALSE; + } + + R5xx2DFlush(scrnIndex); + return TRUE; +} + +/* + * Reset graphics card to known state + */ +static void +R5xx2DReset(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + CARD32 save, tmp; + + RHDFUNC(rhdPtr); + + /* The following RBBM_SOFT_RESET sequence can help un-wedge + * an R300 after the command processor got stuck. */ + save = RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET); + tmp = save | R5XX_SOFT_RESET_CP | + R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_SE | + R5XX_SOFT_RESET_RE | R5XX_SOFT_RESET_PP | + R5XX_SOFT_RESET_E2 | R5XX_SOFT_RESET_RB; + RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp); + + RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET); + tmp &= ~(R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | + R5XX_SOFT_RESET_SE | R5XX_SOFT_RESET_RE | + R5XX_SOFT_RESET_PP | R5XX_SOFT_RESET_E2 | + R5XX_SOFT_RESET_RB); + RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, tmp); + + RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET); + RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, save); + RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET); + + R5xx2DFlush(rhdPtr->scrnIndex); + + /* Soft resetting HDP thru RBBM_SOFT_RESET register can cause some + * unexpected behaviour on some machines. Here we use + * R5XX_HOST_PATH_CNTL to reset it. */ + save = RHDRegRead(rhdPtr, R5XX_HOST_PATH_CNTL); + RHDRegMask(rhdPtr, R5XX_RBBM_SOFT_RESET, + R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_E2, + R5XX_SOFT_RESET_CP | R5XX_SOFT_RESET_HI | R5XX_SOFT_RESET_E2); + + RHDRegRead(rhdPtr, R5XX_RBBM_SOFT_RESET); + RHDRegWrite(rhdPtr, R5XX_RBBM_SOFT_RESET, 0); + + RHDRegMask(rhdPtr, R5XX_RB2D_DSTCACHE_MODE, + R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE, + R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE); + + RHDRegWrite(rhdPtr, R5XX_HOST_PATH_CNTL, save | R5XX_HDP_SOFT_RESET); + RHDRegRead(rhdPtr, R5XX_HOST_PATH_CNTL); + RHDRegWrite(rhdPtr, R5XX_HOST_PATH_CNTL, save); +} + +/* + * + */ +CARD8 +R5xx2DDatatypeGet(ScrnInfoPtr pScrn) +{ + switch (pScrn->depth) { + case 8: + return R5XX_DATATYPE_CI8; + case 15: + return R5XX_DATATYPE_ARGB1555; + case 16: + return R5XX_DATATYPE_RGB565; + case 24: + case 32: + return R5XX_DATATYPE_ARGB8888; + default: + /* should never happen, as we only support the above bpps */ + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: Unhandled pixel depth: %d.\n", + __func__, pScrn->depth); + return R5XX_DATATYPE_ARGB8888; + } +} + +/* + * + */ +void +R5xx2DSetup(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + CARD32 tmp; + + RHDFUNC(rhdPtr); + + /* Setup engine location. This shouldn't be necessary since we + * set them appropriately before any accel ops, but let's avoid + * random bogus DMA in case we inadvertently trigger the engine + * in the wrong place (happened). */ + tmp = (((pScrn->displayWidth * (pScrn->bitsPerPixel / 8)) / 64) << 22) | + ((rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart) >> 10); + + R5xxFIFOWait(rhdPtr, 2); + RHDRegWrite(rhdPtr, R5XX_DST_PITCH_OFFSET, tmp); + RHDRegWrite(rhdPtr, R5XX_SRC_PITCH_OFFSET, tmp); + + R5xxFIFOWait(rhdPtr, 2); +#if X_BYTE_ORDER == X_BIG_ENDIAN + RHDRegMask(rhdPtr, R5XX_DP_DATATYPE, + R5XX_HOST_BIG_ENDIAN_EN, R5XX_HOST_BIG_ENDIAN_EN); + + switch (pScrn->bitsPerPixel) { + case 8: + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, 0); + break; + case 16: /* depths 15 and 16 */ + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, + R5XX_NONSURF_AP0_SWP_16BPP | R5XX_NONSURF_AP1_SWP_16BPP); + break; + case 32: /* depth 24 */ + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, + R5XX_NONSURF_AP0_SWP_32BPP | R5XX_NONSURF_AP1_SWP_32BPP); + break; + } +#else + RHDRegMask(rhdPtr, R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN); + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, 0); +#endif + + R5xxFIFOWait(rhdPtr, 1); + RHDRegWrite(rhdPtr, R5XX_DEFAULT_SC_BOTTOM_RIGHT, + R5XX_DEFAULT_SC_RIGHT_MAX | R5XX_DEFAULT_SC_BOTTOM_MAX); + + R5xxFIFOWait(rhdPtr, 1); + RHDRegWrite(rhdPtr, R5XX_DP_GUI_MASTER_CNTL, + (R5xx2DDatatypeGet(pScrn) << R5XX_GMC_DST_DATATYPE_SHIFT) | + R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_DST_PITCH_OFFSET_CNTL | + R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR); + + R5xxFIFOWait(rhdPtr, 5); + RHDRegWrite(rhdPtr, R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF); + RHDRegWrite(rhdPtr, R5XX_DP_BRUSH_BKGD_CLR, 0x00000000); + RHDRegWrite(rhdPtr, R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF); + RHDRegWrite(rhdPtr, R5XX_DP_SRC_BKGD_CLR, 0x00000000); + RHDRegWrite(rhdPtr, R5XX_DP_WRITE_MASK, 0xFFFFFFFF); +} + +/* + * + */ +static void +R5xxEngineReset(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s!!!!!\n", __func__); + + R5xx2DReset(pScrn); + R5xx2DSetup(pScrn); + RHDCSReset(rhdPtr->CS); + + /* we also need to reinitialise the 3d engine now */ + if (rhdPtr->ThreeDPrivate) + ((struct R5xx3D *) rhdPtr->ThreeDPrivate)->XHas3DEngineState = FALSE; +} + +/* + * + */ +void +R5xx2DIdle(ScrnInfoPtr pScrn) +{ + if (!R5xx2DIdleLocal(pScrn->scrnIndex)) + R5xxEngineReset(pScrn); +} + +/* + * + */ +void +R5xx2DStart(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(pScrn); + + if ((rhdPtr->ChipSet != RHD_RS690) && + (rhdPtr->ChipSet != RHD_RS600) && + (rhdPtr->ChipSet != RHD_RS740)) { + CARD8 pipe = (RHDRegRead(rhdPtr, R400_GB_PIPE_SELECT) >> 4) & 0xF0; + RHDWritePLL(pScrn, R500_DYN_SCLK_PWMEM_PIPE, pipe | 0x01); + } + + RHDRegMask(pScrn, R5XX_GB_TILE_CONFIG, 0, R5XX_ENABLE_TILING); + RHDRegWrite(pScrn, R5XX_WAIT_UNTIL, + R5XX_WAIT_2D_IDLECLEAN | R5XX_WAIT_3D_IDLECLEAN); + RHDRegMask(pScrn, R5XX_DST_PIPE_CONFIG, + R5XX_PIPE_AUTO_CONFIG, R5XX_PIPE_AUTO_CONFIG); + RHDRegMask(pScrn, R5XX_RB2D_DSTCACHE_MODE, + R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE, + R5XX_RB2D_DC_AUTOFLUSH_ENABLE | R5XX_RB2D_DC_DISABLE_IGNORE_PE); + + R5xx2DReset(pScrn); + R5xx2DSetup(pScrn); + R5xx2DIdleLocal(pScrn->scrnIndex); +} + +/* + * Impose some acceleration limitations. + */ +Bool +R5xx2DFBValid(RHDPtr rhdPtr, CARD16 Width, CARD16 Height, int bpp, + CARD32 Offset, CARD32 Size, CARD32 Pitch) +{ + int Bytes; + + /* we do not care about offset atm. */ + + switch (bpp) { + case 8: + Bytes = 1; + break; + case 15: + case 16: + Bytes = 2; + break; + case 24: + case 32: + Bytes = 4; + break; + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: unhandled bpp (%d)\n", + __func__, bpp); + Bytes = 4; + break; + } + + if ((Pitch * Bytes) & 0x3F) /* bits are ignored */ + return FALSE; + + if ((Pitch * Bytes) >= 0x4000) + return FALSE; + + /* TODO check */ + if (Height >= 0x2000) + return FALSE; + + return TRUE; +} + +/* + * Handlers for rhdPtr->ThreeDInfo. + */ +void +R5xx3DInit(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct R5xx3D *R5xx3D; + + if (rhdPtr->ThreeDPrivate) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: rhdPtr->ThreeDPrivate is already initialised.\n", + __func__); + return; + } + + R5xx3D = (struct R5xx3D *) xnfcalloc(1, sizeof(struct R5xx3D)); + R5xx3D->XHas3DEngineState = FALSE; + rhdPtr->ThreeDPrivate = R5xx3D; +} + +/* + * + */ +void +R5xx3DDestroy(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + if (!rhdPtr->ThreeDPrivate) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: rhdPtr->ThreeDPrivate is not assigned.\n", __func__); + return; + } + + xfree(rhdPtr->ThreeDPrivate); + rhdPtr->ThreeDPrivate = NULL; +} + +/* + * + */ +void +R5xxDstCacheFlush(struct RhdCS *CS) +{ + RHDCSGrab(CS, 2); + RHDCSRegWrite(CS, R5XX_RB3D_DSTCACHE_CTLSTAT, R5XX_RB3D_DC_FLUSH_ALL); +} + +/* + * + */ +void +R5xxZCacheFlush(struct RhdCS *CS) +{ + RHDCSGrab(CS, 2); + RHDCSRegWrite(CS, R5XX_RB3D_ZCACHE_CTLSTAT, R5XX_RB3D_ZC_FLUSH_ALL); +} + +/* + * When we switch between 3d and 2d rendering all the time, we need to make + * sure that the other engine is idle first before the new engine goes and + * fires off. + */ +void +R5xxEngineWaitIdleFull(struct RhdCS *CS) +{ + RHDPtr rhdPtr = RHDPTRI(CS); + + RHDCSGrab(CS, 2); + RHDCSRegWrite(CS, R5XX_WAIT_UNTIL, + R5XX_WAIT_HOST_IDLECLEAN | R5XX_WAIT_3D_IDLECLEAN | + R5XX_WAIT_2D_IDLECLEAN | R5XX_WAIT_DMA_GUI_IDLE); + + if (rhdPtr->ThreeDPrivate) { + struct R5xx3D *State = rhdPtr->ThreeDPrivate; + State->engineMode = R5XX_ENGINEMODE_IDLE_FULL; + } +} + +/* + * + */ +void +R5xxEngineWaitIdle3D(struct RhdCS *CS) +{ + struct R5xx3D *State = RHDPTRI(CS)->ThreeDPrivate; + + if (!State) + return; + + if (State->engineMode == R5XX_ENGINEMODE_IDLE_2D) { + RHDCSGrab(CS, 2); + RHDCSRegWrite(CS, R5XX_WAIT_UNTIL, R5XX_WAIT_3D_IDLECLEAN); + } /* FULL/3D is always good */ + + State->engineMode = R5XX_ENGINEMODE_IDLE_3D; +} + +/* + * + */ +void +R5xxEngineWaitIdle2D(struct RhdCS *CS) +{ + struct R5xx3D *State = RHDPTRI(CS)->ThreeDPrivate; + + if (!State) + return; + + if (State->engineMode == R5XX_ENGINEMODE_IDLE_3D) { + RHDCSGrab(CS, 2); + RHDCSRegWrite(CS, R5XX_WAIT_UNTIL, + R5XX_WAIT_2D_IDLECLEAN | R5XX_WAIT_DMA_GUI_IDLE); + } /* FULL/2D is always good */ + + State->engineMode = R5XX_ENGINEMODE_IDLE_2D; +} diff --git a/driver/xf86-video-radeonhd/src/r5xx_accel.h b/driver/xf86-video-radeonhd/src/r5xx_accel.h new file mode 100644 index 000000000..3e642bec9 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r5xx_accel.h @@ -0,0 +1,106 @@ +/* + * Copyright 2008 Luc Verhaegen + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * Copyright 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * Functionality shared by both R5xx XAA and EXA code. + */ + +#ifndef _RHD_ACCEL_H +#define _RHD_ACCEL_H 1 + +#define R5XX_LOOP_COUNT 2000000 + +struct R5xxRop { + CARD32 rop; + CARD32 pattern; +}; + +void R5xx2DIdle(ScrnInfoPtr pScrn); + +void R5xx2DSetup(ScrnInfoPtr pScrn); /* to be called after VT switch and such */ +void R5xx2DStart(ScrnInfoPtr pScrn); + +Bool R5xx2DFBValid(RHDPtr rhdPtr, CARD16 Width, CARD16 Height, int bpp, + CARD32 Offset, CARD32 Size, CARD32 Pitch); + +/* Helper from r5xx_accel.c */ +CARD8 R5xx2DDatatypeGet(ScrnInfoPtr pScrn); + +/* XAA specific */ +Bool R5xxXAAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); +void R5xxXAADestroy(ScrnInfoPtr pScrn); + +/* EXA specific */ +#ifdef USE_EXA + +/* r5xx_exa.c */ +Bool R5xxEXAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); +void R5xxEXACloseScreen(ScreenPtr pScreen); +void R5xxEXADestroy(ScrnInfoPtr pScrn); + +/* radeon_exa_render.c */ +void R5xxExaCompositeFuncs(int scrnIndex, struct _ExaDriver *Exa); + +#endif /* USE_EXA */ + +/* + * EXA Composite and Textured Video both need to know the state of the + * 3d engine, so we provide the structure here. + */ +struct R5xx3D { + Bool XHas3DEngineState; + +#define R5XX_ENGINEMODE_UNKNOWN 0 +#define R5XX_ENGINEMODE_IDLE_FULL 1 +#define R5XX_ENGINEMODE_IDLE_2D 2 +#define R5XX_ENGINEMODE_IDLE_3D 3 + int engineMode; + + unsigned short texW[2]; + unsigned short texH[2]; + + Bool is_transform[2]; + struct pixman_transform *transform[2]; + Bool has_mask; + /* Whether we are tiling horizontally and vertically */ + Bool need_src_tile_x; + Bool need_src_tile_y; + /* Size of tiles ... set to 65536x65536 if not tiling in that direction */ + Bool src_tile_width; + Bool src_tile_height; +}; + +void R5xx3DInit(ScrnInfoPtr pScrn); +void R5xx3DSetup(int scrnIndex); +void R5xx3DDestroy(ScrnInfoPtr pScrn); + +void R5xxDstCacheFlush(struct RhdCS *CS); +void R5xxZCacheFlush(struct RhdCS *CS); + +void R5xxEngineWaitIdleFull(struct RhdCS *CS); +void R5xxEngineWaitIdle3D(struct RhdCS *CS); +void R5xxEngineWaitIdle2D(struct RhdCS *CS); + +#endif /* _RHD_ACCEL_H */ diff --git a/driver/xf86-video-radeonhd/src/r5xx_exa.c b/driver/xf86-video-radeonhd/src/r5xx_exa.c new file mode 100644 index 000000000..36e91ad45 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r5xx_exa.c @@ -0,0 +1,900 @@ +/* + * Copyright 2005 Eric Anholt + * Copyright 2005 Benjamin Herrenschmidt + * Copyright 2006 Tungsten Graphics, Inc. + * Copyright 2008 Luc Verhaegen + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * + * 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 + * 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 (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 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. + * + * Authors: + * Eric Anholt + * Zack Rusin + * Benjamin Herrenschmidt + * Michel Dänzer + * Luc Verhaegen + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "exa.h" + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_cs.h" +#include "r5xx_accel.h" +#include "r5xx_regs.h" + +extern struct R5xxRop R5xxRops[]; + +struct R5xxExaPrivate { + int scrnIndex; + + int xdir; + int ydir; + +#ifdef USE_DRI + /* For Download: claim an indirect buffer, as a scratch area for download. */ + CARD8 *Buffer; + unsigned int BufferIntAddress; + CARD32 BufferSize; +#endif + + int exaSyncMarker; + int exaMarkerSynced; +#if X_BYTE_ORDER == X_BIG_ENDIAN + unsigned long swapper_surfaces[6]; +#endif /* X_BYTE_ORDER */ +}; + +/* + * Helpers. + */ +inline CARD8 +R5xxEXADatatypeGet(int bitsPerPixel) +{ + switch (bitsPerPixel) { + case 8: + return R5XX_DATATYPE_CI8; + case 16: + return R5XX_DATATYPE_RGB565; + case 32: + return R5XX_DATATYPE_ARGB8888; + default: + return 0; + } +} + +#define R5XX_EXA_PITCH_CHECK(pitch) (((pitch) >= 0x4000) || ((pitch) & 0x003F)) +#define R5XX_EXA_OFFSET_CHECK(offset) ((offset) & 0xFFF) +#define RHDPTRE(p) (RHDPTR(xf86Screens[(p)->myNum])) + +/* + * + */ +static int +R5xxEXAMarkSync(ScreenPtr pScreen) +{ + struct R5xxExaPrivate *ExaPrivate = RHDPTR(xf86Screens[pScreen->myNum])->TwoDPrivate; + + ExaPrivate->exaSyncMarker++; + + return ExaPrivate->exaSyncMarker; +} + +/* + * + */ +static void +R5xxEXASync(ScreenPtr pScreen, int marker) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + struct R5xxExaPrivate *ExaPrivate = RHDPTR(pScrn)->TwoDPrivate; + + if (ExaPrivate->exaMarkerSynced != marker) { + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + RHDCSFlush(CS); + RHDCSIdle(CS); + R5xx2DIdle(pScrn); + + ExaPrivate->exaMarkerSynced = marker; + } +} + +/* + * + */ +static Bool +R5xxEXAPrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) +{ + RHDPtr rhdPtr = RHDPTRE(pPix->drawable.pScreen); + struct RhdCS *CS = rhdPtr->CS; + CARD32 datatype, pitch, offset; + + datatype = R5xxEXADatatypeGet(pPix->drawable.bitsPerPixel); + if (!datatype) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Unsupported bitdepth %d\n", + __func__, pPix->drawable.bitsPerPixel); + return FALSE; + } + + pitch = exaGetPixmapPitch(pPix); + if (R5XX_EXA_PITCH_CHECK(pitch)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid pitch: %d\n", + __func__, (unsigned int) pitch); + return FALSE; + } + + offset = exaGetPixmapOffset(pPix); + if (R5XX_EXA_OFFSET_CHECK(offset)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid offset: %d\n", + __func__, (unsigned int) offset); + return FALSE; + } + offset += rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + R5xxEngineWaitIdle3D(CS); + + RHDCSGrab(CS, 2 * 5); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, R5XX_GMC_DST_PITCH_OFFSET_CNTL | + R5XX_GMC_BRUSH_SOLID_COLOR | (datatype << 8) | + R5XX_GMC_SRC_DATATYPE_COLOR | R5xxRops[alu].pattern | + R5XX_GMC_CLR_CMP_CNTL_DIS); + RHDCSRegWrite(CS, R5XX_DP_BRUSH_FRGD_CLR, fg); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, pm); + RHDCSRegWrite(CS, R5XX_DP_CNTL, + R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, (pitch << 16) | (offset >> 10)); + + RHDCSAdvance(CS); + + return TRUE; +} + +/* + * + */ +static void +R5xxEXASolid(PixmapPtr pPix, int x1, int y1, int x2, int y2) +{ + struct RhdCS *CS = RHDPTRE(pPix->drawable.pScreen)->CS; + + RHDCSGrab(CS, 2 * 2); + + RHDCSRegWrite(CS, R5XX_DST_Y_X, (y1 << 16) | x1); + RHDCSRegWrite(CS, R5XX_DST_HEIGHT_WIDTH, ((y2 - y1) << 16) | (x2 - x1)); + + RHDCSAdvance(CS); +} + +/* + * + */ +static void +R5xxEXADoneSolid(PixmapPtr pPix) +{ + ; +} + +/* + * + */ +static Bool +R5xxEXAPrepareCopy(PixmapPtr pSrc, PixmapPtr pDst, int xdir, int ydir, int rop, + Pixel planemask) +{ + RHDPtr rhdPtr = RHDPTRE(pDst->drawable.pScreen); + struct RhdCS *CS = rhdPtr->CS; + struct R5xxExaPrivate *ExaPrivate = rhdPtr->TwoDPrivate; + CARD32 datatype, srcpitch, srcoffset, dstpitch, dstoffset; + + ExaPrivate->xdir = xdir; + ExaPrivate->ydir = ydir; + + datatype = R5xxEXADatatypeGet(pDst->drawable.bitsPerPixel); + if (!datatype) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Unsupported bitdepth %d\n", + __func__, pDst->drawable.bitsPerPixel); + return FALSE; + } + + srcpitch = exaGetPixmapPitch(pSrc); + if (R5XX_EXA_PITCH_CHECK(srcpitch)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid source pitch: %d\n", + __func__, (unsigned int) srcpitch); + return FALSE; + } + + srcoffset = exaGetPixmapOffset(pSrc); + if (R5XX_EXA_OFFSET_CHECK(srcoffset)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid source offset: %d\n", + __func__, (unsigned int) srcoffset); + return FALSE; + } + srcoffset += rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + dstpitch = exaGetPixmapPitch(pDst); + if (R5XX_EXA_PITCH_CHECK(dstpitch)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid destination pitch: %d\n", + __func__, (unsigned int) dstpitch); + return FALSE; + } + + dstoffset = exaGetPixmapOffset(pDst); + if (R5XX_EXA_OFFSET_CHECK(dstoffset)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid destination offset: %d\n", + __func__, (unsigned int) dstoffset); + return FALSE; + } + dstoffset += rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + R5xxEngineWaitIdle3D(CS); + + RHDCSGrab(CS, 2 * 5); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, + R5XX_GMC_DST_PITCH_OFFSET_CNTL | R5XX_GMC_SRC_PITCH_OFFSET_CNTL | + R5XX_GMC_BRUSH_NONE | (datatype << 8) | + R5XX_GMC_SRC_DATATYPE_COLOR | R5xxRops[rop].rop | + R5XX_DP_SRC_SOURCE_MEMORY | R5XX_GMC_CLR_CMP_CNTL_DIS); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); + RHDCSRegWrite(CS, R5XX_DP_CNTL, + ((xdir >= 0 ? R5XX_DST_X_LEFT_TO_RIGHT : 0) | + (ydir >= 0 ? R5XX_DST_Y_TOP_TO_BOTTOM : 0))); + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, (dstpitch << 16) | (dstoffset >> 10)); + RHDCSRegWrite(CS, R5XX_SRC_PITCH_OFFSET, (srcpitch << 16) | (srcoffset >> 10)); + + RHDCSAdvance(CS); + + return TRUE; +} + +/* + * + */ +void +R5xxEXACopy(PixmapPtr pDst, int srcX, int srcY, int dstX, int dstY, int w, int h) +{ + RHDPtr rhdPtr = RHDPTRE(pDst->drawable.pScreen); + struct RhdCS *CS = rhdPtr->CS; + struct R5xxExaPrivate *ExaPrivate = rhdPtr->TwoDPrivate; + + if (ExaPrivate->xdir < 0) { + srcX += w - 1; + dstX += w - 1; + } + if (ExaPrivate->ydir < 0) { + srcY += h - 1; + dstY += h - 1; + } + + RHDCSGrab(CS, 2 * 3); + + RHDCSRegWrite(CS, R5XX_SRC_Y_X, (srcY << 16) | srcX); + RHDCSRegWrite(CS, R5XX_DST_Y_X, (dstY << 16) | dstX); + RHDCSRegWrite(CS, R5XX_DST_HEIGHT_WIDTH, (h << 16) | w); + + RHDCSAdvance(CS); +} + +/* + * + */ +static void +R5xxEXADoneCopy(PixmapPtr pDst) +{ + ; +} + +/* + * Buffer swaps for big endian. + */ +#if X_BYTE_ORDER == X_BIG_ENDIAN +static inline void +R5xxCopySwap32(CARD8 *dst, CARD8 *src, unsigned int size) +{ + unsigned int *d = (unsigned int *)dst; + unsigned int *s = (unsigned int *)src; + unsigned int nwords = size >> 2; + + for (; nwords > 0; --nwords, ++d, ++s) +#ifdef __powerpc__ + asm volatile("stwbrx %0,0,%1" : : "r" (*s), "r" (d)); +#else + *d = ((*s >> 24) & 0xff) | ((*s >> 8) & 0xff00) + | ((*s & 0xff00) << 8) | ((*s & 0xff) << 24); +#endif +} + +static inline void +R5xxCopySwapHDW(CARD8 *dst, CARD8 *src, unsigned int size) +{ + unsigned int *d = (unsigned int *)dst; + unsigned int *s = (unsigned int *)src; + unsigned int nwords = size >> 2; + + for (; nwords > 0; --nwords, ++d, ++s) + *d = ((*s & 0xffff) << 16) | ((*s >> 16) & 0xffff); +} + +#ifdef USE_DRI +static inline void +R5xxCopySwap16(CARD8 *dst, CARD8 *src, unsigned int size) +{ + unsigned short *d = (unsigned short *)dst; + unsigned short *s = (unsigned short *)src; + unsigned int nwords = size >> 1; + + for (; nwords > 0; --nwords, ++d, ++s) +#ifdef __powerpc__ + asm volatile("stwbrx %0,0,%1" : : "r" (*s), "r" (d)); +#else + *d = ((*s >> 24) & 0xff) | ((*s >> 8) & 0xff00) + | ((*s & 0xff00) << 8) | ((*s & 0xff) << 24); +#endif +} +#endif /* USE_DRI */ + +#endif /* X_BYTE_ORDER */ + +/* Copies a single pass worth of data for a hostdata blit set up by + * R5XXHostDataBlit(). + */ +static inline void +R5xxBufCopyUpload(CARD8 *dst, CARD8 *src, unsigned int size, CARD8 bpp) +{ +#if X_BYTE_ORDER == X_BIG_ENDIAN + switch (bpp) { + case 8: + R5xxCopySwap32(dst, src, size); + return; + case 16: + R5xxCopySwapHDW(dst, src, size); + return; + default: + memcpy(dst, src, size); + return; + } +#else + memcpy(dst, src, size); +#endif +} + +/* + * + */ +static Bool +R5xxEXAUploadToScreenCP(PixmapPtr pDst, int x, int y, int w, int h, + char *src, int srcpitch) +{ + RHDPtr rhdPtr = RHDPTRE(pDst->drawable.pScreen); + struct RhdCS *CS = rhdPtr->CS; + CARD32 hpass, datatype, dwords; + CARD32 bufpitch, dstpitch, dstoffset; + + /* Why does EXA even bother to pass us this? */ + if (!w || !h || !srcpitch) + return FALSE; + + datatype = R5xxEXADatatypeGet(pDst->drawable.bitsPerPixel); + if (!datatype) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Unsupported bitdepth %d\n", + __func__, pDst->drawable.bitsPerPixel); + return FALSE; + } + + bufpitch = ((w * pDst->drawable.bitsPerPixel / 8) + 3) & ~3; + hpass = ((CS->Size - 10) * 4) / bufpitch; + + dstpitch = exaGetPixmapPitch(pDst); + if (R5XX_EXA_PITCH_CHECK(dstpitch)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid destination pitch: %d\n", + __func__, (unsigned int) dstpitch); + return FALSE; + } + + dstoffset = exaGetPixmapOffset(pDst); + if (R5XX_EXA_OFFSET_CHECK(dstoffset)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid destination offset: %d\n", + __func__, (unsigned int) dstoffset); + return FALSE; + } + dstoffset += rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + R5xxEngineWaitIdle3D(CS); + + for (; h; ) { + hpass = min((unsigned int) h, hpass); + dwords = hpass * bufpitch / 4; + + RHDCSGrab(CS, dwords + 10); + RHDCSWrite(CS, CP_PACKET3(R5XX_CP_PACKET3_CNTL_HOSTDATA_BLT, dwords + 10 - 2)); + RHDCSWrite(CS, R5XX_GMC_DST_PITCH_OFFSET_CNTL | + R5XX_GMC_DST_CLIPPING | R5XX_GMC_BRUSH_NONE | + (datatype << 8) | R5XX_GMC_SRC_DATATYPE_COLOR | + R5XX_ROP3_S | R5XX_DP_SRC_SOURCE_HOST_DATA | + R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_WR_MSK_DIS); + RHDCSWrite(CS, (dstpitch << 16) | (dstoffset >> 10)); + RHDCSWrite(CS, (y << 16) | x ); + RHDCSWrite(CS, ((y + hpass) << 16) | (x + w) ); + RHDCSWrite(CS, 0xffffffff ); + RHDCSWrite(CS, 0xffffffff ); + RHDCSWrite(CS, (y << 16) | x ); + RHDCSWrite(CS, (hpass << 16) | ((bufpitch * 8) / pDst->drawable.bitsPerPixel) ); + RHDCSWrite(CS, dwords ); + + /* now copy over the data, while doing pitch conversion */ + if (bufpitch == (CARD32) srcpitch) + R5xxBufCopyUpload((CARD8 *) (CS->Buffer + CS->Wptr), (CARD8 *)src, + hpass * srcpitch, pDst->drawable.bitsPerPixel); + else { + CARD8 *SrcBuf = (CARD8 *) src; + CARD8 *DstBuf = (CARD8 *) (CS->Buffer + CS->Wptr); + unsigned int i; + + for (i = 0; i < hpass; i++) { + R5xxBufCopyUpload(DstBuf, SrcBuf, bufpitch, + pDst->drawable.bitsPerPixel); + SrcBuf += srcpitch; + DstBuf += bufpitch; + } + } + + CS->Wptr += dwords; + RHDCSFlush(CS); + + src += hpass * srcpitch; + y += hpass; + h -= hpass; + } + + exaMarkSync(pDst->drawable.pScreen); + return TRUE; +} + +/* + * + */ +static Bool +R5xxEXAUploadToScreenManual(PixmapPtr pDst, int x, int y, int w, int h, + char *src, int src_pitch) +{ + RHDPtr rhdPtr = RHDPTRE(pDst->drawable.pScreen); + CARD8 *dst = ((CARD8 *) rhdPtr->FbBase) + + rhdPtr->FbScanoutStart + exaGetPixmapOffset(pDst); + int dst_pitch = exaGetPixmapPitch(pDst); + + if (pDst->drawable.bitsPerPixel < 8) + return FALSE; + + /* Do we need that sync here ? probably not .... */ + exaWaitSync(pDst->drawable.pScreen); + + w *= pDst->drawable.bitsPerPixel / 8; + dst += (x * pDst->drawable.bitsPerPixel / 8) + (y * dst_pitch); + + while (h--) { + memcpy(dst, src, w); + src += src_pitch; + dst += dst_pitch; + } + + return TRUE; +} + +/* + * + */ +static Bool +R5xxEXADownloadFromScreenManual(PixmapPtr pSrc, int x, int y, int w, int h, + char *dst, int dst_pitch) +{ + RHDPtr rhdPtr = RHDPTRE(pSrc->drawable.pScreen); + CARD8 *src = ((CARD8 *) rhdPtr->FbBase) + + rhdPtr->FbScanoutStart + exaGetPixmapOffset(pSrc); + int src_pitch = exaGetPixmapPitch(pSrc); + + /* Can't accelerate download */ + exaWaitSync(pSrc->drawable.pScreen); + + src += (x * pSrc->drawable.bitsPerPixel / 8) + (y * src_pitch); + w *= pSrc->drawable.bitsPerPixel / 8; + + while (h--) { + memcpy(dst, src, w); + src += src_pitch; + dst += dst_pitch; + } + + return TRUE; +} + +#ifdef USE_DRI +/* + * + */ +static inline void +R5xxBufCopyDownload(CARD8 *dst, CARD8 *src, unsigned int size, CARD8 bpp) +{ +#if X_BYTE_ORDER == X_BIG_ENDIAN + switch (bpp) { + case 16: + R5xxCopySwap16(dst, src, size); + return; + case 32: + R5xxCopySwap32(dst, src, size); + return; + default: + memcpy(dst, src, size); + return; + } +#else + memcpy(dst, src, size); +#endif +} + +/* + * Emit blit with arbitrary source and destination offsets and pitches + */ +static inline void +R5xxEXADownloadBlit(struct RhdCS *CS, CARD32 datatype, + CARD32 srcPitch, CARD32 srcOffset, + CARD32 dstPitch, CARD32 dstOffset, + int srcX, int srcY, int w, int h) +{ + RHDCSGrab(CS, 2 * 6); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, + R5XX_GMC_DST_PITCH_OFFSET_CNTL | + R5XX_GMC_SRC_PITCH_OFFSET_CNTL | + R5XX_GMC_BRUSH_NONE | + (datatype << 8) | + R5XX_GMC_SRC_DATATYPE_COLOR | + R5XX_ROP3_S | + R5XX_DP_SRC_SOURCE_MEMORY | + R5XX_GMC_CLR_CMP_CNTL_DIS | + R5XX_GMC_WR_MSK_DIS); + RHDCSRegWrite(CS, R5XX_SRC_PITCH_OFFSET, (srcPitch << 16) | (srcOffset >> 10)); + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, (dstPitch << 16) | (dstOffset >> 10)); + RHDCSRegWrite(CS, R5XX_SRC_Y_X, (srcY << 16) | srcX); + RHDCSRegWrite(CS, R5XX_DST_Y_X, 0); + RHDCSRegWrite(CS, R5XX_DST_HEIGHT_WIDTH, (h << 16) | w); + + RHDCSFlush(CS); +} + +/* + * Blit from the framebuffer into a separate indirect buffer, and then copy + * this data out of the gart space into the destination pixmap. + */ +static Bool +R5xxEXADownloadFromScreenCP(PixmapPtr pSrc, int x, int y, int w, int h, + char *dst, int dstpitch) +{ + ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RhdCS *CS = rhdPtr->CS; + struct R5xxExaPrivate *ExaPrivate = rhdPtr->TwoDPrivate; + CARD32 datatype, srcpitch, srcoffset; + CARD32 BufferPitch; + CARD32 wpass, hpass; + + /* maybe we shouldn't bother to idle the engine for tiny ones. */ + if ((w * h * (pSrc->drawable.bitsPerPixel / 8)) < 64) + return R5xxEXADownloadFromScreenManual(pSrc, x, y, w, h, dst, dstpitch); + + datatype = R5xxEXADatatypeGet(pSrc->drawable.bitsPerPixel); + if (!datatype) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Unsupported bitdepth %d\n", + __func__, pSrc->drawable.bitsPerPixel); + return FALSE; + } + + srcpitch = exaGetPixmapPitch(pSrc); + if (R5XX_EXA_PITCH_CHECK(srcpitch)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid source pitch: %d\n", + __func__, (unsigned int) srcpitch); + return FALSE; + } + + srcoffset = exaGetPixmapOffset(pSrc); + if (R5XX_EXA_OFFSET_CHECK(srcoffset)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Invalid source offset: %d\n", + __func__, (unsigned int) srcoffset); + return FALSE; + } + srcoffset += rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + wpass = w * pSrc->drawable.bitsPerPixel / 8; + BufferPitch = (wpass + 63) & ~63; + hpass = ExaPrivate->BufferSize / BufferPitch; + + R5xxEngineWaitIdle3D(CS); + + while (h) { + hpass = min((unsigned int) h, hpass); + R5xxEXADownloadBlit(CS, datatype, srcpitch, srcoffset, BufferPitch, + ExaPrivate->BufferIntAddress, x, y, w, hpass); + y += hpass; + h -= hpass; + + /* this is quite a big hammer, but we have no other option here */ + RHDCSFlush(CS); + RHDCSIdle(CS); + R5xx2DIdle(pScrn); + + /* Copy out data from previous blit */ + if ((wpass == BufferPitch) && (wpass == (unsigned int) dstpitch)) { + R5xxBufCopyDownload((CARD8*)dst, ExaPrivate->Buffer, wpass * hpass, + pSrc->drawable.bitsPerPixel); + dst += dstpitch * hpass; + } else { + CARD8 *buf = ExaPrivate->Buffer; + unsigned int i; + + for (i = 0; i < hpass; i++) { + R5xxBufCopyDownload((CARD8*)dst, buf, wpass, + pSrc->drawable.bitsPerPixel); + buf += BufferPitch; + dst += dstpitch; + } + } + } + + /* since we had a full idle every time, we make sure we don't do + yet another system call here */ + ExaPrivate->exaMarkerSynced = ExaPrivate->exaSyncMarker; + + return TRUE; +} +#endif /* USE_DRI */ + +#if X_BYTE_ORDER == X_BIG_ENDIAN + +/* + * offset will undoubtedly have to be adapted to the moving scanout + offscreen. + */ +static Bool +R5xxEXAPrepareAccess(PixmapPtr pPix, int index) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + struct R5xxExaPrivate *ExaPrivate = RHDPTR(pScrn)->TwoDPrivate; + CARD32 offset = exaGetPixmapOffset(pPix); + int soff; + CARD32 size, flags; + + /* Front buffer is always set with proper swappers */ + if (offset == 0) + return TRUE; + + /* If same bpp as front buffer, just do nothing as the main + * swappers will apply + */ + if (pPix->drawable.bitsPerPixel == pScrn->bitsPerPixel) + return TRUE; + + /* We need to setup a separate swapper, let's request a + * surface. We need to align the size first + */ + size = RHD_FB_CHUNK(exaGetPixmapSize(pPix)); + + /* Set surface to tiling disabled with appropriate swapper */ + switch (pPix->drawable.bitsPerPixel) { + case 16: + flags = R5XX_SURF_AP0_SWP_16BPP | R5XX_SURF_AP1_SWP_16BPP; + break; + case 32: + flags = R5XX_SURF_AP0_SWP_32BPP | R5XX_SURF_AP1_SWP_32BPP; + break; + default: + flags = 0; + } + + soff = (index + 1) * 0x10; + RHDRegWrite(pScrn, R5XX_SURFACE0_INFO + soff, flags); + RHDRegWrite(pScrn, R5XX_SURFACE0_LOWER_BOUND + soff, offset); + RHDRegWrite(pScrn, R5XX_SURFACE0_UPPER_BOUND + soff, offset + size - 1); + ExaPrivate->swapper_surfaces[index] = offset; + return TRUE; +} + +/* + * + */ +static void +R5xxEXAFinishAccess(PixmapPtr pPix, int index) +{ + RHDPtr rhdPtr = RHDPTRE(pPix->drawable.pScreen); + struct R5xxExaPrivate *ExaPrivate = rhdPtr->TwoDPrivate; + CARD32 offset = exaGetPixmapOffset(pPix); + int soff; + + /* Front buffer is always set with proper swappers */ + if (offset == 0) + return; + + if (ExaPrivate->swapper_surfaces[index] == 0) + return; + + soff = (index + 1) * 0x10; + RHDRegWrite(rhdPtr, R5XX_SURFACE0_INFO + soff, 0); + RHDRegWrite(rhdPtr, R5XX_SURFACE0_LOWER_BOUND + soff, 0); + RHDRegWrite(rhdPtr, R5XX_SURFACE0_UPPER_BOUND + soff, 0); + ExaPrivate->swapper_surfaces[index] = 0; +} + +#endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ + +/* + * + */ +Bool +R5xxEXAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RhdCS *CS = rhdPtr->CS; + ExaDriverRec *EXAInfo; + struct R5xxExaPrivate *ExaPrivate; + + RHDFUNC(pScrn); + + EXAInfo = exaDriverAlloc(); + if (EXAInfo == NULL) + return FALSE; + + ExaPrivate = xnfcalloc(1, sizeof(struct R5xxExaPrivate)); + ExaPrivate->scrnIndex = pScrn->scrnIndex; + + EXAInfo->exa_major = EXA_VERSION_MAJOR; + EXAInfo->exa_minor = EXA_VERSION_MINOR; + + EXAInfo->flags = EXA_OFFSCREEN_PIXMAPS +#ifdef EXA_SUPPORTS_PREPARE_AUX + | EXA_SUPPORTS_PREPARE_AUX +#endif + ; + EXAInfo->pixmapOffsetAlign = 0x1000; + EXAInfo->pixmapPitchAlign = 64; + +#if EXA_VERSION_MAJOR > 2 || (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 3) + EXAInfo->maxPitchBytes = 16320; + EXAInfo->maxX = 8192; +#else + EXAInfo->maxX = 16320 / 4; +#endif + EXAInfo->maxY = 8192; + + EXAInfo->memoryBase = (CARD8 *) rhdPtr->FbBase + rhdPtr->FbScanoutStart; + EXAInfo->offScreenBase = rhdPtr->FbOffscreenStart - rhdPtr->FbScanoutStart; + EXAInfo->memorySize = rhdPtr->FbScanoutSize + rhdPtr->FbOffscreenSize; + + EXAInfo->PrepareSolid = R5xxEXAPrepareSolid; + EXAInfo->Solid = R5xxEXASolid; + EXAInfo->DoneSolid = R5xxEXADoneSolid; + + EXAInfo->PrepareCopy = R5xxEXAPrepareCopy; + EXAInfo->Copy = R5xxEXACopy; + EXAInfo->DoneCopy = R5xxEXADoneCopy; + + EXAInfo->MarkSync = R5xxEXAMarkSync; + EXAInfo->WaitMarker = R5xxEXASync; + + if (CS->Type == RHD_CS_CPDMA) + EXAInfo->UploadToScreen = R5xxEXAUploadToScreenCP; + else + EXAInfo->UploadToScreen = R5xxEXAUploadToScreenManual; + +#ifdef USE_DRI + if (CS->Type == RHD_CS_CPDMA) { + ExaPrivate->Buffer = + RHDDRMIndirectBufferGet(CS->scrnIndex, &ExaPrivate->BufferIntAddress, + &ExaPrivate->BufferSize); + if (ExaPrivate->Buffer) + EXAInfo->DownloadFromScreen = R5xxEXADownloadFromScreenCP; + else { + xf86DrvMsg(CS->scrnIndex, X_INFO, + "Failed to get an indirect buffer for fast download.\n"); + EXAInfo->DownloadFromScreen = R5xxEXADownloadFromScreenManual; + } + } else +#endif /* USE_DRI */ + EXAInfo->DownloadFromScreen = R5xxEXADownloadFromScreenManual; + +#if X_BYTE_ORDER == X_BIG_ENDIAN + EXAInfo->PrepareAccess = R5xxEXAPrepareAccess; + EXAInfo->FinishAccess = R5xxEXAFinishAccess; +#endif /* X_BYTE_ORDER == X_BIG_ENDIAN */ + + /* if we have CP, we can use composite! */ + if (CS->Type != RHD_CS_MMIO) + R5xxExaCompositeFuncs(pScrn->scrnIndex, EXAInfo); + + if (!exaDriverInit(pScreen, EXAInfo)) { +#ifdef USE_DRI + if (ExaPrivate->Buffer) + RHDDRMIndirectBufferDiscard(CS->scrnIndex, ExaPrivate->Buffer); +#endif + xfree(ExaPrivate); + xfree(EXAInfo); + return FALSE; + } + + RHDPTR(pScrn)->EXAInfo = EXAInfo; + + rhdPtr->TwoDPrivate = ExaPrivate; + + /* if we have CP, we need set up the ThreeDPrivate */ + if ((CS->Type != RHD_CS_MMIO) && !rhdPtr->ThreeDPrivate) + R5xx3DInit(pScrn); + + exaMarkSync(pScreen); + + return TRUE; +} + +/* + * + */ +void +R5xxEXACloseScreen(ScreenPtr pScreen) +{ + exaDriverFini(pScreen); +} + +/* + * + */ +void +R5xxEXADestroy(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + if (rhdPtr->EXAInfo) { + xfree(rhdPtr->EXAInfo); + rhdPtr->EXAInfo = NULL; + } + + if (rhdPtr->TwoDPrivate) { +#ifdef USE_DRI + struct R5xxExaPrivate *ExaPrivate = rhdPtr->TwoDPrivate; + + if (ExaPrivate->Buffer) + RHDDRMIndirectBufferDiscard(rhdPtr->scrnIndex, ExaPrivate->Buffer); +#endif + + xfree(rhdPtr->TwoDPrivate); + rhdPtr->TwoDPrivate = NULL; + } +} diff --git a/driver/xf86-video-radeonhd/src/r5xx_regs.h b/driver/xf86-video-radeonhd/src/r5xx_regs.h new file mode 100644 index 000000000..3bd98bb5c --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r5xx_regs.h @@ -0,0 +1,386 @@ +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and + * VA Linux Systems Inc., Fremont, California. + * + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ +/* WARNING: the above is not a standard MIT license. */ +/* + * Authors: + * Kevin E. Martin + * Rickard E. Faith + * Alan Hourihane + */ + +#ifndef _R5XX_2DREGS_H +# define _R5XX_2DREGS_H + +#define R5XX_DATATYPE_VQ 0 +#define R5XX_DATATYPE_CI4 1 +#define R5XX_DATATYPE_CI8 2 +#define R5XX_DATATYPE_ARGB1555 3 +#define R5XX_DATATYPE_RGB565 4 +#define R5XX_DATATYPE_RGB888 5 +#define R5XX_DATATYPE_ARGB8888 6 +#define R5XX_DATATYPE_RGB332 7 +#define R5XX_DATATYPE_Y8 8 +#define R5XX_DATATYPE_RGB8 9 +#define R5XX_DATATYPE_CI16 10 +#define R5XX_DATATYPE_VYUY_422 11 +#define R5XX_DATATYPE_YVYU_422 12 +#define R5XX_DATATYPE_AYUV_444 14 +#define R5XX_DATATYPE_ARGB4444 15 + +#define R5XX_BUS_CNTL 0x0030 +# define R5XX_BUS_MASTER_DIS (1 << 6) + +#define R5XX_RBBM_SOFT_RESET 0x00f0 +# define R5XX_SOFT_RESET_CP (1 << 0) +# define R5XX_SOFT_RESET_HI (1 << 1) +# define R5XX_SOFT_RESET_SE (1 << 2) +# define R5XX_SOFT_RESET_RE (1 << 3) +# define R5XX_SOFT_RESET_PP (1 << 4) +# define R5XX_SOFT_RESET_E2 (1 << 5) +# define R5XX_SOFT_RESET_RB (1 << 6) +# define R5XX_SOFT_RESET_HDP (1 << 7) + +#define R5XX_HOST_PATH_CNTL 0x0130 +# define R5XX_HDP_SOFT_RESET (1 << 26) +# define R5XX_HDP_APER_CNTL (1 << 23) + +#define R5XX_CP_RB_BASE 0x0700 +#define R5XX_CP_RB_CNTL 0x0704 +# define R5XX_BUF_SWAP_32BIT (2 << 16) +# define R5XX_RB_NO_UPDATE (1 << 27) +# define R5XX_RB_RPTR_WR_ENA (1 << 31) + +#define R5XX_CP_RB_RPTR_ADDR 0x070c +#define R5XX_CP_RB_RPTR 0x0710 +#define R5XX_CP_RB_WPTR 0x0714 +#define R5XX_CP_RB_WPTR_DELAY 0x0718 +# define R5XX_PRE_WRITE_TIMER_SHIFT 0 +# define R5XX_PRE_WRITE_LIMIT_SHIFT 23 + +#define R5XX_CP_RB_RPTR_WR 0x071C + +#define R5XX_CP_IB_BASE 0x0738 +#define R5XX_CP_IB_BUFSZ 0x073c + +#define R5XX_CP_CSQ_CNTL 0x0740 +# define R5XX_CSQ_CNT_PRIMARY_MASK (0xff << 0) +# define R5XX_CSQ_PRIDIS_INDDIS (0 << 28) +# define R5XX_CSQ_PRIPIO_INDDIS (1 << 28) +# define R5XX_CSQ_PRIBM_INDDIS (2 << 28) +# define R5XX_CSQ_PRIPIO_INDBM (3 << 28) +# define R5XX_CSQ_PRIBM_INDBM (4 << 28) +# define R5XX_CSQ_PRIPIO_INDPIO (15 << 28) + +#define R5XX_CP_CSQ_MODE 0x0744 + +#define R5XX_CP_STAT 0x07C0 +/* + * [ 0] MRU_BUSY + * [ 1] MWU_BUSY + * [ 2] RSIU_BUSY + * [ 3] RCIU_BUSY + * [ 8: 4] + * [ 9] CSF_PRIMARY_BUSY + * [10] CSF_INDIRECT_BUSY + * [11] CSQ_PRIMARY_BUSY + * [12] CSQ_INDIRECT_BUSY + * [13] CSI_BUSY + * [14] CSF_INDIRECT2_BUSY + * [15] CSQ_INDIRECT2_BUSY + * [27:16] + * [28] GUIDMA_BUSY + * [29] VIDDMA_BUSY + * [30] CMDSTRM_BUSY + * [31] CP_BUSY + */ + +#define R5XX_CP_ME_CNTL 0x07D0 +#define R5XX_CP_ME_RAM_ADDR 0x07D4 +#define R5XX_CP_ME_RAM_RADDR 0x07D8 +#define R5XX_CP_ME_RAM_DATAH 0x07DC +#define R5XX_CP_ME_RAM_DATAL 0x07E0 + +#define R5XX_SURFACE_CNTL 0x0b00 +# define R5XX_SURF_TRANSLATION_DIS (1 << 8) +# define R5XX_NONSURF_AP0_SWP_16BPP (1 << 20) +# define R5XX_NONSURF_AP0_SWP_32BPP (1 << 21) +# define R5XX_NONSURF_AP1_SWP_16BPP (1 << 22) +# define R5XX_NONSURF_AP1_SWP_32BPP (1 << 23) + +#define R5XX_SURFACE0_INFO 0x0b0c +# define R5XX_SURF_TILE_COLOR_MACRO (0 << 16) +# define R5XX_SURF_TILE_COLOR_BOTH (1 << 16) +# define R5XX_SURF_TILE_DEPTH_32BPP (2 << 16) +# define R5XX_SURF_TILE_DEPTH_16BPP (3 << 16) +# define R5XX_SURF_AP0_SWP_16BPP (1 << 20) +# define R5XX_SURF_AP0_SWP_32BPP (1 << 21) +# define R5XX_SURF_AP1_SWP_16BPP (1 << 22) +# define R5XX_SURF_AP1_SWP_32BPP (1 << 23) +#define R5XX_SURFACE0_LOWER_BOUND 0x0b04 +#define R5XX_SURFACE0_UPPER_BOUND 0x0b08 + +#define R5XX_RBBM_STATUS 0x0e40 +# define R5XX_RBBM_FIFOCNT_MASK 0x007f +# define R5XX_RBBM_ACTIVE (1 << 31) + +#define R5XX_SRC_PITCH_OFFSET 0x1428 +#define R5XX_DST_PITCH_OFFSET 0x142c + +#define R5XX_SRC_Y_X 0x1434 +#define R5XX_DST_Y_X 0x1438 +#define R5XX_DST_HEIGHT_WIDTH 0x143c + +#define R5XX_DP_GUI_MASTER_CNTL 0x146c +# define R5XX_GMC_SRC_PITCH_OFFSET_CNTL (1 << 0) +# define R5XX_GMC_DST_PITCH_OFFSET_CNTL (1 << 1) +# define R5XX_GMC_SRC_CLIPPING (1 << 2) +# define R5XX_GMC_DST_CLIPPING (1 << 3) +# define R5XX_GMC_BRUSH_DATATYPE_MASK (0x0f << 4) +# define R5XX_GMC_BRUSH_8X8_MONO_FG_BG (0 << 4) +# define R5XX_GMC_BRUSH_8X8_MONO_FG_LA (1 << 4) +# define R5XX_GMC_BRUSH_1X8_MONO_FG_BG (4 << 4) +# define R5XX_GMC_BRUSH_1X8_MONO_FG_LA (5 << 4) +# define R5XX_GMC_BRUSH_32x1_MONO_FG_BG (6 << 4) +# define R5XX_GMC_BRUSH_32x1_MONO_FG_LA (7 << 4) +# define R5XX_GMC_BRUSH_32x32_MONO_FG_BG (8 << 4) +# define R5XX_GMC_BRUSH_32x32_MONO_FG_LA (9 << 4) +# define R5XX_GMC_BRUSH_8x8_COLOR (10 << 4) +# define R5XX_GMC_BRUSH_1X8_COLOR (12 << 4) +# define R5XX_GMC_BRUSH_SOLID_COLOR (13 << 4) +# define R5XX_GMC_BRUSH_NONE (15 << 4) +# define R5XX_GMC_DST_8BPP_CI (2 << 8) +# define R5XX_GMC_DST_15BPP (3 << 8) +# define R5XX_GMC_DST_16BPP (4 << 8) +# define R5XX_GMC_DST_24BPP (5 << 8) +# define R5XX_GMC_DST_32BPP (6 << 8) +# define R5XX_GMC_DST_8BPP_RGB (7 << 8) +# define R5XX_GMC_DST_Y8 (8 << 8) +# define R5XX_GMC_DST_RGB8 (9 << 8) +# define R5XX_GMC_DST_VYUY (11 << 8) +# define R5XX_GMC_DST_YVYU (12 << 8) +# define R5XX_GMC_DST_AYUV444 (14 << 8) +# define R5XX_GMC_DST_ARGB4444 (15 << 8) +# define R5XX_GMC_DST_DATATYPE_MASK (0x0f << 8) +# define R5XX_GMC_DST_DATATYPE_SHIFT 8 +# define R5XX_GMC_SRC_DATATYPE_MASK (3 << 12) +# define R5XX_GMC_SRC_DATATYPE_MONO_FG_BG (0 << 12) +# define R5XX_GMC_SRC_DATATYPE_MONO_FG_LA (1 << 12) +# define R5XX_GMC_SRC_DATATYPE_COLOR (3 << 12) +# define R5XX_GMC_BYTE_PIX_ORDER (1 << 14) +# define R5XX_GMC_BYTE_MSB_TO_LSB (0 << 14) +# define R5XX_GMC_BYTE_LSB_TO_MSB (1 << 14) +# define R5XX_GMC_CONVERSION_TEMP (1 << 15) +# define R5XX_GMC_CONVERSION_TEMP_6500 (0 << 15) +# define R5XX_GMC_CONVERSION_TEMP_9300 (1 << 15) +# define R5XX_GMC_ROP3_MASK (0xff << 16) +# define R5XX_DP_SRC_SOURCE_MASK (7 << 24) +# define R5XX_DP_SRC_SOURCE_MEMORY (2 << 24) +# define R5XX_DP_SRC_SOURCE_HOST_DATA (3 << 24) +# define R5XX_GMC_3D_FCN_EN (1 << 27) +# define R5XX_GMC_CLR_CMP_CNTL_DIS (1 << 28) +# define R5XX_GMC_AUX_CLIP_DIS (1 << 29) +# define R5XX_GMC_WR_MSK_DIS (1 << 30) +# define R5XX_GMC_LD_BRUSH_Y_X (1 << 31) +# define R5XX_ROP3_ZERO 0x00000000 +# define R5XX_ROP3_DSa 0x00880000 +# define R5XX_ROP3_SDna 0x00440000 +# define R5XX_ROP3_S 0x00cc0000 +# define R5XX_ROP3_DSna 0x00220000 +# define R5XX_ROP3_D 0x00aa0000 +# define R5XX_ROP3_DSx 0x00660000 +# define R5XX_ROP3_DSo 0x00ee0000 +# define R5XX_ROP3_DSon 0x00110000 +# define R5XX_ROP3_DSxn 0x00990000 +# define R5XX_ROP3_Dn 0x00550000 +# define R5XX_ROP3_SDno 0x00dd0000 +# define R5XX_ROP3_Sn 0x00330000 +# define R5XX_ROP3_DSno 0x00bb0000 +# define R5XX_ROP3_DSan 0x00770000 +# define R5XX_ROP3_ONE 0x00ff0000 +# define R5XX_ROP3_DPa 0x00a00000 +# define R5XX_ROP3_PDna 0x00500000 +# define R5XX_ROP3_P 0x00f00000 +# define R5XX_ROP3_DPna 0x000a0000 +# define R5XX_ROP3_D 0x00aa0000 +# define R5XX_ROP3_DPx 0x005a0000 +# define R5XX_ROP3_DPo 0x00fa0000 +# define R5XX_ROP3_DPon 0x00050000 +# define R5XX_ROP3_PDxn 0x00a50000 +# define R5XX_ROP3_PDno 0x00f50000 +# define R5XX_ROP3_Pn 0x000f0000 +# define R5XX_ROP3_DPno 0x00af0000 +# define R5XX_ROP3_DPan 0x005f0000 + +#define R5XX_BRUSH_Y_X 0x1474 +#define R5XX_DP_BRUSH_BKGD_CLR 0x1478 +#define R5XX_DP_BRUSH_FRGD_CLR 0x147c +#define R5XX_BRUSH_DATA0 0x1480 +#define R5XX_BRUSH_DATA1 0x1484 + +#define R5XX_DST_WIDTH_HEIGHT 0x1598 + +#define R5XX_CLR_CMP_CNTL 0x15c0 +# define R5XX_SRC_CMP_EQ_COLOR (4 << 0) +# define R5XX_SRC_CMP_NEQ_COLOR (5 << 0) +# define R5XX_CLR_CMP_SRC_SOURCE (1 << 24) + +#define R5XX_CLR_CMP_CLR_SRC 0x15c4 + +#define R5XX_CLR_CMP_MASK 0x15cc +# define R5XX_CLR_CMP_MSK 0xffffffff + +#define R5XX_DP_SRC_BKGD_CLR 0x15dc +#define R5XX_DP_SRC_FRGD_CLR 0x15d8 + +#define R5XX_DST_LINE_START 0x1600 +#define R5XX_DST_LINE_END 0x1604 +#define R5XX_DST_LINE_PATCOUNT 0x1608 +# define R5XX_BRES_CNTL_SHIFT 8 + +#define R5XX_DP_CNTL 0x16c0 +# define R5XX_DST_X_LEFT_TO_RIGHT (1 << 0) +# define R5XX_DST_Y_TOP_TO_BOTTOM (1 << 1) +# define R5XX_DP_DST_TILE_LINEAR (0 << 3) +# define R5XX_DP_DST_TILE_MACRO (1 << 3) +# define R5XX_DP_DST_TILE_MICRO (2 << 3) +# define R5XX_DP_DST_TILE_BOTH (3 << 3) + +#define R5XX_DP_DATATYPE 0x16c4 +# define R5XX_HOST_BIG_ENDIAN_EN (1 << 29) + +#define R5XX_DP_WRITE_MASK 0x16cc + +#define R5XX_DEFAULT_SC_BOTTOM_RIGHT 0x16e8 +# define R5XX_DEFAULT_SC_RIGHT_MAX (0x1fff << 0) +# define R5XX_DEFAULT_SC_BOTTOM_MAX (0x1fff << 16) + +#define R5XX_SC_TOP_LEFT 0x16ec +#define R5XX_SC_BOTTOM_RIGHT 0x16f0 +# define R5XX_SC_SIGN_MASK_LO 0x8000 +# define R5XX_SC_SIGN_MASK_HI 0x80000000 + +#define R5XX_DST_PIPE_CONFIG 0x170c +# define R5XX_PIPE_AUTO_CONFIG (1 << 31) + +#define R5XX_DSTCACHE_CTLSTAT 0x1714 +# define R5XX_DSTCACHE_FLUSH_2D (1 << 0) +# define R5XX_DSTCACHE_FREE_2D (1 << 2) +# define R5XX_DSTCACHE_FLUSH_ALL (R5XX_DSTCACHE_FLUSH_2D | R5XX_DSTCACHE_FREE_2D) +# define R5XX_DSTCACHE_BUSY (1 << 31) + +#define R5XX_WAIT_UNTIL 0x1720 +# define R5XX_WAIT_CRTC_PFLIP (1 << 0) +# define R5XX_WAIT_RE_CRTC_VLINE (1 << 1) +# define R5XX_WAIT_FE_CRTC_VLINE (1 << 2) +# define R5XX_WAIT_CRTC_VLINE (1 << 3) +# define R5XX_WAIT_DMA_VID_IDLE (1 << 8) +# define R5XX_WAIT_DMA_GUI_IDLE (1 << 9) +# define R5XX_WAIT_CMDFIFO (1 << 10) /* wait for CMDFIFO_ENTRIES */ +# define R5XX_WAIT_OV0_FLIP (1 << 11) +# define R5XX_WAIT_AGP_FLUSH (1 << 13) +# define R5XX_WAIT_2D_IDLE (1 << 14) +# define R5XX_WAIT_3D_IDLE (1 << 15) +# define R5XX_WAIT_2D_IDLECLEAN (1 << 16) +# define R5XX_WAIT_3D_IDLECLEAN (1 << 17) +# define R5XX_WAIT_HOST_IDLECLEAN (1 << 18) +# define R5XX_CMDFIFO_ENTRIES_SHIFT 10 +# define R5XX_CMDFIFO_ENTRIES_MASK 0x7f +# define R5XX_WAIT_VAP_IDLE (1 << 28) +# define R5XX_WAIT_BOTH_CRTC_PFLIP (1 << 30) +# define R5XX_ENG_DISPLAY_SELECT_CRTC0 (0 << 31) +# define R5XX_ENG_DISPLAY_SELECT_CRTC1 (1 << 31) + +#define R5XX_ISYNC_CNTL 0x1724 +# define R5XX_ISYNC_ANY2D_IDLE3D (1 << 0) +# define R5XX_ISYNC_ANY3D_IDLE2D (1 << 1) +# define R5XX_ISYNC_TRIG2D_IDLE3D (1 << 2) +# define R5XX_ISYNC_TRIG3D_IDLE2D (1 << 3) +# define R5XX_ISYNC_WAIT_IDLEGUI (1 << 4) +# define R5XX_ISYNC_CPSCRATCH_IDLEGUI (1 << 5) + +#define R5XX_RBBM_GUICNTL 0x172c +# define R5XX_HOST_DATA_SWAP_NONE (0 << 0) +# define R5XX_HOST_DATA_SWAP_16BIT (1 << 0) +# define R5XX_HOST_DATA_SWAP_32BIT (2 << 0) +# define R5XX_HOST_DATA_SWAP_HDW (3 << 0) + +#define R5XX_HOST_DATA0 0x17c0 +#define R5XX_HOST_DATA1 0x17c4 +#define R5XX_HOST_DATA2 0x17c8 +#define R5XX_HOST_DATA3 0x17cc +#define R5XX_HOST_DATA4 0x17d0 +#define R5XX_HOST_DATA5 0x17d4 +#define R5XX_HOST_DATA6 0x17d8 +#define R5XX_HOST_DATA7 0x17dc +#define R5XX_HOST_DATA_LAST 0x17e0 + +#define R5XX_RB3D_ZCACHE_MODE 0x3250 + +#define R5XX_RB3D_ZCACHE_CTLSTAT 0x3254 +# define R5XX_RB3D_ZC_FLUSH (1 << 0) +# define R5XX_RB3D_ZC_FREE (1 << 1) +# define R5XX_RB3D_ZC_FLUSH_ALL 0x3 + +#define R5XX_RB3D_DSTCACHE_MODE 0x3258 +# define R5XX_RB3D_DC_CACHE_ENABLE (0) +# define R5XX_RB3D_DC_2D_CACHE_DISABLE (1) +# define R5XX_RB3D_DC_3D_CACHE_DISABLE (2) +# define R5XX_RB3D_DC_CACHE_DISABLE (3) +# define R5XX_RB3D_DC_2D_CACHE_LINESIZE_128 (1 << 2) +# define R5XX_RB3D_DC_3D_CACHE_LINESIZE_128 (2 << 2) +# define R5XX_RB3D_DC_2D_CACHE_AUTOFLUSH (1 << 8) +# define R5XX_RB3D_DC_3D_CACHE_AUTOFLUSH (2 << 8) +# define R200_RB3D_DC_2D_CACHE_AUTOFREE (1 << 10) +# define R200_RB3D_DC_3D_CACHE_AUTOFREE (2 << 10) +# define R5XX_RB3D_DC_FORCE_RMW (1 << 16) +# define R5XX_RB3D_DC_DISABLE_RI_FILL (1 << 24) +# define R5XX_RB3D_DC_DISABLE_RI_READ (1 << 25) + +#define R5XX_RB3D_DSTCACHE_CTLSTAT 0x325C +# define R5XX_RB3D_DC_FLUSH (3 << 0) +# define R5XX_RB3D_DC_FREE (3 << 2) +# define R5XX_RB3D_DC_FLUSH_ALL 0xf +# define R5XX_RB3D_DC_BUSY (1 << 31) + +#define R5XX_RB2D_DSTCACHE_MODE 0x3428 +# define R5XX_RB2D_DC_AUTOFLUSH_ENABLE (1 << 8) +# define R5XX_RB2D_DC_DISABLE_IGNORE_PE (1 << 17) + +#define R5XX_GB_TILE_CONFIG 0x4018 +# define R5XX_ENABLE_TILING (1 << 0) +# define R5XX_PIPE_COUNT_RV350 (0 << 1) +# define R5XX_PIPE_COUNT_R300 (3 << 1) +# define R5XX_PIPE_COUNT_R420_3P (6 << 1) +# define R5XX_PIPE_COUNT_R420 (7 << 1) +# define R5XX_TILE_SIZE_8 (0 << 4) +# define R5XX_TILE_SIZE_16 (1 << 4) +# define R5XX_TILE_SIZE_32 (2 << 4) +# define R5XX_SUBPIXEL_1_12 (0 << 16) +# define R5XX_SUBPIXEL_1_16 (1 << 16) + +#endif /* _R5XX_2DREGS_H */ diff --git a/driver/xf86-video-radeonhd/src/r5xx_xaa.c b/driver/xf86-video-radeonhd/src/r5xx_xaa.c new file mode 100644 index 000000000..2d591c276 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r5xx_xaa.c @@ -0,0 +1,1139 @@ +/* + * Copyright 2008 Luc Verhaegen + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * Copyright 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 below code is a clean-up from code in xf86-video-ati/src/radeon_accel.c + * The original license is included below, it has the messed up disclaimer and + * an all rights reserved statement. + */ + +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and + * VA Linux Systems Inc., Fremont, California. + * + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + * + * Authors: + * Kevin E. Martin + * Rickard E. Faith + * Alan Hourihane + * Michel Dänzer + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "xaa.h" +#include "miline.h" /* line support */ +#include "compiler.h" /* write_mem_barrier */ + +#include "rhd.h" +#include "rhd_cs.h" +#include "r5xx_accel.h" +#include "r5xx_regs.h" + +extern struct R5xxRop R5xxRops[]; + +struct R5xxXaaPrivate { + CARD32 dst_pitch_offset; /* Base value for R5XX_DST_PITCH_OFFSET */ + CARD32 control; /* Base value for R5XX_DP_GUI_MASTER_CNTL */ + CARD32 control_saved; + + int xdir; + int ydir; + + int trans_color; + + int scanline_x; + int scanline_y; + int scanline_w; + CARD32 scanline_h; + CARD32 scanline_words; + int scanline_bpp; /* Only used for ImageWrite */ + int scanline_fg; + int scanline_bg; + int scanline_hpass; + int scanline_x1clip; + int scanline_x2clip; + + CARD8 *Buffer; + CARD8 *BufferHook[1]; +}; + +/* + * + */ +static void +R5xxXAAIdle(ScrnInfoPtr pScrn) +{ + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + RHDCSFlush(CS); + RHDCSIdle(CS); + R5xx2DIdle(pScrn); +} + +/* Set up for transparency + * + * Mmmm, Seems as though the transparency compare is opposite to r128. + * It should only draw when source != trans_color, this is the opposite + * of that. + */ +static void +R5xxXAASetTransparency(struct RhdCS *CS, int trans_color) +{ + RHDCSGrab(CS, 2 * 3); + + RHDCSRegWrite(CS, R5XX_CLR_CMP_CLR_SRC, trans_color); + RHDCSRegWrite(CS, R5XX_CLR_CMP_MASK, R5XX_CLR_CMP_MSK); + RHDCSRegWrite(CS, R5XX_CLR_CMP_CNTL, + R5XX_SRC_CMP_EQ_COLOR | R5XX_CLR_CMP_SRC_SOURCE); +} + +/* + * Set up the clipping rectangle + */ +static void +R5xxXAASetClippingRectangle(ScrnInfoPtr pScrn, int xa, int ya, int xb, int yb) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + unsigned long tmp1, tmp2; + + if (xa < 0) { + tmp1 = (-xa) & 0x3fff; + tmp1 |= R5XX_SC_SIGN_MASK_LO; + } else + tmp1 = xa; + + if (ya < 0) { + tmp1 |= ((-ya) & 0x3fff) << 16; + tmp1 |= R5XX_SC_SIGN_MASK_HI; + } else + tmp1 |= ya << 16; + + xb++; + yb++; + + if (xb < 0) { + tmp2 = (-xb) & 0x3fff; + tmp2 |= R5XX_SC_SIGN_MASK_LO; + } else + tmp2 = xb; + + if (yb < 0) { + tmp2 |= ((-yb) & 0x3fff) << 16; + tmp2 |= R5XX_SC_SIGN_MASK_HI; + } else + tmp2 |= yb << 16; + + RHDCSGrab(CS, 2 * 3); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, + XaaPrivate->control_saved | R5XX_GMC_DST_CLIPPING); + RHDCSRegWrite(CS, R5XX_SC_TOP_LEFT, tmp1); + RHDCSRegWrite(CS, R5XX_SC_BOTTOM_RIGHT, tmp2); + + if (XaaPrivate->trans_color != -1) + R5xxXAASetTransparency(CS, XaaPrivate->trans_color); + + RHDCSAdvance(CS); +} + +/* + * Disable the clipping rectangle + */ +static void +R5xxXAADisableClipping(ScrnInfoPtr pScrn) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + RHDCSGrab(CS, 2 * 3); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, XaaPrivate->control_saved); + RHDCSRegWrite(CS, R5XX_SC_TOP_LEFT, 0); + RHDCSRegWrite(CS, R5XX_SC_BOTTOM_RIGHT, + R5XX_DEFAULT_SC_RIGHT_MAX | R5XX_DEFAULT_SC_BOTTOM_MAX); + if (XaaPrivate->trans_color != -1) + R5xxXAASetTransparency(CS, XaaPrivate->trans_color); + + RHDCSAdvance(CS); +} + +/* + * + */ +static void +R5xxXAASetupForSolidFill(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control; + + control = XaaPrivate->control | R5xxRops[rop].pattern; + control |= R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR; + + /* Save for later clipping */ + XaaPrivate->control_saved = control; + + RHDCSGrab(CS, 2 * 4); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, control); + RHDCSRegWrite(CS, R5XX_DP_BRUSH_FRGD_CLR, color); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); + RHDCSRegWrite(CS, R5XX_DP_CNTL, + R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); +} + +/* + * Tests: xtest CH06/fllrctngl, xterm + */ +static void +R5xxXAASubsequentSolidFillRect(ScrnInfoPtr pScrn, int x, int y, int w, int h) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + RHDCSGrab(CS, 2 * 3); + + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_DST_Y_X, (y << 16) | x); + RHDCSRegWrite(CS, R5XX_DST_WIDTH_HEIGHT, (w << 16) | h); + + RHDCSAdvance(CS); +} + +/* + * + */ +static void +R5xxXAASetupForSolidLine(ScrnInfoPtr pScrn, + int color, int rop, unsigned int planemask) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control; + + control = XaaPrivate->control | R5xxRops[rop].pattern; + control |= R5XX_GMC_BRUSH_SOLID_COLOR | R5XX_GMC_SRC_DATATYPE_COLOR; + + /* Save for later clipping */ + XaaPrivate->control_saved = control; + + RHDCSGrab(CS, 2 * 4); + + RHDCSRegWrite(CS, R5XX_DST_LINE_PATCOUNT, 0x55 << R5XX_BRES_CNTL_SHIFT); + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, control); + RHDCSRegWrite(CS, R5XX_DP_BRUSH_FRGD_CLR, color); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); +} + +/* + * + */ +static void +R5xxXAASubsequentSolidHorVertLine(ScrnInfoPtr pScrn, + int x, int y, int len, int dir) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + int w = 1, h = 1; + + if (dir == DEGREES_0) + w = len; + else + h = len; + + RHDCSGrab(CS, 2 * 4); + + RHDCSRegWrite(CS, R5XX_DP_CNTL, + R5XX_DST_X_LEFT_TO_RIGHT | R5XX_DST_Y_TOP_TO_BOTTOM); + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_DST_Y_X, (y << 16) | x); + RHDCSRegWrite(CS, R5XX_DST_WIDTH_HEIGHT, (w << 16) | h); + + RHDCSAdvance(CS); +} + +/* + * Tests: xtest CH06/drwln, ico, Mark Vojkovich's linetest program + * + * [See http://www.xfree86.org/devel/archives/devel/1999-Jun/0102.shtml for + * Mark Vojkovich's linetest program, posted 2Jun99 to devel@xfree86.org.] + */ +static void +R5xxXAASubsequentSolidTwoPointLine(ScrnInfoPtr pScrn, int xa, int ya, + int xb, int yb, int flags) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + if (!(flags & OMIT_LAST)) + R5xxXAASubsequentSolidHorVertLine(pScrn, xb, yb, 1, DEGREES_0); + + RHDCSGrab(CS, 2 * 3); + + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_DST_LINE_START, (ya << 16) | xa); + RHDCSRegWrite(CS, R5XX_DST_LINE_END, (yb << 16) | xb); + + RHDCSAdvance(CS); +} + +/* + * Tests: xtest CH06/fllrctngl (also tests transparency) + */ +static void +R5xxXAASetupForScreenToScreenCopy(ScrnInfoPtr pScrn, int xdir, int ydir, int rop, + unsigned int planemask, int trans_color) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control; + + XaaPrivate->xdir = xdir; + XaaPrivate->ydir = ydir; + + control = XaaPrivate->control; + control |= R5XX_GMC_BRUSH_NONE | R5XX_GMC_SRC_DATATYPE_COLOR | + R5xxRops[rop].rop | R5XX_DP_SRC_SOURCE_MEMORY | + R5XX_GMC_SRC_PITCH_OFFSET_CNTL; + + /* Save for later clipping */ + XaaPrivate->control_saved = control; + + RHDCSGrab(CS, 2 * 3); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, control); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); + RHDCSRegWrite(CS, R5XX_DP_CNTL, + (xdir >= 0 ? R5XX_DST_X_LEFT_TO_RIGHT : 0) | + (ydir >= 0 ? R5XX_DST_Y_TOP_TO_BOTTOM : 0)); + + XaaPrivate->trans_color = trans_color; + if (trans_color != -1) + R5xxXAASetTransparency(CS, trans_color); +} + +/* + * + */ +static void +R5xxXAASubsequentScreenToScreenCopy(ScrnInfoPtr pScrn, int xa, int ya, + int xb, int yb, int w, int h) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + if (XaaPrivate->xdir < 0) { + xa += w - 1; + xb += w - 1; + } + + if (XaaPrivate->ydir < 0) { + ya += h - 1; + yb += h - 1; + } + + RHDCSGrab(CS, 2 * 5); + + RHDCSRegWrite(CS, R5XX_SRC_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_SRC_Y_X, (ya << 16) | xa); + RHDCSRegWrite(CS, R5XX_DST_Y_X, (yb << 16) | xb); + RHDCSRegWrite(CS, R5XX_DST_HEIGHT_WIDTH, (h << 16) | w); + + RHDCSAdvance(CS); +} + +/* + * Setup for XAA mono 8x8 pattern color expansion. Patterns with + * transparency use `bg == -1'. This routine is only used if the XAA + * pixmap cache is turned on. + * + * Tests: xtest XFree86/fllrctngl (no other test will test this routine with + * both transparency and non-transparency) + */ +static void +R5xxXAASetupForMono8x8PatternFill(ScrnInfoPtr pScrn, int patternx, int patterny, + int fg, int bg, int rop, unsigned int planemask) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control; + +#if X_BYTE_ORDER == X_BIG_ENDIAN + +#define CARD32SWAP(x) ((x) >> 24) | (((x) & 0x00FF0000) >> 8) | \ + (((x) & 0x0000FF00) << 8) | (((x) & 0x000000FF) << 24) + + patternx = CARD32SWAP(patternx); + patterny = CARD32SWAP(patterny); +#endif + + control = XaaPrivate->control | R5xxRops[rop].pattern; + if (bg != -1) + control |= R5XX_GMC_BRUSH_8X8_MONO_FG_BG; + else + control |= R5XX_GMC_BRUSH_8X8_MONO_FG_LA; +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + control |= R5XX_GMC_BYTE_MSB_TO_LSB; +#endif + + /* Save for later clipping */ + XaaPrivate->control_saved = control; + + if (bg != -1) + RHDCSGrab(CS, 2 * 6); + else + RHDCSGrab(CS, 2 * 5); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, control); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); + RHDCSRegWrite(CS, R5XX_DP_BRUSH_FRGD_CLR, fg); + if (bg != -1) + RHDCSRegWrite(CS, R5XX_DP_BRUSH_BKGD_CLR, bg); + + RHDCSRegWrite(CS, R5XX_BRUSH_DATA0, patternx); + RHDCSRegWrite(CS, R5XX_BRUSH_DATA1, patterny); +} + +/* + * Subsequent XAA 8x8 pattern color expansion. Because they are used in + * the setup function, `patternx' and `patterny' are not used here. + */ +static void +R5xxXAASubsequentMono8x8PatternFillRect(ScrnInfoPtr pScrn, + int patternx, int patterny, + int x, int y, int w, int h) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + RHDCSGrab(CS, 2 * 4); + + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_BRUSH_Y_X, (patterny << 8) | patternx); + RHDCSRegWrite(CS, R5XX_DST_Y_X, (y << 16) | x); + RHDCSRegWrite(CS, R5XX_DST_HEIGHT_WIDTH, (h << 16) | w); + + RHDCSAdvance(CS); +} + +/* + * Setup for XAA indirect CPU-to-screen color expansion (indirect). + * Because of how the scratch buffer is initialized, this is really a + * mainstore-to-screen color expansion. Transparency is supported when + * `bg == -1'. + * We always need to provide the bg here, otherwise the engine locks. + */ +static void +R5xxXAASetupForScanlineCPUToScreenColorExpandFillMMIO(ScrnInfoPtr pScrn, int fg, int bg, + int rop, unsigned int planemask) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control = XaaPrivate->control; + + XaaPrivate->scanline_bpp = 0; + + control |= R5XX_GMC_DST_CLIPPING | R5XX_GMC_BRUSH_NONE | + R5xxRops[rop].rop | R5XX_DP_SRC_SOURCE_HOST_DATA; + + if (bg == -1) + control |= R5XX_GMC_SRC_DATATYPE_MONO_FG_LA; + else + control |= R5XX_GMC_SRC_DATATYPE_MONO_FG_BG; + +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + control |= R5XX_GMC_BYTE_LSB_TO_MSB; +#else + control |= R5XX_GMC_BYTE_MSB_TO_LSB; +#endif + + /* Save for later clipping */ + XaaPrivate->control_saved = control; + +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + RHDCSGrab(CS, 2 * 4); +#else + RHDCSGrab(CS, 2 * 5); + + RHDCSRegWrite(CS, R5XX_RBBM_GUICNTL, R5XX_HOST_DATA_SWAP_NONE); +#endif + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, control); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); + RHDCSRegWrite(CS, R5XX_DP_SRC_FRGD_CLR, fg); + RHDCSRegWrite(CS, R5XX_DP_SRC_BKGD_CLR, bg); +} + +/* + * Subsequent XAA indirect CPU-to-screen color expansion. This is only + * called once for each rectangle. + */ +static void +R5xxXAASubsequentScanlineCPUToScreenColorExpandFillMMIO(ScrnInfoPtr pScrn, int x, int y, + int w, int h, int skipleft) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + XaaPrivate->scanline_h = h; + XaaPrivate->scanline_words = (w + 31) >> 5; + + RHDCSGrab(CS, 2 * 5); + + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_SC_TOP_LEFT, (y << 16) | ((x + skipleft) & 0xffff)); + RHDCSRegWrite(CS, R5XX_SC_BOTTOM_RIGHT, ((y + h) << 16) | ((x + w) & 0xffff)); + RHDCSRegWrite(CS, R5XX_DST_Y_X, (y << 16) | (x & 0xffff)); + /* Have to pad the width here and use clipping engine */ + RHDCSRegWrite(CS, R5XX_DST_HEIGHT_WIDTH, (h << 16) | ((w + 31) & ~31)); + + RHDCSAdvance(CS); +} + +/* + * Subsequent XAA indirect CPU-to-screen color expansion and indirect + * image write. This is called once for each scanline. + */ +static void +R5xxXAASubsequentScanlineMMIO(ScrnInfoPtr pScrn, int bufno) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 *p = (CARD32 *) XaaPrivate->BufferHook[bufno]; + int i, remainder, left = XaaPrivate->scanline_words; + CARD16 Reg; + + XaaPrivate->scanline_h--; + + if (XaaPrivate->scanline_h) + remainder = 8; + else + remainder = 9; + + while (left > remainder) { + Reg = R5XX_HOST_DATA0; + + RHDCSGrab(CS, 2 * 8); + for (i = 0; i < 8; i++, Reg += 4) + RHDCSRegWrite(CS, Reg, *p++); + + left -= 8; + } + + if (XaaPrivate->scanline_h) + Reg = R5XX_HOST_DATA7; + else + Reg = R5XX_HOST_DATA_LAST; /* Last scanline - finish write to DATA_LAST */ + + Reg -= 4 * (left - 1); + + RHDCSGrab(CS, 2 * left); + for (i = 0; i < left; i++, Reg += 4) + RHDCSRegWrite(CS, Reg, *p++); + + if (!(XaaPrivate->scanline_h % 32)) /* don't push too big an amount of data */ + RHDCSAdvance(CS); +} + +/* + * Setup for XAA indirect image write + */ +static void +R5xxXAASetupForScanlineImageWriteMMIO(ScrnInfoPtr pScrn, int rop, unsigned int planemask, + int trans_color, int bpp, int depth) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control = XaaPrivate->control; + + XaaPrivate->scanline_bpp = bpp; + + control |= R5XX_GMC_DST_CLIPPING | R5XX_GMC_BRUSH_NONE | + R5XX_GMC_SRC_DATATYPE_COLOR | R5xxRops[rop].rop | + R5XX_GMC_BYTE_MSB_TO_LSB | R5XX_DP_SRC_SOURCE_HOST_DATA; + + /* Save for later clipping */ + XaaPrivate->control_saved = control; + +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + RHDCSGrab(CS, 2 * 2); +#else + RHDCSGrab(CS, 2 * 3); + + if (bpp == 16) + RHDCSRegWrite(CS, R5XX_RBBM_GUICNTL, R5XX_HOST_DATA_SWAP_16BIT); + else if (bpp == 32) + RHDCSRegWrite(CS, R5XX_RBBM_GUICNTL, R5XX_HOST_DATA_SWAP_32BIT); + else + RHDCSRegWrite(CS, R5XX_RBBM_GUICNTL, R5XX_HOST_DATA_SWAP_NONE); +#endif + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, control); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); + + XaaPrivate->trans_color = trans_color; + if (trans_color != -1) + R5xxXAASetTransparency(CS, trans_color); +} + +/* + * + */ +static void +R5xxXAASubsequentScanlineImageWriteRectMMIO(ScrnInfoPtr pScrn, int x, int y, + int w, int h, int skipleft) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + int shift = 0; /* 32bpp */ + + if (pScrn->bitsPerPixel == 8) + shift = 3; + else if (pScrn->bitsPerPixel == 16) + shift = 1; + + XaaPrivate->scanline_h = h; + XaaPrivate->scanline_words = (w * XaaPrivate->scanline_bpp + 31) >> 5; + + RHDCSGrab(CS, 2 * 5); + RHDCSRegWrite(CS, R5XX_DST_PITCH_OFFSET, XaaPrivate->dst_pitch_offset); + RHDCSRegWrite(CS, R5XX_SC_TOP_LEFT, (y << 16) | ((x + skipleft) & 0xffff)); + RHDCSRegWrite(CS, R5XX_SC_BOTTOM_RIGHT, ((y + h) << 16) | ((x + w) & 0xffff)); + RHDCSRegWrite(CS, R5XX_DST_Y_X, (y << 16) | (x & 0xffff)); + /* Have to pad the width here and use clipping engine */ + RHDCSRegWrite(CS, R5XX_DST_HEIGHT_WIDTH, (h << 16) | ((w + shift) & ~shift)); + + RHDCSAdvance(CS); +} + +/* + * Helper function to write out a HOSTDATA_BLT packet into the indirect + * buffer and set the XAA scratch buffer address appropriately. + */ +static void +R5xxXAACPScanlinePacket(struct RhdCS *CS, struct R5xxXaaPrivate *XaaPrivate) +{ + int chunk_words = XaaPrivate->scanline_hpass * XaaPrivate->scanline_words; + + RHDCSGrab(CS, chunk_words + 10); + + RHDCSWrite(CS, CP_PACKET3(R5XX_CP_PACKET3_CNTL_HOSTDATA_BLT,chunk_words+10-2)); + RHDCSWrite(CS, XaaPrivate->control_saved); + RHDCSWrite(CS, XaaPrivate->dst_pitch_offset); + RHDCSWrite(CS, (XaaPrivate->scanline_y << 16) | + (XaaPrivate->scanline_x1clip & 0xffff)); + RHDCSWrite(CS, ((XaaPrivate->scanline_y + XaaPrivate->scanline_hpass) << 16) | + (XaaPrivate->scanline_x2clip & 0xffff)); + RHDCSWrite(CS, XaaPrivate->scanline_fg); + RHDCSWrite(CS, XaaPrivate->scanline_bg); + RHDCSWrite(CS, (XaaPrivate->scanline_y << 16) | + (XaaPrivate->scanline_x & 0xffff)); + RHDCSWrite(CS, (XaaPrivate->scanline_hpass << 16) | + (XaaPrivate->scanline_w & 0xffff)); + RHDCSWrite(CS, chunk_words); + + XaaPrivate->BufferHook[0] = (CARD8 *) &(CS->Buffer[CS->Wptr]); + CS->Wptr += chunk_words; + + XaaPrivate->scanline_y += XaaPrivate->scanline_hpass; + XaaPrivate->scanline_h -= XaaPrivate->scanline_hpass; +} + +/* + * Setup for XAA indirect CPU-to-screen color expansion (indirect). + * Because of how the scratch buffer is initialized, this is really a + * mainstore-to-screen color expansion. Transparency is supported when + * `bg == -1'. + */ +static void +R5xxXAASetupForScanlineCPUToScreenColorExpandFillCP(ScrnInfoPtr pScrn, int fg, + int bg, int rop, unsigned int planemask) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control = XaaPrivate->control; + + XaaPrivate->scanline_bpp = 0; + + control |= R5XX_GMC_DST_CLIPPING | R5XX_GMC_BRUSH_NONE | + R5xxRops[rop].rop | R5XX_DP_SRC_SOURCE_HOST_DATA; + + if (bg == -1) + control |= R5XX_GMC_SRC_DATATYPE_MONO_FG_LA; + else + control |= R5XX_GMC_SRC_DATATYPE_MONO_FG_BG; + +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + control |= R5XX_GMC_BYTE_LSB_TO_MSB; +#else + control |= R5XX_GMC_BYTE_MSB_TO_LSB; +#endif + + XaaPrivate->control_saved = control; + + XaaPrivate->scanline_fg = fg; + XaaPrivate->scanline_bg = bg; + + RHDCSGrab(CS, 2 * 1); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); +} + +/* + * Subsequent XAA indirect CPU-to-screen color expansion. This is only + * called once for each rectangle. + */ +static void +R5xxXAASubsequentScanlineCPUToScreenColorExpandFillCP(ScrnInfoPtr pScrn, int x, int y, + int w, int h, int skipleft) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + XaaPrivate->scanline_x = x; + XaaPrivate->scanline_y = y; + /* Have to pad the width here and use clipping engine */ + XaaPrivate->scanline_w = (w + 31) & ~31; + XaaPrivate->scanline_h = h; + + XaaPrivate->scanline_x1clip = x + skipleft; + XaaPrivate->scanline_x2clip = x + w; + + XaaPrivate->scanline_words = XaaPrivate->scanline_w / 32; + XaaPrivate->scanline_hpass = + min(XaaPrivate->scanline_h, ((CS->Size - 10) / XaaPrivate->scanline_words)); + + R5xxXAACPScanlinePacket(CS, XaaPrivate); +} + +#if X_BYTE_ORDER == X_BIG_ENDIAN + +static inline void +R5xxXAAScanlineSwap16(unsigned int *Buf, unsigned int nwords) +{ + unsigned int *d = Buf; + unsigned int *s = Buf; + + for (; nwords > 0; --nwords, ++d, ++s) + *d = ((*s & 0xffff) << 16) | ((*s >> 16) & 0xffff); +} + +static inline void +R5xxXAAScanlineSwap8(unsigned int *Buf, unsigned int nwords) +{ + unsigned int *d = Buf; + unsigned int *s = Buf; + + for (; nwords > 0; --nwords, ++d, ++s) +#ifdef __powerpc__ + asm volatile("stwbrx %0,0,%1" : : "r" (*s), "r" (d)); +#else + *d = ((*s >> 24) & 0xff) | ((*s >> 8) & 0xff00) + | ((*s & 0xff00) << 8) | ((*s & 0xff) << 24); +#endif +} + +#endif /* X_BYTE_ORDER */ + +/* + * Subsequent XAA indirect CPU-to-screen color expansion and indirect + * image write. This is called once for each scanline. + */ +static void +R5xxXAASubsequentScanlineCP(ScrnInfoPtr pScrn, int bufno) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + if (bufno) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: buffer number provided (%d)\n", __func__, bufno); + return; + } + +#if X_BYTE_ORDER == X_BIG_ENDIAN + if (XaaPrivate->scanline_bpp == 16) + R5xxXAAScanlineSwap16((unsigned int *)XaaPrivate->BufferHook[0], + XaaPrivate->scanline_words); + else if (XaaPrivate->scanline_bpp < 15) + R5xxXAAScanlineSwap8((unsigned int *)XaaPrivate->BufferHook[0], + XaaPrivate->scanline_words); +#endif + + if (--XaaPrivate->scanline_hpass) { + XaaPrivate->BufferHook[0] += 4 * XaaPrivate->scanline_words; + } else if (XaaPrivate->scanline_h) { + XaaPrivate->scanline_hpass = + min(XaaPrivate->scanline_h, ((CS->Size - 10) / XaaPrivate->scanline_words)); + R5xxXAACPScanlinePacket(CS, XaaPrivate); + } +} + +/* + * Setup for XAA indirect image write + */ +static void +R5xxXAASetupForScanlineImageWriteCP(ScrnInfoPtr pScrn, int rop, unsigned int planemask, + int trans_color, int bpp, int depth) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + CARD32 control = XaaPrivate->control; + + XaaPrivate->scanline_bpp = bpp; + + control |= R5XX_GMC_DST_CLIPPING | R5XX_GMC_BRUSH_NONE | + R5XX_GMC_SRC_DATATYPE_COLOR | R5xxRops[rop].rop | + R5XX_GMC_BYTE_MSB_TO_LSB | R5XX_DP_SRC_SOURCE_HOST_DATA; + + /* Save for later clipping */ + XaaPrivate->control_saved = control; + + RHDCSGrab(CS, 2 * 2); + + RHDCSRegWrite(CS, R5XX_DP_GUI_MASTER_CNTL, control); + RHDCSRegWrite(CS, R5XX_DP_WRITE_MASK, planemask); + + XaaPrivate->trans_color = trans_color; + if (trans_color != -1) + R5xxXAASetTransparency(CS, trans_color); +} + +/* + * Subsequent XAA indirect image write. This is only called once for + * each rectangle. + */ +static void +R5xxXAASubsequentScanlineImageWriteRectCP(ScrnInfoPtr pScrn, int x, int y, + int w, int h, int skipleft) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + int pad; + + switch (pScrn->bitsPerPixel) { + case 8: + pad = 3; + break; + case 16: + pad = 1; + break; + case 32: + pad = 0; + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: unhandled bpp: %d\n", + __func__, pScrn->bitsPerPixel); + pad = 0; + } + + XaaPrivate->scanline_x = x; + XaaPrivate->scanline_y = y; + /* Have to pad the width here and use clipping engine */ + XaaPrivate->scanline_w = (w + pad) & ~pad; + XaaPrivate->scanline_h = h; + + XaaPrivate->scanline_x1clip = x + skipleft; + XaaPrivate->scanline_x2clip = x + w; + + XaaPrivate->scanline_words = (w * XaaPrivate->scanline_bpp + 31) / 32; + XaaPrivate->scanline_hpass = + min(XaaPrivate->scanline_h, ((CS->Size - 10) / XaaPrivate->scanline_words)); + + R5xxXAACPScanlinePacket(CS, XaaPrivate); +} + +/* + * + */ +static void +R5xxXAAFunctionsInit(ScrnInfoPtr pScrn, ScreenPtr pScreen, XAAInfoRecPtr XAAInfo) +{ + struct R5xxXaaPrivate *XaaPrivate = RHDPTR(pScrn)->TwoDPrivate; + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + RHDFUNC(pScrn); + + XAAInfo->Flags = PIXMAP_CACHE | OFFSCREEN_PIXMAPS | LINEAR_FRAMEBUFFER; + + /* Sync */ + XAAInfo->Sync = R5xxXAAIdle; + + /* Clipping */ + XAAInfo->SetClippingRectangle = R5xxXAASetClippingRectangle; + XAAInfo->DisableClipping = R5xxXAADisableClipping; + XAAInfo->ClippingFlags = HARDWARE_CLIP_SOLID_LINE | HARDWARE_CLIP_DASHED_LINE | + /* HARDWARE_CLIP_SOLID_FILL | -- seems very slow with this on */ + HARDWARE_CLIP_MONO_8x8_FILL | HARDWARE_CLIP_SCREEN_TO_SCREEN_COPY; + + /* Solid Filled Rectangle */ + XAAInfo->PolyFillRectSolidFlags = 0; + XAAInfo->SetupForSolidFill = R5xxXAASetupForSolidFill; + XAAInfo->SubsequentSolidFillRect = R5xxXAASubsequentSolidFillRect; + + /* Solid Lines + * + * R5XX only supports 14 bits for lines and clipping and only draws lines + * that are completely on-screen correctly. This will cause display + * corruption problem in the cases when out-of-range commands are issued, + * like when dimming screen during GNOME logout in dual-head setup. Solid + * and dashed lines are therefore limited to the virtual screen. + */ + XAAInfo->SolidLineFlags = LINE_LIMIT_COORDS; + XAAInfo->SolidLineLimits.x1 = 0; + XAAInfo->SolidLineLimits.y1 = 0; + XAAInfo->SolidLineLimits.x2 = pScrn->virtualX - 1; + XAAInfo->SolidLineLimits.y2 = pScrn->virtualY - 1; + + /* Call miSetZeroLineBias() to have mi/mfb/fb routines match + hardware accel two point lines */ + miSetZeroLineBias(pScreen, OCTANT5 | OCTANT6 | OCTANT7 | OCTANT8); + + XAAInfo->SetupForSolidLine = R5xxXAASetupForSolidLine; + XAAInfo->SubsequentSolidHorVertLine = R5xxXAASubsequentSolidHorVertLine; + XAAInfo->SubsequentSolidTwoPointLine = R5xxXAASubsequentSolidTwoPointLine; + + /* Screen-to-screen Copy */ + XAAInfo->ScreenToScreenCopyFlags = 0; + XAAInfo->SetupForScreenToScreenCopy = R5xxXAASetupForScreenToScreenCopy; + XAAInfo->SubsequentScreenToScreenCopy = R5xxXAASubsequentScreenToScreenCopy; + + /* Mono 8x8 Pattern Fill (Color Expand) */ + XAAInfo->Mono8x8PatternFillFlags = HARDWARE_PATTERN_PROGRAMMED_BITS | + HARDWARE_PATTERN_PROGRAMMED_ORIGIN | HARDWARE_PATTERN_SCREEN_ORIGIN; +#if X_BYTE_ORDER == X_LITTLE_ENDIAN + XAAInfo->Mono8x8PatternFillFlags |= BIT_ORDER_IN_BYTE_MSBFIRST; +#else + XAAInfo->Mono8x8PatternFillFlags |= BIT_ORDER_IN_BYTE_LSBFIRST; +#endif + XAAInfo->SetupForMono8x8PatternFill = R5xxXAASetupForMono8x8PatternFill; + XAAInfo->SubsequentMono8x8PatternFillRect = R5xxXAASubsequentMono8x8PatternFillRect; + + /* In the MMIO Case, we buffer the scanline */ + if (CS->Type == RHD_CS_MMIO) { + if (!XaaPrivate->Buffer) + XaaPrivate->Buffer = xnfcalloc(1, ((pScrn->virtualX + 31) / 32 * 4) + + (pScrn->virtualX * (pScrn->bitsPerPixel / 8))); + XaaPrivate->BufferHook[0] = XaaPrivate->Buffer; + } + + /* Indirect CPU-To-Screen Color Expand + * + * R5XX gets upset, when using HOST provided data without a source rop. + * To show run 'xtest's drwarc. + */ + XAAInfo->ScanlineCPUToScreenColorExpandFillFlags = + LEFT_EDGE_CLIPPING | ROP_NEEDS_SOURCE | LEFT_EDGE_CLIPPING_NEGATIVE_X; + XAAInfo->NumScanlineColorExpandBuffers = 1; + XAAInfo->ScanlineColorExpandBuffers = XaaPrivate->BufferHook; + + if (CS->Type == RHD_CS_MMIO) { + XAAInfo->SetupForScanlineCPUToScreenColorExpandFill + = R5xxXAASetupForScanlineCPUToScreenColorExpandFillMMIO; + XAAInfo->SubsequentScanlineCPUToScreenColorExpandFill + = R5xxXAASubsequentScanlineCPUToScreenColorExpandFillMMIO; + XAAInfo->SubsequentColorExpandScanline = R5xxXAASubsequentScanlineMMIO; + } else { + XAAInfo->SetupForScanlineCPUToScreenColorExpandFill + = R5xxXAASetupForScanlineCPUToScreenColorExpandFillCP; + XAAInfo->SubsequentScanlineCPUToScreenColorExpandFill + = R5xxXAASubsequentScanlineCPUToScreenColorExpandFillCP; + XAAInfo->SubsequentColorExpandScanline = R5xxXAASubsequentScanlineCP; + } + + /* ImageWrite */ + XAAInfo->ScanlineImageWriteFlags = CPU_TRANSFER_PAD_DWORD | + /* R5XX gets upset, when using HOST provided data without a source rop. + To show run 'xtest's ptimg */ + ROP_NEEDS_SOURCE | + SCANLINE_PAD_DWORD | LEFT_EDGE_CLIPPING | LEFT_EDGE_CLIPPING_NEGATIVE_X; + + /* Performance tests show that we shouldn't use MMIOed GXcopy for uploads + as a memcpy is faster */ + if (CS->Type == RHD_CS_MMIO) + XAAInfo->ScanlineImageWriteFlags |= NO_GXCOPY; + + XAAInfo->NumScanlineImageWriteBuffers = 1; + XAAInfo->ScanlineImageWriteBuffers = XaaPrivate->BufferHook; + + if (CS->Type == RHD_CS_MMIO) { + XAAInfo->SetupForScanlineImageWrite = R5xxXAASetupForScanlineImageWriteMMIO; + XAAInfo->SubsequentScanlineImageWriteRect = R5xxXAASubsequentScanlineImageWriteRectMMIO; + XAAInfo->SubsequentImageWriteScanline = R5xxXAASubsequentScanlineMMIO; + } else { + XAAInfo->SetupForScanlineImageWrite = R5xxXAASetupForScanlineImageWriteCP; + XAAInfo->SubsequentScanlineImageWriteRect = R5xxXAASubsequentScanlineImageWriteRectCP; + XAAInfo->SubsequentImageWriteScanline = R5xxXAASubsequentScanlineCP; + } +} + +/* + * Initialize memory manager. + */ +static void +R5xxXAAFBInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + BoxRec AvailFBArea; + int tmp = 0; + + tmp = rhdPtr->FbScanoutSize + rhdPtr->FbOffscreenSize; + tmp /= pScrn->displayWidth * (pScrn->bitsPerPixel >> 3); + + /* BoxRec Members are limited to 16bit signed, but the acceleration engine + can only use 8191 lines anyway. */ + if (tmp > 0x1FFF) + tmp = 0x1FFF; + + AvailFBArea.x1 = 0; + AvailFBArea.y1 = 0; + AvailFBArea.x2 = pScrn->displayWidth; + AvailFBArea.y2 = tmp; + + xf86InitFBManager(pScreen, &AvailFBArea); + + /* Calculate how much offscreen memory / pixmap cache we are using */ + tmp -= pScrn->virtualY; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d scanlines of offscreen memory\n", tmp); +} + +/* + * + */ +static void +R5xxXaaPrivateInit(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct R5xxXaaPrivate *XaaPrivate = + xnfcalloc(1, sizeof(struct R5xxXaaPrivate)); + + XaaPrivate->control = + (R5xx2DDatatypeGet(pScrn) << R5XX_GMC_DST_DATATYPE_SHIFT) | + R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_DST_PITCH_OFFSET_CNTL; + + XaaPrivate->dst_pitch_offset = + (((pScrn->displayWidth * (pScrn->bitsPerPixel / 8)) / 64) << 22) | + ((rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart) >> 10); + + rhdPtr->TwoDPrivate = XaaPrivate; +} + +/* + * + */ +static void +R5xxXaaPrivateDestroy(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct R5xxXaaPrivate *XaaPrivate = rhdPtr->TwoDPrivate; + + if (!XaaPrivate) + return; + + if (XaaPrivate->Buffer) + xfree(XaaPrivate->Buffer); + + xfree(XaaPrivate); + rhdPtr->TwoDPrivate = NULL; +} + +/* + * + */ +Bool +R5xxXAAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + XAAInfoRecPtr XAAInfo; + + XAAInfo = XAACreateInfoRec(); + if (!XAAInfo) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: XAACreateInfoRec failed.\n", __func__); + return FALSE; + } + + /* need to do this before FunctionsInit */ + R5xxXaaPrivateInit(pScrn); + + R5xxXAAFunctionsInit(pScrn, pScreen, XAAInfo); + + R5xxXAAFBInit(pScrn, pScreen); + + if (!XAAInit(pScreen, XAAInfo)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: XAAInit failed.\n", + __func__); + XAADestroyInfoRec(XAAInfo); + R5xxXaaPrivateDestroy(pScrn); + return FALSE; + } + + rhdPtr->XAAInfo = XAAInfo; + + return TRUE; +} + +/* + * + */ +void +R5xxXAADestroy(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + if (rhdPtr->XAAInfo) { + XAADestroyInfoRec(rhdPtr->XAAInfo); + rhdPtr->XAAInfo = NULL; + } + + R5xxXaaPrivateDestroy(pScrn); +} diff --git a/driver/xf86-video-radeonhd/src/r600_exa.c b/driver/xf86-video-radeonhd/src/r600_exa.c new file mode 100644 index 000000000..e68195b4a --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_exa.c @@ -0,0 +1,2164 @@ +/* + * Copyright 2008 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 (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 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. + * + * Author: Alex Deucher + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "exa.h" + +#include "rhd.h" +#include "rhd_cs.h" +#include "r6xx_accel.h" +#include "r600_shader.h" +#include "r600_reg.h" +#include "r600_state.h" + +/* #define SHOW_VERTEXES */ + +# define RADEON_ROP3_ZERO 0x00000000 +# define RADEON_ROP3_DSa 0x00880000 +# define RADEON_ROP3_SDna 0x00440000 +# define RADEON_ROP3_S 0x00cc0000 +# define RADEON_ROP3_DSna 0x00220000 +# define RADEON_ROP3_D 0x00aa0000 +# define RADEON_ROP3_DSx 0x00660000 +# define RADEON_ROP3_DSo 0x00ee0000 +# define RADEON_ROP3_DSon 0x00110000 +# define RADEON_ROP3_DSxn 0x00990000 +# define RADEON_ROP3_Dn 0x00550000 +# define RADEON_ROP3_SDno 0x00dd0000 +# define RADEON_ROP3_Sn 0x00330000 +# define RADEON_ROP3_DSno 0x00bb0000 +# define RADEON_ROP3_DSan 0x00770000 +# define RADEON_ROP3_ONE 0x00ff0000 + +uint32_t RADEON_ROP[16] = { + RADEON_ROP3_ZERO, /* GXclear */ + RADEON_ROP3_DSa, /* Gxand */ + RADEON_ROP3_SDna, /* GXandReverse */ + RADEON_ROP3_S, /* GXcopy */ + RADEON_ROP3_DSna, /* GXandInverted */ + RADEON_ROP3_D, /* GXnoop */ + RADEON_ROP3_DSx, /* GXxor */ + RADEON_ROP3_DSo, /* GXor */ + RADEON_ROP3_DSon, /* GXnor */ + RADEON_ROP3_DSxn, /* GXequiv */ + RADEON_ROP3_Dn, /* GXinvert */ + RADEON_ROP3_SDno, /* GXorReverse */ + RADEON_ROP3_Sn, /* GXcopyInverted */ + RADEON_ROP3_DSno, /* GXorInverted */ + RADEON_ROP3_DSan, /* GXnand */ + RADEON_ROP3_ONE, /* GXset */ +}; + +static void +R600DoneSolid(PixmapPtr pPix); + +static void +R600DoneComposite(PixmapPtr pDst); + +static Bool +R600PrepareSolid(PixmapPtr pPix, int alu, Pixel pm, Pixel fg) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + cb_config_t cb_conf; + shader_config_t vs_conf, ps_conf; + int pmask = 0; + uint32_t a, r, g, b; + float ps_alu_consts[4]; + + accel_state->dst_mc_addr = exaGetPixmapOffset(pPix) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + accel_state->dst_size = exaGetPixmapPitch(pPix) * pPix->drawable.height; + accel_state->dst_pitch = exaGetPixmapPitch(pPix) / (pPix->drawable.bitsPerPixel / 8); + + /* bad pitch */ + if (accel_state->dst_pitch & 7) + return FALSE; + + /* bad offset */ + if (accel_state->dst_mc_addr & 0xff) + return FALSE; + + if (pPix->drawable.bitsPerPixel == 24) + return FALSE; + + CLEAR (cb_conf); + CLEAR (vs_conf); + CLEAR (ps_conf); + + /* return FALSE; */ + +#ifdef SHOW_VERTEXES + ErrorF("%dx%d @ %dbpp, 0x%08x\n", pPix->drawable.width, pPix->drawable.height, + pPix->drawable.bitsPerPixel, exaGetPixmapPitch(pPix)); +#endif + + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + + /* Init */ + start_3d(pScrn, accel_state->ib); + + /* cp_set_surface_sync(pScrn, accel_state->ib); */ + + set_default_state(pScrn, accel_state->ib); + + /* Scissor / viewport */ + EREG(accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG(accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); + + accel_state->vs_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->solid_vs_offset; + accel_state->ps_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->solid_ps_offset; + accel_state->vs_size = 512; + accel_state->ps_size = 512; + + /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + + vs_conf.shader_addr = accel_state->vs_mc_addr; + vs_conf.num_gprs = 2; + vs_conf.stack_size = 0; + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); + + ps_conf.shader_addr = accel_state->ps_mc_addr; + ps_conf.num_gprs = 1; + ps_conf.stack_size = 0; + ps_conf.uncached_first_inst = 1; + ps_conf.clamp_consts = 0; + ps_conf.export_mode = 2; + ps_setup (pScrn, accel_state->ib, &ps_conf); + + /* Render setup */ + if (pm & 0x000000ff) + pmask |= 4; /* B */ + if (pm & 0x0000ff00) + pmask |= 2; /* G */ + if (pm & 0x00ff0000) + pmask |= 1; /* R */ + if (pm & 0xff000000) + pmask |= 8; /* A */ + EREG(accel_state->ib, CB_SHADER_MASK, (pmask << OUTPUT0_ENABLE_shift)); + EREG(accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + EREG(accel_state->ib, CB_COLOR_CONTROL, RADEON_ROP[alu]); + + + cb_conf.id = 0; + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = pPix->drawable.height; + cb_conf.base = accel_state->dst_mc_addr; + + if (pPix->drawable.bitsPerPixel == 8) { + cb_conf.format = COLOR_8; + cb_conf.comp_swap = 3; /* A */ + } else if (pPix->drawable.bitsPerPixel == 16) { + cb_conf.format = COLOR_5_6_5; + cb_conf.comp_swap = 2; /* RGB */ + } else { + cb_conf.format = COLOR_8_8_8_8; + cb_conf.comp_swap = 1; /* ARGB */ + } + cb_conf.source_format = 1; + cb_conf.blend_clamp = 1; + set_render_target(pScrn, accel_state->ib, &cb_conf); + + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ + + /* Interpolator setup */ + /* one unused export from VS (VS_EXPORT_COUNT is zero based, count minus one) */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, (0 << VS_EXPORT_COUNT_shift)); + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + + /* Enabling flat shading needs both FLAT_SHADE_bit in SPI_PS_INPUT_CNTL_x + * *and* FLAT_SHADE_ENA_bit in SPI_INTERP_CONTROL_0 */ + /* no VS exports as PS input (NUM_INTERP is not zero based, no minus one) */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, (0 << NUM_INTERP_shift)); + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + /* color semantic id 0 -> GPR[0] */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x03 << DEFAULT_VAL_shift) | + FLAT_SHADE_bit | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, FLAT_SHADE_ENA_bit | 0); + + /* PS alu constants */ + if (pPix->drawable.bitsPerPixel == 16) { + r = (fg >> 11) & 0x1f; + g = (fg >> 5) & 0x3f; + b = (fg >> 0) & 0x1f; + ps_alu_consts[0] = (float)r / 31; /* R */ + ps_alu_consts[1] = (float)g / 63; /* G */ + ps_alu_consts[2] = (float)b / 31; /* B */ + ps_alu_consts[3] = 1.0; /* A */ + } else if (pPix->drawable.bitsPerPixel == 8) { + a = (fg >> 0) & 0xff; + ps_alu_consts[0] = 0.0; /* R */ + ps_alu_consts[1] = 0.0; /* G */ + ps_alu_consts[2] = 0.0; /* B */ + ps_alu_consts[3] = (float)a / 255; /* A */ + } else { + a = (fg >> 24) & 0xff; + r = (fg >> 16) & 0xff; + g = (fg >> 8) & 0xff; + b = (fg >> 0) & 0xff; + ps_alu_consts[0] = (float)r / 255; /* R */ + ps_alu_consts[1] = (float)g / 255; /* G */ + ps_alu_consts[2] = (float)b / 255; /* B */ + ps_alu_consts[3] = (float)a / 255; /* A */ + } + set_alu_consts(pScrn, accel_state->ib, 0, sizeof(ps_alu_consts) / SQ_ALU_CONSTANT_offset, ps_alu_consts); + + accel_state->vb_index = 0; + +#ifdef SHOW_VERTEXES + ErrorF("PM: 0x%08x\n", pm); +#endif + + return TRUE; +} + + +static void +R600Solid(PixmapPtr pPix, int x1, int y1, int x2, int y2) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + float *vb; + + if (((accel_state->vb_index + 3) * 8) > (accel_state->ib->total / 2)) { + R600DoneSolid(pPix); + accel_state->vb_index = 0; + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + } + + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 8); + + vb[0] = (float)x1; + vb[1] = (float)y1; + + vb[2] = (float)x1; + vb[3] = (float)y2; + + vb[4] = (float)x2; + vb[5] = (float)y2; + + accel_state->vb_index += 3; + +} + +static void +R600DoneSolid(PixmapPtr pPix) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + draw_config_t draw_conf; + vtx_resource_t vtx_res; + + CLEAR (draw_conf); + CLEAR (vtx_res); + + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = RHDDRIGetIntGARTLocation(pScrn) + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + accel_state->vb_size = accel_state->vb_index * 8; + + /* flush vertex cache */ + if ((rhdPtr->ChipSet == RHD_RV610) || + (rhdPtr->ChipSet == RHD_RV620) || + (rhdPtr->ChipSet == RHD_M72) || + (rhdPtr->ChipSet == RHD_M74) || + (rhdPtr->ChipSet == RHD_M82) || + (rhdPtr->ChipSet == RHD_RS780) || + (rhdPtr->ChipSet == RHD_RS880) || + (rhdPtr->ChipSet == RHD_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + /* Vertex buffer setup */ + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 8 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + /* Draw */ + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + /* sync dst surface */ + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); +} + +static void +R600DoPrepareCopy(ScrnInfoPtr pScrn, + int src_pitch, int src_width, int src_height, uint32_t src_offset, int src_bpp, + int dst_pitch, int dst_height, uint32_t dst_offset, int dst_bpp, + int rop, Pixel planemask) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + int pmask = 0; + cb_config_t cb_conf; + tex_resource_t tex_res; + tex_sampler_t tex_samp; + shader_config_t vs_conf, ps_conf; + + CLEAR (cb_conf); + CLEAR (tex_res); + CLEAR (tex_samp); + CLEAR (vs_conf); + CLEAR (ps_conf); + + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + + /* Init */ + start_3d(pScrn, accel_state->ib); + + /* cp_set_surface_sync(pScrn, accel_state->ib); */ + + set_default_state(pScrn, accel_state->ib); + + /* Scissor / viewport */ + EREG(accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG(accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); + + accel_state->vs_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->copy_vs_offset; + accel_state->ps_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->copy_ps_offset; + accel_state->vs_size = 512; + accel_state->ps_size = 512; + + /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + + vs_conf.shader_addr = accel_state->vs_mc_addr; + vs_conf.num_gprs = 2; + vs_conf.stack_size = 0; + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); + + ps_conf.shader_addr = accel_state->ps_mc_addr; + ps_conf.num_gprs = 1; + ps_conf.stack_size = 0; + ps_conf.uncached_first_inst = 1; + ps_conf.clamp_consts = 0; + ps_conf.export_mode = 2; + ps_setup (pScrn, accel_state->ib, &ps_conf); + + accel_state->src_size[0] = src_pitch * src_height * (src_bpp/8); + accel_state->src_mc_addr[0] = src_offset; + accel_state->src_pitch[0] = src_pitch; + accel_state->src_width[0] = src_width; + accel_state->src_height[0] = src_height; + accel_state->src_bpp[0] = src_bpp; + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[0], accel_state->src_mc_addr[0]); + + /* Texture */ + tex_res.id = 0; + tex_res.w = src_width; + tex_res.h = src_height; + tex_res.pitch = accel_state->src_pitch[0]; + tex_res.depth = 0; + tex_res.dim = SQ_TEX_DIM_2D; + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; + if (src_bpp == 8) { + tex_res.format = FMT_8; + tex_res.dst_sel_x = SQ_SEL_1; /* R */ + tex_res.dst_sel_y = SQ_SEL_1; /* G */ + tex_res.dst_sel_z = SQ_SEL_1; /* B */ + tex_res.dst_sel_w = SQ_SEL_X; /* A */ + } else if (src_bpp == 16) { + tex_res.format = FMT_5_6_5; + tex_res.dst_sel_x = SQ_SEL_Z; /* R */ + tex_res.dst_sel_y = SQ_SEL_Y; /* G */ + tex_res.dst_sel_z = SQ_SEL_X; /* B */ + tex_res.dst_sel_w = SQ_SEL_1; /* A */ + } else { + tex_res.format = FMT_8_8_8_8; + tex_res.dst_sel_x = SQ_SEL_Z; /* R */ + tex_res.dst_sel_y = SQ_SEL_Y; /* G */ + tex_res.dst_sel_z = SQ_SEL_X; /* B */ + tex_res.dst_sel_w = SQ_SEL_W; /* A */ + } + + tex_res.request_size = 1; + tex_res.base_level = 0; + tex_res.last_level = 0; + tex_res.perf_modulation = 0; + set_tex_resource (pScrn, accel_state->ib, &tex_res); + + tex_samp.id = 0; + tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_z = SQ_TEX_WRAP; + tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_POINT; + tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_POINT; + tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; + tex_samp.mip_filter = 0; /* no mipmap */ + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + + + /* Render setup */ + if (planemask & 0x000000ff) + pmask |= 4; /* B */ + if (planemask & 0x0000ff00) + pmask |= 2; /* G */ + if (planemask & 0x00ff0000) + pmask |= 1; /* R */ + if (planemask & 0xff000000) + pmask |= 8; /* A */ + EREG (accel_state->ib, CB_SHADER_MASK, (pmask << OUTPUT0_ENABLE_shift)); + EREG (accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + EREG (accel_state->ib, CB_COLOR_CONTROL, RADEON_ROP[rop]); + + accel_state->dst_size = dst_pitch * dst_height * (dst_bpp/8); + accel_state->dst_mc_addr = dst_offset; + accel_state->dst_pitch = dst_pitch; + accel_state->dst_height = dst_height; + accel_state->dst_bpp = dst_bpp; + + cb_conf.id = 0; + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = dst_height; + cb_conf.base = accel_state->dst_mc_addr; + if (dst_bpp == 8) { + cb_conf.format = COLOR_8; + cb_conf.comp_swap = 3; /* A */ + } else if (dst_bpp == 16) { + cb_conf.format = COLOR_5_6_5; + cb_conf.comp_swap = 2; /* RGB */ + } else { + cb_conf.format = COLOR_8_8_8_8; + cb_conf.comp_swap = 1; /* ARGB */ + } + cb_conf.source_format = 1; + cb_conf.blend_clamp = 1; + set_render_target(pScrn, accel_state->ib, &cb_conf); + + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ + + /* Interpolator setup */ + /* export tex coord from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((1 - 1) << VS_EXPORT_COUNT_shift)); + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + + /* Enabling flat shading needs both FLAT_SHADE_bit in SPI_PS_INPUT_CNTL_x + * *and* FLAT_SHADE_ENA_bit in SPI_INTERP_CONTROL_0 */ + /* input tex coord from VS */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, ((1 << NUM_INTERP_shift))); + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + /* color semantic id 0 -> GPR[0] */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x01 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, 0); + + accel_state->vb_index = 0; + +} + +static void +R600DoCopy(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + draw_config_t draw_conf; + vtx_resource_t vtx_res; + + CLEAR (draw_conf); + CLEAR (vtx_res); + + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = RHDDRIGetIntGARTLocation(pScrn) + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + accel_state->vb_size = accel_state->vb_index * 16; + + /* flush vertex cache */ + if ((rhdPtr->ChipSet == RHD_RV610) || + (rhdPtr->ChipSet == RHD_RV620) || + (rhdPtr->ChipSet == RHD_M72) || + (rhdPtr->ChipSet == RHD_M74) || + (rhdPtr->ChipSet == RHD_M82) || + (rhdPtr->ChipSet == RHD_RS780) || + (rhdPtr->ChipSet == RHD_RS880) || + (rhdPtr->ChipSet == RHD_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + /* Vertex buffer setup */ + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 16 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + /* sync dst surface */ + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); +} + +static void +R600AppendCopyVertex(ScrnInfoPtr pScrn, + int srcX, int srcY, + int dstX, int dstY, + int w, int h) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + float *vb; + + if (((accel_state->vb_index + 3) * 16) > (accel_state->ib->total / 2)) { + R600DoCopy(pScrn); + accel_state->vb_index = 0; + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + } + + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 16); + + vb[0] = (float)dstX; + vb[1] = (float)dstY; + vb[2] = (float)srcX; + vb[3] = (float)srcY; + + vb[4] = (float)dstX; + vb[5] = (float)(dstY + h); + vb[6] = (float)srcX; + vb[7] = (float)(srcY + h); + + vb[8] = (float)(dstX + w); + vb[9] = (float)(dstY + h); + vb[10] = (float)(srcX + w); + vb[11] = (float)(srcY + h); + + accel_state->vb_index += 3; +} + +static Bool +R600PrepareCopy(PixmapPtr pSrc, PixmapPtr pDst, + int xdir, int ydir, + int rop, + Pixel planemask) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + + accel_state->dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + accel_state->src_pitch[0] = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); + + accel_state->src_mc_addr[0] = exaGetPixmapOffset(pSrc) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + accel_state->dst_mc_addr = exaGetPixmapOffset(pDst) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + accel_state->src_width[0] = pSrc->drawable.width; + accel_state->src_height[0] = pSrc->drawable.height; + accel_state->src_bpp[0] = pSrc->drawable.bitsPerPixel; + accel_state->dst_height = pDst->drawable.height; + accel_state->dst_bpp = pDst->drawable.bitsPerPixel; + + /* bad pitch */ + if (accel_state->src_pitch[0] & 7) + return FALSE; + if (accel_state->dst_pitch & 7) + return FALSE; + + /* bad offset */ + if (accel_state->src_mc_addr[0] & 0xff) + return FALSE; + if (accel_state->dst_mc_addr & 0xff) + return FALSE; + + if (pSrc->drawable.bitsPerPixel == 24) + return FALSE; + if (pDst->drawable.bitsPerPixel == 24) + return FALSE; + + /* return FALSE; */ + +#ifdef SHOW_VERTEXES + ErrorF("src: %dx%d @ %dbpp, 0x%08x\n", pSrc->drawable.width, pSrc->drawable.height, + pSrc->drawable.bitsPerPixel, exaGetPixmapPitch(pSrc)); + ErrorF("dst: %dx%d @ %dbpp, 0x%08x\n", pDst->drawable.width, pDst->drawable.height, + pDst->drawable.bitsPerPixel, exaGetPixmapPitch(pDst)); +#endif + + accel_state->rop = rop; + accel_state->planemask = planemask; + + if (exaGetPixmapOffset(pSrc) == exaGetPixmapOffset(pDst)) { + unsigned long size = pDst->drawable.height * accel_state->dst_pitch * pDst->drawable.bitsPerPixel/8; + accel_state->same_surface = TRUE; + + if (accel_state->copy_area) { + exaOffscreenFree(pDst->drawable.pScreen, accel_state->copy_area); + accel_state->copy_area = NULL; + } + accel_state->copy_area = exaOffscreenAlloc(pDst->drawable.pScreen, size, 256, TRUE, NULL, NULL); + } else { + + accel_state->same_surface = FALSE; + + R600DoPrepareCopy(pScrn, + accel_state->src_pitch[0], pSrc->drawable.width, pSrc->drawable.height, + accel_state->src_mc_addr[0], pSrc->drawable.bitsPerPixel, + accel_state->dst_pitch, pDst->drawable.height, + accel_state->dst_mc_addr, pDst->drawable.bitsPerPixel, + rop, planemask); + + } + + return TRUE; +} + +static Bool +is_overlap(int sx1, int sx2, int sy1, int sy2, int dx1, int dx2, int dy1, int dy2) +{ + if (((sx1 >= dx1) && (sx1 <= dx2) && (sy1 >= dy1) && (sy1 <= dy2)) || /* TL x1, y1 */ + ((sx2 >= dx1) && (sx2 <= dx2) && (sy1 >= dy1) && (sy1 <= dy2)) || /* TR x2, y1 */ + ((sx1 >= dx1) && (sx1 <= dx2) && (sy2 >= dy1) && (sy2 <= dy2)) || /* BL x1, y2 */ + ((sx2 >= dx1) && (sx2 <= dx2) && (sy2 >= dy1) && (sy2 <= dy2))) /* BR x2, y2 */ + return TRUE; + else + return FALSE; +} + +static void +R600OverlapCopy(PixmapPtr pDst, + int srcX, int srcY, + int dstX, int dstY, + int w, int h) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + uint32_t dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + uint32_t dst_offset = exaGetPixmapOffset(pDst) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + int i, hchunk, vchunk; + + if (is_overlap(srcX, srcX + w, srcY, srcY + h, + dstX, dstX + w, dstY, dstY + h)) { + /* Calculate height/width of non-overlapping area */ + hchunk = (srcX < dstX) ? (dstX - srcX) : (srcX - dstX); + vchunk = (srcY < dstY) ? (dstY - srcY) : (srcY - dstY); + + /* Diagonally offset overlap is reduced to either horizontal or vertical offset-only + * by copying a part of the non-overlapping portion, then adjusting coordinates + * Choose horizontal vs vertical to minimize the total number of copy operations + */ + if (vchunk != 0 && hchunk != 0) { /* diagonal */ + if ((w / hchunk) <= (h / vchunk)) { /* reduce to horizontal */ + if (srcY > dstY ) { /* diagonal up */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, vchunk); + R600DoCopy(pScrn); + + srcY = srcY + vchunk; + dstY = dstY + vchunk; + } else { /* diagonal down */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY + h - vchunk, dstX, dstY + h - vchunk, w, vchunk); + R600DoCopy(pScrn); + } + h = h - vchunk; + vchunk = 0; + } else { /* reduce to vertical */ + if (srcX > dstX ) { /* diagonal left */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, hchunk, h); + R600DoCopy(pScrn); + + srcX = srcX + hchunk; + dstX = dstX + hchunk; + } else { /* diagonal right */ + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX + w - hchunk, srcY, dstX + w - hchunk, dstY, hchunk, h); + R600DoCopy(pScrn); + } + w = w - hchunk; + hchunk = 0; + } + } + + if (vchunk == 0) { /* left/right */ + if (srcX < dstX) { /* right */ + /* copy right to left */ + for (i = w; i > 0; i -= hchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX + i - hchunk, srcY, dstX + i - hchunk, dstY, hchunk, h); + R600DoCopy(pScrn); + } + } else { /* left */ + /* copy left to right */ + for (i = 0; i < w; i += hchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + R600AppendCopyVertex(pScrn, srcX + i, srcY, dstX + i, dstY, hchunk, h); + R600DoCopy(pScrn); + } + } + } else { /* up/down */ + if (srcY > dstY) { /* up */ + /* copy top to bottom */ + for (i = 0; i < h; i += vchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + if (vchunk > h - i) vchunk = h - i; + R600AppendCopyVertex(pScrn, srcX, srcY + i, dstX, dstY + i, w, vchunk); + R600DoCopy(pScrn); + } + } else { /* down */ + /* copy bottom to top */ + for (i = h; i > 0; i -= vchunk) { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + if (vchunk > i) vchunk = i; + R600AppendCopyVertex(pScrn, srcX, srcY + i - vchunk, dstX, dstY + i - vchunk, w, vchunk); + R600DoCopy(pScrn); + } + } + } + } else { + R600DoPrepareCopy(pScrn, + dst_pitch, pDst->drawable.width, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + dst_pitch, pDst->drawable.height, dst_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); + R600DoCopy(pScrn); + } +} + +static void +R600Copy(PixmapPtr pDst, + int srcX, int srcY, + int dstX, int dstY, + int w, int h) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + + if (accel_state->same_surface && (srcX == dstX) && (srcY == dstY)) + return; + + if (accel_state->same_surface && is_overlap(srcX, srcX + w, srcY, srcY + h, dstX, dstX + w, dstY, dstY + h)) { + if (accel_state->copy_area) { + uint32_t pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + uint32_t orig_offset, tmp_offset; + + tmp_offset = accel_state->copy_area->offset + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + orig_offset = exaGetPixmapOffset(pDst) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + R600DoPrepareCopy(pScrn, + pitch, pDst->drawable.width, pDst->drawable.height, orig_offset, pDst->drawable.bitsPerPixel, + pitch, pDst->drawable.height, tmp_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); + R600DoCopy(pScrn); + R600DoPrepareCopy(pScrn, + pitch, pDst->drawable.width, pDst->drawable.height, tmp_offset, pDst->drawable.bitsPerPixel, + pitch, pDst->drawable.height, orig_offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, dstX, dstY, dstX, dstY, w, h); + R600DoCopy(pScrn); + } else + R600OverlapCopy(pDst, srcX, srcY, dstX, dstY, w, h); + } else if (accel_state->same_surface) { + uint32_t pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + uint32_t offset = exaGetPixmapOffset(pDst) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + R600DoPrepareCopy(pScrn, + pitch, pDst->drawable.width, pDst->drawable.height, offset, pDst->drawable.bitsPerPixel, + pitch, pDst->drawable.height, offset, pDst->drawable.bitsPerPixel, + accel_state->rop, accel_state->planemask); + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); + R600DoCopy(pScrn); + } else { + R600AppendCopyVertex(pScrn, srcX, srcY, dstX, dstY, w, h); + } + +} + +static void +R600DoneCopy(PixmapPtr pDst) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + + if (!accel_state->same_surface) + R600DoCopy(pScrn); + + if (accel_state->copy_area) { + exaOffscreenFree(pDst->drawable.pScreen, accel_state->copy_area); + accel_state->copy_area = NULL; + } +} + +#define RADEON_TRACE_FALL 0 +#define RADEON_TRACE_DRAW 0 + +#if RADEON_TRACE_FALL +#define RADEON_FALLBACK(x) \ +do { \ + ErrorF("%s: ", __FUNCTION__); \ + ErrorF x; \ + return FALSE; \ +} while (0) +#else +#define RADEON_FALLBACK(x) return FALSE +#endif + +#define xFixedToFloat(f) (((float) (f)) / 65536) + +static inline void transformPoint(PictTransform *transform, xPointFixed *point) +{ + PictVector v; + v.vector[0] = point->x; + v.vector[1] = point->y; + v.vector[2] = xFixed1; + PictureTransformPoint(transform, &v); + point->x = v.vector[0]; + point->y = v.vector[1]; +} + +struct blendinfo { + Bool dst_alpha; + Bool src_alpha; + uint32_t blend_cntl; +}; + +static struct blendinfo R600BlendOp[] = { + /* Clear */ + {0, 0, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, + /* Src */ + {0, 0, (BLEND_ONE << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, + /* Dst */ + {0, 0, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_ONE << COLOR_DESTBLEND_shift)}, + /* Over */ + {0, 1, (BLEND_ONE << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, + /* OverReverse */ + {1, 0, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ONE << COLOR_DESTBLEND_shift)}, + /* In */ + {1, 0, (BLEND_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, + /* InReverse */ + {0, 1, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_SRC_ALPHA << COLOR_DESTBLEND_shift)}, + /* Out */ + {1, 0, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ZERO << COLOR_DESTBLEND_shift)}, + /* OutReverse */ + {0, 1, (BLEND_ZERO << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, + /* Atop */ + {1, 1, (BLEND_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, + /* AtopReverse */ + {1, 1, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_SRC_ALPHA << COLOR_DESTBLEND_shift)}, + /* Xor */ + {1, 1, (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift) | (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)}, + /* Add */ + {0, 0, (BLEND_ONE << COLOR_SRCBLEND_shift) | (BLEND_ONE << COLOR_DESTBLEND_shift)}, +}; + +struct formatinfo { + unsigned int fmt; + uint32_t card_fmt; +}; + +static struct formatinfo R600TexFormats[] = { + {PICT_a8r8g8b8, FMT_8_8_8_8}, + {PICT_x8r8g8b8, FMT_8_8_8_8}, + {PICT_a8b8g8r8, FMT_8_8_8_8}, + {PICT_x8b8g8r8, FMT_8_8_8_8}, + {PICT_r5g6b5, FMT_5_6_5}, + {PICT_a1r5g5b5, FMT_1_5_5_5}, + {PICT_x1r5g5b5, FMT_1_5_5_5}, + {PICT_a8, FMT_8}, +}; + +static uint32_t R600GetBlendCntl(int op, PicturePtr pMask, uint32_t dst_format) +{ + uint32_t sblend, dblend; + + sblend = R600BlendOp[op].blend_cntl & COLOR_SRCBLEND_mask; + dblend = R600BlendOp[op].blend_cntl & COLOR_DESTBLEND_mask; + + /* If there's no dst alpha channel, adjust the blend op so that we'll treat + * it as always 1. + */ + if (PICT_FORMAT_A(dst_format) == 0 && R600BlendOp[op].dst_alpha) { + if (sblend == (BLEND_DST_ALPHA << COLOR_SRCBLEND_shift)) + sblend = (BLEND_ONE << COLOR_SRCBLEND_shift); + else if (sblend == (BLEND_ONE_MINUS_DST_ALPHA << COLOR_SRCBLEND_shift)) + sblend = (BLEND_ZERO << COLOR_SRCBLEND_shift); + } + + /* If the source alpha is being used, then we should only be in a case where + * the source blend factor is 0, and the source blend value is the mask + * channels multiplied by the source picture's alpha. + */ + if (pMask && pMask->componentAlpha && R600BlendOp[op].src_alpha) { + if (dblend == (BLEND_SRC_ALPHA << COLOR_DESTBLEND_shift)) { + dblend = (BLEND_SRC_COLOR << COLOR_DESTBLEND_shift); + } else if (dblend == (BLEND_ONE_MINUS_SRC_ALPHA << COLOR_DESTBLEND_shift)) { + dblend = (BLEND_ONE_MINUS_SRC_COLOR << COLOR_DESTBLEND_shift); + } + } + + return sblend | dblend; +} + +static Bool R600GetDestFormat(PicturePtr pDstPicture, uint32_t *dst_format) +{ + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + *dst_format = COLOR_8_8_8_8; + break; + case PICT_r5g6b5: + *dst_format = COLOR_5_6_5; + break; + case PICT_a1r5g5b5: + case PICT_x1r5g5b5: + *dst_format = COLOR_1_5_5_5; + break; + case PICT_a8: + *dst_format = COLOR_8; + break; + default: + RADEON_FALLBACK(("Unsupported dest format 0x%x\n", + (int)pDstPicture->format)); + } + return TRUE; +} + +static Bool R600CheckCompositeTexture(PicturePtr pPict, + PicturePtr pDstPict, + int op, + int unit) +{ + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + unsigned int i; + int max_tex_w, max_tex_h; + + max_tex_w = 8192; + max_tex_h = 8192; + + if ((w > max_tex_w) || (h > max_tex_h)) + RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h)); + + for (i = 0; i < sizeof(R600TexFormats) / sizeof(R600TexFormats[0]); i++) { + if (R600TexFormats[i].fmt == pPict->format) + break; + } + if (i == sizeof(R600TexFormats) / sizeof(R600TexFormats[0])) + RADEON_FALLBACK(("Unsupported picture format 0x%x\n", + (int)pPict->format)); + + if (pPict->filter != PictFilterNearest && + pPict->filter != PictFilterBilinear) + RADEON_FALLBACK(("Unsupported filter 0x%x\n", pPict->filter)); + + /* for REPEAT_NONE, Render semantics are that sampling outside the source + * picture results in alpha=0 pixels. We can implement this with a border color + * *if* our source texture has an alpha channel, otherwise we need to fall + * back. If we're not transformed then we hope that upper layers have clipped + * rendering to the bounds of the source drawable, in which case it doesn't + * matter. I have not, however, verified that the X server always does such + * clipping. + */ + /* FIXME R6xx */ + if (pPict->transform != 0 && !pPict->repeat && PICT_FORMAT_A(pPict->format) == 0) { + if (!(((op == PictOpSrc) || (op == PictOpClear)) && (PICT_FORMAT_A(pDstPict->format) == 0))) + RADEON_FALLBACK(("REPEAT_NONE unsupported for transformed xRGB source\n")); + } + + return TRUE; +} + +static Bool R600TextureSetup(PicturePtr pPict, PixmapPtr pPix, + int unit) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + unsigned int i; + tex_resource_t tex_res; + tex_sampler_t tex_samp; + int pix_r, pix_g, pix_b, pix_a; + + CLEAR (tex_res); + CLEAR (tex_samp); + + accel_state->src_pitch[unit] = exaGetPixmapPitch(pPix) / (pPix->drawable.bitsPerPixel / 8); + accel_state->src_size[unit] = exaGetPixmapPitch(pPix) * h; + accel_state->src_mc_addr[unit] = exaGetPixmapOffset(pPix) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + if (accel_state->src_pitch[1] & 7) + RADEON_FALLBACK(("Bad pitch %d 0x%x\n", (int)accel_state->src_pitch[unit], unit)); + + if (accel_state->src_mc_addr[1] & 0xff) + RADEON_FALLBACK(("Bad offset %d 0x%x\n", (int)accel_state->src_mc_addr[unit], unit)); + + for (i = 0; i < sizeof(R600TexFormats) / sizeof(R600TexFormats[0]); i++) { + if (R600TexFormats[i].fmt == pPict->format) + break; + } + + accel_state->texW[unit] = w; + accel_state->texH[unit] = h; + + /* ErrorF("Tex %d setup %dx%d\n", unit, w, h); */ + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[unit], accel_state->src_mc_addr[unit]); + + /* Texture */ + tex_res.id = unit; + tex_res.w = w; + tex_res.h = h; + tex_res.pitch = accel_state->src_pitch[unit]; + tex_res.depth = 0; + tex_res.dim = SQ_TEX_DIM_2D; + tex_res.base = accel_state->src_mc_addr[unit]; + tex_res.mip_base = accel_state->src_mc_addr[unit]; + tex_res.format = R600TexFormats[i].card_fmt; + tex_res.request_size = 1; + + /* component swizzles */ + switch (pPict->format) { + case PICT_a1r5g5b5: + case PICT_a8r8g8b8: + pix_r = SQ_SEL_Z; /* R */ + pix_g = SQ_SEL_Y; /* G */ + pix_b = SQ_SEL_X; /* B */ + pix_a = SQ_SEL_W; /* A */ + break; + case PICT_a8b8g8r8: + pix_r = SQ_SEL_X; /* R */ + pix_g = SQ_SEL_Y; /* G */ + pix_b = SQ_SEL_Z; /* B */ + pix_a = SQ_SEL_W; /* A */ + break; + case PICT_x8b8g8r8: + pix_r = SQ_SEL_X; /* R */ + pix_g = SQ_SEL_Y; /* G */ + pix_b = SQ_SEL_Z; /* B */ + pix_a = SQ_SEL_1; /* A */ + break; + case PICT_x1r5g5b5: + case PICT_x8r8g8b8: + case PICT_r5g6b5: + pix_r = SQ_SEL_Z; /* R */ + pix_g = SQ_SEL_Y; /* G */ + pix_b = SQ_SEL_X; /* B */ + pix_a = SQ_SEL_1; /* A */ + break; + case PICT_a8: + pix_r = SQ_SEL_0; /* R */ + pix_g = SQ_SEL_0; /* G */ + pix_b = SQ_SEL_0; /* B */ + pix_a = SQ_SEL_X; /* A */ + break; + default: + RADEON_FALLBACK(("Bad format 0x%x\n", pPict->format)); + } + + if (unit == 0) { + if (!accel_state->has_mask) { + if (PICT_FORMAT_RGB(pPict->format) == 0) { + pix_r = SQ_SEL_0; + pix_g = SQ_SEL_0; + pix_b = SQ_SEL_0; + } + + if (PICT_FORMAT_A(pPict->format) == 0) + pix_a = SQ_SEL_1; + } else { + if (accel_state->component_alpha) { + if (accel_state->src_alpha) { + if (PICT_FORMAT_A(pPict->format) == 0) { + pix_r = SQ_SEL_1; + pix_g = SQ_SEL_1; + pix_b = SQ_SEL_1; + pix_a = SQ_SEL_1; + } else { + pix_r = pix_a; + pix_g = pix_a; + pix_b = pix_a; + } + } else { + if (PICT_FORMAT_A(pPict->format) == 0) + pix_a = SQ_SEL_1; + } + } else { + if (PICT_FORMAT_RGB(pPict->format) == 0) { + pix_r = SQ_SEL_0; + pix_g = SQ_SEL_0; + pix_b = SQ_SEL_0; + } + + if (PICT_FORMAT_A(pPict->format) == 0) + pix_a = SQ_SEL_1; + } + } + } else { + if (accel_state->component_alpha) { + if (PICT_FORMAT_A(pPict->format) == 0) + pix_a = SQ_SEL_1; + } else { + if (PICT_FORMAT_A(pPict->format) == 0) { + pix_r = SQ_SEL_1; + pix_g = SQ_SEL_1; + pix_b = SQ_SEL_1; + pix_a = SQ_SEL_1; + } else { + pix_r = pix_a; + pix_g = pix_a; + pix_b = pix_a; + } + } + } + + tex_res.dst_sel_x = pix_r; /* R */ + tex_res.dst_sel_y = pix_g; /* G */ + tex_res.dst_sel_z = pix_b; /* B */ + tex_res.dst_sel_w = pix_a; /* A */ + + tex_res.base_level = 0; + tex_res.last_level = 0; + tex_res.perf_modulation = 0; + set_tex_resource (pScrn, accel_state->ib, &tex_res); + + tex_samp.id = unit; + tex_samp.border_color = SQ_TEX_BORDER_COLOR_TRANS_BLACK; + + if (pPict->repeat) { + switch (pPict->repeatType) { + case RepeatNormal: + tex_samp.clamp_x = SQ_TEX_WRAP; + tex_samp.clamp_y = SQ_TEX_WRAP; + break; + case RepeatPad: + tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; + break; + case RepeatReflect: + tex_samp.clamp_x = SQ_TEX_MIRROR; + tex_samp.clamp_y = SQ_TEX_MIRROR; + break; + case RepeatNone: + tex_samp.clamp_x = SQ_TEX_CLAMP_BORDER; + tex_samp.clamp_y = SQ_TEX_CLAMP_BORDER; + break; + default: + RADEON_FALLBACK(("Bad repeat 0x%x\n", pPict->repeatType)); + } + } else { + tex_samp.clamp_x = SQ_TEX_CLAMP_BORDER; + tex_samp.clamp_y = SQ_TEX_CLAMP_BORDER; + } + + switch (pPict->filter) { + case PictFilterNearest: + tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_POINT; + tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_POINT; + break; + case PictFilterBilinear: + tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; + tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_BILINEAR; + break; + default: + RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); + } + + tex_samp.clamp_z = SQ_TEX_WRAP; + tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; + tex_samp.mip_filter = 0; /* no mipmap */ + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + + if (pPict->transform != 0) { + accel_state->is_transform[unit] = TRUE; + accel_state->transform[unit] = pPict->transform; + } else + accel_state->is_transform[unit] = FALSE; + + return TRUE; +} + +static Bool R600CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, + PicturePtr pDstPicture) +{ + uint32_t tmp1; +/* ScreenPtr pScreen = pDstPicture->pDrawable->pScreen; */ + PixmapPtr pSrcPixmap, pDstPixmap; +/* ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; */ +/* RHDPtr rhdPtr = RHDPTR(pScrn); */ + int max_tex_w, max_tex_h, max_dst_w, max_dst_h; + + /* Check for unsupported compositing operations. */ + if (op >= (int) (sizeof(R600BlendOp) / sizeof(R600BlendOp[0]))) + RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op)); + + pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); + + max_tex_w = 8192; + max_tex_h = 8192; + max_dst_w = 8192; + max_dst_h = 8192; + + if (pSrcPixmap->drawable.width >= max_tex_w || + pSrcPixmap->drawable.height >= max_tex_h) { + RADEON_FALLBACK(("Source w/h too large (%d,%d).\n", + pSrcPixmap->drawable.width, + pSrcPixmap->drawable.height)); + } + + pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable); + + if (pDstPixmap->drawable.width >= max_dst_w || + pDstPixmap->drawable.height >= max_dst_h) { + RADEON_FALLBACK(("Dest w/h too large (%d,%d).\n", + pDstPixmap->drawable.width, + pDstPixmap->drawable.height)); + } + + if (pMaskPicture) { + PixmapPtr pMaskPixmap = RADEONGetDrawablePixmap(pMaskPicture->pDrawable); + + if (pMaskPixmap->drawable.width >= max_tex_w || + pMaskPixmap->drawable.height >= max_tex_h) { + RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n", + pMaskPixmap->drawable.width, + pMaskPixmap->drawable.height)); + } + + if (pMaskPicture->componentAlpha) { + /* Check if it's component alpha that relies on a source alpha and + * on the source value. We can only get one of those into the + * single source value that we get to blend with. + */ + if (R600BlendOp[op].src_alpha && + (R600BlendOp[op].blend_cntl & COLOR_SRCBLEND_mask) != + (BLEND_ZERO << COLOR_SRCBLEND_shift)) { + RADEON_FALLBACK(("Component alpha not supported with source " + "alpha and source value blending.\n")); + } + } + + if (!R600CheckCompositeTexture(pMaskPicture, pDstPicture, op, 1)) + return FALSE; + } + + if (!R600CheckCompositeTexture(pSrcPicture, pDstPicture, op, 0)) + return FALSE; + + if (!R600GetDestFormat(pDstPicture, &tmp1)) + return FALSE; + + return TRUE; + +} + +static Bool R600PrepareComposite(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, PicturePtr pDstPicture, + PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) +{ + ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + uint32_t blendcntl, dst_format; + cb_config_t cb_conf; + shader_config_t vs_conf, ps_conf; + + /* RV740 seems to be particularly problematic */ + /* if ((rhdPtr->ChipSet == RHD_RV740) && (w < 32 || h < 32)) */ + if (rhdPtr->ChipSet == RHD_RV740) + return FALSE; + + /* return FALSE; */ + + if (pMask) { + accel_state->has_mask = TRUE; + if (pMaskPicture->componentAlpha) { + accel_state->component_alpha = TRUE; + if (R600BlendOp[op].src_alpha) + accel_state->src_alpha = TRUE; + else + accel_state->src_alpha = FALSE; + } else { + accel_state->component_alpha = FALSE; + accel_state->src_alpha = FALSE; + } + } else { + accel_state->has_mask = FALSE; + accel_state->component_alpha = FALSE; + accel_state->src_alpha = FALSE; + } + + accel_state->dst_mc_addr = exaGetPixmapOffset(pDst) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + accel_state->dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + accel_state->dst_size = exaGetPixmapPitch(pDst) * pDst->drawable.height; + + if (accel_state->dst_pitch & 7) + RADEON_FALLBACK(("Bad dst pitch 0x%x\n", (int)accel_state->dst_pitch)); + + if (accel_state->dst_mc_addr & 0xff) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)accel_state->dst_mc_addr)); + + if (!R600GetDestFormat(pDstPicture, &dst_format)) + return FALSE; + + CLEAR (cb_conf); + CLEAR (vs_conf); + CLEAR (ps_conf); + + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + + /* Init */ + start_3d(pScrn, accel_state->ib); + + /* cp_set_surface_sync(pScrn, accel_state->ib); */ + + set_default_state(pScrn, accel_state->ib); + + /* Scissor / viewport */ + EREG (accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG (accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); + + if (!R600TextureSetup(pSrcPicture, pSrc, 0)) { + R600IBDiscard(pScrn, accel_state->ib); + return FALSE; + } + + if (pMask != NULL) { + if (!R600TextureSetup(pMaskPicture, pMask, 1)) { + R600IBDiscard(pScrn, accel_state->ib); + return FALSE; + } + } else + accel_state->is_transform[1] = FALSE; + + if (pMask) { + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_vs, (1 << 0)); + accel_state->ps_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->comp_mask_ps_offset; + } else { + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_vs, (0 << 0)); + accel_state->ps_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->comp_ps_offset; + } + + accel_state->vs_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->comp_vs_offset; + + accel_state->vs_size = 512; + accel_state->ps_size = 512; + + /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + + vs_conf.shader_addr = accel_state->vs_mc_addr; + vs_conf.num_gprs = 3; + vs_conf.stack_size = 1; + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); + + ps_conf.shader_addr = accel_state->ps_mc_addr; + ps_conf.num_gprs = 3; + ps_conf.stack_size = 0; + ps_conf.uncached_first_inst = 1; + ps_conf.clamp_consts = 0; + ps_conf.export_mode = 2; + ps_setup (pScrn, accel_state->ib, &ps_conf); + + EREG (accel_state->ib, CB_SHADER_MASK, (0xf << OUTPUT0_ENABLE_shift)); + EREG (accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + + blendcntl = R600GetBlendCntl(op, pMaskPicture, pDstPicture->format); + + if (rhdPtr->ChipSet == RHD_R600) { + /* no per-MRT blend on R600 */ + EREG (accel_state->ib, CB_COLOR_CONTROL, RADEON_ROP[3] | (1 << TARGET_BLEND_ENABLE_shift)); + EREG (accel_state->ib, CB_BLEND_CONTROL, blendcntl); + } else { + EREG (accel_state->ib, CB_COLOR_CONTROL, (RADEON_ROP[3] | + (1 << TARGET_BLEND_ENABLE_shift) | + PER_MRT_BLEND_bit)); + EREG (accel_state->ib, CB_BLEND0_CONTROL, blendcntl); + } + + cb_conf.id = 0; + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = pDst->drawable.height; + cb_conf.base = accel_state->dst_mc_addr; + cb_conf.format = dst_format; + + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + case PICT_a1r5g5b5: + case PICT_x1r5g5b5: + default: + cb_conf.comp_swap = 1; /* ARGB */ + break; + case PICT_r5g6b5: + cb_conf.comp_swap = 2; /* RGB */ + break; + case PICT_a8: + cb_conf.comp_swap = 3; /* A */ + break; + } + cb_conf.source_format = 1; + cb_conf.blend_clamp = 1; + set_render_target(pScrn, accel_state->ib, &cb_conf); + + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ + + /* Interpolator setup */ + if (pMask) { + /* export 2 tex coords from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((2 - 1) << VS_EXPORT_COUNT_shift)); + /* src = semantic id 0; mask = semantic id 1 */ + EREG(accel_state->ib, SPI_VS_OUT_ID_0, ((0 << SEMANTIC_0_shift) | + (1 << SEMANTIC_1_shift))); + /* input 2 tex coords from VS */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, (2 << NUM_INTERP_shift)); + } else { + /* export 1 tex coords from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((1 - 1) << VS_EXPORT_COUNT_shift)); + /* src = semantic id 0 */ + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + /* input 1 tex coords from VS */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, (1 << NUM_INTERP_shift)); + } + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + /* SPI_PS_INPUT_CNTL_0 maps to GPR[0] - load with semantic id 0 */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x01 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + /* SPI_PS_INPUT_CNTL_1 maps to GPR[1] - load with semantic id 1 */ + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (1 <<2), ((1 << SEMANTIC_shift) | + (0x01 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, 0); + + accel_state->vb_index = 0; + + return TRUE; +} + +static void R600Composite(PixmapPtr pDst, + int srcX, int srcY, + int maskX, int maskY, + int dstX, int dstY, + int w, int h) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + float *vb; + xPointFixed srcTopLeft, srcTopRight, srcBottomLeft, srcBottomRight; + + /* ErrorF("R600Composite (%d,%d) (%d,%d) (%d,%d) (%d,%d)\n", + srcX, srcY, maskX, maskY,dstX, dstY, w, h); */ + + srcTopLeft.x = IntToxFixed(srcX); + srcTopLeft.y = IntToxFixed(srcY); + srcTopRight.x = IntToxFixed(srcX + w); + srcTopRight.y = IntToxFixed(srcY); + srcBottomLeft.x = IntToxFixed(srcX); + srcBottomLeft.y = IntToxFixed(srcY + h); + srcBottomRight.x = IntToxFixed(srcX + w); + srcBottomRight.y = IntToxFixed(srcY + h); + + /* XXX do transform in vertex shader */ + if (accel_state->is_transform[0]) { + transformPoint(accel_state->transform[0], &srcTopLeft); + transformPoint(accel_state->transform[0], &srcTopRight); + transformPoint(accel_state->transform[0], &srcBottomLeft); + transformPoint(accel_state->transform[0], &srcBottomRight); + } + + if (accel_state->has_mask) { + xPointFixed maskTopLeft, maskTopRight, maskBottomLeft, maskBottomRight; + + if (((accel_state->vb_index + 3) * 24) > (accel_state->ib->total / 2)) { + R600DoneComposite(pDst); + accel_state->vb_index = 0; + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + } + + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 24); + + maskTopLeft.x = IntToxFixed(maskX); + maskTopLeft.y = IntToxFixed(maskY); + maskTopRight.x = IntToxFixed(maskX + w); + maskTopRight.y = IntToxFixed(maskY); + maskBottomLeft.x = IntToxFixed(maskX); + maskBottomLeft.y = IntToxFixed(maskY + h); + maskBottomRight.x = IntToxFixed(maskX + w); + maskBottomRight.y = IntToxFixed(maskY + h); + + if (accel_state->is_transform[1]) { + transformPoint(accel_state->transform[1], &maskTopLeft); + transformPoint(accel_state->transform[1], &maskTopRight); + transformPoint(accel_state->transform[1], &maskBottomLeft); + transformPoint(accel_state->transform[1], &maskBottomRight); + } + + vb[0] = (float)dstX; + vb[1] = (float)dstY; + vb[2] = xFixedToFloat(srcTopLeft.x) / accel_state->texW[0]; + vb[3] = xFixedToFloat(srcTopLeft.y) / accel_state->texH[0]; + vb[4] = xFixedToFloat(maskTopLeft.x) / accel_state->texW[1]; + vb[5] = xFixedToFloat(maskTopLeft.y) / accel_state->texH[1]; + + vb[6] = (float)dstX; + vb[7] = (float)(dstY + h); + vb[8] = xFixedToFloat(srcBottomLeft.x) / accel_state->texW[0]; + vb[9] = xFixedToFloat(srcBottomLeft.y) / accel_state->texH[0]; + vb[10] = xFixedToFloat(maskBottomLeft.x) / accel_state->texW[1]; + vb[11] = xFixedToFloat(maskBottomLeft.y) / accel_state->texH[1]; + + vb[12] = (float)(dstX + w); + vb[13] = (float)(dstY + h); + vb[14] = xFixedToFloat(srcBottomRight.x) / accel_state->texW[0]; + vb[15] = xFixedToFloat(srcBottomRight.y) / accel_state->texH[0]; + vb[16] = xFixedToFloat(maskBottomRight.x) / accel_state->texW[1]; + vb[17] = xFixedToFloat(maskBottomRight.y) / accel_state->texH[1]; + + } else { + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 16); + + vb[0] = (float)dstX; + vb[1] = (float)dstY; + vb[2] = xFixedToFloat(srcTopLeft.x) / accel_state->texW[0]; + vb[3] = xFixedToFloat(srcTopLeft.y) / accel_state->texH[0]; + + vb[4] = (float)dstX; + vb[5] = (float)(dstY + h); + vb[6] = xFixedToFloat(srcBottomLeft.x) / accel_state->texW[0]; + vb[7] = xFixedToFloat(srcBottomLeft.y) / accel_state->texH[0]; + + vb[8] = (float)(dstX + w); + vb[9] = (float)(dstY + h); + vb[10] = xFixedToFloat(srcBottomRight.x) / accel_state->texW[0]; + vb[11] = xFixedToFloat(srcBottomRight.y) / accel_state->texH[0]; + } + + accel_state->vb_index += 3; + +} + +static void R600DoneComposite(PixmapPtr pDst) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + draw_config_t draw_conf; + vtx_resource_t vtx_res; + + CLEAR (draw_conf); + CLEAR (vtx_res); + + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = RHDDRIGetIntGARTLocation(pScrn) + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + + + /* Vertex buffer setup */ + if (accel_state->has_mask) { + accel_state->vb_size = accel_state->vb_index * 24; + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 24 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + } else { + accel_state->vb_size = accel_state->vb_index * 16; + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 16 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + } + /* flush vertex cache */ + if ((rhdPtr->ChipSet == RHD_RV610) || + (rhdPtr->ChipSet == RHD_RV620) || + (rhdPtr->ChipSet == RHD_M72) || + (rhdPtr->ChipSet == RHD_M74) || + (rhdPtr->ChipSet == RHD_M82) || + (rhdPtr->ChipSet == RHD_RS780) || + (rhdPtr->ChipSet == RHD_RS880) || + (rhdPtr->ChipSet == RHD_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); +} + +Bool +R600CopyToVRAM(ScrnInfoPtr pScrn, + char *src, int src_pitch, + uint32_t dst_pitch, uint32_t dst_mc_addr, uint32_t dst_height, int bpp, + int x, int y, int w, int h) +{ + struct RhdCS *CS = RHDPTR(pScrn)->CS; + uint32_t scratch_mc_addr; + int wpass = w * (bpp/8); + int scratch_pitch_bytes = (wpass + 255) & ~255; + uint32_t scratch_pitch = scratch_pitch_bytes / (bpp / 8); + int scratch_offset = 0, hpass, temph; + char *dst; + drmBufPtr scratch; + + if (dst_pitch & 7) + return FALSE; + + if (dst_mc_addr & 0xff) + return FALSE; + + scratch = RHDDRMCPBuffer(pScrn->scrnIndex); + if (scratch == NULL) + return FALSE; + + scratch_mc_addr = RHDDRIGetIntGARTLocation(pScrn) + (scratch->idx * scratch->total); + temph = hpass = min(h, scratch->total/2 / scratch_pitch_bytes); + dst = (char *)scratch->address; + + /* memcopy from sys to scratch */ + while (temph--) { + memcpy (dst, src, wpass); + src += src_pitch; + dst += scratch_pitch_bytes; + } + + while (h) { + uint32_t offset = scratch_mc_addr + scratch_offset; + int oldhpass = hpass; + h -= oldhpass; + temph = hpass = min(h, scratch->total/2 / scratch_pitch_bytes); + + if (hpass) { + scratch_offset = scratch->total/2 - scratch_offset; + dst = (char *)scratch->address + scratch_offset; + /* wait for the engine to be idle */ + RHDCSIdle(CS); + /* memcopy from sys to scratch */ + while (temph--) { + memcpy (dst, src, wpass); + src += src_pitch; + dst += scratch_pitch_bytes; + } + } + /* blit from scratch to vram */ + R600DoPrepareCopy(pScrn, + scratch_pitch, w, oldhpass, offset, bpp, + dst_pitch, dst_height, dst_mc_addr, bpp, + 3, 0xffffffff); + R600AppendCopyVertex(pScrn, 0, 0, x, y, w, oldhpass); + R600DoCopy(pScrn); + y += oldhpass; + } + + R600IBDiscard(pScrn, scratch); + + return TRUE; +} + +static Bool +R600UploadToScreen(PixmapPtr pDst, int x, int y, int w, int h, + char *src, int src_pitch) +{ + ScrnInfoPtr pScrn = xf86Screens[pDst->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + uint32_t dst_pitch = exaGetPixmapPitch(pDst) / (pDst->drawable.bitsPerPixel / 8); + uint32_t dst_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + exaGetPixmapOffset(pDst); + uint32_t dst_height = pDst->drawable.height; + int bpp = pDst->drawable.bitsPerPixel; + + return R600CopyToVRAM(pScrn, + src, src_pitch, + dst_pitch, dst_mc_addr, dst_height, bpp, + x, y, w, h); +} + +static Bool +R600DownloadFromScreen(PixmapPtr pSrc, int x, int y, int w, int h, + char *dst, int dst_pitch) +{ + ScrnInfoPtr pScrn = xf86Screens[pSrc->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RhdCS *CS = rhdPtr->CS; + uint32_t src_pitch = exaGetPixmapPitch(pSrc) / (pSrc->drawable.bitsPerPixel / 8); + uint32_t src_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + exaGetPixmapOffset(pSrc); + uint32_t src_width = pSrc->drawable.width; + uint32_t src_height = pSrc->drawable.height; + int bpp = pSrc->drawable.bitsPerPixel; + uint32_t scratch_mc_addr; + int scratch_pitch_bytes = (dst_pitch + 255) & ~255; + int scratch_offset = 0, hpass; + uint32_t scratch_pitch = scratch_pitch_bytes / (bpp / 8); + int wpass = w * (bpp/8); + drmBufPtr scratch; + + /* RV740 seems to be particularly problematic with small xfers */ + /* if ((rhdPtr->ChipSet == RHD_RV740) && (w < 32 || h < 32)) */ + /* Composite in software with DFS partially active breaks badly */ + if (rhdPtr->ChipSet == RHD_RV740) + return FALSE; + + if (src_pitch & 7) + return FALSE; + + scratch = RHDDRMCPBuffer(pScrn->scrnIndex); + if (scratch == NULL) + return FALSE; + + scratch_mc_addr = RHDDRIGetIntGARTLocation(pScrn) + (scratch->idx * scratch->total); + hpass = min(h, scratch->total/2 / scratch_pitch_bytes); + + /* blit from vram to scratch */ + R600DoPrepareCopy(pScrn, + src_pitch, src_width, src_height, src_mc_addr, bpp, + scratch_pitch, hpass, scratch_mc_addr, bpp, + 3, 0xffffffff); + R600AppendCopyVertex(pScrn, x, y, 0, 0, w, hpass); + R600DoCopy(pScrn); + + while (h) { + char *src = (char *)scratch->address + scratch_offset; + int oldhpass = hpass; + h -= oldhpass; + y += oldhpass; + hpass = min(h, scratch->total/2 / scratch_pitch_bytes); + + if (hpass) { + scratch_offset = scratch->total/2 - scratch_offset; + /* blit from vram to scratch */ + R600DoPrepareCopy(pScrn, + src_pitch, src_width, src_height, src_mc_addr, bpp, + scratch_pitch, hpass, scratch_mc_addr + scratch_offset, bpp, + 3, 0xffffffff); + R600AppendCopyVertex(pScrn, x, y, 0, 0, w, hpass); + R600DoCopy(pScrn); + } + + /* wait for the engine to be idle */ + RHDCSIdle(CS); + /* memcopy from scratch to sys */ + while (oldhpass--) { + memcpy (dst, src, wpass); + dst += dst_pitch; + src += scratch_pitch_bytes; + } + } + + R600IBDiscard(pScrn, scratch); + + return TRUE; + +} + +void +R6xxEXACloseScreen(ScreenPtr pScreen) +{ + exaDriverFini(pScreen); +} + +void +R6xxEXADestroy(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + if (rhdPtr->EXAInfo) { + xfree(rhdPtr->EXAInfo); + rhdPtr->EXAInfo = NULL; + } + + if (rhdPtr->TwoDPrivate) { + xfree(rhdPtr->TwoDPrivate); + rhdPtr->TwoDPrivate = NULL; + } +} + +/* no need to needlessly flush the caches/wait for idle + * the drawing code does this already (and mesa code should be designed to do so as well) + * excessive idling/flushing seems to cause stability problems on + * r7xx and drawing glitches on r6xx. + */ +void +R6xxCacheFlush(struct RhdCS *CS) +{ + CS = CS; /* nop - avoid compiler warning */ +} + +void +R6xxEngineWaitIdleFull(struct RhdCS *CS) +{ + CS = CS; /* nop - avoid compiler warning */ +} + +static int +R600EXAMarkSync(ScreenPtr pScreen) +{ + struct r6xx_accel_state *accel_state = RHDPTR(xf86Screens[pScreen->myNum])->TwoDPrivate; + + return ++accel_state->exaSyncMarker; + +} + +static void +R600EXASync(ScreenPtr pScreen, int marker) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + struct r6xx_accel_state *accel_state = RHDPTR(pScrn)->TwoDPrivate; + + if (accel_state->exaMarkerSynced != marker) { + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + RHDCSIdle(CS); + + accel_state->exaMarkerSynced = marker; + } +} + +static Bool +R600AllocShaders(ScrnInfoPtr pScrn, ScreenPtr pScreen) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + /* 512 bytes per shader for now */ + int size = 512 * 9; + + accel_state->shaders = NULL; + + accel_state->shaders = exaOffscreenAlloc(pScreen, size, 256, + TRUE, NULL, NULL); + + if (accel_state->shaders == NULL) + return FALSE; + return TRUE; +} + +Bool +R600LoadShaders(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + enum RHD_CHIPSETS ChipSet = rhdPtr->ChipSet; + uint32_t *shader; + + shader = (pointer)((char *)rhdPtr->FbBase + rhdPtr->FbScanoutStart + accel_state->shaders->offset); + + /* solid vs --------------------------------------- */ + accel_state->solid_vs_offset = 0; + R600_solid_vs(ChipSet, shader + accel_state->solid_vs_offset / 4); + + /* solid ps --------------------------------------- */ + accel_state->solid_ps_offset = 512; + R600_solid_ps(ChipSet, shader + accel_state->solid_ps_offset / 4); + + /* copy vs --------------------------------------- */ + accel_state->copy_vs_offset = 1024; + R600_copy_vs(ChipSet, shader + accel_state->copy_vs_offset / 4); + + /* copy ps --------------------------------------- */ + accel_state->copy_ps_offset = 1536; + R600_copy_ps(ChipSet, shader + accel_state->copy_ps_offset / 4); + + /* comp vs --------------------------------------- */ + accel_state->comp_vs_offset = 2048; + R600_comp_vs(ChipSet, shader + accel_state->comp_vs_offset / 4); + + /* comp ps --------------------------------------- */ + accel_state->comp_ps_offset = 2560; + R600_comp_ps(ChipSet, shader + accel_state->comp_ps_offset / 4); + + /* comp mask ps --------------------------------------- */ + accel_state->comp_mask_ps_offset = 3072; + R600_comp_mask_ps(ChipSet, shader + accel_state->comp_mask_ps_offset / 4); + + /* xv vs --------------------------------------- */ + accel_state->xv_vs_offset = 3584; + R600_xv_vs(ChipSet, shader + accel_state->xv_vs_offset / 4); + + /* xv ps --------------------------------------- */ + accel_state->xv_ps_offset = 4096; + R600_xv_ps(ChipSet, shader + accel_state->xv_ps_offset / 4); + + return TRUE; +} + +static Bool +R600PrepareAccess(PixmapPtr pPix, int index) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + /* flush HDP read/write caches */ + RHDRegWrite(rhdPtr, HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); + + return TRUE; +} + +static void +R600FinishAccess(PixmapPtr pPix, int index) +{ + ScrnInfoPtr pScrn = xf86Screens[pPix->drawable.pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + /* flush HDP read/write caches */ + RHDRegWrite(rhdPtr, HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1); + +} + + +Bool +R6xxEXAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RhdCS *CS = rhdPtr->CS; + ExaDriverRec *EXAInfo; + struct r6xx_accel_state *accel_state; + + RHDFUNC(pScrn); + + EXAInfo = exaDriverAlloc(); + if (EXAInfo == NULL || !CS) + return FALSE; + + accel_state = xnfcalloc(1, sizeof(struct r6xx_accel_state)); + + EXAInfo->exa_major = EXA_VERSION_MAJOR; + EXAInfo->exa_minor = EXA_VERSION_MINOR; + + EXAInfo->flags = EXA_OFFSCREEN_PIXMAPS; + EXAInfo->pixmapOffsetAlign = 256; + EXAInfo->pixmapPitchAlign = 256; + +#if EXA_VERSION_MAJOR > 2 || (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 3) + EXAInfo->maxPitchBytes = 32768; + EXAInfo->maxX = 8192; +#else + EXAInfo->maxX = 8192; +#endif + EXAInfo->maxY = 8192; + + EXAInfo->memoryBase = (CARD8 *) rhdPtr->FbBase + rhdPtr->FbScanoutStart; + EXAInfo->offScreenBase = rhdPtr->FbOffscreenStart - rhdPtr->FbScanoutStart; + EXAInfo->memorySize = rhdPtr->FbScanoutSize + rhdPtr->FbOffscreenSize; + + EXAInfo->PrepareSolid = R600PrepareSolid; + EXAInfo->Solid = R600Solid; + EXAInfo->DoneSolid = R600DoneSolid; + + EXAInfo->PrepareCopy = R600PrepareCopy; + EXAInfo->Copy = R600Copy; + EXAInfo->DoneCopy = R600DoneCopy; + + EXAInfo->CheckComposite = R600CheckComposite; + EXAInfo->PrepareComposite = R600PrepareComposite; + EXAInfo->Composite = R600Composite; + EXAInfo->DoneComposite = R600DoneComposite; + + if (rhdPtr->cardType != RHD_CARD_AGP) { + EXAInfo->UploadToScreen = R600UploadToScreen; + EXAInfo->DownloadFromScreen = R600DownloadFromScreen; + } + + EXAInfo->PrepareAccess = R600PrepareAccess; + EXAInfo->FinishAccess = R600FinishAccess; + + EXAInfo->MarkSync = R600EXAMarkSync; + EXAInfo->WaitMarker = R600EXASync; + + if (!exaDriverInit(pScreen, EXAInfo)) { + xfree(accel_state); + xfree(EXAInfo); + return FALSE; + } + + RHDPTR(pScrn)->EXAInfo = EXAInfo; + + accel_state->XHas3DEngineState = FALSE; + accel_state->copy_area = NULL; + + rhdPtr->TwoDPrivate = accel_state; + + if (!R600AllocShaders(pScrn, pScreen)) { + xfree(accel_state); + xfree(EXAInfo); + return FALSE; + } + + if (!R600LoadShaders(pScrn)) { + xfree(accel_state); + xfree(EXAInfo); + return FALSE; + } + + exaMarkSync(pScreen); + + return TRUE; +} + diff --git a/driver/xf86-video-radeonhd/src/r600_reg.h b/driver/xf86-video-radeonhd/src/r600_reg.h new file mode 100644 index 000000000..3c27c7f72 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_reg.h @@ -0,0 +1,132 @@ +/* + * RadeonHD R6xx, R7xx Register documentation + * + * Copyright (C) 2008-2009 Advanced Micro Devices, Inc. + * Copyright (C) 2008-2009 Matthias Hopf + * + * 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 COPYRIGHT HOLDER(S) 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. + */ + +#ifndef _R600_REG_H_ +#define _R600_REG_H_ + +/* + * Register definitions + */ + +#include "r600_reg_auto_r6xx.h" +#include "r600_reg_r6xx.h" +#include "r600_reg_r7xx.h" + + +/* SET_*_REG offsets + ends */ +enum { + SET_CONFIG_REG_offset = 0x00008000, + SET_CONFIG_REG_end = 0x0000ac00, + SET_CONTEXT_REG_offset = 0x00028000, + SET_CONTEXT_REG_end = 0x00029000, + SET_ALU_CONST_offset = 0x00030000, + SET_ALU_CONST_end = 0x00032000, + SET_RESOURCE_offset = 0x00038000, + SET_RESOURCE_end = 0x0003c000, + SET_SAMPLER_offset = 0x0003c000, + SET_SAMPLER_end = 0x0003cff0, + SET_CTL_CONST_offset = 0x0003cff0, + SET_CTL_CONST_end = 0x0003e200, + SET_LOOP_CONST_offset = 0x0003e200, + SET_LOOP_CONST_end = 0x0003e380, + SET_BOOL_CONST_offset = 0x0003e380, + SET_BOOL_CONST_end = 0x0003e38c +}; + +/* packet3 IT_SURFACE_BASE_UPDATE bits */ +enum { + DEPTH_BASE = (1 << 0), + COLOR0_BASE = (1 << 1), + COLOR1_BASE = (1 << 2), + COLOR2_BASE = (1 << 3), + COLOR3_BASE = (1 << 4), + COLOR4_BASE = (1 << 5), + COLOR5_BASE = (1 << 6), + COLOR6_BASE = (1 << 7), + COLOR7_BASE = (1 << 8), + STRMOUT_BASE0 = (1 << 9), + STRMOUT_BASE1 = (1 << 10), + STRMOUT_BASE2 = (1 << 11), + STRMOUT_BASE3 = (1 << 12), + COHER_BASE0 = (1 << 13), + COHER_BASE1 = (1 << 14) +}; + +/* packet3 IT_WAIT_REG_MEM operation encoding */ +enum { + WAIT_ALWAYS = (0<<0), + WAIT_LT = (1<<0), + WAIT_LE = (2<<0), + WAIT_EQ = (3<<0), + WAIT_NE = (4<<0), + WAIT_GE = (5<<0), + WAIT_GT = (6<<0), + + WAIT_REG = (0<<4), + WAIT_MEM = (1<<4) +}; + +/* Packet3 commands */ +enum { + IT_NOP = 0x10, + IT_INDIRECT_BUFFER_END = 0x17, + IT_SET_PREDICATION = 0x20, + IT_REG_RMW = 0x21, + IT_COND_EXEC = 0x22, + IT_PRED_EXEC = 0x23, + IT_START_3D_CMDBUF = 0x24, + IT_DRAW_INDEX_2 = 0x27, + IT_CONTEXT_CONTROL = 0x28, + IT_DRAW_INDEX_IMMD_BE = 0x29, + IT_INDEX_TYPE = 0x2A, + IT_DRAW_INDEX = 0x2B, + IT_DRAW_INDEX_AUTO = 0x2D, + IT_DRAW_INDEX_IMMD = 0x2E, + IT_NUM_INSTANCES = 0x2F, + IT_STRMOUT_BUFFER_UPDATE = 0x34, + IT_INDIRECT_BUFFER_MP = 0x38, + IT_MEM_SEMAPHORE = 0x39, + IT_MPEG_INDEX = 0x3A, + IT_WAIT_REG_MEM = 0x3C, + IT_MEM_WRITE = 0x3D, + IT_INDIRECT_BUFFER = 0x32, + IT_CP_INTERRUPT = 0x40, + IT_SURFACE_SYNC = 0x43, + IT_ME_INITIALIZE = 0x44, + IT_COND_WRITE = 0x45, + IT_EVENT_WRITE = 0x46, + IT_EVENT_WRITE_EOP = 0x47, + IT_ONE_REG_WRITE = 0x57, + IT_SET_CONFIG_REG = 0x68, + IT_SET_CONTEXT_REG = 0x69, + IT_SET_ALU_CONST = 0x6A, + IT_SET_BOOL_CONST = 0x6B, + IT_SET_LOOP_CONST = 0x6C, + IT_SET_RESOURCE = 0x6D, + IT_SET_SAMPLER = 0x6E, + IT_SET_CTL_CONST = 0x6F, + IT_SURFACE_BASE_UPDATE = 0x73 +}; + +#endif diff --git a/driver/xf86-video-ati/src/evergreen_reg_auto.h b/driver/xf86-video-radeonhd/src/r600_reg_auto_r6xx.h similarity index 52% rename from driver/xf86-video-ati/src/evergreen_reg_auto.h rename to driver/xf86-video-radeonhd/src/r600_reg_auto_r6xx.h index 5c6158645..fbbd45201 100644 --- a/driver/xf86-video-ati/src/evergreen_reg_auto.h +++ b/driver/xf86-video-radeonhd/src/r600_reg_auto_r6xx.h @@ -1,7 +1,8 @@ /* - * Evergreen Register documentation + * RadeonHD R6xx, R7xx Register documentation * - * Copyright (C) 2010 Advanced Micro Devices, Inc. + * Copyright (C) 2008-2009 Advanced Micro Devices, Inc. + * Copyright (C) 2008-2009 Matthias Hopf * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -21,8 +22,8 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#ifndef _EVERGREEN_REG_AUTO_H -#define _EVERGREEN_REG_AUTO_H +#ifndef _AUTOREGS +#define _AUTOREGS enum { @@ -41,11 +42,21 @@ enum { TC_ONLY = 0x01, VC_AND_TC = 0x02, VS_NO_EXTRA_BUFFER_bit = 1 << 5, - AUTO_INVLD_EN_mask = 0x03 << 6, - AUTO_INVLD_EN_shift = 6, + VGT_GS_PER_ES = 0x000088c8, + VGT_ES_PER_GS = 0x000088cc, VGT_GS_VERTEX_REUSE = 0x000088d4, VERT_REUSE_mask = 0x1f << 0, VERT_REUSE_shift = 0, + VGT_MC_LAT_CNTL = 0x000088d8, + MC_TIME_STAMP_RES_mask = 0x03 << 0, + MC_TIME_STAMP_RES_shift = 0, + X_0_992_MAX_LATENCY = 0x00, + X_0_496_MAX_LATENCY = 0x01, + X_0_248_MAX_LATENCY = 0x02, + X_0_124_MAX_LATENCY = 0x03, + VGT_GS_PER_VS = 0x000088e8, + GS_PER_VS_mask = 0x0f << 0, + GS_PER_VS_shift = 0, VGT_CNTL_STATUS = 0x000088f0, VGT_OUT_INDX_BUSY_bit = 1 << 0, VGT_OUT_BUSY_bit = 1 << 1, @@ -56,9 +67,7 @@ enum { VGT_DMA_REQ_BUSY_bit = 1 << 6, VGT_DMA_BUSY_bit = 1 << 7, VGT_GS_BUSY_bit = 1 << 8, - VGT_HS_BUSY_bit = 1 << 9, - VGT_TE11_BUSY_bit = 1 << 10, - VGT_BUSY_bit = 1 << 11, + VGT_BUSY_bit = 1 << 9, VGT_PRIMITIVE_TYPE = 0x00008958, VGT_PRIMITIVE_TYPE__PRIM_TYPE_mask = 0x3f << 0, VGT_PRIMITIVE_TYPE__PRIM_TYPE_shift = 0, @@ -71,7 +80,7 @@ enum { DI_PT_TRISTRIP = 0x06, DI_PT_UNUSED_0 = 0x07, DI_PT_UNUSED_1 = 0x08, - DI_PT_PATCH = 0x09, + DI_PT_UNUSED_2 = 0x09, DI_PT_LINELIST_ADJ = 0x0a, DI_PT_LINESTRIP_ADJ = 0x0b, DI_PT_TRILIST_ADJ = 0x0c, @@ -112,23 +121,105 @@ enum { VE_NAN_PROC_DISABLE_bit = 1 << 4, PA_SU_CNTL_STATUS = 0x00008a50, SU_BUSY_bit = 1 << 31, - PA_SU_LINE_STIPPLE_VALUE = 0x00008a60, - LINE_STIPPLE_VALUE_mask = 0xffffff << 0, - LINE_STIPPLE_VALUE_shift = 0, PA_SC_LINE_STIPPLE_STATE = 0x00008b10, CURRENT_PTR_mask = 0x0f << 0, CURRENT_PTR_shift = 0, CURRENT_COUNT_mask = 0xff << 8, CURRENT_COUNT_shift = 8, + PA_SC_MULTI_CHIP_CNTL = 0x00008b20, + LOG2_NUM_CHIPS_mask = 0x07 << 0, + LOG2_NUM_CHIPS_shift = 0, + MULTI_CHIP_TILE_SIZE_mask = 0x03 << 3, + MULTI_CHIP_TILE_SIZE_shift = 3, + X_16_X_16_PIXEL_TILE_PER_CHIP = 0x00, + X_32_X_32_PIXEL_TILE_PER_CHIP = 0x01, + X_64_X_64_PIXEL_TILE_PER_CHIP = 0x02, + X_128X128_PIXEL_TILE_PER_CHIP = 0x03, + CHIP_TILE_X_LOC_mask = 0x07 << 5, + CHIP_TILE_X_LOC_shift = 5, + CHIP_TILE_Y_LOC_mask = 0x07 << 8, + CHIP_TILE_Y_LOC_shift = 8, + CHIP_SUPER_TILE_B_bit = 1 << 11, + PA_SC_AA_SAMPLE_LOCS_2S = 0x00008b40, + S0_X_mask = 0x0f << 0, + S0_X_shift = 0, + S0_Y_mask = 0x0f << 4, + S0_Y_shift = 4, + S1_X_mask = 0x0f << 8, + S1_X_shift = 8, + S1_Y_mask = 0x0f << 12, + S1_Y_shift = 12, + PA_SC_AA_SAMPLE_LOCS_4S = 0x00008b44, +/* S0_X_mask = 0x0f << 0, */ +/* S0_X_shift = 0, */ +/* S0_Y_mask = 0x0f << 4, */ +/* S0_Y_shift = 4, */ +/* S1_X_mask = 0x0f << 8, */ +/* S1_X_shift = 8, */ +/* S1_Y_mask = 0x0f << 12, */ +/* S1_Y_shift = 12, */ + S2_X_mask = 0x0f << 16, + S2_X_shift = 16, + S2_Y_mask = 0x0f << 20, + S2_Y_shift = 20, + S3_X_mask = 0x0f << 24, + S3_X_shift = 24, + S3_Y_mask = 0x0f << 28, + S3_Y_shift = 28, + PA_SC_AA_SAMPLE_LOCS_8S_WD0 = 0x00008b48, +/* S0_X_mask = 0x0f << 0, */ +/* S0_X_shift = 0, */ +/* S0_Y_mask = 0x0f << 4, */ +/* S0_Y_shift = 4, */ +/* S1_X_mask = 0x0f << 8, */ +/* S1_X_shift = 8, */ +/* S1_Y_mask = 0x0f << 12, */ +/* S1_Y_shift = 12, */ +/* S2_X_mask = 0x0f << 16, */ +/* S2_X_shift = 16, */ +/* S2_Y_mask = 0x0f << 20, */ +/* S2_Y_shift = 20, */ +/* S3_X_mask = 0x0f << 24, */ +/* S3_X_shift = 24, */ +/* S3_Y_mask = 0x0f << 28, */ +/* S3_Y_shift = 28, */ + PA_SC_AA_SAMPLE_LOCS_8S_WD1 = 0x00008b4c, + S4_X_mask = 0x0f << 0, + S4_X_shift = 0, + S4_Y_mask = 0x0f << 4, + S4_Y_shift = 4, + S5_X_mask = 0x0f << 8, + S5_X_shift = 8, + S5_Y_mask = 0x0f << 12, + S5_Y_shift = 12, + S6_X_mask = 0x0f << 16, + S6_X_shift = 16, + S6_Y_mask = 0x0f << 20, + S6_Y_shift = 20, + S7_X_mask = 0x0f << 24, + S7_X_shift = 24, + S7_Y_mask = 0x0f << 28, + S7_Y_shift = 28, + PA_SC_CNTL_STATUS = 0x00008be0, + MPASS_OVERFLOW_bit = 1 << 30, + PA_SC_ENHANCE = 0x00008bf0, + FORCE_EOV_MAX_CLK_CNT_mask = 0xfff << 0, + FORCE_EOV_MAX_CLK_CNT_shift = 0, + FORCE_EOV_MAX_TILE_CNT_mask = 0xfff << 12, + FORCE_EOV_MAX_TILE_CNT_shift = 12, SQ_CONFIG = 0x00008c00, VC_ENABLE_bit = 1 << 0, EXPORT_SRC_C_bit = 1 << 1, - CS_PRIO_mask = 0x03 << 18, - CS_PRIO_shift = 18, - LS_PRIO_mask = 0x03 << 20, - LS_PRIO_shift = 20, - HS_PRIO_mask = 0x03 << 22, - HS_PRIO_shift = 22, + DX9_CONSTS_bit = 1 << 2, + ALU_INST_PREFER_VECTOR_bit = 1 << 3, + SQ_CONFIG__DX10_CLAMP_bit = 1 << 4, + ALU_PREFER_ONE_WATERFALL_bit = 1 << 5, + ALU_MAX_ONE_WATERFALL_bit = 1 << 6, + CLAUSE_SEQ_PRIO_mask = 0x03 << 8, + CLAUSE_SEQ_PRIO_shift = 8, + SQ_CL_PRIO_RND_ROBIN = 0x00, + SQ_CL_PRIO_MACRO_SEQ = 0x01, + SQ_CL_PRIO_NONE = 0x02, PS_PRIO_mask = 0x03 << 24, PS_PRIO_shift = 24, VS_PRIO_mask = 0x03 << 26, @@ -149,28 +240,7 @@ enum { NUM_GS_GPRS_shift = 0, NUM_ES_GPRS_mask = 0xff << 16, NUM_ES_GPRS_shift = 16, - SQ_GPR_RESOURCE_MGMT_3 = 0x00008c0c, - NUM_HS_GPRS_mask = 0xff << 0, - NUM_HS_GPRS_shift = 0, - NUM_LS_GPRS_mask = 0xff << 16, - NUM_LS_GPRS_shift = 16, - SQ_GLOBAL_GPR_RESOURCE_MGMT_1 = 0x00008c10, - PS_GGPR_BASE_mask = 0xff << 0, - PS_GGPR_BASE_shift = 0, - VS_GGPR_BASE_mask = 0xff << 8, - VS_GGPR_BASE_shift = 8, - GS_GGPR_BASE_mask = 0xff << 16, - GS_GGPR_BASE_shift = 16, - ES_GGPR_BASE_mask = 0xff << 24, - ES_GGPR_BASE_shift = 24, - SQ_GLOBAL_GPR_RESOURCE_MGMT_2 = 0x00008c14, - HS_GGPR_BASE_mask = 0xff << 0, - HS_GGPR_BASE_shift = 0, - LS_GGPR_BASE_mask = 0xff << 8, - LS_GGPR_BASE_shift = 8, - CS_GGPR_BASE_mask = 0xff << 16, - CS_GGPR_BASE_shift = 16, - SQ_THREAD_RESOURCE_MGMT = 0x00008c18, + SQ_THREAD_RESOURCE_MGMT = 0x00008c0c, NUM_PS_THREADS_mask = 0xff << 0, NUM_PS_THREADS_shift = 0, NUM_VS_THREADS_mask = 0xff << 8, @@ -179,26 +249,16 @@ enum { NUM_GS_THREADS_shift = 16, NUM_ES_THREADS_mask = 0xff << 24, NUM_ES_THREADS_shift = 24, - SQ_THREAD_RESOURCE_MGMT_2 = 0x00008c1c, - NUM_HS_THREADS_mask = 0xff << 0, - NUM_HS_THREADS_shift = 0, - NUM_LS_THREADS_mask = 0xff << 8, - NUM_LS_THREADS_shift = 8, - SQ_STACK_RESOURCE_MGMT_1 = 0x00008c20, + SQ_STACK_RESOURCE_MGMT_1 = 0x00008c10, NUM_PS_STACK_ENTRIES_mask = 0xfff << 0, NUM_PS_STACK_ENTRIES_shift = 0, NUM_VS_STACK_ENTRIES_mask = 0xfff << 16, NUM_VS_STACK_ENTRIES_shift = 16, - SQ_STACK_RESOURCE_MGMT_2 = 0x00008c24, + SQ_STACK_RESOURCE_MGMT_2 = 0x00008c14, NUM_GS_STACK_ENTRIES_mask = 0xfff << 0, NUM_GS_STACK_ENTRIES_shift = 0, NUM_ES_STACK_ENTRIES_mask = 0xfff << 16, NUM_ES_STACK_ENTRIES_shift = 16, - SQ_STACK_RESOURCE_MGMT_3 = 0x00008c28, - NUM_HS_STACK_ENTRIES_mask = 0xfff << 0, - NUM_HS_STACK_ENTRIES_shift = 0, - NUM_LS_STACK_ENTRIES_mask = 0xfff << 16, - NUM_LS_STACK_ENTRIES_shift = 16, SQ_ESGS_RING_BASE = 0x00008c40, SQ_ESGS_RING_SIZE = 0x00008c44, SQ_GSVS_RING_BASE = 0x00008c48, @@ -211,36 +271,13 @@ enum { SQ_VSTMP_RING_SIZE = 0x00008c64, SQ_PSTMP_RING_BASE = 0x00008c68, SQ_PSTMP_RING_SIZE = 0x00008c6c, - SQ_CONST_MEM_BASE = 0x00008df8, + SQ_FBUF_RING_BASE = 0x00008c70, + SQ_FBUF_RING_SIZE = 0x00008c74, + SQ_REDUC_RING_BASE = 0x00008c78, + SQ_REDUC_RING_SIZE = 0x00008c7c, SQ_ALU_WORD1_OP3 = 0x00008dfc, SRC2_SEL_mask = 0x1ff << 0, SRC2_SEL_shift = 0, - SQ_ALU_SRC_LDS_OQ_A = 0xdb, - SQ_ALU_SRC_LDS_OQ_B = 0xdc, - SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, - SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, - SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, - SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, - SQ_ALU_SRC_TIME_HI = 0xe3, - SQ_ALU_SRC_TIME_LO = 0xe4, - SQ_ALU_SRC_MASK_HI = 0xe5, - SQ_ALU_SRC_MASK_LO = 0xe6, - SQ_ALU_SRC_HW_WAVE_ID = 0xe7, - SQ_ALU_SRC_SIMD_ID = 0xe8, - SQ_ALU_SRC_SE_ID = 0xe9, - SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, - SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, - SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, - SQ_ALU_SRC_HW_ALU_ODD = 0xed, - SQ_ALU_SRC_LOOP_IDX = 0xee, - SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, - SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, - SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, - SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, - SQ_ALU_SRC_1_DBL_L = 0xf4, - SQ_ALU_SRC_1_DBL_M = 0xf5, - SQ_ALU_SRC_0_5_DBL_L = 0xf6, - SQ_ALU_SRC_0_5_DBL_M = 0xf7, SQ_ALU_SRC_0 = 0xf8, SQ_ALU_SRC_1 = 0xf9, SQ_ALU_SRC_1_INT = 0xfa, @@ -259,37 +296,24 @@ enum { SRC2_NEG_bit = 1 << 12, SQ_ALU_WORD1_OP3__ALU_INST_mask = 0x1f << 13, SQ_ALU_WORD1_OP3__ALU_INST_shift = 13, - SQ_OP3_INST_BFE_UINT = 0x04, - SQ_OP3_INST_BFE_INT = 0x05, - SQ_OP3_INST_BFI_INT = 0x06, - SQ_OP3_INST_FMA = 0x07, - SQ_OP3_INST_CNDNE_64 = 0x09, - SQ_OP3_INST_FMA_64 = 0x0a, - SQ_OP3_INST_LERP_UINT = 0x0b, - SQ_OP3_INST_BIT_ALIGN_INT = 0x0c, - SQ_OP3_INST_BYTE_ALIGN_INT = 0x0d, - SQ_OP3_INST_SAD_ACCUM_UINT = 0x0e, - SQ_OP3_INST_SAD_ACCUM_HI_UINT = 0x0f, - SQ_OP3_INST_MULADD_UINT24 = 0x10, - SQ_OP3_INST_LDS_IDX_OP = 0x11, - SQ_OP3_INST_MULADD = 0x14, - SQ_OP3_INST_MULADD_M2 = 0x15, - SQ_OP3_INST_MULADD_M4 = 0x16, - SQ_OP3_INST_MULADD_D2 = 0x17, - SQ_OP3_INST_MULADD_IEEE = 0x18, - SQ_OP3_INST_CNDE = 0x19, - SQ_OP3_INST_CNDGT = 0x1a, - SQ_OP3_INST_CNDGE = 0x1b, + SQ_OP3_INST_MUL_LIT = 0x0c, + SQ_OP3_INST_MUL_LIT_M2 = 0x0d, + SQ_OP3_INST_MUL_LIT_M4 = 0x0e, + SQ_OP3_INST_MUL_LIT_D2 = 0x0f, + SQ_OP3_INST_MULADD = 0x10, + SQ_OP3_INST_MULADD_M2 = 0x11, + SQ_OP3_INST_MULADD_M4 = 0x12, + SQ_OP3_INST_MULADD_D2 = 0x13, + SQ_OP3_INST_MULADD_IEEE = 0x14, + SQ_OP3_INST_MULADD_IEEE_M2 = 0x15, + SQ_OP3_INST_MULADD_IEEE_M4 = 0x16, + SQ_OP3_INST_MULADD_IEEE_D2 = 0x17, + SQ_OP3_INST_CNDE = 0x18, + SQ_OP3_INST_CNDGT = 0x19, + SQ_OP3_INST_CNDGE = 0x1a, SQ_OP3_INST_CNDE_INT = 0x1c, SQ_OP3_INST_CNDGT_INT = 0x1d, SQ_OP3_INST_CNDGE_INT = 0x1e, - SQ_OP3_INST_MUL_LIT = 0x1f, - SQ_ALU_WORD1_LDS_DIRECT_LITERAL_LO = 0x00008dfc, - OFFSET_A_mask = 0x1fff << 0, - OFFSET_A_shift = 0, - STRIDE_A_mask = 0x7f << 13, - STRIDE_A_shift = 13, - THREAD_REL_A_bit = 1 << 22, SQ_TEX_WORD2 = 0x00008dfc, OFFSET_X_mask = 0x1f << 0, OFFSET_X_shift = 0, @@ -332,41 +356,22 @@ enum { /* SQ_SEL_0 = 0x04, */ /* SQ_SEL_1 = 0x05, */ SQ_CF_ALLOC_EXPORT_WORD1 = 0x00008dfc, - BURST_COUNT_mask = 0x0f << 16, - BURST_COUNT_shift = 16, - VALID_PIXEL_MODE_bit = 1 << 20, + BURST_COUNT_mask = 0x0f << 17, + BURST_COUNT_shift = 17, END_OF_PROGRAM_bit = 1 << 21, - SQ_CF_ALLOC_EXPORT_WORD1__CF_INST_mask = 0xff << 22, - SQ_CF_ALLOC_EXPORT_WORD1__CF_INST_shift = 22, - SQ_CF_INST_MEM_STREAM0_BUF0 = 0x40, - SQ_CF_INST_MEM_STREAM0_BUF1 = 0x41, - SQ_CF_INST_MEM_STREAM0_BUF2 = 0x42, - SQ_CF_INST_MEM_STREAM0_BUF3 = 0x43, - SQ_CF_INST_MEM_STREAM1_BUF0 = 0x44, - SQ_CF_INST_MEM_STREAM1_BUF1 = 0x45, - SQ_CF_INST_MEM_STREAM1_BUF2 = 0x46, - SQ_CF_INST_MEM_STREAM1_BUF3 = 0x47, - SQ_CF_INST_MEM_STREAM2_BUF0 = 0x48, - SQ_CF_INST_MEM_STREAM2_BUF1 = 0x49, - SQ_CF_INST_MEM_STREAM2_BUF2 = 0x4a, - SQ_CF_INST_MEM_STREAM2_BUF3 = 0x4b, - SQ_CF_INST_MEM_STREAM3_BUF0 = 0x4c, - SQ_CF_INST_MEM_STREAM3_BUF1 = 0x4d, - SQ_CF_INST_MEM_STREAM3_BUF2 = 0x4e, - SQ_CF_INST_MEM_STREAM3_BUF3 = 0x4f, - SQ_CF_INST_MEM_SCRATCH = 0x50, - SQ_CF_INST_MEM_RING = 0x52, - SQ_CF_INST_EXPORT = 0x53, - SQ_CF_INST_EXPORT_DONE = 0x54, - SQ_CF_INST_MEM_EXPORT = 0x55, - SQ_CF_INST_MEM_RAT = 0x56, - SQ_CF_INST_MEM_RAT_CACHELESS = 0x57, - SQ_CF_INST_MEM_RING1 = 0x58, - SQ_CF_INST_MEM_RING2 = 0x59, - SQ_CF_INST_MEM_RING3 = 0x5a, - SQ_CF_INST_MEM_EXPORT_COMBINED = 0x5b, - SQ_CF_INST_MEM_RAT_COMBINED_CACHELESS = 0x5c, - MARK_bit = 1 << 30, + VALID_PIXEL_MODE_bit = 1 << 22, + SQ_CF_ALLOC_EXPORT_WORD1__CF_INST_mask = 0x7f << 23, + SQ_CF_ALLOC_EXPORT_WORD1__CF_INST_shift = 23, + SQ_CF_INST_MEM_STREAM0 = 0x20, + SQ_CF_INST_MEM_STREAM1 = 0x21, + SQ_CF_INST_MEM_STREAM2 = 0x22, + SQ_CF_INST_MEM_STREAM3 = 0x23, + SQ_CF_INST_MEM_SCRATCH = 0x24, + SQ_CF_INST_MEM_REDUCTION = 0x25, + SQ_CF_INST_MEM_RING = 0x26, + SQ_CF_INST_EXPORT = 0x27, + SQ_CF_INST_EXPORT_DONE = 0x28, + WHOLE_QUAD_MODE_bit = 1 << 30, BARRIER_bit = 1 << 31, SQ_CF_ALU_WORD1 = 0x00008dfc, KCACHE_MODE1_mask = 0x03 << 0, @@ -388,11 +393,10 @@ enum { SQ_CF_INST_ALU_PUSH_BEFORE = 0x09, SQ_CF_INST_ALU_POP_AFTER = 0x0a, SQ_CF_INST_ALU_POP2_AFTER = 0x0b, - SQ_CF_INST_ALU_EXTENDED = 0x0c, SQ_CF_INST_ALU_CONTINUE = 0x0d, SQ_CF_INST_ALU_BREAK = 0x0e, SQ_CF_INST_ALU_ELSE_AFTER = 0x0f, - WHOLE_QUAD_MODE_bit = 1 << 30, +/* WHOLE_QUAD_MODE_bit = 1 << 30, */ /* BARRIER_bit = 1 << 31, */ SQ_TEX_WORD1 = 0x00008dfc, SQ_TEX_WORD1__DST_GPR_mask = 0x7f << 0, @@ -445,7 +449,6 @@ enum { VTX_INST_shift = 0, SQ_VTX_INST_FETCH = 0x00, SQ_VTX_INST_SEMANTIC = 0x01, - SQ_VTX_INST_GET_BUFFER_RESINFO = 0x0e, FETCH_TYPE_mask = 0x03 << 5, FETCH_TYPE_shift = 5, SQ_VTX_FETCH_VERTEX_DATA = 0x00, @@ -454,8 +457,8 @@ enum { FETCH_WHOLE_QUAD_bit = 1 << 7, BUFFER_ID_mask = 0xff << 8, BUFFER_ID_shift = 8, - SQ_VTX_WORD0__SRC_GPR_mask = 0x7f << 16, - SQ_VTX_WORD0__SRC_GPR_shift = 16, + SRC_GPR_mask = 0x7f << 16, + SRC_GPR_shift = 16, SRC_REL_bit = 1 << 23, SQ_VTX_WORD0__SRC_SEL_X_mask = 0x03 << 24, SQ_VTX_WORD0__SRC_SEL_X_shift = 24, @@ -502,35 +505,9 @@ enum { /* SQ_SEL_0 = 0x04, */ /* SQ_SEL_1 = 0x05, */ /* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD0 = 0x00008dfc, - MEM_INST_mask = 0x1f << 0, - MEM_INST_shift = 0, - SQ_MEM_INST_MEM = 0x02, - SQ_MEM_RD_WORD0__ELEM_SIZE_mask = 0x03 << 5, - SQ_MEM_RD_WORD0__ELEM_SIZE_shift = 5, -/* FETCH_WHOLE_QUAD_bit = 1 << 7, */ - MEM_OP_mask = 0x07 << 8, - MEM_OP_shift = 8, - SQ_MEM_OP_RD_SCRATCH = 0x00, - SQ_MEM_OP_RD_SCATTER = 0x02, - SQ_MEM_OP_GDS = 0x04, - SQ_MEM_OP_TF_WRITE = 0x05, - SQ_MEM_RD_WORD0__UNCACHED_bit = 1 << 11, - INDEXED_bit = 1 << 12, - SQ_MEM_RD_WORD0__SRC_GPR_mask = 0x7f << 16, - SQ_MEM_RD_WORD0__SRC_GPR_shift = 16, -/* SRC_REL_bit = 1 << 23, */ - SQ_MEM_RD_WORD0__SRC_SEL_X_mask = 0x03 << 24, - SQ_MEM_RD_WORD0__SRC_SEL_X_shift = 24, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ - BURST_CNT_mask = 0x0f << 26, - BURST_CNT_shift = 26, SQ_ALU_WORD1 = 0x00008dfc, - SQ_ALU_WORD1__ENCODING_mask = 0x07 << 15, - SQ_ALU_WORD1__ENCODING_shift = 15, + ENCODING_mask = 0x07 << 15, + ENCODING_shift = 15, BANK_SWIZZLE_mask = 0x07 << 18, BANK_SWIZZLE_shift = 18, SQ_ALU_VEC_012 = 0x00, @@ -549,242 +526,6 @@ enum { CHAN_Z = 0x02, CHAN_W = 0x03, SQ_ALU_WORD1__CLAMP_bit = 1 << 31, - SQ_CF_ALU_WORD0_EXT = 0x00008dfc, - KCACHE_BANK_INDEX_MODE0_mask = 0x03 << 4, - KCACHE_BANK_INDEX_MODE0_shift = 4, - SQ_CF_INDEX_NONE = 0x00, - SQ_CF_INDEX_0 = 0x01, - SQ_CF_INDEX_1 = 0x02, - SQ_CF_INVALID = 0x03, - KCACHE_BANK_INDEX_MODE1_mask = 0x03 << 6, - KCACHE_BANK_INDEX_MODE1_shift = 6, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - KCACHE_BANK_INDEX_MODE2_mask = 0x03 << 8, - KCACHE_BANK_INDEX_MODE2_shift = 8, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - KCACHE_BANK_INDEX_MODE3_mask = 0x03 << 10, - KCACHE_BANK_INDEX_MODE3_shift = 10, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - KCACHE_BANK2_mask = 0x0f << 22, - KCACHE_BANK2_shift = 22, - KCACHE_BANK3_mask = 0x0f << 26, - KCACHE_BANK3_shift = 26, - KCACHE_MODE2_mask = 0x03 << 30, - KCACHE_MODE2_shift = 30, -/* SQ_CF_KCACHE_NOP = 0x00, */ -/* SQ_CF_KCACHE_LOCK_1 = 0x01, */ -/* SQ_CF_KCACHE_LOCK_2 = 0x02, */ -/* SQ_CF_KCACHE_LOCK_LOOP_INDEX = 0x03, */ - SQ_ALU_WORD0_LDS_IDX_OP = 0x00008dfc, - SRC0_SEL_mask = 0x1ff << 0, - SRC0_SEL_shift = 0, -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ - SRC0_REL_bit = 1 << 9, - SRC0_CHAN_mask = 0x03 << 10, - SRC0_CHAN_shift = 10, -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - IDX_OFFSET_4_bit = 1 << 12, - SRC1_SEL_mask = 0x1ff << 13, - SRC1_SEL_shift = 13, -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ - SRC1_REL_bit = 1 << 22, - SRC1_CHAN_mask = 0x03 << 23, - SRC1_CHAN_shift = 23, -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - IDX_OFFSET_5_bit = 1 << 25, - INDEX_MODE_mask = 0x07 << 26, - INDEX_MODE_shift = 26, - SQ_INDEX_AR_X = 0x00, - SQ_INDEX_LOOP = 0x04, - SQ_INDEX_GLOBAL = 0x05, - SQ_INDEX_GLOBAL_AR_X = 0x06, - PRED_SEL_mask = 0x03 << 29, - PRED_SEL_shift = 29, - SQ_PRED_SEL_OFF = 0x00, - SQ_PRED_SEL_ZERO = 0x02, - SQ_PRED_SEL_ONE = 0x03, - LAST_bit = 1 << 31, - SQ_MEM_GDS_WORD2 = 0x00008dfc, - SQ_MEM_GDS_WORD2__DST_SEL_X_mask = 0x07 << 0, - SQ_MEM_GDS_WORD2__DST_SEL_X_shift = 0, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_GDS_WORD2__DST_SEL_Y_mask = 0x07 << 3, - SQ_MEM_GDS_WORD2__DST_SEL_Y_shift = 3, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_GDS_WORD2__DST_SEL_Z_mask = 0x07 << 6, - SQ_MEM_GDS_WORD2__DST_SEL_Z_shift = 6, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_GDS_WORD2__DST_SEL_W_mask = 0x07 << 9, - SQ_MEM_GDS_WORD2__DST_SEL_W_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_CF_ALLOC_EXPORT_WORD0_RAT = 0x00008dfc, - RAT_ID_mask = 0x0f << 0, - RAT_ID_shift = 0, - RAT_INST_mask = 0x3f << 4, - RAT_INST_shift = 4, - SQ_EXPORT_RAT_INST_NOP = 0x00, - SQ_EXPORT_RAT_INST_STORE_TYPED = 0x01, - SQ_EXPORT_RAT_INST_STORE_RAW = 0x02, - SQ_EXPORT_RAT_INST_STORE_RAW_FDENORM = 0x03, - SQ_EXPORT_RAT_INST_CMPXCHG_INT = 0x04, - SQ_EXPORT_RAT_INST_CMPXCHG_FLT = 0x05, - SQ_EXPORT_RAT_INST_CMPXCHG_FDENORM = 0x06, - SQ_EXPORT_RAT_INST_ADD = 0x07, - SQ_EXPORT_RAT_INST_SUB = 0x08, - SQ_EXPORT_RAT_INST_RSUB = 0x09, - SQ_EXPORT_RAT_INST_MIN_INT = 0x0a, - SQ_EXPORT_RAT_INST_MIN_UINT = 0x0b, - SQ_EXPORT_RAT_INST_MAX_INT = 0x0c, - SQ_EXPORT_RAT_INST_MAX_UINT = 0x0d, - SQ_EXPORT_RAT_INST_AND = 0x0e, - SQ_EXPORT_RAT_INST_OR = 0x0f, - SQ_EXPORT_RAT_INST_XOR = 0x10, - SQ_EXPORT_RAT_INST_MSKOR = 0x11, - SQ_EXPORT_RAT_INST_INC_UINT = 0x12, - SQ_EXPORT_RAT_INST_DEC_UINT = 0x13, - SQ_EXPORT_RAT_INST_NOP_RTN = 0x20, - SQ_EXPORT_RAT_INST_XCHG_RTN = 0x22, - SQ_EXPORT_RAT_INST_XCHG_FDENORM_RTN = 0x23, - SQ_EXPORT_RAT_INST_CMPXCHG_INT_RTN = 0x24, - SQ_EXPORT_RAT_INST_CMPXCHG_FLT_RTN = 0x25, - SQ_EXPORT_RAT_INST_CMPXCHG_FDENORM_RTN = 0x26, - SQ_EXPORT_RAT_INST_ADD_RTN = 0x27, - SQ_EXPORT_RAT_INST_SUB_RTN = 0x28, - SQ_EXPORT_RAT_INST_RSUB_RTN = 0x29, - SQ_EXPORT_RAT_INST_MIN_INT_RTN = 0x2a, - SQ_EXPORT_RAT_INST_MIN_UINT_RTN = 0x2b, - SQ_EXPORT_RAT_INST_MAX_INT_RTN = 0x2c, - SQ_EXPORT_RAT_INST_MAX_UINT_RTN = 0x2d, - SQ_EXPORT_RAT_INST_AND_RTN = 0x2e, - SQ_EXPORT_RAT_INST_OR_RTN = 0x2f, - SQ_EXPORT_RAT_INST_XOR_RTN = 0x30, - SQ_EXPORT_RAT_INST_MSKOR_RTN = 0x31, - SQ_EXPORT_RAT_INST_INC_UINT_RTN = 0x32, - SQ_EXPORT_RAT_INST_DEC_UINT_RTN = 0x33, - RAT_INDEX_MODE_mask = 0x03 << 11, - RAT_INDEX_MODE_shift = 11, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - SQ_CF_ALLOC_EXPORT_WORD0_RAT__TYPE_mask = 0x03 << 13, - SQ_CF_ALLOC_EXPORT_WORD0_RAT__TYPE_shift = 13, - SQ_EXPORT_PIXEL = 0x00, - SQ_EXPORT_POS = 0x01, - SQ_EXPORT_PARAM = 0x02, - X_UNUSED_FOR_SX_EXPORTS = 0x03, - RW_GPR_mask = 0x7f << 15, - RW_GPR_shift = 15, - RW_REL_bit = 1 << 22, - INDEX_GPR_mask = 0x7f << 23, - INDEX_GPR_shift = 23, - SQ_CF_ALLOC_EXPORT_WORD0_RAT__ELEM_SIZE_mask = 0x03 << 30, - SQ_CF_ALLOC_EXPORT_WORD0_RAT__ELEM_SIZE_shift = 30, SQ_CF_ALU_WORD0 = 0x00008dfc, SQ_CF_ALU_WORD0__ADDR_mask = 0x3fffff << 0, SQ_CF_ALU_WORD0__ADDR_shift = 0, @@ -798,289 +539,31 @@ enum { /* SQ_CF_KCACHE_LOCK_1 = 0x01, */ /* SQ_CF_KCACHE_LOCK_2 = 0x02, */ /* SQ_CF_KCACHE_LOCK_LOOP_INDEX = 0x03, */ - SQ_MEM_GDS_WORD1 = 0x00008dfc, - SQ_MEM_GDS_WORD1__DST_GPR_mask = 0x7f << 0, - SQ_MEM_GDS_WORD1__DST_GPR_shift = 0, - DST_REL_MODE_mask = 0x03 << 7, - DST_REL_MODE_shift = 7, - SQ_REL_NONE = 0x00, - SQ_REL_LOOP = 0x01, - SQ_REL_GLOBAL = 0x02, - GDS_OP_mask = 0x3f << 9, - GDS_OP_shift = 9, - SQ_DS_INST_ADD = 0x00, - SQ_DS_INST_SUB = 0x01, - SQ_DS_INST_RSUB = 0x02, - SQ_DS_INST_INC = 0x03, - SQ_DS_INST_DEC = 0x04, - SQ_DS_INST_MIN_INT = 0x05, - SQ_DS_INST_MAX_INT = 0x06, - SQ_DS_INST_MIN_UINT = 0x07, - SQ_DS_INST_MAX_UINT = 0x08, - SQ_DS_INST_AND = 0x09, - SQ_DS_INST_OR = 0x0a, - SQ_DS_INST_XOR = 0x0b, - SQ_DS_INST_MSKOR = 0x0c, - SQ_DS_INST_WRITE = 0x0d, - SQ_DS_INST_WRITE_REL = 0x0e, - SQ_DS_INST_WRITE2 = 0x0f, - SQ_DS_INST_CMP_STORE = 0x10, - SQ_DS_INST_CMP_STORE_SPF = 0x11, - SQ_DS_INST_BYTE_WRITE = 0x12, - SQ_DS_INST_SHORT_WRITE = 0x13, - SQ_DS_INST_ADD_RET = 0x20, - SQ_DS_INST_SUB_RET = 0x21, - SQ_DS_INST_RSUB_RET = 0x22, - SQ_DS_INST_INC_RET = 0x23, - SQ_DS_INST_DEC_RET = 0x24, - SQ_DS_INST_MIN_INT_RET = 0x25, - SQ_DS_INST_MAX_INT_RET = 0x26, - SQ_DS_INST_MIN_UINT_RET = 0x27, - SQ_DS_INST_MAX_UINT_RET = 0x28, - SQ_DS_INST_AND_RET = 0x29, - SQ_DS_INST_OR_RET = 0x2a, - SQ_DS_INST_XOR_RET = 0x2b, - SQ_DS_INST_MSKOR_RET = 0x2c, - SQ_DS_INST_XCHG_RET = 0x2d, - SQ_DS_INST_XCHG_REL_RET = 0x2e, - SQ_DS_INST_XCHG2_RET = 0x2f, - SQ_DS_INST_CMP_XCHG_RET = 0x30, - SQ_DS_INST_CMP_XCHG_SPF_RET = 0x31, - SQ_DS_INST_READ_RET = 0x32, - SQ_DS_INST_READ_REL_RET = 0x33, - SQ_DS_INST_READ2_RET = 0x34, - SQ_DS_INST_READWRITE_RET = 0x35, - SQ_DS_INST_BYTE_READ_RET = 0x36, - SQ_DS_INST_UBYTE_READ_RET = 0x37, - SQ_DS_INST_SHORT_READ_RET = 0x38, - SQ_DS_INST_USHORT_READ_RET = 0x39, - SQ_DS_INST_ATOMIC_ORDERED_ALLOC_RET = 0x3f, - DS_OFFSET_mask = 0x7f << 16, - DS_OFFSET_shift = 16, - UAV_INDEX_MODE_mask = 0x03 << 24, - UAV_INDEX_MODE_shift = 24, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - UAV_ID_mask = 0x0f << 26, - UAV_ID_shift = 26, - ALLOC_CONSUME_bit = 1 << 30, - BCAST_FIRST_REQ_bit = 1 << 31, - SQ_MEM_RD_WORD2 = 0x00008dfc, - ARRAY_BASE_mask = 0x1fff << 0, - ARRAY_BASE_shift = 0, - SQ_MEM_RD_WORD2__ENDIAN_SWAP_mask = 0x03 << 16, - SQ_MEM_RD_WORD2__ENDIAN_SWAP_shift = 16, - SQ_ENDIAN_NONE = 0x00, - SQ_ENDIAN_8IN16 = 0x01, - SQ_ENDIAN_8IN32 = 0x02, - SQ_MEM_RD_WORD2__ARRAY_SIZE_mask = 0xfff << 20, - SQ_MEM_RD_WORD2__ARRAY_SIZE_shift = 20, - SQ_CF_ALU_WORD1_EXT = 0x00008dfc, - KCACHE_MODE3_mask = 0x03 << 0, - KCACHE_MODE3_shift = 0, -/* SQ_CF_KCACHE_NOP = 0x00, */ -/* SQ_CF_KCACHE_LOCK_1 = 0x01, */ -/* SQ_CF_KCACHE_LOCK_2 = 0x02, */ -/* SQ_CF_KCACHE_LOCK_LOOP_INDEX = 0x03, */ - KCACHE_ADDR2_mask = 0xff << 2, - KCACHE_ADDR2_shift = 2, - KCACHE_ADDR3_mask = 0xff << 10, - KCACHE_ADDR3_shift = 10, - SQ_CF_ALU_WORD1_EXT__CF_INST_mask = 0x0f << 26, - SQ_CF_ALU_WORD1_EXT__CF_INST_shift = 26, -/* SQ_CF_INST_ALU = 0x08, */ -/* SQ_CF_INST_ALU_PUSH_BEFORE = 0x09, */ -/* SQ_CF_INST_ALU_POP_AFTER = 0x0a, */ -/* SQ_CF_INST_ALU_POP2_AFTER = 0x0b, */ -/* SQ_CF_INST_ALU_EXTENDED = 0x0c, */ -/* SQ_CF_INST_ALU_CONTINUE = 0x0d, */ -/* SQ_CF_INST_ALU_BREAK = 0x0e, */ -/* SQ_CF_INST_ALU_ELSE_AFTER = 0x0f, */ -/* BARRIER_bit = 1 << 31, */ - SQ_CF_GWS_WORD0 = 0x00008dfc, - VALUE_mask = 0x3ff << 0, - VALUE_shift = 0, - RESOURCE_mask = 0x1f << 16, - RESOURCE_shift = 16, - SIGN_bit = 1 << 25, - VAL_INDEX_MODE_mask = 0x03 << 26, - VAL_INDEX_MODE_shift = 26, - SQ_GWS_INDEX_NONE = 0x00, - SQ_GWS_INDEX_0 = 0x01, - SQ_GWS_INDEX_1 = 0x02, - SQ_GWS_INDEX_MIX = 0x03, - RSRC_INDEX_MODE_mask = 0x03 << 28, - RSRC_INDEX_MODE_shift = 28, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - GWS_OPCODE_mask = 0x03 << 30, - GWS_OPCODE_shift = 30, - SQ_GWS_SEMA_V = 0x00, - SQ_GWS_SEMA_P = 0x01, - SQ_GWS_BARRIER = 0x02, - SQ_GWS_INIT = 0x03, SQ_VTX_WORD2 = 0x00008dfc, SQ_VTX_WORD2__OFFSET_mask = 0xffff << 0, SQ_VTX_WORD2__OFFSET_shift = 0, SQ_VTX_WORD2__ENDIAN_SWAP_mask = 0x03 << 16, SQ_VTX_WORD2__ENDIAN_SWAP_shift = 16, -/* SQ_ENDIAN_NONE = 0x00, */ -/* SQ_ENDIAN_8IN16 = 0x01, */ -/* SQ_ENDIAN_8IN32 = 0x02, */ + SQ_ENDIAN_NONE = 0x00, + SQ_ENDIAN_8IN16 = 0x01, + SQ_ENDIAN_8IN32 = 0x02, CONST_BUF_NO_STRIDE_bit = 1 << 18, MEGA_FETCH_bit = 1 << 19, SQ_VTX_WORD2__ALT_CONST_bit = 1 << 20, - BUFFER_INDEX_MODE_mask = 0x03 << 21, - BUFFER_INDEX_MODE_shift = 21, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - SQ_CF_ALLOC_EXPORT_WORD1_BUF = 0x00008dfc, - SQ_CF_ALLOC_EXPORT_WORD1_BUF__ARRAY_SIZE_mask = 0xfff << 0, - SQ_CF_ALLOC_EXPORT_WORD1_BUF__ARRAY_SIZE_shift = 0, - COMP_MASK_mask = 0x0f << 12, - COMP_MASK_shift = 12, - SQ_CF_WORD0 = 0x00008dfc, - SQ_CF_WORD0__ADDR_mask = 0xffffff << 0, - SQ_CF_WORD0__ADDR_shift = 0, - JUMPTABLE_SEL_mask = 0x07 << 24, - JUMPTABLE_SEL_shift = 24, - SQ_CF_JUMPTABLE_SEL_CONST_A = 0x00, - SQ_CF_JUMPTABLE_SEL_CONST_B = 0x01, - SQ_CF_JUMPTABLE_SEL_CONST_C = 0x02, - SQ_CF_JUMPTABLE_SEL_CONST_D = 0x03, - SQ_CF_JUMPTABLE_SEL_INDEX_0 = 0x04, - SQ_CF_JUMPTABLE_SEL_INDEX_1 = 0x05, - SQ_CF_ALLOC_EXPORT_WORD0 = 0x00008dfc, -/* ARRAY_BASE_mask = 0x1fff << 0, */ -/* ARRAY_BASE_shift = 0, */ - SQ_CF_ALLOC_EXPORT_WORD0__TYPE_mask = 0x03 << 13, - SQ_CF_ALLOC_EXPORT_WORD0__TYPE_shift = 13, -/* SQ_EXPORT_PIXEL = 0x00, */ -/* SQ_EXPORT_POS = 0x01, */ -/* SQ_EXPORT_PARAM = 0x02, */ -/* X_UNUSED_FOR_SX_EXPORTS = 0x03, */ -/* RW_GPR_mask = 0x7f << 15, */ -/* RW_GPR_shift = 15, */ -/* RW_REL_bit = 1 << 22, */ -/* INDEX_GPR_mask = 0x7f << 23, */ -/* INDEX_GPR_shift = 23, */ - SQ_CF_ALLOC_EXPORT_WORD0__ELEM_SIZE_mask = 0x03 << 30, - SQ_CF_ALLOC_EXPORT_WORD0__ELEM_SIZE_shift = 30, - SQ_MEM_GDS_WORD0 = 0x00008dfc, -/* MEM_INST_mask = 0x1f << 0, */ -/* MEM_INST_shift = 0, */ -/* SQ_MEM_INST_MEM = 0x02, */ -/* MEM_OP_mask = 0x07 << 8, */ -/* MEM_OP_shift = 8, */ -/* SQ_MEM_OP_RD_SCRATCH = 0x00, */ -/* SQ_MEM_OP_RD_SCATTER = 0x02, */ -/* SQ_MEM_OP_GDS = 0x04, */ -/* SQ_MEM_OP_TF_WRITE = 0x05, */ - SQ_MEM_GDS_WORD0__SRC_GPR_mask = 0x7f << 11, - SQ_MEM_GDS_WORD0__SRC_GPR_shift = 11, - SRC_REL_MODE_mask = 0x03 << 18, - SRC_REL_MODE_shift = 18, -/* SQ_REL_NONE = 0x00, */ -/* SQ_REL_LOOP = 0x01, */ -/* SQ_REL_GLOBAL = 0x02, */ - SQ_MEM_GDS_WORD0__SRC_SEL_X_mask = 0x07 << 20, - SQ_MEM_GDS_WORD0__SRC_SEL_X_shift = 20, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SRC_SEL_Y_mask = 0x07 << 23, */ -/* SRC_SEL_Y_shift = 23, */ -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SRC_SEL_Z_mask = 0x07 << 26, */ -/* SRC_SEL_Z_shift = 26, */ -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_ALU_WORD1_LDS_DIRECT_LITERAL_HI = 0x00008dfc, - OFFSET_B_mask = 0x1fff << 0, - OFFSET_B_shift = 0, - STRIDE_B_mask = 0x7f << 13, - STRIDE_B_shift = 13, - THREAD_REL_B_bit = 1 << 22, - DIRECT_READ_32_bit = 1 << 31, - SQ_VTX_WORD1 = 0x00008dfc, - SQ_VTX_WORD1__DST_SEL_X_mask = 0x07 << 9, - SQ_VTX_WORD1__DST_SEL_X_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_VTX_WORD1__DST_SEL_Y_mask = 0x07 << 12, - SQ_VTX_WORD1__DST_SEL_Y_shift = 12, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_VTX_WORD1__DST_SEL_Z_mask = 0x07 << 15, - SQ_VTX_WORD1__DST_SEL_Z_shift = 15, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_VTX_WORD1__DST_SEL_W_mask = 0x07 << 18, - SQ_VTX_WORD1__DST_SEL_W_shift = 18, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - USE_CONST_FIELDS_bit = 1 << 21, - SQ_VTX_WORD1__DATA_FORMAT_mask = 0x3f << 22, - SQ_VTX_WORD1__DATA_FORMAT_shift = 22, - SQ_VTX_WORD1__NUM_FORMAT_ALL_mask = 0x03 << 28, - SQ_VTX_WORD1__NUM_FORMAT_ALL_shift = 28, - SQ_NUM_FORMAT_NORM = 0x00, - SQ_NUM_FORMAT_INT = 0x01, - SQ_NUM_FORMAT_SCALED = 0x02, - SQ_VTX_WORD1__FORMAT_COMP_ALL_bit = 1 << 30, - SQ_VTX_WORD1__SRF_MODE_ALL_bit = 1 << 31, - SQ_ALU_WORD1_OP2 = 0x00008dfc, + SQ_ALU_WORD1_OP2_V2 = 0x00008dfc, SRC0_ABS_bit = 1 << 0, SRC1_ABS_bit = 1 << 1, UPDATE_EXECUTE_MASK_bit = 1 << 2, UPDATE_PRED_bit = 1 << 3, WRITE_MASK_bit = 1 << 4, - OMOD_mask = 0x03 << 5, - OMOD_shift = 5, + SQ_ALU_WORD1_OP2_V2__OMOD_mask = 0x03 << 5, + SQ_ALU_WORD1_OP2_V2__OMOD_shift = 5, SQ_ALU_OMOD_OFF = 0x00, SQ_ALU_OMOD_M2 = 0x01, SQ_ALU_OMOD_M4 = 0x02, SQ_ALU_OMOD_D2 = 0x03, - SQ_ALU_WORD1_OP2__ALU_INST_mask = 0x7ff << 7, - SQ_ALU_WORD1_OP2__ALU_INST_shift = 7, + SQ_ALU_WORD1_OP2_V2__ALU_INST_mask = 0x7ff << 7, + SQ_ALU_WORD1_OP2_V2__ALU_INST_shift = 7, SQ_OP2_INST_ADD = 0x00, SQ_OP2_INST_MUL = 0x01, SQ_OP2_INST_MUL_IEEE = 0x02, @@ -1101,9 +584,9 @@ enum { SQ_OP2_INST_CEIL = 0x12, SQ_OP2_INST_RNDNE = 0x13, SQ_OP2_INST_FLOOR = 0x14, - SQ_OP2_INST_ASHR_INT = 0x15, - SQ_OP2_INST_LSHR_INT = 0x16, - SQ_OP2_INST_LSHL_INT = 0x17, + SQ_OP2_INST_MOVA = 0x15, + SQ_OP2_INST_MOVA_FLOOR = 0x16, + SQ_OP2_INST_MOVA_INT = 0x18, SQ_OP2_INST_MOV = 0x19, SQ_OP2_INST_NOP = 0x1a, SQ_OP2_INST_PRED_SETGT_UINT = 0x1e, @@ -1156,101 +639,225 @@ enum { SQ_OP2_INST_PRED_SETNE_PUSH_INT = 0x4d, SQ_OP2_INST_PRED_SETLT_PUSH_INT = 0x4e, SQ_OP2_INST_PRED_SETLE_PUSH_INT = 0x4f, - SQ_OP2_INST_FLT_TO_INT = 0x50, - SQ_OP2_INST_BFREV_INT = 0x51, - SQ_OP2_INST_ADDC_UINT = 0x52, - SQ_OP2_INST_SUBB_UINT = 0x53, - SQ_OP2_INST_GROUP_BARRIER = 0x54, - SQ_OP2_INST_GROUP_SEQ_BEGIN = 0x55, - SQ_OP2_INST_GROUP_SEQ_END = 0x56, - SQ_OP2_INST_SET_MODE = 0x57, - SQ_OP2_INST_SET_CF_IDX0 = 0x58, - SQ_OP2_INST_SET_CF_IDX1 = 0x59, - SQ_OP2_INST_SET_LDS_SIZE = 0x5a, - SQ_OP2_INST_EXP_IEEE = 0x81, - SQ_OP2_INST_LOG_CLAMPED = 0x82, - SQ_OP2_INST_LOG_IEEE = 0x83, - SQ_OP2_INST_RECIP_CLAMPED = 0x84, - SQ_OP2_INST_RECIP_FF = 0x85, - SQ_OP2_INST_RECIP_IEEE = 0x86, - SQ_OP2_INST_RECIPSQRT_CLAMPED = 0x87, - SQ_OP2_INST_RECIPSQRT_FF = 0x88, - SQ_OP2_INST_RECIPSQRT_IEEE = 0x89, - SQ_OP2_INST_SQRT_IEEE = 0x8a, - SQ_OP2_INST_SIN = 0x8d, - SQ_OP2_INST_COS = 0x8e, - SQ_OP2_INST_MULLO_INT = 0x8f, - SQ_OP2_INST_MULHI_INT = 0x90, - SQ_OP2_INST_MULLO_UINT = 0x91, - SQ_OP2_INST_MULHI_UINT = 0x92, - SQ_OP2_INST_RECIP_INT = 0x93, - SQ_OP2_INST_RECIP_UINT = 0x94, - SQ_OP2_INST_RECIP_64 = 0x95, - SQ_OP2_INST_RECIP_CLAMPED_64 = 0x96, - SQ_OP2_INST_RECIPSQRT_64 = 0x97, - SQ_OP2_INST_RECIPSQRT_CLAMPED_64 = 0x98, - SQ_OP2_INST_SQRT_64 = 0x99, - SQ_OP2_INST_FLT_TO_UINT = 0x9a, - SQ_OP2_INST_INT_TO_FLT = 0x9b, - SQ_OP2_INST_UINT_TO_FLT = 0x9c, - SQ_OP2_INST_BFM_INT = 0xa0, - SQ_OP2_INST_FLT32_TO_FLT16 = 0xa2, - SQ_OP2_INST_FLT16_TO_FLT32 = 0xa3, - SQ_OP2_INST_UBYTE0_FLT = 0xa4, - SQ_OP2_INST_UBYTE1_FLT = 0xa5, - SQ_OP2_INST_UBYTE2_FLT = 0xa6, - SQ_OP2_INST_UBYTE3_FLT = 0xa7, - SQ_OP2_INST_BCNT_INT = 0xaa, - SQ_OP2_INST_FFBH_UINT = 0xab, - SQ_OP2_INST_FFBL_INT = 0xac, - SQ_OP2_INST_FFBH_INT = 0xad, - SQ_OP2_INST_FLT_TO_UINT4 = 0xae, - SQ_OP2_INST_DOT_IEEE = 0xaf, - SQ_OP2_INST_FLT_TO_INT_RPI = 0xb0, - SQ_OP2_INST_FLT_TO_INT_FLOOR = 0xb1, - SQ_OP2_INST_MULHI_UINT24 = 0xb2, - SQ_OP2_INST_MBCNT_32HI_INT = 0xb3, - SQ_OP2_INST_OFFSET_TO_FLT = 0xb4, - SQ_OP2_INST_MUL_UINT24 = 0xb5, - SQ_OP2_INST_BCNT_ACCUM_PREV_INT = 0xb6, - SQ_OP2_INST_MBCNT_32LO_ACCUM_PREV_INT = 0xb7, - SQ_OP2_INST_SETE_64 = 0xb8, - SQ_OP2_INST_SETNE_64 = 0xb9, - SQ_OP2_INST_SETGT_64 = 0xba, - SQ_OP2_INST_SETGE_64 = 0xbb, - SQ_OP2_INST_MIN_64 = 0xbc, - SQ_OP2_INST_MAX_64 = 0xbd, - SQ_OP2_INST_DOT4 = 0xbe, - SQ_OP2_INST_DOT4_IEEE = 0xbf, - SQ_OP2_INST_CUBE = 0xc0, - SQ_OP2_INST_MAX4 = 0xc1, - SQ_OP2_INST_FREXP_64 = 0xc4, - SQ_OP2_INST_LDEXP_64 = 0xc5, - SQ_OP2_INST_FRACT_64 = 0xc6, - SQ_OP2_INST_PRED_SETGT_64 = 0xc7, - SQ_OP2_INST_PRED_SETE_64 = 0xc8, - SQ_OP2_INST_PRED_SETGE_64 = 0xc9, - SQ_OP2_INST_MUL_64 = 0xca, - SQ_OP2_INST_ADD_64 = 0xcb, - SQ_OP2_INST_MOVA_INT = 0xcc, - SQ_OP2_INST_FLT64_TO_FLT32 = 0xcd, - SQ_OP2_INST_FLT32_TO_FLT64 = 0xce, - SQ_OP2_INST_SAD_ACCUM_PREV_UINT = 0xcf, - SQ_OP2_INST_DOT = 0xd0, - SQ_OP2_INST_MUL_PREV = 0xd1, - SQ_OP2_INST_MUL_IEEE_PREV = 0xd2, - SQ_OP2_INST_ADD_PREV = 0xd3, - SQ_OP2_INST_MULADD_PREV = 0xd4, - SQ_OP2_INST_MULADD_IEEE_PREV = 0xd5, - SQ_OP2_INST_INTERP_XY = 0xd6, - SQ_OP2_INST_INTERP_ZW = 0xd7, - SQ_OP2_INST_INTERP_X = 0xd8, - SQ_OP2_INST_INTERP_Z = 0xd9, - SQ_OP2_INST_STORE_FLAGS = 0xda, - SQ_OP2_INST_LOAD_STORE_FLAGS = 0xdb, - SQ_OP2_INST_INTERP_LOAD_P0 = 0xe0, - SQ_OP2_INST_INTERP_LOAD_P10 = 0xe1, - SQ_OP2_INST_INTERP_LOAD_P20 = 0xe2, + SQ_OP2_INST_DOT4 = 0x50, + SQ_OP2_INST_DOT4_IEEE = 0x51, + SQ_OP2_INST_CUBE = 0x52, + SQ_OP2_INST_MAX4 = 0x53, + SQ_OP2_INST_MOVA_GPR_INT = 0x60, + SQ_OP2_INST_EXP_IEEE = 0x61, + SQ_OP2_INST_LOG_CLAMPED = 0x62, + SQ_OP2_INST_LOG_IEEE = 0x63, + SQ_OP2_INST_RECIP_CLAMPED = 0x64, + SQ_OP2_INST_RECIP_FF = 0x65, + SQ_OP2_INST_RECIP_IEEE = 0x66, + SQ_OP2_INST_RECIPSQRT_CLAMPED = 0x67, + SQ_OP2_INST_RECIPSQRT_FF = 0x68, + SQ_OP2_INST_RECIPSQRT_IEEE = 0x69, + SQ_OP2_INST_SQRT_IEEE = 0x6a, + SQ_OP2_INST_FLT_TO_INT = 0x6b, + SQ_OP2_INST_INT_TO_FLT = 0x6c, + SQ_OP2_INST_UINT_TO_FLT = 0x6d, + SQ_OP2_INST_SIN = 0x6e, + SQ_OP2_INST_COS = 0x6f, + SQ_OP2_INST_ASHR_INT = 0x70, + SQ_OP2_INST_LSHR_INT = 0x71, + SQ_OP2_INST_LSHL_INT = 0x72, + SQ_OP2_INST_MULLO_INT = 0x73, + SQ_OP2_INST_MULHI_INT = 0x74, + SQ_OP2_INST_MULLO_UINT = 0x75, + SQ_OP2_INST_MULHI_UINT = 0x76, + SQ_OP2_INST_RECIP_INT = 0x77, + SQ_OP2_INST_RECIP_UINT = 0x78, + SQ_OP2_INST_FLT_TO_UINT = 0x79, + SQ_CF_ALLOC_EXPORT_WORD1_BUF = 0x00008dfc, + ARRAY_SIZE_mask = 0xfff << 0, + ARRAY_SIZE_shift = 0, + COMP_MASK_mask = 0x0f << 12, + COMP_MASK_shift = 12, + SQ_CF_WORD0 = 0x00008dfc, + SQ_CF_ALLOC_EXPORT_WORD0 = 0x00008dfc, + ARRAY_BASE_mask = 0x1fff << 0, + ARRAY_BASE_shift = 0, + SQ_CF_ALLOC_EXPORT_WORD0__TYPE_mask = 0x03 << 13, + SQ_CF_ALLOC_EXPORT_WORD0__TYPE_shift = 13, + SQ_EXPORT_PIXEL = 0x00, + SQ_EXPORT_POS = 0x01, + SQ_EXPORT_PARAM = 0x02, + X_UNUSED_FOR_SX_EXPORTS = 0x03, + RW_GPR_mask = 0x7f << 15, + RW_GPR_shift = 15, + RW_REL_bit = 1 << 22, + INDEX_GPR_mask = 0x7f << 23, + INDEX_GPR_shift = 23, + ELEM_SIZE_mask = 0x03 << 30, + ELEM_SIZE_shift = 30, + SQ_VTX_WORD1 = 0x00008dfc, + SQ_VTX_WORD1__DST_SEL_X_mask = 0x07 << 9, + SQ_VTX_WORD1__DST_SEL_X_shift = 9, +/* SQ_SEL_X = 0x00, */ +/* SQ_SEL_Y = 0x01, */ +/* SQ_SEL_Z = 0x02, */ +/* SQ_SEL_W = 0x03, */ +/* SQ_SEL_0 = 0x04, */ +/* SQ_SEL_1 = 0x05, */ +/* SQ_SEL_MASK = 0x07, */ + SQ_VTX_WORD1__DST_SEL_Y_mask = 0x07 << 12, + SQ_VTX_WORD1__DST_SEL_Y_shift = 12, +/* SQ_SEL_X = 0x00, */ +/* SQ_SEL_Y = 0x01, */ +/* SQ_SEL_Z = 0x02, */ +/* SQ_SEL_W = 0x03, */ +/* SQ_SEL_0 = 0x04, */ +/* SQ_SEL_1 = 0x05, */ +/* SQ_SEL_MASK = 0x07, */ + SQ_VTX_WORD1__DST_SEL_Z_mask = 0x07 << 15, + SQ_VTX_WORD1__DST_SEL_Z_shift = 15, +/* SQ_SEL_X = 0x00, */ +/* SQ_SEL_Y = 0x01, */ +/* SQ_SEL_Z = 0x02, */ +/* SQ_SEL_W = 0x03, */ +/* SQ_SEL_0 = 0x04, */ +/* SQ_SEL_1 = 0x05, */ +/* SQ_SEL_MASK = 0x07, */ + SQ_VTX_WORD1__DST_SEL_W_mask = 0x07 << 18, + SQ_VTX_WORD1__DST_SEL_W_shift = 18, +/* SQ_SEL_X = 0x00, */ +/* SQ_SEL_Y = 0x01, */ +/* SQ_SEL_Z = 0x02, */ +/* SQ_SEL_W = 0x03, */ +/* SQ_SEL_0 = 0x04, */ +/* SQ_SEL_1 = 0x05, */ +/* SQ_SEL_MASK = 0x07, */ + USE_CONST_FIELDS_bit = 1 << 21, + SQ_VTX_WORD1__DATA_FORMAT_mask = 0x3f << 22, + SQ_VTX_WORD1__DATA_FORMAT_shift = 22, + SQ_VTX_WORD1__NUM_FORMAT_ALL_mask = 0x03 << 28, + SQ_VTX_WORD1__NUM_FORMAT_ALL_shift = 28, + SQ_NUM_FORMAT_NORM = 0x00, + SQ_NUM_FORMAT_INT = 0x01, + SQ_NUM_FORMAT_SCALED = 0x02, + SQ_VTX_WORD1__FORMAT_COMP_ALL_bit = 1 << 30, + SQ_VTX_WORD1__SRF_MODE_ALL_bit = 1 << 31, + SQ_ALU_WORD1_OP2 = 0x00008dfc, +/* SRC0_ABS_bit = 1 << 0, */ +/* SRC1_ABS_bit = 1 << 1, */ +/* UPDATE_EXECUTE_MASK_bit = 1 << 2, */ +/* UPDATE_PRED_bit = 1 << 3, */ +/* WRITE_MASK_bit = 1 << 4, */ + FOG_MERGE_bit = 1 << 5, + SQ_ALU_WORD1_OP2__OMOD_mask = 0x03 << 6, + SQ_ALU_WORD1_OP2__OMOD_shift = 6, +/* SQ_ALU_OMOD_OFF = 0x00, */ +/* SQ_ALU_OMOD_M2 = 0x01, */ +/* SQ_ALU_OMOD_M4 = 0x02, */ +/* SQ_ALU_OMOD_D2 = 0x03, */ + SQ_ALU_WORD1_OP2__ALU_INST_mask = 0x3ff << 8, + SQ_ALU_WORD1_OP2__ALU_INST_shift = 8, +/* SQ_OP2_INST_ADD = 0x00, */ +/* SQ_OP2_INST_MUL = 0x01, */ +/* SQ_OP2_INST_MUL_IEEE = 0x02, */ +/* SQ_OP2_INST_MAX = 0x03, */ +/* SQ_OP2_INST_MIN = 0x04, */ +/* SQ_OP2_INST_MAX_DX10 = 0x05, */ +/* SQ_OP2_INST_MIN_DX10 = 0x06, */ +/* SQ_OP2_INST_SETE = 0x08, */ +/* SQ_OP2_INST_SETGT = 0x09, */ +/* SQ_OP2_INST_SETGE = 0x0a, */ +/* SQ_OP2_INST_SETNE = 0x0b, */ +/* SQ_OP2_INST_SETE_DX10 = 0x0c, */ +/* SQ_OP2_INST_SETGT_DX10 = 0x0d, */ +/* SQ_OP2_INST_SETGE_DX10 = 0x0e, */ +/* SQ_OP2_INST_SETNE_DX10 = 0x0f, */ +/* SQ_OP2_INST_FRACT = 0x10, */ +/* SQ_OP2_INST_TRUNC = 0x11, */ +/* SQ_OP2_INST_CEIL = 0x12, */ +/* SQ_OP2_INST_RNDNE = 0x13, */ +/* SQ_OP2_INST_FLOOR = 0x14, */ +/* SQ_OP2_INST_MOVA = 0x15, */ +/* SQ_OP2_INST_MOVA_FLOOR = 0x16, */ +/* SQ_OP2_INST_MOVA_INT = 0x18, */ +/* SQ_OP2_INST_MOV = 0x19, */ +/* SQ_OP2_INST_NOP = 0x1a, */ +/* SQ_OP2_INST_PRED_SETGT_UINT = 0x1e, */ +/* SQ_OP2_INST_PRED_SETGE_UINT = 0x1f, */ +/* SQ_OP2_INST_PRED_SETE = 0x20, */ +/* SQ_OP2_INST_PRED_SETGT = 0x21, */ +/* SQ_OP2_INST_PRED_SETGE = 0x22, */ +/* SQ_OP2_INST_PRED_SETNE = 0x23, */ +/* SQ_OP2_INST_PRED_SET_INV = 0x24, */ +/* SQ_OP2_INST_PRED_SET_POP = 0x25, */ +/* SQ_OP2_INST_PRED_SET_CLR = 0x26, */ +/* SQ_OP2_INST_PRED_SET_RESTORE = 0x27, */ +/* SQ_OP2_INST_PRED_SETE_PUSH = 0x28, */ +/* SQ_OP2_INST_PRED_SETGT_PUSH = 0x29, */ +/* SQ_OP2_INST_PRED_SETGE_PUSH = 0x2a, */ +/* SQ_OP2_INST_PRED_SETNE_PUSH = 0x2b, */ +/* SQ_OP2_INST_KILLE = 0x2c, */ +/* SQ_OP2_INST_KILLGT = 0x2d, */ +/* SQ_OP2_INST_KILLGE = 0x2e, */ +/* SQ_OP2_INST_KILLNE = 0x2f, */ +/* SQ_OP2_INST_AND_INT = 0x30, */ +/* SQ_OP2_INST_OR_INT = 0x31, */ +/* SQ_OP2_INST_XOR_INT = 0x32, */ +/* SQ_OP2_INST_NOT_INT = 0x33, */ +/* SQ_OP2_INST_ADD_INT = 0x34, */ +/* SQ_OP2_INST_SUB_INT = 0x35, */ +/* SQ_OP2_INST_MAX_INT = 0x36, */ +/* SQ_OP2_INST_MIN_INT = 0x37, */ +/* SQ_OP2_INST_MAX_UINT = 0x38, */ +/* SQ_OP2_INST_MIN_UINT = 0x39, */ +/* SQ_OP2_INST_SETE_INT = 0x3a, */ +/* SQ_OP2_INST_SETGT_INT = 0x3b, */ +/* SQ_OP2_INST_SETGE_INT = 0x3c, */ +/* SQ_OP2_INST_SETNE_INT = 0x3d, */ +/* SQ_OP2_INST_SETGT_UINT = 0x3e, */ +/* SQ_OP2_INST_SETGE_UINT = 0x3f, */ +/* SQ_OP2_INST_KILLGT_UINT = 0x40, */ +/* SQ_OP2_INST_KILLGE_UINT = 0x41, */ +/* SQ_OP2_INST_PRED_SETE_INT = 0x42, */ +/* SQ_OP2_INST_PRED_SETGT_INT = 0x43, */ +/* SQ_OP2_INST_PRED_SETGE_INT = 0x44, */ +/* SQ_OP2_INST_PRED_SETNE_INT = 0x45, */ +/* SQ_OP2_INST_KILLE_INT = 0x46, */ +/* SQ_OP2_INST_KILLGT_INT = 0x47, */ +/* SQ_OP2_INST_KILLGE_INT = 0x48, */ +/* SQ_OP2_INST_KILLNE_INT = 0x49, */ +/* SQ_OP2_INST_PRED_SETE_PUSH_INT = 0x4a, */ +/* SQ_OP2_INST_PRED_SETGT_PUSH_INT = 0x4b, */ +/* SQ_OP2_INST_PRED_SETGE_PUSH_INT = 0x4c, */ +/* SQ_OP2_INST_PRED_SETNE_PUSH_INT = 0x4d, */ +/* SQ_OP2_INST_PRED_SETLT_PUSH_INT = 0x4e, */ +/* SQ_OP2_INST_PRED_SETLE_PUSH_INT = 0x4f, */ +/* SQ_OP2_INST_DOT4 = 0x50, */ +/* SQ_OP2_INST_DOT4_IEEE = 0x51, */ +/* SQ_OP2_INST_CUBE = 0x52, */ +/* SQ_OP2_INST_MAX4 = 0x53, */ +/* SQ_OP2_INST_MOVA_GPR_INT = 0x60, */ +/* SQ_OP2_INST_EXP_IEEE = 0x61, */ +/* SQ_OP2_INST_LOG_CLAMPED = 0x62, */ +/* SQ_OP2_INST_LOG_IEEE = 0x63, */ +/* SQ_OP2_INST_RECIP_CLAMPED = 0x64, */ +/* SQ_OP2_INST_RECIP_FF = 0x65, */ +/* SQ_OP2_INST_RECIP_IEEE = 0x66, */ +/* SQ_OP2_INST_RECIPSQRT_CLAMPED = 0x67, */ +/* SQ_OP2_INST_RECIPSQRT_FF = 0x68, */ +/* SQ_OP2_INST_RECIPSQRT_IEEE = 0x69, */ +/* SQ_OP2_INST_SQRT_IEEE = 0x6a, */ +/* SQ_OP2_INST_FLT_TO_INT = 0x6b, */ +/* SQ_OP2_INST_INT_TO_FLT = 0x6c, */ +/* SQ_OP2_INST_UINT_TO_FLT = 0x6d, */ +/* SQ_OP2_INST_SIN = 0x6e, */ +/* SQ_OP2_INST_COS = 0x6f, */ +/* SQ_OP2_INST_ASHR_INT = 0x70, */ +/* SQ_OP2_INST_LSHR_INT = 0x71, */ +/* SQ_OP2_INST_LSHL_INT = 0x72, */ +/* SQ_OP2_INST_MULLO_INT = 0x73, */ +/* SQ_OP2_INST_MULHI_INT = 0x74, */ +/* SQ_OP2_INST_MULLO_UINT = 0x75, */ +/* SQ_OP2_INST_MULHI_UINT = 0x76, */ +/* SQ_OP2_INST_RECIP_INT = 0x77, */ +/* SQ_OP2_INST_RECIP_UINT = 0x78, */ +/* SQ_OP2_INST_FLT_TO_UINT = 0x79, */ SQ_CF_WORD1 = 0x00008dfc, POP_COUNT_mask = 0x07 << 0, POP_COUNT_shift = 0, @@ -1262,16 +869,19 @@ enum { SQ_CF_COND_FALSE = 0x01, SQ_CF_COND_BOOL = 0x02, SQ_CF_COND_NOT_BOOL = 0x03, - SQ_CF_WORD1__COUNT_mask = 0x3f << 10, + SQ_CF_WORD1__COUNT_mask = 0x07 << 10, SQ_CF_WORD1__COUNT_shift = 10, -/* VALID_PIXEL_MODE_bit = 1 << 20, */ + CALL_COUNT_mask = 0x3f << 13, + CALL_COUNT_shift = 13, + COUNT_3_bit = 1 << 19, /* END_OF_PROGRAM_bit = 1 << 21, */ - SQ_CF_WORD1__CF_INST_mask = 0xff << 22, - SQ_CF_WORD1__CF_INST_shift = 22, +/* VALID_PIXEL_MODE_bit = 1 << 22, */ + SQ_CF_WORD1__CF_INST_mask = 0x7f << 23, + SQ_CF_WORD1__CF_INST_shift = 23, SQ_CF_INST_NOP = 0x00, - SQ_CF_INST_TC = 0x01, - SQ_CF_INST_VC = 0x02, - SQ_CF_INST_GDS = 0x03, + SQ_CF_INST_TEX = 0x01, + SQ_CF_INST_VTX = 0x02, + SQ_CF_INST_VTX_TC = 0x03, SQ_CF_INST_LOOP_START = 0x04, SQ_CF_INST_LOOP_END = 0x05, SQ_CF_INST_LOOP_START_DX10 = 0x06, @@ -1280,8 +890,12 @@ enum { SQ_CF_INST_LOOP_BREAK = 0x09, SQ_CF_INST_JUMP = 0x0a, SQ_CF_INST_PUSH = 0x0b, + SQ_CF_INST_PUSH_ELSE = 0x0c, SQ_CF_INST_ELSE = 0x0d, SQ_CF_INST_POP = 0x0e, + SQ_CF_INST_POP_JUMP = 0x0f, + SQ_CF_INST_POP_PUSH = 0x10, + SQ_CF_INST_POP_PUSH_ELSE = 0x11, SQ_CF_INST_CALL = 0x12, SQ_CF_INST_CALL_FS = 0x13, SQ_CF_INST_RETURN = 0x14, @@ -1289,12 +903,6 @@ enum { SQ_CF_INST_EMIT_CUT_VERTEX = 0x16, SQ_CF_INST_CUT_VERTEX = 0x17, SQ_CF_INST_KILL = 0x18, - SQ_CF_INST_WAIT_ACK = 0x1a, - SQ_CF_INST_TC_ACK = 0x1b, - SQ_CF_INST_VC_ACK = 0x1c, - SQ_CF_INST_JUMPTABLE = 0x1d, - SQ_CF_INST_GLOBAL_WAVE_SYNC = 0x1e, - SQ_CF_INST_HALT = 0x1f, /* WHOLE_QUAD_MODE_bit = 1 << 30, */ /* BARRIER_bit = 1 << 31, */ SQ_VTX_WORD1_SEM = 0x00008dfc, @@ -1303,232 +911,51 @@ enum { SQ_TEX_WORD0 = 0x00008dfc, TEX_INST_mask = 0x1f << 0, TEX_INST_shift = 0, + SQ_TEX_INST_VTX_FETCH = 0x00, + SQ_TEX_INST_VTX_SEMANTIC = 0x01, SQ_TEX_INST_LD = 0x03, SQ_TEX_INST_GET_TEXTURE_RESINFO = 0x04, SQ_TEX_INST_GET_NUMBER_OF_SAMPLES = 0x05, SQ_TEX_INST_GET_LOD = 0x06, SQ_TEX_INST_GET_GRADIENTS_H = 0x07, SQ_TEX_INST_GET_GRADIENTS_V = 0x08, - SQ_TEX_INST_SET_TEXTURE_OFFSETS = 0x09, - SQ_TEX_INST_KEEP_GRADIENTS = 0x0a, + SQ_TEX_INST_GET_LERP = 0x09, + SQ_TEX_INST_RESERVED_10 = 0x0a, SQ_TEX_INST_SET_GRADIENTS_H = 0x0b, SQ_TEX_INST_SET_GRADIENTS_V = 0x0c, SQ_TEX_INST_PASS = 0x0d, + X_Z_SET_INDEX_FOR_ARRAY_OF_CUBEMAPS = 0x0e, SQ_TEX_INST_SAMPLE = 0x10, SQ_TEX_INST_SAMPLE_L = 0x11, SQ_TEX_INST_SAMPLE_LB = 0x12, SQ_TEX_INST_SAMPLE_LZ = 0x13, SQ_TEX_INST_SAMPLE_G = 0x14, - SQ_TEX_INST_GATHER4 = 0x15, + SQ_TEX_INST_SAMPLE_G_L = 0x15, SQ_TEX_INST_SAMPLE_G_LB = 0x16, - SQ_TEX_INST_GATHER4_O = 0x17, + SQ_TEX_INST_SAMPLE_G_LZ = 0x17, SQ_TEX_INST_SAMPLE_C = 0x18, SQ_TEX_INST_SAMPLE_C_L = 0x19, SQ_TEX_INST_SAMPLE_C_LB = 0x1a, SQ_TEX_INST_SAMPLE_C_LZ = 0x1b, SQ_TEX_INST_SAMPLE_C_G = 0x1c, - SQ_TEX_INST_GATHER4_C = 0x1d, + SQ_TEX_INST_SAMPLE_C_G_L = 0x1d, SQ_TEX_INST_SAMPLE_C_G_LB = 0x1e, - SQ_TEX_INST_GATHER4_C_O = 0x1f, - INST_MOD_mask = 0x03 << 5, - INST_MOD_shift = 5, + SQ_TEX_INST_SAMPLE_C_G_LZ = 0x1f, + BC_FRAC_MODE_bit = 1 << 5, /* FETCH_WHOLE_QUAD_bit = 1 << 7, */ RESOURCE_ID_mask = 0xff << 8, RESOURCE_ID_shift = 8, - SQ_TEX_WORD0__SRC_GPR_mask = 0x7f << 16, - SQ_TEX_WORD0__SRC_GPR_shift = 16, +/* SRC_GPR_mask = 0x7f << 16, */ +/* SRC_GPR_shift = 16, */ /* SRC_REL_bit = 1 << 23, */ SQ_TEX_WORD0__ALT_CONST_bit = 1 << 24, - RESOURCE_INDEX_MODE_mask = 0x03 << 25, - RESOURCE_INDEX_MODE_shift = 25, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ - SAMPLER_INDEX_MODE_mask = 0x03 << 27, - SAMPLER_INDEX_MODE_shift = 27, -/* SQ_CF_INDEX_NONE = 0x00, */ -/* SQ_CF_INDEX_0 = 0x01, */ -/* SQ_CF_INDEX_1 = 0x02, */ -/* SQ_CF_INVALID = 0x03, */ SQ_VTX_WORD1_GPR = 0x00008dfc, SQ_VTX_WORD1_GPR__DST_GPR_mask = 0x7f << 0, SQ_VTX_WORD1_GPR__DST_GPR_shift = 0, SQ_VTX_WORD1_GPR__DST_REL_bit = 1 << 7, - SQ_ALU_WORD1_LDS_IDX_OP = 0x00008dfc, -/* SRC2_SEL_mask = 0x1ff << 0, */ -/* SRC2_SEL_shift = 0, */ -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ -/* SQ_ALU_SRC_0 = 0xf8, */ -/* SQ_ALU_SRC_1 = 0xf9, */ -/* SQ_ALU_SRC_1_INT = 0xfa, */ -/* SQ_ALU_SRC_M_1_INT = 0xfb, */ -/* SQ_ALU_SRC_0_5 = 0xfc, */ -/* SQ_ALU_SRC_LITERAL = 0xfd, */ -/* SQ_ALU_SRC_PV = 0xfe, */ -/* SQ_ALU_SRC_PS = 0xff, */ -/* SRC2_REL_bit = 1 << 9, */ -/* SRC2_CHAN_mask = 0x03 << 10, */ -/* SRC2_CHAN_shift = 10, */ -/* SQ_CHAN_X = 0x00, */ -/* SQ_CHAN_Y = 0x01, */ -/* SQ_CHAN_Z = 0x02, */ -/* SQ_CHAN_W = 0x03, */ - IDX_OFFSET_1_bit = 1 << 12, - SQ_ALU_WORD1_LDS_IDX_OP__ALU_INST_mask = 0x1f << 13, - SQ_ALU_WORD1_LDS_IDX_OP__ALU_INST_shift = 13, -/* SQ_OP3_INST_BFE_UINT = 0x04, */ -/* SQ_OP3_INST_BFE_INT = 0x05, */ -/* SQ_OP3_INST_BFI_INT = 0x06, */ -/* SQ_OP3_INST_FMA = 0x07, */ -/* SQ_OP3_INST_CNDNE_64 = 0x09, */ -/* SQ_OP3_INST_FMA_64 = 0x0a, */ -/* SQ_OP3_INST_LERP_UINT = 0x0b, */ -/* SQ_OP3_INST_BIT_ALIGN_INT = 0x0c, */ -/* SQ_OP3_INST_BYTE_ALIGN_INT = 0x0d, */ -/* SQ_OP3_INST_SAD_ACCUM_UINT = 0x0e, */ -/* SQ_OP3_INST_SAD_ACCUM_HI_UINT = 0x0f, */ -/* SQ_OP3_INST_MULADD_UINT24 = 0x10, */ -/* SQ_OP3_INST_LDS_IDX_OP = 0x11, */ -/* SQ_OP3_INST_MULADD = 0x14, */ -/* SQ_OP3_INST_MULADD_M2 = 0x15, */ -/* SQ_OP3_INST_MULADD_M4 = 0x16, */ -/* SQ_OP3_INST_MULADD_D2 = 0x17, */ -/* SQ_OP3_INST_MULADD_IEEE = 0x18, */ -/* SQ_OP3_INST_CNDE = 0x19, */ -/* SQ_OP3_INST_CNDGT = 0x1a, */ -/* SQ_OP3_INST_CNDGE = 0x1b, */ -/* SQ_OP3_INST_CNDE_INT = 0x1c, */ -/* SQ_OP3_INST_CNDGT_INT = 0x1d, */ -/* SQ_OP3_INST_CNDGE_INT = 0x1e, */ -/* SQ_OP3_INST_MUL_LIT = 0x1f, */ -/* BANK_SWIZZLE_mask = 0x07 << 18, */ -/* BANK_SWIZZLE_shift = 18, */ -/* SQ_ALU_VEC_012 = 0x00, */ -/* SQ_ALU_VEC_021 = 0x01, */ -/* SQ_ALU_VEC_120 = 0x02, */ -/* SQ_ALU_VEC_102 = 0x03, */ -/* SQ_ALU_VEC_201 = 0x04, */ -/* SQ_ALU_VEC_210 = 0x05, */ - LDS_OP_mask = 0x3f << 21, - LDS_OP_shift = 21, -/* SQ_DS_INST_ADD = 0x00, */ -/* SQ_DS_INST_SUB = 0x01, */ -/* SQ_DS_INST_RSUB = 0x02, */ -/* SQ_DS_INST_INC = 0x03, */ -/* SQ_DS_INST_DEC = 0x04, */ -/* SQ_DS_INST_MIN_INT = 0x05, */ -/* SQ_DS_INST_MAX_INT = 0x06, */ -/* SQ_DS_INST_MIN_UINT = 0x07, */ -/* SQ_DS_INST_MAX_UINT = 0x08, */ -/* SQ_DS_INST_AND = 0x09, */ -/* SQ_DS_INST_OR = 0x0a, */ -/* SQ_DS_INST_XOR = 0x0b, */ -/* SQ_DS_INST_MSKOR = 0x0c, */ -/* SQ_DS_INST_WRITE = 0x0d, */ -/* SQ_DS_INST_WRITE_REL = 0x0e, */ -/* SQ_DS_INST_WRITE2 = 0x0f, */ -/* SQ_DS_INST_CMP_STORE = 0x10, */ -/* SQ_DS_INST_CMP_STORE_SPF = 0x11, */ -/* SQ_DS_INST_BYTE_WRITE = 0x12, */ -/* SQ_DS_INST_SHORT_WRITE = 0x13, */ -/* SQ_DS_INST_ADD_RET = 0x20, */ -/* SQ_DS_INST_SUB_RET = 0x21, */ -/* SQ_DS_INST_RSUB_RET = 0x22, */ -/* SQ_DS_INST_INC_RET = 0x23, */ -/* SQ_DS_INST_DEC_RET = 0x24, */ -/* SQ_DS_INST_MIN_INT_RET = 0x25, */ -/* SQ_DS_INST_MAX_INT_RET = 0x26, */ -/* SQ_DS_INST_MIN_UINT_RET = 0x27, */ -/* SQ_DS_INST_MAX_UINT_RET = 0x28, */ -/* SQ_DS_INST_AND_RET = 0x29, */ -/* SQ_DS_INST_OR_RET = 0x2a, */ -/* SQ_DS_INST_XOR_RET = 0x2b, */ -/* SQ_DS_INST_MSKOR_RET = 0x2c, */ -/* SQ_DS_INST_XCHG_RET = 0x2d, */ -/* SQ_DS_INST_XCHG_REL_RET = 0x2e, */ -/* SQ_DS_INST_XCHG2_RET = 0x2f, */ -/* SQ_DS_INST_CMP_XCHG_RET = 0x30, */ -/* SQ_DS_INST_CMP_XCHG_SPF_RET = 0x31, */ -/* SQ_DS_INST_READ_RET = 0x32, */ -/* SQ_DS_INST_READ_REL_RET = 0x33, */ -/* SQ_DS_INST_READ2_RET = 0x34, */ -/* SQ_DS_INST_READWRITE_RET = 0x35, */ -/* SQ_DS_INST_BYTE_READ_RET = 0x36, */ -/* SQ_DS_INST_UBYTE_READ_RET = 0x37, */ -/* SQ_DS_INST_SHORT_READ_RET = 0x38, */ -/* SQ_DS_INST_USHORT_READ_RET = 0x39, */ -/* SQ_DS_INST_ATOMIC_ORDERED_ALLOC_RET = 0x3f, */ - IDX_OFFSET_0_bit = 1 << 27, - IDX_OFFSET_2_bit = 1 << 28, -/* DST_CHAN_mask = 0x03 << 29, */ -/* DST_CHAN_shift = 29, */ -/* CHAN_X = 0x00, */ -/* CHAN_Y = 0x01, */ -/* CHAN_Z = 0x02, */ -/* CHAN_W = 0x03, */ - IDX_OFFSET_3_bit = 1 << 31, - SQ_CF_ENCODING_WORD1 = 0x00008dfc, - SQ_CF_ENCODING_WORD1__ENCODING_mask = 0x03 << 28, - SQ_CF_ENCODING_WORD1__ENCODING_shift = 28, - SQ_CF_ENCODING_INST_CF = 0x00, - SQ_CF_ENCODING_INST_ALLOC_EXPORT = 0x01, - SQ_CF_ENCODING_INST_ALU0 = 0x02, - SQ_CF_ENCODING_INST_ALU1 = 0x03, SQ_ALU_WORD0 = 0x00008dfc, -/* SRC0_SEL_mask = 0x1ff << 0, */ -/* SRC0_SEL_shift = 0, */ -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ + SRC0_SEL_mask = 0x1ff << 0, + SRC0_SEL_shift = 0, /* SQ_ALU_SRC_0 = 0xf8, */ /* SQ_ALU_SRC_1 = 0xf9, */ /* SQ_ALU_SRC_1_INT = 0xfa, */ @@ -1537,42 +964,16 @@ enum { /* SQ_ALU_SRC_LITERAL = 0xfd, */ /* SQ_ALU_SRC_PV = 0xfe, */ /* SQ_ALU_SRC_PS = 0xff, */ -/* SRC0_REL_bit = 1 << 9, */ -/* SRC0_CHAN_mask = 0x03 << 10, */ -/* SRC0_CHAN_shift = 10, */ + SRC0_REL_bit = 1 << 9, + SRC0_CHAN_mask = 0x03 << 10, + SRC0_CHAN_shift = 10, /* SQ_CHAN_X = 0x00, */ /* SQ_CHAN_Y = 0x01, */ /* SQ_CHAN_Z = 0x02, */ /* SQ_CHAN_W = 0x03, */ SRC0_NEG_bit = 1 << 12, -/* SRC1_SEL_mask = 0x1ff << 13, */ -/* SRC1_SEL_shift = 13, */ -/* SQ_ALU_SRC_LDS_OQ_A = 0xdb, */ -/* SQ_ALU_SRC_LDS_OQ_B = 0xdc, */ -/* SQ_ALU_SRC_LDS_OQ_A_POP = 0xdd, */ -/* SQ_ALU_SRC_LDS_OQ_B_POP = 0xde, */ -/* SQ_ALU_SRC_LDS_DIRECT_A = 0xdf, */ -/* SQ_ALU_SRC_LDS_DIRECT_B = 0xe0, */ -/* SQ_ALU_SRC_TIME_HI = 0xe3, */ -/* SQ_ALU_SRC_TIME_LO = 0xe4, */ -/* SQ_ALU_SRC_MASK_HI = 0xe5, */ -/* SQ_ALU_SRC_MASK_LO = 0xe6, */ -/* SQ_ALU_SRC_HW_WAVE_ID = 0xe7, */ -/* SQ_ALU_SRC_SIMD_ID = 0xe8, */ -/* SQ_ALU_SRC_SE_ID = 0xe9, */ -/* SQ_ALU_SRC_HW_THREADGRP_ID = 0xea, */ -/* SQ_ALU_SRC_WAVE_ID_IN_GRP = 0xeb, */ -/* SQ_ALU_SRC_NUM_THREADGRP_WAVES = 0xec, */ -/* SQ_ALU_SRC_HW_ALU_ODD = 0xed, */ -/* SQ_ALU_SRC_LOOP_IDX = 0xee, */ -/* SQ_ALU_SRC_PARAM_BASE_ADDR = 0xf0, */ -/* SQ_ALU_SRC_NEW_PRIM_MASK = 0xf1, */ -/* SQ_ALU_SRC_PRIM_MASK_HI = 0xf2, */ -/* SQ_ALU_SRC_PRIM_MASK_LO = 0xf3, */ -/* SQ_ALU_SRC_1_DBL_L = 0xf4, */ -/* SQ_ALU_SRC_1_DBL_M = 0xf5, */ -/* SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ -/* SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ + SRC1_SEL_mask = 0x1ff << 13, + SRC1_SEL_shift = 13, /* SQ_ALU_SRC_0 = 0xf8, */ /* SQ_ALU_SRC_1 = 0xf9, */ /* SQ_ALU_SRC_1_INT = 0xfa, */ @@ -1581,79 +982,27 @@ enum { /* SQ_ALU_SRC_LITERAL = 0xfd, */ /* SQ_ALU_SRC_PV = 0xfe, */ /* SQ_ALU_SRC_PS = 0xff, */ -/* SRC1_REL_bit = 1 << 22, */ -/* SRC1_CHAN_mask = 0x03 << 23, */ -/* SRC1_CHAN_shift = 23, */ + SRC1_REL_bit = 1 << 22, + SRC1_CHAN_mask = 0x03 << 23, + SRC1_CHAN_shift = 23, /* SQ_CHAN_X = 0x00, */ /* SQ_CHAN_Y = 0x01, */ /* SQ_CHAN_Z = 0x02, */ /* SQ_CHAN_W = 0x03, */ SRC1_NEG_bit = 1 << 25, -/* INDEX_MODE_mask = 0x07 << 26, */ -/* INDEX_MODE_shift = 26, */ -/* SQ_INDEX_AR_X = 0x00, */ -/* SQ_INDEX_LOOP = 0x04, */ -/* SQ_INDEX_GLOBAL = 0x05, */ -/* SQ_INDEX_GLOBAL_AR_X = 0x06, */ -/* PRED_SEL_mask = 0x03 << 29, */ -/* PRED_SEL_shift = 29, */ -/* SQ_PRED_SEL_OFF = 0x00, */ -/* SQ_PRED_SEL_ZERO = 0x02, */ -/* SQ_PRED_SEL_ONE = 0x03, */ -/* LAST_bit = 1 << 31, */ - SQ_MEM_RD_WORD1 = 0x00008dfc, - SQ_MEM_RD_WORD1__DST_GPR_mask = 0x7f << 0, - SQ_MEM_RD_WORD1__DST_GPR_shift = 0, - SQ_MEM_RD_WORD1__DST_REL_bit = 1 << 7, - SQ_MEM_RD_WORD1__DST_SEL_X_mask = 0x07 << 9, - SQ_MEM_RD_WORD1__DST_SEL_X_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DST_SEL_Y_mask = 0x07 << 12, - SQ_MEM_RD_WORD1__DST_SEL_Y_shift = 12, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DST_SEL_Z_mask = 0x07 << 15, - SQ_MEM_RD_WORD1__DST_SEL_Z_shift = 15, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DST_SEL_W_mask = 0x07 << 18, - SQ_MEM_RD_WORD1__DST_SEL_W_shift = 18, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ -/* SQ_SEL_MASK = 0x07, */ - SQ_MEM_RD_WORD1__DATA_FORMAT_mask = 0x3f << 22, - SQ_MEM_RD_WORD1__DATA_FORMAT_shift = 22, - SQ_MEM_RD_WORD1__NUM_FORMAT_ALL_mask = 0x03 << 28, - SQ_MEM_RD_WORD1__NUM_FORMAT_ALL_shift = 28, -/* SQ_NUM_FORMAT_NORM = 0x00, */ -/* SQ_NUM_FORMAT_INT = 0x01, */ -/* SQ_NUM_FORMAT_SCALED = 0x02, */ - SQ_MEM_RD_WORD1__FORMAT_COMP_ALL_bit = 1 << 30, - SQ_MEM_RD_WORD1__SRF_MODE_ALL_bit = 1 << 31, - SQ_LSTMP_RING_BASE = 0x00008e10, - SQ_LSTMP_RING_SIZE = 0x00008e14, - SQ_HSTMP_RING_BASE = 0x00008e18, - SQ_HSTMP_RING_SIZE = 0x00008e1c, + INDEX_MODE_mask = 0x07 << 26, + INDEX_MODE_shift = 26, + SQ_INDEX_AR_X = 0x00, + SQ_INDEX_AR_Y = 0x01, + SQ_INDEX_AR_Z = 0x02, + SQ_INDEX_AR_W = 0x03, + SQ_INDEX_LOOP = 0x04, + PRED_SEL_mask = 0x03 << 29, + PRED_SEL_shift = 29, + SQ_PRED_SEL_OFF = 0x00, + SQ_PRED_SEL_ZERO = 0x02, + SQ_PRED_SEL_ONE = 0x03, + LAST_bit = 1 << 31, SX_EXPORT_BUFFER_SIZES = 0x0000900c, COLOR_BUFFER_SIZE_mask = 0xff << 0, COLOR_BUFFER_SIZE_shift = 0, @@ -1664,177 +1013,363 @@ enum { SX_MEMORY_EXPORT_BASE = 0x00009010, SX_MEMORY_EXPORT_SIZE = 0x00009014, SPI_CONFIG_CNTL = 0x00009100, - GPR_WRITE_PRIORITY_mask = 0x3ffff << 0, + GPR_WRITE_PRIORITY_mask = 0x1f << 0, GPR_WRITE_PRIORITY_shift = 0, + X_PRIORITY_ORDER = 0x00, + X_PRIORITY_ORDER_VS = 0x01, + DISABLE_INTERP_1_bit = 1 << 5, + DEBUG_THREAD_TYPE_SEL_mask = 0x03 << 6, + DEBUG_THREAD_TYPE_SEL_shift = 6, + DEBUG_GROUP_SEL_mask = 0x1f << 8, + DEBUG_GROUP_SEL_shift = 8, + DEBUG_GRBM_OVERRIDE_bit = 1 << 13, SPI_CONFIG_CNTL_1 = 0x0000913c, VTX_DONE_DELAY_mask = 0x0f << 0, VTX_DONE_DELAY_shift = 0, - X_DELAY_14_CLKS = 0x00, - X_DELAY_16_CLKS = 0x01, - X_DELAY_18_CLKS = 0x02, - X_DELAY_20_CLKS = 0x03, - X_DELAY_22_CLKS = 0x04, - X_DELAY_24_CLKS = 0x05, - X_DELAY_26_CLKS = 0x06, - X_DELAY_28_CLKS = 0x07, - X_DELAY_30_CLKS = 0x08, - X_DELAY_32_CLKS = 0x09, - X_DELAY_34_CLKS = 0x0a, - X_DELAY_4_CLKS = 0x0b, + X_DELAY_10_CLKS = 0x00, + X_DELAY_11_CLKS = 0x01, + X_DELAY_12_CLKS = 0x02, + X_DELAY_13_CLKS = 0x03, + X_DELAY_14_CLKS = 0x04, + X_DELAY_15_CLKS = 0x05, + X_DELAY_16_CLKS = 0x06, + X_DELAY_17_CLKS = 0x07, + X_DELAY_2_CLKS = 0x08, + X_DELAY_3_CLKS = 0x09, + X_DELAY_4_CLKS = 0x0a, + X_DELAY_5_CLKS = 0x0b, X_DELAY_6_CLKS = 0x0c, - X_DELAY_8_CLKS = 0x0d, - X_DELAY_10_CLKS = 0x0e, - X_DELAY_12_CLKS = 0x0f, + X_DELAY_7_CLKS = 0x0d, + X_DELAY_8_CLKS = 0x0e, + X_DELAY_9_CLKS = 0x0f, INTERP_ONE_PRIM_PER_ROW_bit = 1 << 4, - BC_OPTIMIZE_DISABLE_bit = 1 << 5, - PC_LIMIT_ENABLE_bit = 1 << 6, - PC_LIMIT_STRICT_bit = 1 << 7, - PC_LIMIT_SIZE_mask = 0xffff << 16, - PC_LIMIT_SIZE_shift = 16, - TD_CNTL = 0x00009494, + TD_FILTER4 = 0x00009400, + WEIGHT_1_mask = 0x7ff << 0, + WEIGHT_1_shift = 0, + WEIGHT_0_mask = 0x7ff << 11, + WEIGHT_0_shift = 11, + WEIGHT_PAIR_bit = 1 << 22, + PHASE_mask = 0x0f << 23, + PHASE_shift = 23, + DIRECTION_bit = 1 << 27, + TD_FILTER4_1 = 0x00009404, + TD_FILTER4_1_num = 35, +/* WEIGHT_1_mask = 0x7ff << 0, */ +/* WEIGHT_1_shift = 0, */ +/* WEIGHT_0_mask = 0x7ff << 11, */ +/* WEIGHT_0_shift = 11, */ + TD_CNTL = 0x00009490, SYNC_PHASE_SH_mask = 0x03 << 0, SYNC_PHASE_SH_shift = 0, - PAD_STALL_EN_bit = 1 << 8, - GATHER4_FLOAT_MODE_bit = 1 << 16, - TD_STATUS = 0x00009498, + SYNC_PHASE_VC_SMX_mask = 0x03 << 4, + SYNC_PHASE_VC_SMX_shift = 4, + TD0_CNTL = 0x00009494, + TD0_CNTL_num = 4, + ID_OVERRIDE_mask = 0x03 << 28, + ID_OVERRIDE_shift = 28, + TD0_STATUS = 0x000094a4, + TD0_STATUS_num = 4, BUSY_bit = 1 << 31, + TA_CNTL = 0x00009504, + GRADIENT_CREDIT_mask = 0x1f << 0, + GRADIENT_CREDIT_shift = 0, + WALKER_CREDIT_mask = 0x1f << 8, + WALKER_CREDIT_shift = 8, + ALIGNER_CREDIT_mask = 0x1f << 16, + ALIGNER_CREDIT_shift = 16, + TD_FIFO_CREDIT_mask = 0x3ff << 22, + TD_FIFO_CREDIT_shift = 22, TA_CNTL_AUX = 0x00009508, - TA_CNTL_AUX__DISABLE_CUBE_WRAP_bit = 1 << 0, - DISABLE_CUBE_ANISO_bit = 1 << 1, - GETLOD_SELECT_mask = 0x03 << 2, - GETLOD_SELECT_shift = 2, - X_SAMPLER_AND_RESOURCE_CLAMPED_LOD_IN_RESOURCE= 0x00, - DISABLE_IDLE_STALL_bit = 1 << 4, - TEX_COORD_PRECISION_bit = 1 << 28, - LOD_LOG2_TRUNC_bit = 1 << 29, - DB_ZPASS_COUNT_LOW = 0x00009870, - DB_ZPASS_COUNT_HI = 0x00009874, - COUNT_HI_mask = 0x7fffffff << 0, - COUNT_HI_shift = 0, - TD_PS_BORDER_COLOR_INDEX = 0x0000a400, - INDEX_mask = 0x1f << 0, - INDEX_shift = 0, - TD_PS_BORDER_COLOR_RED = 0x0000a404, - TD_PS_BORDER_COLOR_GREEN = 0x0000a408, - TD_PS_BORDER_COLOR_BLUE = 0x0000a40c, - TD_PS_BORDER_COLOR_ALPHA = 0x0000a410, - TD_VS_BORDER_COLOR_INDEX = 0x0000a414, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_VS_BORDER_COLOR_RED = 0x0000a418, - TD_VS_BORDER_COLOR_GREEN = 0x0000a41c, - TD_VS_BORDER_COLOR_BLUE = 0x0000a420, - TD_VS_BORDER_COLOR_ALPHA = 0x0000a424, - TD_GS_BORDER_COLOR_INDEX = 0x0000a428, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_GS_BORDER_COLOR_RED = 0x0000a42c, - TD_GS_BORDER_COLOR_GREEN = 0x0000a430, - TD_GS_BORDER_COLOR_BLUE = 0x0000a434, - TD_GS_BORDER_COLOR_ALPHA = 0x0000a438, - TD_HS_BORDER_COLOR_INDEX = 0x0000a43c, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_HS_BORDER_COLOR_RED = 0x0000a440, - TD_HS_BORDER_COLOR_GREEN = 0x0000a444, - TD_HS_BORDER_COLOR_BLUE = 0x0000a448, - TD_HS_BORDER_COLOR_ALPHA = 0x0000a44c, - TD_LS_BORDER_COLOR_INDEX = 0x0000a450, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_LS_BORDER_COLOR_RED = 0x0000a454, - TD_LS_BORDER_COLOR_GREEN = 0x0000a458, - TD_LS_BORDER_COLOR_BLUE = 0x0000a45c, - TD_LS_BORDER_COLOR_ALPHA = 0x0000a460, - TD_CS_BORDER_COLOR_INDEX = 0x0000a464, -/* INDEX_mask = 0x1f << 0, */ -/* INDEX_shift = 0, */ - TD_CS_BORDER_COLOR_RED = 0x0000a468, - TD_CS_BORDER_COLOR_GREEN = 0x0000a46c, - TD_CS_BORDER_COLOR_BLUE = 0x0000a470, - TD_CS_BORDER_COLOR_ALPHA = 0x0000a474, - DB_RENDER_CONTROL = 0x00028000, - DEPTH_CLEAR_ENABLE_bit = 1 << 0, - STENCIL_CLEAR_ENABLE_bit = 1 << 1, - DEPTH_COPY_bit = 1 << 2, - STENCIL_COPY_bit = 1 << 3, - RESUMMARIZE_ENABLE_bit = 1 << 4, - STENCIL_COMPRESS_DISABLE_bit = 1 << 5, - DEPTH_COMPRESS_DISABLE_bit = 1 << 6, - COPY_CENTROID_bit = 1 << 7, - COPY_SAMPLE_mask = 0x07 << 8, - COPY_SAMPLE_shift = 8, - COLOR_DISABLE_bit = 1 << 12, - DB_COUNT_CONTROL = 0x00028004, - ZPASS_INCREMENT_DISABLE_bit = 1 << 0, - PERFECT_ZPASS_COUNTS_bit = 1 << 1, - DB_DEPTH_VIEW = 0x00028008, + DISABLE_CUBE_WRAP_bit = 1 << 0, + SYNC_GRADIENT_bit = 1 << 24, + SYNC_WALKER_bit = 1 << 25, + SYNC_ALIGNER_bit = 1 << 26, + BILINEAR_PRECISION_bit = 1 << 31, + TA0_CNTL = 0x00009510, +/* ID_OVERRIDE_mask = 0x03 << 28, */ +/* ID_OVERRIDE_shift = 28, */ + TA1_CNTL = 0x00009514, +/* ID_OVERRIDE_mask = 0x03 << 28, */ +/* ID_OVERRIDE_shift = 28, */ + TA2_CNTL = 0x00009518, +/* ID_OVERRIDE_mask = 0x03 << 28, */ +/* ID_OVERRIDE_shift = 28, */ + TA3_CNTL = 0x0000951c, +/* ID_OVERRIDE_mask = 0x03 << 28, */ +/* ID_OVERRIDE_shift = 28, */ + TA0_STATUS = 0x00009520, + FG_PFIFO_EMPTYB_bit = 1 << 12, + FG_LFIFO_EMPTYB_bit = 1 << 13, + FG_SFIFO_EMPTYB_bit = 1 << 14, + FL_PFIFO_EMPTYB_bit = 1 << 16, + FL_LFIFO_EMPTYB_bit = 1 << 17, + FL_SFIFO_EMPTYB_bit = 1 << 18, + FA_PFIFO_EMPTYB_bit = 1 << 20, + FA_LFIFO_EMPTYB_bit = 1 << 21, + FA_SFIFO_EMPTYB_bit = 1 << 22, + IN_BUSY_bit = 1 << 24, + FG_BUSY_bit = 1 << 25, + FL_BUSY_bit = 1 << 27, + TA_BUSY_bit = 1 << 28, + FA_BUSY_bit = 1 << 29, + AL_BUSY_bit = 1 << 30, +/* BUSY_bit = 1 << 31, */ + TA1_STATUS = 0x00009524, +/* FG_PFIFO_EMPTYB_bit = 1 << 12, */ +/* FG_LFIFO_EMPTYB_bit = 1 << 13, */ +/* FG_SFIFO_EMPTYB_bit = 1 << 14, */ +/* FL_PFIFO_EMPTYB_bit = 1 << 16, */ +/* FL_LFIFO_EMPTYB_bit = 1 << 17, */ +/* FL_SFIFO_EMPTYB_bit = 1 << 18, */ +/* FA_PFIFO_EMPTYB_bit = 1 << 20, */ +/* FA_LFIFO_EMPTYB_bit = 1 << 21, */ +/* FA_SFIFO_EMPTYB_bit = 1 << 22, */ +/* IN_BUSY_bit = 1 << 24, */ +/* FG_BUSY_bit = 1 << 25, */ +/* FL_BUSY_bit = 1 << 27, */ +/* TA_BUSY_bit = 1 << 28, */ +/* FA_BUSY_bit = 1 << 29, */ +/* AL_BUSY_bit = 1 << 30, */ +/* BUSY_bit = 1 << 31, */ + TA2_STATUS = 0x00009528, +/* FG_PFIFO_EMPTYB_bit = 1 << 12, */ +/* FG_LFIFO_EMPTYB_bit = 1 << 13, */ +/* FG_SFIFO_EMPTYB_bit = 1 << 14, */ +/* FL_PFIFO_EMPTYB_bit = 1 << 16, */ +/* FL_LFIFO_EMPTYB_bit = 1 << 17, */ +/* FL_SFIFO_EMPTYB_bit = 1 << 18, */ +/* FA_PFIFO_EMPTYB_bit = 1 << 20, */ +/* FA_LFIFO_EMPTYB_bit = 1 << 21, */ +/* FA_SFIFO_EMPTYB_bit = 1 << 22, */ +/* IN_BUSY_bit = 1 << 24, */ +/* FG_BUSY_bit = 1 << 25, */ +/* FL_BUSY_bit = 1 << 27, */ +/* TA_BUSY_bit = 1 << 28, */ +/* FA_BUSY_bit = 1 << 29, */ +/* AL_BUSY_bit = 1 << 30, */ +/* BUSY_bit = 1 << 31, */ + TA3_STATUS = 0x0000952c, +/* FG_PFIFO_EMPTYB_bit = 1 << 12, */ +/* FG_LFIFO_EMPTYB_bit = 1 << 13, */ +/* FG_SFIFO_EMPTYB_bit = 1 << 14, */ +/* FL_PFIFO_EMPTYB_bit = 1 << 16, */ +/* FL_LFIFO_EMPTYB_bit = 1 << 17, */ +/* FL_SFIFO_EMPTYB_bit = 1 << 18, */ +/* FA_PFIFO_EMPTYB_bit = 1 << 20, */ +/* FA_LFIFO_EMPTYB_bit = 1 << 21, */ +/* FA_SFIFO_EMPTYB_bit = 1 << 22, */ +/* IN_BUSY_bit = 1 << 24, */ +/* FG_BUSY_bit = 1 << 25, */ +/* FL_BUSY_bit = 1 << 27, */ +/* TA_BUSY_bit = 1 << 28, */ +/* FA_BUSY_bit = 1 << 29, */ +/* AL_BUSY_bit = 1 << 30, */ +/* BUSY_bit = 1 << 31, */ + TC_STATUS = 0x00009600, + TC_BUSY_bit = 1 << 0, + TC_INVALIDATE = 0x00009604, + START_bit = 1 << 0, + TC_CNTL = 0x00009608, + FORCE_HIT_bit = 1 << 0, + FORCE_MISS_bit = 1 << 1, + L2_SIZE_mask = 0x0f << 5, + L2_SIZE_shift = 5, + _256K = 0x00, + _224K = 0x01, + _192K = 0x02, + _160K = 0x03, + _128K = 0x04, + _96K = 0x05, + _64K = 0x06, + _32K = 0x07, + L2_DISABLE_LATE_HIT_bit = 1 << 9, + DISABLE_VERT_PERF_bit = 1 << 10, + DISABLE_INVAL_BUSY_bit = 1 << 11, + DISABLE_INVAL_SAME_SURFACE_bit = 1 << 12, + PARTITION_MODE_mask = 0x03 << 13, + PARTITION_MODE_shift = 13, + X_VERTEX = 0x00, + MISS_ARB_MODE_bit = 1 << 15, + HIT_ARB_MODE_bit = 1 << 16, + DISABLE_WRITE_DELAY_bit = 1 << 17, + HIT_FIFO_DEPTH_bit = 1 << 18, + VC_CNTL = 0x00009700, + L2_INVALIDATE_bit = 1 << 0, + RESERVED_bit = 1 << 1, + CC_FORCE_MISS_bit = 1 << 2, + MI_CHAN_SEL_mask = 0x03 << 3, + MI_CHAN_SEL_shift = 3, + X_MC0_USES_CH_0_1 = 0x00, + X_MC0_USES_CH_0_3 = 0x01, + X_VC_MC0_IS_ACTIVE = 0x02, + X_VC_MC1_IS_DISABLED = 0x03, + MI_STEER_DISABLE_bit = 1 << 5, + MI_CREDIT_CTR_mask = 0x0f << 6, + MI_CREDIT_CTR_shift = 6, + MI_CREDIT_WE_bit = 1 << 10, + MI_REQ_STALL_THLD_mask = 0x07 << 11, + MI_REQ_STALL_THLD_shift = 11, + X_LATENCY_EXCEEDS_399_CLOCKS = 0x00, + X_LATENCY_EXCEEDS_415_CLOCKS = 0x01, + X_LATENCY_EXCEEDS_431_CLOCKS = 0x02, + X_LATENCY_EXCEEDS_447_CLOCKS = 0x03, + X_LATENCY_EXCEEDS_463_CLOCKS = 0x04, + X_LATENCY_EXCEEDS_479_CLOCKS = 0x05, + X_LATENCY_EXCEEDS_495_CLOCKS = 0x06, + X_LATENCY_EXCEEDS_511_CLOCKS = 0x07, + VC_CNTL__MI_TIMESTAMP_RES_mask = 0x1f << 14, + VC_CNTL__MI_TIMESTAMP_RES_shift = 14, + X_1X_SYSTEM_CLOCK = 0x00, + X_2X_SYSTEM_CLOCK = 0x01, + X_4X_SYSTEM_CLOCK = 0x02, + X_8X_SYSTEM_CLOCK = 0x03, + X_16X_SYSTEM_CLOCK = 0x04, + X_32X_SYSTEM_CLOCK = 0x05, + X_64X_SYSTEM_CLOCK = 0x06, + X_128X_SYSTEM_CLOCK = 0x07, + X_256X_SYSTEM_CLOCK = 0x08, + X_512X_SYSTEM_CLOCK = 0x09, + X_1024X_SYSTEM_CLOCK = 0x0a, + X_2048X_SYSTEM_CLOCK = 0x0b, + X_4092X_SYSTEM_CLOCK = 0x0c, + X_8192X_SYSTEM_CLOCK = 0x0d, + X_16384X_SYSTEM_CLOCK = 0x0e, + X_32768X_SYSTEM_CLOCK = 0x0f, + VC_CNTL_STATUS = 0x00009704, + RP_BUSY_bit = 1 << 0, + RG_BUSY_bit = 1 << 1, + VC_BUSY_bit = 1 << 2, + CLAMP_DETECT_bit = 1 << 3, + VC_CONFIG = 0x00009718, + WRITE_DIS_bit = 1 << 0, + GPR_DATA_PHASE_ADJ_mask = 0x07 << 1, + GPR_DATA_PHASE_ADJ_shift = 1, + X_LATENCY_BASE_0_CYCLES = 0x00, + X_LATENCY_BASE_1_CYCLES = 0x01, + X_LATENCY_BASE_2_CYCLES = 0x02, + X_LATENCY_BASE_3_CYCLES = 0x03, + TD_SIMD_SYNC_ADJ_mask = 0x07 << 4, + TD_SIMD_SYNC_ADJ_shift = 4, + X_0_CYCLES_DELAY = 0x00, + X_1_CYCLES_DELAY = 0x01, + X_2_CYCLES_DELAY = 0x02, + X_3_CYCLES_DELAY = 0x03, + X_4_CYCLES_DELAY = 0x04, + X_5_CYCLES_DELAY = 0x05, + X_6_CYCLES_DELAY = 0x06, + X_7_CYCLES_DELAY = 0x07, + SMX_DC_CTL0 = 0x0000a020, + WR_GATHER_STREAM0_bit = 1 << 0, + WR_GATHER_STREAM1_bit = 1 << 1, + WR_GATHER_STREAM2_bit = 1 << 2, + WR_GATHER_STREAM3_bit = 1 << 3, + WR_GATHER_SCRATCH_bit = 1 << 4, + WR_GATHER_REDUC_BUF_bit = 1 << 5, + WR_GATHER_RING_BUF_bit = 1 << 6, + WR_GATHER_F_BUF_bit = 1 << 7, + DISABLE_CACHES_bit = 1 << 8, + AUTO_FLUSH_INVAL_EN_bit = 1 << 10, + AUTO_FLUSH_EN_bit = 1 << 11, + AUTO_FLUSH_CNT_mask = 0xffff << 12, + AUTO_FLUSH_CNT_shift = 12, + MC_RD_STALL_FACTOR_mask = 0x03 << 28, + MC_RD_STALL_FACTOR_shift = 28, + MC_WR_STALL_FACTOR_mask = 0x03 << 30, + MC_WR_STALL_FACTOR_shift = 30, + SMX_DC_CTL1 = 0x0000a024, + OP_FIFO_SKID_mask = 0x7f << 0, + OP_FIFO_SKID_shift = 0, + CACHE_LINE_SIZE_bit = 1 << 8, + MULTI_FLUSH_MODE_bit = 1 << 9, + MULTI_FLUSH_REQ_ABORT_IDX_FIFO_SKID_mask = 0x0f << 10, + MULTI_FLUSH_REQ_ABORT_IDX_FIFO_SKID_shift = 10, + DISABLE_WR_GATHER_RD_HIT_FORCE_EVICT_bit = 1 << 16, + DISABLE_WR_GATHER_RD_HIT_COMP_VLDS_CHECK_bit = 1 << 17, + DISABLE_FLUSH_ES_ALSO_INVALS_bit = 1 << 18, + DISABLE_FLUSH_GS_ALSO_INVALS_bit = 1 << 19, + SMX_DC_CTL2 = 0x0000a028, + INVALIDATE_CACHES_bit = 1 << 0, + CACHES_INVALID_bit = 1 << 1, + CACHES_DIRTY_bit = 1 << 2, + FLUSH_ALL_bit = 1 << 4, + FLUSH_GS_THREADS_bit = 1 << 8, + FLUSH_ES_THREADS_bit = 1 << 9, + SMX_DC_MC_INTF_CTL = 0x0000a02c, + MC_RD_REQ_CRED_mask = 0xff << 0, + MC_RD_REQ_CRED_shift = 0, + MC_WR_REQ_CRED_mask = 0xff << 16, + MC_WR_REQ_CRED_shift = 16, + TD_PS_SAMPLER0_BORDER_RED = 0x0000a400, + TD_PS_SAMPLER0_BORDER_RED_num = 18, + TD_PS_SAMPLER0_BORDER_RED_offset = 16, + TD_PS_SAMPLER0_BORDER_GREEN = 0x0000a404, + TD_PS_SAMPLER0_BORDER_GREEN_num = 18, + TD_PS_SAMPLER0_BORDER_GREEN_offset = 16, + TD_PS_SAMPLER0_BORDER_BLUE = 0x0000a408, + TD_PS_SAMPLER0_BORDER_BLUE_num = 18, + TD_PS_SAMPLER0_BORDER_BLUE_offset = 16, + TD_PS_SAMPLER0_BORDER_ALPHA = 0x0000a40c, + TD_PS_SAMPLER0_BORDER_ALPHA_num = 18, + TD_PS_SAMPLER0_BORDER_ALPHA_offset = 16, + TD_VS_SAMPLER0_BORDER_RED = 0x0000a600, + TD_VS_SAMPLER0_BORDER_RED_num = 18, + TD_VS_SAMPLER0_BORDER_RED_offset = 16, + TD_VS_SAMPLER0_BORDER_GREEN = 0x0000a604, + TD_VS_SAMPLER0_BORDER_GREEN_num = 18, + TD_VS_SAMPLER0_BORDER_GREEN_offset = 16, + TD_VS_SAMPLER0_BORDER_BLUE = 0x0000a608, + TD_VS_SAMPLER0_BORDER_BLUE_num = 18, + TD_VS_SAMPLER0_BORDER_BLUE_offset = 16, + TD_VS_SAMPLER0_BORDER_ALPHA = 0x0000a60c, + TD_VS_SAMPLER0_BORDER_ALPHA_num = 18, + TD_VS_SAMPLER0_BORDER_ALPHA_offset = 16, + TD_GS_SAMPLER0_BORDER_RED = 0x0000a800, + TD_GS_SAMPLER0_BORDER_RED_num = 18, + TD_GS_SAMPLER0_BORDER_RED_offset = 16, + TD_GS_SAMPLER0_BORDER_GREEN = 0x0000a804, + TD_GS_SAMPLER0_BORDER_GREEN_num = 18, + TD_GS_SAMPLER0_BORDER_GREEN_offset = 16, + TD_GS_SAMPLER0_BORDER_BLUE = 0x0000a808, + TD_GS_SAMPLER0_BORDER_BLUE_num = 18, + TD_GS_SAMPLER0_BORDER_BLUE_offset = 16, + TD_GS_SAMPLER0_BORDER_ALPHA = 0x0000a80c, + TD_GS_SAMPLER0_BORDER_ALPHA_num = 18, + TD_GS_SAMPLER0_BORDER_ALPHA_offset = 16, + TD_PS_SAMPLER0_CLEARTYPE_KERNEL = 0x0000aa00, + TD_PS_SAMPLER0_CLEARTYPE_KERNEL_num = 18, + TD_PS_SAMPLER0_CLEARTYPE_KERNEL__WIDTH_mask = 0x07 << 0, + TD_PS_SAMPLER0_CLEARTYPE_KERNEL__WIDTH_shift = 0, + TD_PS_SAMPLER0_CLEARTYPE_KERNEL__HEIGHT_mask = 0x07 << 3, + TD_PS_SAMPLER0_CLEARTYPE_KERNEL__HEIGHT_shift = 3, + DB_DEPTH_SIZE = 0x00028000, + PITCH_TILE_MAX_mask = 0x3ff << 0, + PITCH_TILE_MAX_shift = 0, + SLICE_TILE_MAX_mask = 0xfffff << 10, + SLICE_TILE_MAX_shift = 10, + DB_DEPTH_VIEW = 0x00028004, SLICE_START_mask = 0x7ff << 0, SLICE_START_shift = 0, SLICE_MAX_mask = 0x7ff << 13, SLICE_MAX_shift = 13, - Z_READ_ONLY_bit = 1 << 24, - STENCIL_READ_ONLY_bit = 1 << 25, - DB_RENDER_OVERRIDE = 0x0002800c, - FORCE_HIZ_ENABLE_mask = 0x03 << 0, - FORCE_HIZ_ENABLE_shift = 0, - FORCE_OFF = 0x00, - FORCE_ENABLE = 0x01, - FORCE_DISABLE = 0x02, - FORCE_RESERVED = 0x03, - FORCE_HIS_ENABLE0_mask = 0x03 << 2, - FORCE_HIS_ENABLE0_shift = 2, -/* FORCE_OFF = 0x00, */ -/* FORCE_ENABLE = 0x01, */ -/* FORCE_DISABLE = 0x02, */ -/* FORCE_RESERVED = 0x03, */ - FORCE_HIS_ENABLE1_mask = 0x03 << 4, - FORCE_HIS_ENABLE1_shift = 4, -/* FORCE_OFF = 0x00, */ -/* FORCE_ENABLE = 0x01, */ -/* FORCE_DISABLE = 0x02, */ -/* FORCE_RESERVED = 0x03, */ - FORCE_SHADER_Z_ORDER_bit = 1 << 6, - FAST_Z_DISABLE_bit = 1 << 7, - FAST_STENCIL_DISABLE_bit = 1 << 8, - NOOP_CULL_DISABLE_bit = 1 << 9, - FORCE_COLOR_KILL_bit = 1 << 10, - FORCE_Z_READ_bit = 1 << 11, - FORCE_STENCIL_READ_bit = 1 << 12, - FORCE_FULL_Z_RANGE_mask = 0x03 << 13, - FORCE_FULL_Z_RANGE_shift = 13, -/* FORCE_OFF = 0x00, */ -/* FORCE_ENABLE = 0x01, */ -/* FORCE_DISABLE = 0x02, */ -/* FORCE_RESERVED = 0x03, */ - FORCE_QC_SMASK_CONFLICT_bit = 1 << 15, - DISABLE_VIEWPORT_CLAMP_bit = 1 << 16, - IGNORE_SC_ZRANGE_bit = 1 << 17, - DISABLE_FULLY_COVERED_bit = 1 << 18, - FORCE_Z_LIMIT_SUMM_mask = 0x03 << 19, - FORCE_Z_LIMIT_SUMM_shift = 19, - FORCE_SUMM_OFF = 0x00, - FORCE_SUMM_MINZ = 0x01, - FORCE_SUMM_MAXZ = 0x02, - FORCE_SUMM_BOTH = 0x03, - MAX_TILES_IN_DTT_mask = 0x1f << 21, - MAX_TILES_IN_DTT_shift = 21, - DISABLE_PIXEL_RATE_TILES_bit = 1 << 26, - FORCE_Z_DIRTY_bit = 1 << 27, - FORCE_STENCIL_DIRTY_bit = 1 << 28, - FORCE_Z_VALID_bit = 1 << 29, - FORCE_STENCIL_VALID_bit = 1 << 30, - PRESERVE_COMPRESSION_bit = 1 << 31, - DB_RENDER_OVERRIDE2 = 0x00028010, - PARTIAL_SQUAD_LAUNCH_CONTROL_mask = 0x03 << 0, - PARTIAL_SQUAD_LAUNCH_CONTROL_shift = 0, - PSLC_AUTO = 0x00, - PSLC_ON_HANG_ONLY = 0x01, - PSLC_ASAP = 0x02, - PSLC_COUNTDOWN = 0x03, - PARTIAL_SQUAD_LAUNCH_COUNTDOWN_mask = 0x07 << 2, - PARTIAL_SQUAD_LAUNCH_COUNTDOWN_shift = 2, - DISABLE_ZMASK_EXPCLEAR_OPTIMIZATIO_bit = 1 << 5, + DB_DEPTH_BASE = 0x0002800c, + DB_DEPTH_INFO = 0x00028010, + DB_DEPTH_INFO__FORMAT_mask = 0x07 << 0, + DB_DEPTH_INFO__FORMAT_shift = 0, + DEPTH_INVALID = 0x00, + DEPTH_16 = 0x01, + DEPTH_X8_24 = 0x02, + DEPTH_8_24 = 0x03, + DEPTH_X8_24_FLOAT = 0x04, + DEPTH_8_24_FLOAT = 0x05, + DEPTH_32_FLOAT = 0x06, + DEPTH_X24_8_32_FLOAT = 0x07, + DB_DEPTH_INFO__READ_SIZE_bit = 1 << 3, + DB_DEPTH_INFO__ARRAY_MODE_mask = 0x0f << 15, + DB_DEPTH_INFO__ARRAY_MODE_shift = 15, + ARRAY_2D_TILED_THIN1 = 0x04, + TILE_SURFACE_ENABLE_bit = 1 << 25, + TILE_COMPACT_bit = 1 << 26, + ZRANGE_PRECISION_bit = 1 << 31, DB_HTILE_DATA_BASE = 0x00028014, DB_STENCIL_CLEAR = 0x00028028, DB_STENCIL_CLEAR__CLEAR_mask = 0xff << 0, @@ -1843,89 +1378,122 @@ enum { MIN_shift = 16, DB_DEPTH_CLEAR = 0x0002802c, PA_SC_SCREEN_SCISSOR_TL = 0x00028030, - PA_SC_SCREEN_SCISSOR_TL__TL_X_mask = 0xffff << 0, + PA_SC_SCREEN_SCISSOR_TL__TL_X_mask = 0x7fff << 0, PA_SC_SCREEN_SCISSOR_TL__TL_X_shift = 0, - PA_SC_SCREEN_SCISSOR_TL__TL_Y_mask = 0xffff << 16, + PA_SC_SCREEN_SCISSOR_TL__TL_Y_mask = 0x7fff << 16, PA_SC_SCREEN_SCISSOR_TL__TL_Y_shift = 16, PA_SC_SCREEN_SCISSOR_BR = 0x00028034, - PA_SC_SCREEN_SCISSOR_BR__BR_X_mask = 0xffff << 0, + PA_SC_SCREEN_SCISSOR_BR__BR_X_mask = 0x7fff << 0, PA_SC_SCREEN_SCISSOR_BR__BR_X_shift = 0, - PA_SC_SCREEN_SCISSOR_BR__BR_Y_mask = 0xffff << 16, + PA_SC_SCREEN_SCISSOR_BR__BR_Y_mask = 0x7fff << 16, PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift = 16, - DB_Z_INFO = 0x00028040, - DB_Z_INFO__FORMAT_mask = 0x03 << 0, - DB_Z_INFO__FORMAT_shift = 0, - Z_INVALID = 0x00, - Z_16 = 0x01, - Z_24 = 0x02, - Z_32_FLOAT = 0x03, - DB_Z_INFO__ARRAY_MODE_mask = 0x0f << 4, - DB_Z_INFO__ARRAY_MODE_shift = 4, + CB_COLOR0_BASE = 0x00028040, + CB_COLOR0_BASE_num = 8, + CB_COLOR0_SIZE = 0x00028060, + CB_COLOR0_SIZE_num = 8, +/* PITCH_TILE_MAX_mask = 0x3ff << 0, */ +/* PITCH_TILE_MAX_shift = 0, */ +/* SLICE_TILE_MAX_mask = 0xfffff << 10, */ +/* SLICE_TILE_MAX_shift = 10, */ + CB_COLOR0_VIEW = 0x00028080, + CB_COLOR0_VIEW_num = 8, +/* SLICE_START_mask = 0x7ff << 0, */ +/* SLICE_START_shift = 0, */ +/* SLICE_MAX_mask = 0x7ff << 13, */ +/* SLICE_MAX_shift = 13, */ + CB_COLOR0_INFO = 0x000280a0, + CB_COLOR0_INFO_num = 8, + ENDIAN_mask = 0x03 << 0, + ENDIAN_shift = 0, + ENDIAN_NONE = 0x00, + ENDIAN_8IN16 = 0x01, + ENDIAN_8IN32 = 0x02, + ENDIAN_8IN64 = 0x03, + CB_COLOR0_INFO__FORMAT_mask = 0x3f << 2, + CB_COLOR0_INFO__FORMAT_shift = 2, + COLOR_INVALID = 0x00, + COLOR_8 = 0x01, + COLOR_4_4 = 0x02, + COLOR_3_3_2 = 0x03, + COLOR_16 = 0x05, + COLOR_16_FLOAT = 0x06, + COLOR_8_8 = 0x07, + COLOR_5_6_5 = 0x08, + COLOR_6_5_5 = 0x09, + COLOR_1_5_5_5 = 0x0a, + COLOR_4_4_4_4 = 0x0b, + COLOR_5_5_5_1 = 0x0c, + COLOR_32 = 0x0d, + COLOR_32_FLOAT = 0x0e, + COLOR_16_16 = 0x0f, + COLOR_16_16_FLOAT = 0x10, + COLOR_8_24 = 0x11, + COLOR_8_24_FLOAT = 0x12, + COLOR_24_8 = 0x13, + COLOR_24_8_FLOAT = 0x14, + COLOR_10_11_11 = 0x15, + COLOR_10_11_11_FLOAT = 0x16, + COLOR_11_11_10 = 0x17, + COLOR_11_11_10_FLOAT = 0x18, + COLOR_2_10_10_10 = 0x19, + COLOR_8_8_8_8 = 0x1a, + COLOR_10_10_10_2 = 0x1b, + COLOR_X24_8_32_FLOAT = 0x1c, + COLOR_32_32 = 0x1d, + COLOR_32_32_FLOAT = 0x1e, + COLOR_16_16_16_16 = 0x1f, + COLOR_16_16_16_16_FLOAT = 0x20, + COLOR_32_32_32_32 = 0x22, + COLOR_32_32_32_32_FLOAT = 0x23, + CB_COLOR0_INFO__ARRAY_MODE_mask = 0x0f << 8, + CB_COLOR0_INFO__ARRAY_MODE_shift = 8, ARRAY_LINEAR_GENERAL = 0x00, ARRAY_LINEAR_ALIGNED = 0x01, - ARRAY_1D_TILED_THIN1 = 0x02, - ARRAY_2D_TILED_THIN1 = 0x04, - DB_Z_INFO__TILE_SPLIT_mask = 0x07 << 8, - DB_Z_INFO__TILE_SPLIT_shift = 8, - ADDR_SURF_TILE_SPLIT_64B = 0x00, - ADDR_SURF_TILE_SPLIT_128B = 0x01, - ADDR_SURF_TILE_SPLIT_256B = 0x02, - ADDR_SURF_TILE_SPLIT_512B = 0x03, - ADDR_SURF_TILE_SPLIT_1KB = 0x04, - ADDR_SURF_TILE_SPLIT_2KB = 0x05, - ADDR_SURF_TILE_SPLIT_4KB = 0x06, - DB_Z_INFO__NUM_BANKS_mask = 0x03 << 12, - DB_Z_INFO__NUM_BANKS_shift = 12, - ADDR_SURF_2_BANK = 0x00, - ADDR_SURF_4_BANK = 0x01, - ADDR_SURF_8_BANK = 0x02, - ADDR_SURF_16_BANK = 0x03, - DB_Z_INFO__BANK_WIDTH_mask = 0x03 << 16, - DB_Z_INFO__BANK_WIDTH_shift = 16, - ADDR_SURF_BANK_WIDTH_1 = 0x00, - ADDR_SURF_BANK_WIDTH_2 = 0x01, - ADDR_SURF_BANK_WIDTH_4 = 0x02, - ADDR_SURF_BANK_WIDTH_8 = 0x03, - DB_Z_INFO__BANK_HEIGHT_mask = 0x03 << 20, - DB_Z_INFO__BANK_HEIGHT_shift = 20, - ADDR_SURF_BANK_HEIGHT_1 = 0x00, - ADDR_SURF_BANK_HEIGHT_2 = 0x01, - ADDR_SURF_BANK_HEIGHT_4 = 0x02, - ADDR_SURF_BANK_HEIGHT_8 = 0x03, - DB_Z_INFO__MACRO_TILE_ASPECT_mask = 0x03 << 24, - DB_Z_INFO__MACRO_TILE_ASPECT_shift = 24, - ADDR_SURF_MACRO_ASPECT_1 = 0x00, - ADDR_SURF_MACRO_ASPECT_2 = 0x01, - ADDR_SURF_MACRO_ASPECT_4 = 0x02, - ADDR_SURF_MACRO_ASPECT_8 = 0x03, - ALLOW_EXPCLEAR_bit = 1 << 27, - READ_SIZE_bit = 1 << 28, - TILE_SURFACE_ENABLE_bit = 1 << 29, - DB_Z_INFO__TILE_COMPACT_bit = 1 << 30, - ZRANGE_PRECISION_bit = 1 << 31, - DB_STENCIL_INFO = 0x00028044, - DB_STENCIL_INFO__FORMAT_bit = 1 << 0, - DB_STENCIL_INFO__TILE_SPLIT_mask = 0x07 << 8, - DB_STENCIL_INFO__TILE_SPLIT_shift = 8, -/* ADDR_SURF_TILE_SPLIT_64B = 0x00, */ -/* ADDR_SURF_TILE_SPLIT_128B = 0x01, */ -/* ADDR_SURF_TILE_SPLIT_256B = 0x02, */ -/* ADDR_SURF_TILE_SPLIT_512B = 0x03, */ -/* ADDR_SURF_TILE_SPLIT_1KB = 0x04, */ -/* ADDR_SURF_TILE_SPLIT_2KB = 0x05, */ -/* ADDR_SURF_TILE_SPLIT_4KB = 0x06, */ - DB_Z_READ_BASE = 0x00028048, - DB_STENCIL_READ_BASE = 0x0002804c, - DB_Z_WRITE_BASE = 0x00028050, - DB_STENCIL_WRITE_BASE = 0x00028054, - DB_DEPTH_SIZE = 0x00028058, - PITCH_TILE_MAX_mask = 0x7ff << 0, - PITCH_TILE_MAX_shift = 0, - HEIGHT_TILE_MAX_mask = 0x7ff << 11, - HEIGHT_TILE_MAX_shift = 11, - DB_DEPTH_SLICE = 0x0002805c, - SLICE_TILE_MAX_mask = 0x3fffff << 0, - SLICE_TILE_MAX_shift = 0, +/* ARRAY_2D_TILED_THIN1 = 0x04, */ + NUMBER_TYPE_mask = 0x07 << 12, + NUMBER_TYPE_shift = 12, + NUMBER_UNORM = 0x00, + NUMBER_SNORM = 0x01, + NUMBER_USCALED = 0x02, + NUMBER_SSCALED = 0x03, + NUMBER_UINT = 0x04, + NUMBER_SINT = 0x05, + NUMBER_SRGB = 0x06, + NUMBER_FLOAT = 0x07, + CB_COLOR0_INFO__READ_SIZE_bit = 1 << 15, + COMP_SWAP_mask = 0x03 << 16, + COMP_SWAP_shift = 16, + SWAP_STD = 0x00, + SWAP_ALT = 0x01, + SWAP_STD_REV = 0x02, + SWAP_ALT_REV = 0x03, + CB_COLOR0_INFO__TILE_MODE_mask = 0x03 << 18, + CB_COLOR0_INFO__TILE_MODE_shift = 18, + TILE_DISABLE = 0x00, + TILE_CLEAR_ENABLE = 0x01, + TILE_FRAG_ENABLE = 0x02, + BLEND_CLAMP_bit = 1 << 20, + CLEAR_COLOR_bit = 1 << 21, + BLEND_BYPASS_bit = 1 << 22, + BLEND_FLOAT32_bit = 1 << 23, + SIMPLE_FLOAT_bit = 1 << 24, + CB_COLOR0_INFO__ROUND_MODE_bit = 1 << 25, +/* TILE_COMPACT_bit = 1 << 26, */ + SOURCE_FORMAT_bit = 1 << 27, + CB_COLOR0_TILE = 0x000280c0, + CB_COLOR0_TILE_num = 8, + CB_COLOR0_FRAG = 0x000280e0, + CB_COLOR0_FRAG_num = 8, + CB_COLOR0_MASK = 0x00028100, + CB_COLOR0_MASK_num = 8, + CMASK_BLOCK_MAX_mask = 0xfff << 0, + CMASK_BLOCK_MAX_shift = 0, + FMASK_TILE_MAX_mask = 0xfffff << 12, + FMASK_TILE_MAX_shift = 12, + CB_CLEAR_RED = 0x00028120, + CB_CLEAR_GREEN = 0x00028124, + CB_CLEAR_BLUE = 0x00028128, + CB_CLEAR_ALPHA = 0x0002812c, SQ_ALU_CONST_BUFFER_SIZE_PS_0 = 0x00028140, SQ_ALU_CONST_BUFFER_SIZE_PS_0_num = 16, SQ_ALU_CONST_BUFFER_SIZE_PS_0__DATA_mask = 0x1ff << 0, @@ -1939,20 +1507,20 @@ enum { SQ_ALU_CONST_BUFFER_SIZE_GS_0__DATA_mask = 0x1ff << 0, SQ_ALU_CONST_BUFFER_SIZE_GS_0__DATA_shift = 0, PA_SC_WINDOW_OFFSET = 0x00028200, - WINDOW_X_OFFSET_mask = 0xffff << 0, + WINDOW_X_OFFSET_mask = 0x7fff << 0, WINDOW_X_OFFSET_shift = 0, - WINDOW_Y_OFFSET_mask = 0xffff << 16, + WINDOW_Y_OFFSET_mask = 0x7fff << 16, WINDOW_Y_OFFSET_shift = 16, PA_SC_WINDOW_SCISSOR_TL = 0x00028204, - PA_SC_WINDOW_SCISSOR_TL__TL_X_mask = 0x7fff << 0, + PA_SC_WINDOW_SCISSOR_TL__TL_X_mask = 0x3fff << 0, PA_SC_WINDOW_SCISSOR_TL__TL_X_shift = 0, - PA_SC_WINDOW_SCISSOR_TL__TL_Y_mask = 0x7fff << 16, + PA_SC_WINDOW_SCISSOR_TL__TL_Y_mask = 0x3fff << 16, PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift = 16, WINDOW_OFFSET_DISABLE_bit = 1 << 31, PA_SC_WINDOW_SCISSOR_BR = 0x00028208, - PA_SC_WINDOW_SCISSOR_BR__BR_X_mask = 0x7fff << 0, + PA_SC_WINDOW_SCISSOR_BR__BR_X_mask = 0x3fff << 0, PA_SC_WINDOW_SCISSOR_BR__BR_X_shift = 0, - PA_SC_WINDOW_SCISSOR_BR__BR_Y_mask = 0x7fff << 16, + PA_SC_WINDOW_SCISSOR_BR__BR_Y_mask = 0x3fff << 16, PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift = 16, PA_SC_CLIPRECT_RULE = 0x0002820c, CLIP_RULE_mask = 0xffff << 0, @@ -1960,37 +1528,17 @@ enum { PA_SC_CLIPRECT_0_TL = 0x00028210, PA_SC_CLIPRECT_0_TL_num = 4, PA_SC_CLIPRECT_0_TL_offset = 8, - PA_SC_CLIPRECT_0_TL__TL_X_mask = 0x7fff << 0, + PA_SC_CLIPRECT_0_TL__TL_X_mask = 0x3fff << 0, PA_SC_CLIPRECT_0_TL__TL_X_shift = 0, - PA_SC_CLIPRECT_0_TL__TL_Y_mask = 0x7fff << 16, + PA_SC_CLIPRECT_0_TL__TL_Y_mask = 0x3fff << 16, PA_SC_CLIPRECT_0_TL__TL_Y_shift = 16, PA_SC_CLIPRECT_0_BR = 0x00028214, PA_SC_CLIPRECT_0_BR_num = 4, PA_SC_CLIPRECT_0_BR_offset = 8, - PA_SC_CLIPRECT_0_BR__BR_X_mask = 0x7fff << 0, + PA_SC_CLIPRECT_0_BR__BR_X_mask = 0x3fff << 0, PA_SC_CLIPRECT_0_BR__BR_X_shift = 0, - PA_SC_CLIPRECT_0_BR__BR_Y_mask = 0x7fff << 16, + PA_SC_CLIPRECT_0_BR__BR_Y_mask = 0x3fff << 16, PA_SC_CLIPRECT_0_BR__BR_Y_shift = 16, - PA_SC_EDGERULE = 0x00028230, - ER_TRI_mask = 0x0f << 0, - ER_TRI_shift = 0, - ER_POINT_mask = 0x0f << 4, - ER_POINT_shift = 4, - ER_RECT_mask = 0x0f << 8, - ER_RECT_shift = 8, - ER_LINE_LR_mask = 0x3f << 12, - ER_LINE_LR_shift = 12, - ER_LINE_RL_mask = 0x3f << 18, - ER_LINE_RL_shift = 18, - ER_LINE_TB_mask = 0x0f << 24, - ER_LINE_TB_shift = 24, - ER_LINE_BT_mask = 0x0f << 28, - ER_LINE_BT_shift = 28, - PA_SU_HARDWARE_SCREEN_OFFSET = 0x00028234, - HW_SCREEN_OFFSET_X_mask = 0x1f << 0, - HW_SCREEN_OFFSET_X_shift = 0, - HW_SCREEN_OFFSET_Y_mask = 0x1f << 8, - HW_SCREEN_OFFSET_Y_shift = 8, CB_TARGET_MASK = 0x00028238, TARGET0_ENABLE_mask = 0x0f << 0, TARGET0_ENABLE_shift = 0, @@ -2026,30 +1574,30 @@ enum { OUTPUT7_ENABLE_mask = 0x0f << 28, OUTPUT7_ENABLE_shift = 28, PA_SC_GENERIC_SCISSOR_TL = 0x00028240, - PA_SC_GENERIC_SCISSOR_TL__TL_X_mask = 0x7fff << 0, + PA_SC_GENERIC_SCISSOR_TL__TL_X_mask = 0x3fff << 0, PA_SC_GENERIC_SCISSOR_TL__TL_X_shift = 0, - PA_SC_GENERIC_SCISSOR_TL__TL_Y_mask = 0x7fff << 16, + PA_SC_GENERIC_SCISSOR_TL__TL_Y_mask = 0x3fff << 16, PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift = 16, /* WINDOW_OFFSET_DISABLE_bit = 1 << 31, */ PA_SC_GENERIC_SCISSOR_BR = 0x00028244, - PA_SC_GENERIC_SCISSOR_BR__BR_X_mask = 0x7fff << 0, + PA_SC_GENERIC_SCISSOR_BR__BR_X_mask = 0x3fff << 0, PA_SC_GENERIC_SCISSOR_BR__BR_X_shift = 0, - PA_SC_GENERIC_SCISSOR_BR__BR_Y_mask = 0x7fff << 16, + PA_SC_GENERIC_SCISSOR_BR__BR_Y_mask = 0x3fff << 16, PA_SC_GENERIC_SCISSOR_BR__BR_Y_shift = 16, PA_SC_VPORT_SCISSOR_0_TL = 0x00028250, PA_SC_VPORT_SCISSOR_0_TL_num = 16, PA_SC_VPORT_SCISSOR_0_TL_offset = 8, - PA_SC_VPORT_SCISSOR_0_TL__TL_X_mask = 0x7fff << 0, + PA_SC_VPORT_SCISSOR_0_TL__TL_X_mask = 0x3fff << 0, PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift = 0, - PA_SC_VPORT_SCISSOR_0_TL__TL_Y_mask = 0x7fff << 16, + PA_SC_VPORT_SCISSOR_0_TL__TL_Y_mask = 0x3fff << 16, PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift = 16, /* WINDOW_OFFSET_DISABLE_bit = 1 << 31, */ PA_SC_VPORT_SCISSOR_0_BR = 0x00028254, PA_SC_VPORT_SCISSOR_0_BR_num = 16, PA_SC_VPORT_SCISSOR_0_BR_offset = 8, - PA_SC_VPORT_SCISSOR_0_BR__BR_X_mask = 0x7fff << 0, + PA_SC_VPORT_SCISSOR_0_BR__BR_X_mask = 0x3fff << 0, PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift = 0, - PA_SC_VPORT_SCISSOR_0_BR__BR_Y_mask = 0x7fff << 16, + PA_SC_VPORT_SCISSOR_0_BR__BR_Y_mask = 0x3fff << 16, PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift = 16, PA_SC_VPORT_ZMIN_0 = 0x000282d0, PA_SC_VPORT_ZMIN_0_num = 16, @@ -2084,6 +1632,9 @@ enum { CB_BLEND_GREEN = 0x00028418, CB_BLEND_BLUE = 0x0002841c, CB_BLEND_ALPHA = 0x00028420, + CB_FOG_RED = 0x00028424, + CB_FOG_GREEN = 0x00028428, + CB_FOG_BLUE = 0x0002842c, DB_STENCILREFMASK = 0x00028430, STENCILREF_mask = 0xff << 0, STENCILREF_shift = 0, @@ -2117,19 +1668,7 @@ enum { PA_CL_VPORT_ZOFFSET_0 = 0x00028450, PA_CL_VPORT_ZOFFSET_0_num = 16, PA_CL_VPORT_ZOFFSET_0_offset = 24, - PA_CL_UCP_0_X = 0x000285bc, - PA_CL_UCP_0_X_num = 6, - PA_CL_UCP_0_X_offset = 16, - PA_CL_UCP_0_Y = 0x000285c0, - PA_CL_UCP_0_Y_num = 6, - PA_CL_UCP_0_Y_offset = 16, - PA_CL_UCP_0_Z = 0x000285c4, - PA_CL_UCP_0_Z_num = 6, - PA_CL_UCP_0_Z_offset = 16, - PA_CL_UCP_0_W = 0x000285c8, - PA_CL_UCP_0_W_num = 6, - PA_CL_UCP_0_W_offset = 16, - SPI_VS_OUT_ID_0 = 0x0002861c, + SPI_VS_OUT_ID_0 = 0x00028614, SPI_VS_OUT_ID_0_num = 10, SEMANTIC_0_mask = 0xff << 0, SEMANTIC_0_shift = 0, @@ -2147,9 +1686,12 @@ enum { DEFAULT_VAL_shift = 8, X_0_0F = 0x00, FLAT_SHADE_bit = 1 << 10, + SEL_CENTROID_bit = 1 << 11, + SEL_LINEAR_bit = 1 << 12, CYL_WRAP_mask = 0x0f << 13, CYL_WRAP_shift = 13, PT_SPRITE_TEX_bit = 1 << 17, + SEL_SAMPLE_bit = 1 << 18, SPI_VS_OUT_CONFIG = 0x000286c4, VS_PER_COMPONENT_bit = 1 << 0, VS_EXPORT_COUNT_mask = 0x1f << 1, @@ -2166,11 +1708,25 @@ enum { POSITION_ADDR_shift = 10, PARAM_GEN_mask = 0x0f << 15, PARAM_GEN_shift = 15, + PARAM_GEN_ADDR_mask = 0x7f << 19, + PARAM_GEN_ADDR_shift = 19, + BARYC_SAMPLE_CNTL_mask = 0x03 << 26, + BARYC_SAMPLE_CNTL_shift = 26, + CENTROIDS_ONLY = 0x00, + CENTERS_ONLY = 0x01, + CENTROIDS_AND_CENTERS = 0x02, + UNDEF = 0x03, PERSP_GRADIENT_ENA_bit = 1 << 28, LINEAR_GRADIENT_ENA_bit = 1 << 29, POSITION_SAMPLE_bit = 1 << 30, + BARYC_AT_SAMPLE_ENA_bit = 1 << 31, SPI_PS_IN_CONTROL_1 = 0x000286d0, + GEN_INDEX_PIX_bit = 1 << 0, + GEN_INDEX_PIX_ADDR_mask = 0x7f << 1, + GEN_INDEX_PIX_ADDR_shift = 1, FRONT_FACE_ENA_bit = 1 << 8, + FRONT_FACE_CHAN_mask = 0x03 << 9, + FRONT_FACE_CHAN_shift = 9, FRONT_FACE_ALL_BITS_bit = 1 << 11, FRONT_FACE_ADDR_mask = 0x1f << 12, FRONT_FACE_ADDR_shift = 12, @@ -2179,7 +1735,6 @@ enum { FIXED_PT_POSITION_ENA_bit = 1 << 24, FIXED_PT_POSITION_ADDR_mask = 0x1f << 25, FIXED_PT_POSITION_ADDR_shift = 25, - POSITION_ULC_bit = 1 << 30, SPI_INTERP_CONTROL_0 = 0x000286d4, FLAT_SHADE_ENA_bit = 1 << 0, PNT_SPRITE_ENA_bit = 1 << 1, @@ -2216,154 +1771,32 @@ enum { PROVIDE_Z_TO_SPI_bit = 1 << 0, SPI_FOG_CNTL = 0x000286dc, PASS_FOG_THROUGH_PS_bit = 1 << 0, - SPI_BARYC_CNTL = 0x000286e0, - PERSP_CENTER_ENA_mask = 0x03 << 0, - PERSP_CENTER_ENA_shift = 0, - X_OFF = 0x00, - PERSP_CENTER_ENA__X_ON_AT_CENTER = 0x01, - PERSP_CENTER_ENA__X_ON_AT_CENTROID = 0x02, - PERSP_CENTROID_ENA_mask = 0x03 << 4, - PERSP_CENTROID_ENA_shift = 4, -/* X_OFF = 0x00, */ - PERSP_CENTROID_ENA__X_ON_AT_CENTROID = 0x01, - PERSP_CENTROID_ENA__X_ON_AT_CENTER = 0x02, - PERSP_SAMPLE_ENA_mask = 0x03 << 8, - PERSP_SAMPLE_ENA_shift = 8, -/* X_OFF = 0x00, */ - PERSP_PULL_MODEL_ENA_mask = 0x03 << 12, - PERSP_PULL_MODEL_ENA_shift = 12, -/* X_OFF = 0x00, */ - LINEAR_CENTER_ENA_mask = 0x03 << 16, - LINEAR_CENTER_ENA_shift = 16, -/* X_OFF = 0x00, */ - LINEAR_CENTER_ENA__X_ON_AT_CENTER = 0x01, - LINEAR_CENTER_ENA__X_ON_AT_CENTROID = 0x02, - LINEAR_CENTROID_ENA_mask = 0x03 << 20, - LINEAR_CENTROID_ENA_shift = 20, -/* X_OFF = 0x00, */ - LINEAR_CENTROID_ENA__X_ON_AT_CENTROID = 0x01, - LINEAR_CENTROID_ENA__X_ON_AT_CENTER = 0x02, - LINEAR_SAMPLE_ENA_mask = 0x03 << 24, - LINEAR_SAMPLE_ENA_shift = 24, -/* X_OFF = 0x00, */ - SPI_PS_IN_CONTROL_2 = 0x000286e4, - LINE_STIPPLE_TEX_ADDR_mask = 0xff << 0, - LINE_STIPPLE_TEX_ADDR_shift = 0, - LINE_STIPPLE_TEX_ENA_bit = 1 << 8, + PIXEL_FOG_FUNC_mask = 0x03 << 1, + PIXEL_FOG_FUNC_shift = 1, + SPI_FOG_NONE = 0x00, + SPI_FOG_EXP = 0x01, + SPI_FOG_EXP2 = 0x02, + SPI_FOG_LINEAR = 0x03, + PIXEL_FOG_SRC_SEL_bit = 1 << 3, + VS_FOG_CLAMP_DISABLE_bit = 1 << 4, + SPI_FOG_FUNC_SCALE = 0x000286e0, + SPI_FOG_FUNC_BIAS = 0x000286e4, CB_BLEND0_CONTROL = 0x00028780, CB_BLEND0_CONTROL_num = 8, COLOR_SRCBLEND_mask = 0x1f << 0, COLOR_SRCBLEND_shift = 0, - BLEND_ZERO = 0x00, - BLEND_ONE = 0x01, - BLEND_SRC_COLOR = 0x02, - BLEND_ONE_MINUS_SRC_COLOR = 0x03, - BLEND_SRC_ALPHA = 0x04, - BLEND_ONE_MINUS_SRC_ALPHA = 0x05, - BLEND_DST_ALPHA = 0x06, - BLEND_ONE_MINUS_DST_ALPHA = 0x07, - BLEND_DST_COLOR = 0x08, - BLEND_ONE_MINUS_DST_COLOR = 0x09, - BLEND_SRC_ALPHA_SATURATE = 0x0a, - BLEND_BOTH_SRC_ALPHA = 0x0b, - BLEND_BOTH_INV_SRC_ALPHA = 0x0c, - BLEND_CONSTANT_COLOR = 0x0d, - BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, - BLEND_SRC1_COLOR = 0x0f, - BLEND_INV_SRC1_COLOR = 0x10, - BLEND_SRC1_ALPHA = 0x11, - BLEND_INV_SRC1_ALPHA = 0x12, - BLEND_CONSTANT_ALPHA = 0x13, - BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, COLOR_COMB_FCN_mask = 0x07 << 5, COLOR_COMB_FCN_shift = 5, - COMB_DST_PLUS_SRC = 0x00, - COMB_SRC_MINUS_DST = 0x01, - COMB_MIN_DST_SRC = 0x02, - COMB_MAX_DST_SRC = 0x03, - COMB_DST_MINUS_SRC = 0x04, COLOR_DESTBLEND_mask = 0x1f << 8, COLOR_DESTBLEND_shift = 8, -/* BLEND_ZERO = 0x00, */ -/* BLEND_ONE = 0x01, */ -/* BLEND_SRC_COLOR = 0x02, */ -/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ -/* BLEND_SRC_ALPHA = 0x04, */ -/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ -/* BLEND_DST_ALPHA = 0x06, */ -/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ -/* BLEND_DST_COLOR = 0x08, */ -/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ -/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ -/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ -/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ -/* BLEND_CONSTANT_COLOR = 0x0d, */ -/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ -/* BLEND_SRC1_COLOR = 0x0f, */ -/* BLEND_INV_SRC1_COLOR = 0x10, */ -/* BLEND_SRC1_ALPHA = 0x11, */ -/* BLEND_INV_SRC1_ALPHA = 0x12, */ -/* BLEND_CONSTANT_ALPHA = 0x13, */ -/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ + OPACITY_WEIGHT_bit = 1 << 13, ALPHA_SRCBLEND_mask = 0x1f << 16, ALPHA_SRCBLEND_shift = 16, -/* BLEND_ZERO = 0x00, */ -/* BLEND_ONE = 0x01, */ -/* BLEND_SRC_COLOR = 0x02, */ -/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ -/* BLEND_SRC_ALPHA = 0x04, */ -/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ -/* BLEND_DST_ALPHA = 0x06, */ -/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ -/* BLEND_DST_COLOR = 0x08, */ -/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ -/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ -/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ -/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ -/* BLEND_CONSTANT_COLOR = 0x0d, */ -/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ -/* BLEND_SRC1_COLOR = 0x0f, */ -/* BLEND_INV_SRC1_COLOR = 0x10, */ -/* BLEND_SRC1_ALPHA = 0x11, */ -/* BLEND_INV_SRC1_ALPHA = 0x12, */ -/* BLEND_CONSTANT_ALPHA = 0x13, */ -/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ ALPHA_COMB_FCN_mask = 0x07 << 21, ALPHA_COMB_FCN_shift = 21, -/* COMB_DST_PLUS_SRC = 0x00, */ -/* COMB_SRC_MINUS_DST = 0x01, */ -/* COMB_MIN_DST_SRC = 0x02, */ -/* COMB_MAX_DST_SRC = 0x03, */ -/* COMB_DST_MINUS_SRC = 0x04, */ ALPHA_DESTBLEND_mask = 0x1f << 24, ALPHA_DESTBLEND_shift = 24, -/* BLEND_ZERO = 0x00, */ -/* BLEND_ONE = 0x01, */ -/* BLEND_SRC_COLOR = 0x02, */ -/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ -/* BLEND_SRC_ALPHA = 0x04, */ -/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ -/* BLEND_DST_ALPHA = 0x06, */ -/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ -/* BLEND_DST_COLOR = 0x08, */ -/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ -/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ -/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ -/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ -/* BLEND_CONSTANT_COLOR = 0x0d, */ -/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ -/* BLEND_SRC1_COLOR = 0x0f, */ -/* BLEND_INV_SRC1_COLOR = 0x10, */ -/* BLEND_SRC1_ALPHA = 0x11, */ -/* BLEND_INV_SRC1_ALPHA = 0x12, */ -/* BLEND_CONSTANT_ALPHA = 0x13, */ -/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ SEPARATE_ALPHA_BLEND_bit = 1 << 29, - CB_BLEND0_CONTROL__ENABLE_bit = 1 << 30, - PA_CL_POINT_X_RAD = 0x000287d4, - PA_CL_POINT_Y_RAD = 0x000287d8, - PA_CL_POINT_SIZE = 0x000287dc, - PA_CL_POINT_CULL_RAD = 0x000287e0, VGT_DMA_BASE_HI = 0x000287e4, VGT_DMA_BASE_HI__BASE_ADDR_mask = 0xff << 0, VGT_DMA_BASE_HI__BASE_ADDR_shift = 0, @@ -2379,6 +1812,7 @@ enum { MAJOR_MODE_shift = 2, DI_MAJOR_MODE_0 = 0x00, DI_MAJOR_MODE_1 = 0x01, + SPRITE_EN_bit = 1 << 4, NOT_EOP_bit = 1 << 5, USE_OPAQUE_bit = 1 << 6, VGT_IMMED_DATA = 0x000287f4, @@ -2480,16 +1914,133 @@ enum { /* STENCIL_INVERT = 0x05, */ /* STENCIL_INCR_WRAP = 0x06, */ /* STENCIL_DECR_WRAP = 0x07, */ + CB_BLEND_CONTROL = 0x00028804, +/* COLOR_SRCBLEND_mask = 0x1f << 0, */ +/* COLOR_SRCBLEND_shift = 0, */ + BLEND_ZERO = 0x00, + BLEND_ONE = 0x01, + BLEND_SRC_COLOR = 0x02, + BLEND_ONE_MINUS_SRC_COLOR = 0x03, + BLEND_SRC_ALPHA = 0x04, + BLEND_ONE_MINUS_SRC_ALPHA = 0x05, + BLEND_DST_ALPHA = 0x06, + BLEND_ONE_MINUS_DST_ALPHA = 0x07, + BLEND_DST_COLOR = 0x08, + BLEND_ONE_MINUS_DST_COLOR = 0x09, + BLEND_SRC_ALPHA_SATURATE = 0x0a, + BLEND_BOTH_SRC_ALPHA = 0x0b, + BLEND_BOTH_INV_SRC_ALPHA = 0x0c, + BLEND_CONSTANT_COLOR = 0x0d, + BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, + BLEND_SRC1_COLOR = 0x0f, + BLEND_INV_SRC1_COLOR = 0x10, + BLEND_SRC1_ALPHA = 0x11, + BLEND_INV_SRC1_ALPHA = 0x12, + BLEND_CONSTANT_ALPHA = 0x13, + BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, +/* COLOR_COMB_FCN_mask = 0x07 << 5, */ +/* COLOR_COMB_FCN_shift = 5, */ + COMB_DST_PLUS_SRC = 0x00, + COMB_SRC_MINUS_DST = 0x01, + COMB_MIN_DST_SRC = 0x02, + COMB_MAX_DST_SRC = 0x03, + COMB_DST_MINUS_SRC = 0x04, +/* COLOR_DESTBLEND_mask = 0x1f << 8, */ +/* COLOR_DESTBLEND_shift = 8, */ +/* BLEND_ZERO = 0x00, */ +/* BLEND_ONE = 0x01, */ +/* BLEND_SRC_COLOR = 0x02, */ +/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ +/* BLEND_SRC_ALPHA = 0x04, */ +/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ +/* BLEND_DST_ALPHA = 0x06, */ +/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ +/* BLEND_DST_COLOR = 0x08, */ +/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ +/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ +/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ +/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ +/* BLEND_CONSTANT_COLOR = 0x0d, */ +/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ +/* BLEND_SRC1_COLOR = 0x0f, */ +/* BLEND_INV_SRC1_COLOR = 0x10, */ +/* BLEND_SRC1_ALPHA = 0x11, */ +/* BLEND_INV_SRC1_ALPHA = 0x12, */ +/* BLEND_CONSTANT_ALPHA = 0x13, */ +/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ +/* OPACITY_WEIGHT_bit = 1 << 13, */ +/* ALPHA_SRCBLEND_mask = 0x1f << 16, */ +/* ALPHA_SRCBLEND_shift = 16, */ +/* BLEND_ZERO = 0x00, */ +/* BLEND_ONE = 0x01, */ +/* BLEND_SRC_COLOR = 0x02, */ +/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ +/* BLEND_SRC_ALPHA = 0x04, */ +/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ +/* BLEND_DST_ALPHA = 0x06, */ +/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ +/* BLEND_DST_COLOR = 0x08, */ +/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ +/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ +/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ +/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ +/* BLEND_CONSTANT_COLOR = 0x0d, */ +/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ +/* BLEND_SRC1_COLOR = 0x0f, */ +/* BLEND_INV_SRC1_COLOR = 0x10, */ +/* BLEND_SRC1_ALPHA = 0x11, */ +/* BLEND_INV_SRC1_ALPHA = 0x12, */ +/* BLEND_CONSTANT_ALPHA = 0x13, */ +/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ +/* ALPHA_COMB_FCN_mask = 0x07 << 21, */ +/* ALPHA_COMB_FCN_shift = 21, */ +/* COMB_DST_PLUS_SRC = 0x00, */ +/* COMB_SRC_MINUS_DST = 0x01, */ +/* COMB_MIN_DST_SRC = 0x02, */ +/* COMB_MAX_DST_SRC = 0x03, */ +/* COMB_DST_MINUS_SRC = 0x04, */ +/* ALPHA_DESTBLEND_mask = 0x1f << 24, */ +/* ALPHA_DESTBLEND_shift = 24, */ +/* BLEND_ZERO = 0x00, */ +/* BLEND_ONE = 0x01, */ +/* BLEND_SRC_COLOR = 0x02, */ +/* BLEND_ONE_MINUS_SRC_COLOR = 0x03, */ +/* BLEND_SRC_ALPHA = 0x04, */ +/* BLEND_ONE_MINUS_SRC_ALPHA = 0x05, */ +/* BLEND_DST_ALPHA = 0x06, */ +/* BLEND_ONE_MINUS_DST_ALPHA = 0x07, */ +/* BLEND_DST_COLOR = 0x08, */ +/* BLEND_ONE_MINUS_DST_COLOR = 0x09, */ +/* BLEND_SRC_ALPHA_SATURATE = 0x0a, */ +/* BLEND_BOTH_SRC_ALPHA = 0x0b, */ +/* BLEND_BOTH_INV_SRC_ALPHA = 0x0c, */ +/* BLEND_CONSTANT_COLOR = 0x0d, */ +/* BLEND_ONE_MINUS_CONSTANT_COLOR = 0x0e, */ +/* BLEND_SRC1_COLOR = 0x0f, */ +/* BLEND_INV_SRC1_COLOR = 0x10, */ +/* BLEND_SRC1_ALPHA = 0x11, */ +/* BLEND_INV_SRC1_ALPHA = 0x12, */ +/* BLEND_CONSTANT_ALPHA = 0x13, */ +/* BLEND_ONE_MINUS_CONSTANT_ALPHA = 0x14, */ +/* SEPARATE_ALPHA_BLEND_bit = 1 << 29, */ CB_COLOR_CONTROL = 0x00028808, + FOG_ENABLE_bit = 1 << 0, + MULTIWRITE_ENABLE_bit = 1 << 1, + DITHER_ENABLE_bit = 1 << 2, DEGAMMA_ENABLE_bit = 1 << 3, - CB_COLOR_CONTROL__MODE_mask = 0x07 << 4, - CB_COLOR_CONTROL__MODE_shift = 4, - CB_DISABLE = 0x00, - CB_NORMAL = 0x01, - CB_ELIMINATE_FAST_CLEAR = 0x02, - CB_RESOLVE = 0x03, - CB_DECOMPRESS = 0x04, - CB_FMASK_DECOMPRESS = 0x05, + SPECIAL_OP_mask = 0x07 << 4, + SPECIAL_OP_shift = 4, + SPECIAL_NORMAL = 0x00, + SPECIAL_DISABLE = 0x01, + SPECIAL_FAST_CLEAR = 0x02, + SPECIAL_FORCE_CLEAR = 0x03, + SPECIAL_EXPAND_COLOR = 0x04, + SPECIAL_EXPAND_TEXTURE = 0x05, + SPECIAL_EXPAND_SAMPLES = 0x06, + SPECIAL_RESOLVE_BOX = 0x07, + PER_MRT_BLEND_bit = 1 << 7, + TARGET_BLEND_ENABLE_mask = 0xff << 8, + TARGET_BLEND_ENABLE_shift = 8, ROP3_mask = 0xff << 16, ROP3_shift = 16, DB_SHADER_CONTROL = 0x0002880c, @@ -2507,19 +2058,6 @@ enum { DUAL_EXPORT_ENABLE_bit = 1 << 9, EXEC_ON_HIER_FAIL_bit = 1 << 10, EXEC_ON_NOOP_bit = 1 << 11, - ALPHA_TO_MASK_DISABLE_bit = 1 << 12, - DB_SOURCE_FORMAT_mask = 0x03 << 13, - DB_SOURCE_FORMAT_shift = 13, - EXPORT_DB_FULL = 0x00, - EXPORT_DB_FOUR16 = 0x01, - EXPORT_DB_TWO = 0x02, - DEPTH_BEFORE_SHADER_bit = 1 << 15, - CONSERVATIVE_Z_EXPORT_mask = 0x03 << 16, - CONSERVATIVE_Z_EXPORT_shift = 16, - EXPORT_ANY_Z = 0x00, - EXPORT_LESS_THAN_Z = 0x01, - EXPORT_GREATER_THAN_Z = 0x02, - EXPORT_RESERVED = 0x03, PA_CL_CLIP_CNTL = 0x00028810, UCP_ENA_0_bit = 1 << 0, UCP_ENA_1_bit = 1 << 1, @@ -2536,7 +2074,6 @@ enum { DX_CLIP_SPACE_DEF_bit = 1 << 19, DIS_CLIP_ERR_DETECT_bit = 1 << 20, VTX_KILL_OR_bit = 1 << 21, - DX_RASTERIZATION_KILL_bit = 1 << 22, DX_LINEAR_ATTR_CLIP_ENA_bit = 1 << 24, VTE_VPORT_PROVOKE_DISABLE_bit = 1 << 25, ZCLIP_NEAR_DISABLE_bit = 1 << 26, @@ -2576,6 +2113,7 @@ enum { VTX_XY_FMT_bit = 1 << 8, VTX_Z_FMT_bit = 1 << 9, VTX_W0_FMT_bit = 1 << 10, + PERFCOUNTER_REF_bit = 1 << 11, PA_CL_VS_OUT_CNTL = 0x0002881c, CLIP_DIST_ENA_0_bit = 1 << 0, CLIP_DIST_ENA_1_bit = 1 << 1, @@ -2618,231 +2156,100 @@ enum { VS_W_INF_RETAIN_bit = 1 << 13, VS_CLIP_DIST_INF_DISCARD_bit = 1 << 14, VTE_NO_OUTPUT_NEG_0_bit = 1 << 20, - PA_SU_LINE_STIPPLE_CNTL = 0x00028824, - LINE_STIPPLE_RESET_mask = 0x03 << 0, - LINE_STIPPLE_RESET_shift = 0, - EXPAND_FULL_LENGTH_bit = 1 << 2, - FRACTIONAL_ACCUM_bit = 1 << 3, - DIAMOND_ADJUST_bit = 1 << 4, - PA_SU_LINE_STIPPLE_SCALE = 0x00028828, - PA_SU_PRIM_FILTER_CNTL = 0x0002882c, - TRIANGLE_FILTER_DISABLE_bit = 1 << 0, - LINE_FILTER_DISABLE_bit = 1 << 1, - POINT_FILTER_DISABLE_bit = 1 << 2, - RECTANGLE_FILTER_DISABLE_bit = 1 << 3, - TRIANGLE_EXPAND_ENA_bit = 1 << 4, - LINE_EXPAND_ENA_bit = 1 << 5, - POINT_EXPAND_ENA_bit = 1 << 6, - RECTANGLE_EXPAND_ENA_bit = 1 << 7, - PRIM_EXPAND_CONSTANT_mask = 0xff << 8, - PRIM_EXPAND_CONSTANT_shift = 8, - SQ_LSTMP_RING_ITEMSIZE = 0x00028830, - ITEMSIZE_mask = 0x7fff << 0, - ITEMSIZE_shift = 0, - SQ_HSTMP_RING_ITEMSIZE = 0x00028834, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ SQ_PGM_START_PS = 0x00028840, - SQ_PGM_RESOURCES_PS = 0x00028844, + SQ_PGM_RESOURCES_PS = 0x00028850, NUM_GPRS_mask = 0xff << 0, NUM_GPRS_shift = 0, STACK_SIZE_mask = 0xff << 8, STACK_SIZE_shift = 8, - DX10_CLAMP_bit = 1 << 21, + SQ_PGM_RESOURCES_PS__DX10_CLAMP_bit = 1 << 21, + FETCH_CACHE_LINES_mask = 0x07 << 24, + FETCH_CACHE_LINES_shift = 24, UNCACHED_FIRST_INST_bit = 1 << 28, CLAMP_CONSTS_bit = 1 << 31, - SQ_PGM_RESOURCES_2_PS = 0x00028848, - SINGLE_ROUND_mask = 0x03 << 0, - SINGLE_ROUND_shift = 0, - SQ_ROUND_NEAREST_EVEN = 0x00, - SQ_ROUND_PLUS_INFINITY = 0x01, - SQ_ROUND_MINUS_INFINITY = 0x02, - SQ_ROUND_TO_ZERO = 0x03, - DOUBLE_ROUND_mask = 0x03 << 2, - DOUBLE_ROUND_shift = 2, -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ - ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, - ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, - ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, - ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, - SQ_PGM_EXPORTS_PS = 0x0002884c, + SQ_PGM_EXPORTS_PS = 0x00028854, EXPORT_MODE_mask = 0x1f << 0, EXPORT_MODE_shift = 0, - SQ_PGM_START_VS = 0x0002885c, - SQ_PGM_RESOURCES_VS = 0x00028860, + SQ_PGM_START_VS = 0x00028858, + SQ_PGM_RESOURCES_VS = 0x00028868, /* NUM_GPRS_mask = 0xff << 0, */ /* NUM_GPRS_shift = 0, */ /* STACK_SIZE_mask = 0xff << 8, */ /* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ + SQ_PGM_RESOURCES_VS__DX10_CLAMP_bit = 1 << 21, +/* FETCH_CACHE_LINES_mask = 0x07 << 24, */ +/* FETCH_CACHE_LINES_shift = 24, */ /* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_VS = 0x00028864, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ - SQ_PGM_START_GS = 0x00028874, - SQ_PGM_RESOURCES_GS = 0x00028878, + SQ_PGM_START_GS = 0x0002886c, + SQ_PGM_RESOURCES_GS = 0x0002887c, /* NUM_GPRS_mask = 0xff << 0, */ /* NUM_GPRS_shift = 0, */ /* STACK_SIZE_mask = 0xff << 8, */ /* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ + SQ_PGM_RESOURCES_GS__DX10_CLAMP_bit = 1 << 21, +/* FETCH_CACHE_LINES_mask = 0x07 << 24, */ +/* FETCH_CACHE_LINES_shift = 24, */ /* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_GS = 0x0002887c, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ - SQ_PGM_START_ES = 0x0002888c, + SQ_PGM_START_ES = 0x00028880, SQ_PGM_RESOURCES_ES = 0x00028890, /* NUM_GPRS_mask = 0xff << 0, */ /* NUM_GPRS_shift = 0, */ /* STACK_SIZE_mask = 0xff << 8, */ /* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ + SQ_PGM_RESOURCES_ES__DX10_CLAMP_bit = 1 << 21, +/* FETCH_CACHE_LINES_mask = 0x07 << 24, */ +/* FETCH_CACHE_LINES_shift = 24, */ /* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_ES = 0x00028894, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ - SQ_PGM_START_FS = 0x000288a4, - SQ_PGM_RESOURCES_FS = 0x000288a8, + SQ_PGM_START_FS = 0x00028894, + SQ_PGM_RESOURCES_FS = 0x000288a4, /* NUM_GPRS_mask = 0xff << 0, */ /* NUM_GPRS_shift = 0, */ /* STACK_SIZE_mask = 0xff << 8, */ /* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ - SQ_PGM_START_HS = 0x000288b8, - SQ_PGM_RESOURCES_HS = 0x000288bc, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ -/* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_HS = 0x000288c0, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ - SQ_PGM_START_LS = 0x000288d0, - SQ_PGM_RESOURCES_LS = 0x000288d4, -/* NUM_GPRS_mask = 0xff << 0, */ -/* NUM_GPRS_shift = 0, */ -/* STACK_SIZE_mask = 0xff << 8, */ -/* STACK_SIZE_shift = 8, */ -/* DX10_CLAMP_bit = 1 << 21, */ -/* UNCACHED_FIRST_INST_bit = 1 << 28, */ - SQ_PGM_RESOURCES_2_LS = 0x000288d8, -/* SINGLE_ROUND_mask = 0x03 << 0, */ -/* SINGLE_ROUND_shift = 0, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* DOUBLE_ROUND_mask = 0x03 << 2, */ -/* DOUBLE_ROUND_shift = 2, */ -/* SQ_ROUND_NEAREST_EVEN = 0x00, */ -/* SQ_ROUND_PLUS_INFINITY = 0x01, */ -/* SQ_ROUND_MINUS_INFINITY = 0x02, */ -/* SQ_ROUND_TO_ZERO = 0x03, */ -/* ALLOW_SINGLE_DENORM_IN_bit = 1 << 4, */ -/* ALLOW_SINGLE_DENORM_OUT_bit = 1 << 5, */ -/* ALLOW_DOUBLE_DENORM_IN_bit = 1 << 6, */ -/* ALLOW_DOUBLE_DENORM_OUT_bit = 1 << 7, */ - SQ_VTX_SEMANTIC_CLEAR = 0x000288f0, - SQ_ESGS_RING_ITEMSIZE = 0x00028900, + SQ_PGM_RESOURCES_FS__DX10_CLAMP_bit = 1 << 21, + SQ_ESGS_RING_ITEMSIZE = 0x000288a8, + ITEMSIZE_mask = 0x7fff << 0, + ITEMSIZE_shift = 0, + SQ_GSVS_RING_ITEMSIZE = 0x000288ac, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_GSVS_RING_ITEMSIZE = 0x00028904, + SQ_ESTMP_RING_ITEMSIZE = 0x000288b0, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_ESTMP_RING_ITEMSIZE = 0x00028908, + SQ_GSTMP_RING_ITEMSIZE = 0x000288b4, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_GSTMP_RING_ITEMSIZE = 0x0002890c, + SQ_VSTMP_RING_ITEMSIZE = 0x000288b8, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_VSTMP_RING_ITEMSIZE = 0x00028910, + SQ_PSTMP_RING_ITEMSIZE = 0x000288bc, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_PSTMP_RING_ITEMSIZE = 0x00028914, + SQ_FBUF_RING_ITEMSIZE = 0x000288c0, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE = 0x0002891c, + SQ_REDUC_RING_ITEMSIZE = 0x000288c4, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE_1 = 0x00028920, + SQ_GS_VERT_ITEMSIZE = 0x000288c8, /* ITEMSIZE_mask = 0x7fff << 0, */ /* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE_2 = 0x00028924, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GS_VERT_ITEMSIZE_3 = 0x00028928, -/* ITEMSIZE_mask = 0x7fff << 0, */ -/* ITEMSIZE_shift = 0, */ - SQ_GSVS_RING_OFFSET_1 = 0x0002892c, - SQ_GSVS_RING_OFFSET_1__OFFSET_mask = 0x7fff << 0, - SQ_GSVS_RING_OFFSET_1__OFFSET_shift = 0, - SQ_GSVS_RING_OFFSET_2 = 0x00028930, - SQ_GSVS_RING_OFFSET_2__OFFSET_mask = 0x7fff << 0, - SQ_GSVS_RING_OFFSET_2__OFFSET_shift = 0, - SQ_GSVS_RING_OFFSET_3 = 0x00028934, - SQ_GSVS_RING_OFFSET_3__OFFSET_mask = 0x7fff << 0, - SQ_GSVS_RING_OFFSET_3__OFFSET_shift = 0, + SQ_PGM_CF_OFFSET_PS = 0x000288cc, + PGM_CF_OFFSET_mask = 0xfffff << 0, + PGM_CF_OFFSET_shift = 0, + SQ_PGM_CF_OFFSET_VS = 0x000288d0, +/* PGM_CF_OFFSET_mask = 0xfffff << 0, */ +/* PGM_CF_OFFSET_shift = 0, */ + SQ_PGM_CF_OFFSET_GS = 0x000288d4, +/* PGM_CF_OFFSET_mask = 0xfffff << 0, */ +/* PGM_CF_OFFSET_shift = 0, */ + SQ_PGM_CF_OFFSET_ES = 0x000288d8, +/* PGM_CF_OFFSET_mask = 0xfffff << 0, */ +/* PGM_CF_OFFSET_shift = 0, */ + SQ_PGM_CF_OFFSET_FS = 0x000288dc, +/* PGM_CF_OFFSET_mask = 0xfffff << 0, */ +/* PGM_CF_OFFSET_shift = 0, */ + SQ_VTX_SEMANTIC_CLEAR = 0x000288e0, SQ_ALU_CONST_CACHE_PS_0 = 0x00028940, SQ_ALU_CONST_CACHE_PS_0_num = 16, SQ_ALU_CONST_CACHE_VS_0 = 0x00028980, @@ -2850,15 +2257,15 @@ enum { SQ_ALU_CONST_CACHE_GS_0 = 0x000289c0, SQ_ALU_CONST_CACHE_GS_0_num = 16, PA_SU_POINT_SIZE = 0x00028a00, - HEIGHT_mask = 0xffff << 0, - HEIGHT_shift = 0, + PA_SU_POINT_SIZE__HEIGHT_mask = 0xffff << 0, + PA_SU_POINT_SIZE__HEIGHT_shift = 0, PA_SU_POINT_SIZE__WIDTH_mask = 0xffff << 16, PA_SU_POINT_SIZE__WIDTH_shift = 16, PA_SU_POINT_MINMAX = 0x00028a04, MIN_SIZE_mask = 0xffff << 0, MIN_SIZE_shift = 0, - PA_SU_POINT_MINMAX__MAX_SIZE_mask = 0xffff << 16, - PA_SU_POINT_MINMAX__MAX_SIZE_shift = 16, + MAX_SIZE_mask = 0xffff << 16, + MAX_SIZE_shift = 16, PA_SU_LINE_CNTL = 0x00028a08, PA_SU_LINE_CNTL__WIDTH_mask = 0xffff << 0, PA_SU_LINE_CNTL__WIDTH_shift = 0, @@ -2871,13 +2278,12 @@ enum { AUTO_RESET_CNTL_mask = 0x03 << 29, AUTO_RESET_CNTL_shift = 29, VGT_OUTPUT_PATH_CNTL = 0x00028a10, - PATH_SELECT_mask = 0x07 << 0, + PATH_SELECT_mask = 0x03 << 0, PATH_SELECT_shift = 0, VGT_OUTPATH_VTX_REUSE = 0x00, VGT_OUTPATH_TESS_EN = 0x01, VGT_OUTPATH_PASSTHRU = 0x02, VGT_OUTPATH_GS_BLOCK = 0x03, - VGT_OUTPATH_HS_BLOCK = 0x04, VGT_HOS_CNTL = 0x00028a14, TESS_MODE_mask = 0x03 << 0, TESS_MODE_shift = 0, @@ -2906,7 +2312,6 @@ enum { VGT_GRP_PRIM_INDEX_QUAD = 0x0e, VGT_GRP_3D_LINE_ADJ = 0x0f, VGT_GRP_3D_TRI_ADJ = 0x10, - VGT_GRP_3D_PATCH = 0x11, RETAIN_ORDER_bit = 1 << 14, RETAIN_QUADS_bit = 1 << 15, PRIM_ORDER_mask = 0x07 << 16, @@ -3047,14 +2452,12 @@ enum { /* W_OFFSET_mask = 0x0f << 28, */ /* W_OFFSET_shift = 28, */ VGT_GS_MODE = 0x00028a40, - VGT_GS_MODE__MODE_mask = 0x03 << 0, - VGT_GS_MODE__MODE_shift = 0, + MODE_mask = 0x03 << 0, + MODE_shift = 0, GS_OFF = 0x00, GS_SCENARIO_A = 0x01, GS_SCENARIO_B = 0x02, GS_SCENARIO_G = 0x03, - GS_SCENARIO_C = 0x04, - SPRITE_EN = 0x05, ES_PASSTHRU_bit = 1 << 2, CUT_MODE_mask = 0x03 << 3, CUT_MODE_shift = 3, @@ -3062,21 +2465,38 @@ enum { GS_CUT_512 = 0x01, GS_CUT_256 = 0x02, GS_CUT_128 = 0x03, - MODE_HI_bit = 1 << 8, - PA_SC_MODE_CNTL_0 = 0x00028a48, + PA_SC_MPASS_PS_CNTL = 0x00028a48, + MPASS_PIX_VEC_PER_PASS_mask = 0xfffff << 0, + MPASS_PIX_VEC_PER_PASS_shift = 0, + MPASS_PS_ENA_bit = 1 << 31, + PA_SC_MODE_CNTL = 0x00028a4c, MSAA_ENABLE_bit = 1 << 0, - VPORT_SCISSOR_ENABLE_bit = 1 << 1, + CLIPRECT_ENABLE_bit = 1 << 1, LINE_STIPPLE_ENABLE_bit = 1 << 2, + MULTI_CHIP_PRIM_DISCARD_ENAB_bit = 1 << 3, + WALK_ORDER_ENABLE_bit = 1 << 4, + HALVE_DETAIL_SAMPLE_PERF_bit = 1 << 5, + WALK_SIZE_bit = 1 << 6, + WALK_ALIGNMENT_bit = 1 << 7, + WALK_ALIGN8_PRIM_FITS_ST_bit = 1 << 8, + TILE_COVER_NO_SCISSOR_bit = 1 << 9, + KILL_PIX_POST_HI_Z_bit = 1 << 10, + KILL_PIX_POST_DETAIL_MASK_bit = 1 << 11, + MULTI_CHIP_SUPERTILE_ENABLE_bit = 1 << 12, + TILE_COVER_DISABLE_bit = 1 << 13, + FORCE_EOV_CNTDWN_ENABLE_bit = 1 << 14, + FORCE_EOV_TILE_ENABLE_bit = 1 << 15, + FORCE_EOV_REZ_ENABLE_bit = 1 << 16, + PS_ITER_SAMPLE_bit = 1 << 17, VGT_ENHANCE = 0x00028a50, - VGT_GS_PER_ES = 0x00028a54, - GS_PER_ES_mask = 0x7ff << 0, - GS_PER_ES_shift = 0, - VGT_ES_PER_GS = 0x00028a58, - ES_PER_GS_mask = 0x7ff << 0, - ES_PER_GS_shift = 0, - VGT_GS_PER_VS = 0x00028a5c, - GS_PER_VS_mask = 0x0f << 0, - GS_PER_VS_shift = 0, + VGT_ENHANCE__MI_TIMESTAMP_RES_mask = 0x03 << 0, + VGT_ENHANCE__MI_TIMESTAMP_RES_shift = 0, + X_0_992_CLOCKS_LATENCY_RANGE_IN_STEPS_OF_32 = 0x00, + X_0_496_CLOCKS_LATENCY_RANGE_IN_STEPS_OF_16 = 0x01, + X_0_248_CLOCKS_LATENCY_RANGE_IN_STEPS_OF_8 = 0x02, + X_0_124_CLOCKS_LATENCY_RANGE_IN_STEPS_OF_4 = 0x03, + MISC_mask = 0x3fffffff << 2, + MISC_shift = 2, VGT_GS_OUT_PRIM_TYPE = 0x00028a6c, OUTPRIM_TYPE_mask = 0x3f << 0, OUTPRIM_TYPE_shift = 0, @@ -3084,7 +2504,6 @@ enum { LINESTRIP = 0x01, TRISTRIP = 0x02, VGT_DMA_SIZE = 0x00028a74, - VGT_DMA_MAX_SIZE = 0x00028a78, VGT_DMA_INDEX_TYPE = 0x00028a7c, /* INDEX_TYPE_mask = 0x03 << 0, */ /* INDEX_TYPE_shift = 0, */ @@ -3102,18 +2521,19 @@ enum { VGT_EVENT_INITIATOR = 0x00028a90, EVENT_TYPE_mask = 0x3f << 0, EVENT_TYPE_shift = 0, - SAMPLE_STREAMOUTSTATS1 = 0x01, - SAMPLE_STREAMOUTSTATS2 = 0x02, - SAMPLE_STREAMOUTSTATS3 = 0x03, CACHE_FLUSH_TS = 0x04, CONTEXT_DONE = 0x05, CACHE_FLUSH = 0x06, - CS_PARTIAL_FLUSH = 0x07, + VIZQUERY_START = 0x07, + VIZQUERY_END = 0x08, + SC_WAIT_WC = 0x09, + MPASS_PS_CP_REFETCH = 0x0a, + MPASS_PS_RST_START = 0x0b, + MPASS_PS_INCR_START = 0x0c, RST_PIX_CNT = 0x0d, + RST_VTX_CNT = 0x0e, VS_PARTIAL_FLUSH = 0x0f, PS_PARTIAL_FLUSH = 0x10, - FLUSH_HS_OUTPUT = 0x11, - FLUSH_LS_OUTPUT = 0x12, CACHE_FLUSH_AND_INV_TS_EVENT = 0x14, ZPASS_DONE = 0x15, CACHE_FLUSH_AND_INV_EVENT = 0x16, @@ -3129,20 +2549,13 @@ enum { SAMPLE_STREAMOUTSTATS = 0x20, RESET_VTX_CNT = 0x21, BLOCK_CONTEXT_DONE = 0x22, - CS_CONTEXT_DONE = 0x23, + CR_CONTEXT_DONE = 0x23, VGT_FLUSH = 0x24, + CR_DONE_TS = 0x25, SQ_NON_EVENT = 0x26, SC_SEND_DB_VPZ = 0x27, BOTTOM_OF_PIPE_TS = 0x28, - FLUSH_SX_TS = 0x29, DB_CACHE_FLUSH_AND_INV = 0x2a, - FLUSH_AND_INV_DB_DATA_TS = 0x2b, - FLUSH_AND_INV_DB_META = 0x2c, - FLUSH_AND_INV_CB_DATA_TS = 0x2d, - FLUSH_AND_INV_CB_META = 0x2e, - CS_DONE = 0x2f, - PS_DONE = 0x30, - FLUSH_AND_INV_CB_PIXEL_DATA = 0x31, ADDRESS_HI_mask = 0xff << 19, ADDRESS_HI_shift = 19, EXTENDED_EVENT_bit = 1 << 27, @@ -3150,62 +2563,12 @@ enum { RESET_EN_bit = 1 << 0, VGT_INSTANCE_STEP_RATE_0 = 0x00028aa0, VGT_INSTANCE_STEP_RATE_1 = 0x00028aa4, + VGT_STRMOUT_EN = 0x00028ab0, + STREAMOUT_bit = 1 << 0, VGT_REUSE_OFF = 0x00028ab4, REUSE_OFF_bit = 1 << 0, VGT_VTX_CNT_EN = 0x00028ab8, VTX_CNT_EN_bit = 1 << 0, - DB_HTILE_SURFACE = 0x00028abc, - HTILE_WIDTH_bit = 1 << 0, - HTILE_HEIGHT_bit = 1 << 1, - LINEAR_bit = 1 << 2, - FULL_CACHE_bit = 1 << 3, - HTILE_USES_PRELOAD_WIN_bit = 1 << 4, - PRELOAD_bit = 1 << 5, - PREFETCH_WIDTH_mask = 0x3f << 6, - PREFETCH_WIDTH_shift = 6, - PREFETCH_HEIGHT_mask = 0x3f << 12, - PREFETCH_HEIGHT_shift = 12, - DB_SRESULTS_COMPARE_STATE0 = 0x00028ac0, - COMPAREFUNC0_mask = 0x07 << 0, - COMPAREFUNC0_shift = 0, -/* REF_NEVER = 0x00, */ -/* REF_LESS = 0x01, */ -/* REF_EQUAL = 0x02, */ -/* REF_LEQUAL = 0x03, */ -/* REF_GREATER = 0x04, */ -/* REF_NOTEQUAL = 0x05, */ -/* REF_GEQUAL = 0x06, */ -/* REF_ALWAYS = 0x07, */ - COMPAREVALUE0_mask = 0xff << 4, - COMPAREVALUE0_shift = 4, - COMPAREMASK0_mask = 0xff << 12, - COMPAREMASK0_shift = 12, - ENABLE0_bit = 1 << 24, - DB_SRESULTS_COMPARE_STATE1 = 0x00028ac4, - COMPAREFUNC1_mask = 0x07 << 0, - COMPAREFUNC1_shift = 0, -/* REF_NEVER = 0x00, */ -/* REF_LESS = 0x01, */ -/* REF_EQUAL = 0x02, */ -/* REF_LEQUAL = 0x03, */ -/* REF_GREATER = 0x04, */ -/* REF_NOTEQUAL = 0x05, */ -/* REF_GEQUAL = 0x06, */ -/* REF_ALWAYS = 0x07, */ - COMPAREVALUE1_mask = 0xff << 4, - COMPAREVALUE1_shift = 4, - COMPAREMASK1_mask = 0xff << 12, - COMPAREMASK1_shift = 12, - ENABLE1_bit = 1 << 24, - DB_PRELOAD_CONTROL = 0x00028ac8, - START_X_mask = 0xff << 0, - START_X_shift = 0, - START_Y_mask = 0xff << 8, - START_Y_shift = 8, - MAX_X_mask = 0xff << 16, - MAX_X_shift = 16, - MAX_Y_mask = 0xff << 24, - MAX_Y_shift = 24, VGT_STRMOUT_BUFFER_SIZE_0 = 0x00028ad0, VGT_STRMOUT_VTX_STRIDE_0 = 0x00028ad4, VGT_STRMOUT_VTX_STRIDE_0__STRIDE_mask = 0x3ff << 0, @@ -3234,14 +2597,14 @@ enum { VGT_STRMOUT_BASE_OFFSET_1 = 0x00028b14, VGT_STRMOUT_BASE_OFFSET_2 = 0x00028b18, VGT_STRMOUT_BASE_OFFSET_3 = 0x00028b1c, + VGT_STRMOUT_BUFFER_EN = 0x00028b20, + BUFFER_0_EN_bit = 1 << 0, + BUFFER_1_EN_bit = 1 << 1, + BUFFER_2_EN_bit = 1 << 2, + BUFFER_3_EN_bit = 1 << 3, VGT_STRMOUT_DRAW_OPAQUE_OFFSET = 0x00028b28, VGT_STRMOUT_DRAW_OPAQUE_BUFFER_FILLED_SIZE = 0x00028b2c, VGT_STRMOUT_DRAW_OPAQUE_VERTEX_STRIDE = 0x00028b30, - VERTEX_STRIDE_mask = 0x1ff << 0, - VERTEX_STRIDE_shift = 0, - VGT_GS_MAX_VERT_OUT = 0x00028b38, - MAX_VERT_OUT_mask = 0x7ff << 0, - MAX_VERT_OUT_shift = 0, VGT_STRMOUT_BASE_OFFSET_HI_0 = 0x00028b44, VGT_STRMOUT_BASE_OFFSET_HI_0__BASE_OFFSET_mask = 0x3f << 0, VGT_STRMOUT_BASE_OFFSET_HI_0__BASE_OFFSET_shift = 0, @@ -3254,98 +2617,12 @@ enum { VGT_STRMOUT_BASE_OFFSET_HI_3 = 0x00028b50, VGT_STRMOUT_BASE_OFFSET_HI_3__BASE_OFFSET_mask = 0x3f << 0, VGT_STRMOUT_BASE_OFFSET_HI_3__BASE_OFFSET_shift = 0, - VGT_SHADER_STAGES_EN = 0x00028b54, - LS_EN_mask = 0x03 << 0, - LS_EN_shift = 0, - LS_STAGE_OFF = 0x00, - LS_STAGE_ON = 0x01, - CS_STAGE_ON = 0x02, - HS_EN_bit = 1 << 2, - ES_EN_mask = 0x03 << 3, - ES_EN_shift = 3, - ES_STAGE_OFF = 0x00, - ES_STAGE_DS = 0x01, - ES_STAGE_REAL = 0x02, - GS_EN_bit = 1 << 5, - VS_EN_mask = 0x03 << 6, - VS_EN_shift = 6, - VS_STAGE_REAL = 0x00, - VS_STAGE_DS = 0x01, - VS_STAGE_COPY_SHADER = 0x02, - VGT_LS_HS_CONFIG = 0x00028b58, - NUM_PATCHES_mask = 0xff << 0, - NUM_PATCHES_shift = 0, - HS_NUM_INPUT_CP_mask = 0x3f << 8, - HS_NUM_INPUT_CP_shift = 8, - HS_NUM_OUTPUT_CP_mask = 0x3f << 14, - HS_NUM_OUTPUT_CP_shift = 14, - VGT_LS_SIZE = 0x00028b5c, - VGT_LS_SIZE__SIZE_mask = 0xff << 0, - VGT_LS_SIZE__SIZE_shift = 0, - PATCH_CP_SIZE_mask = 0x1fff << 8, - PATCH_CP_SIZE_shift = 8, - VGT_HS_SIZE = 0x00028b60, - VGT_HS_SIZE__SIZE_mask = 0xff << 0, - VGT_HS_SIZE__SIZE_shift = 0, -/* PATCH_CP_SIZE_mask = 0x1fff << 8, */ -/* PATCH_CP_SIZE_shift = 8, */ - VGT_LS_HS_ALLOC = 0x00028b64, - HS_TOTAL_OUTPUT_mask = 0x1fff << 0, - HS_TOTAL_OUTPUT_shift = 0, - LS_HS_TOTAL_OUTPUT_mask = 0x1fff << 13, - LS_HS_TOTAL_OUTPUT_shift = 13, - VGT_HS_PATCH_CONST = 0x00028b68, - VGT_HS_PATCH_CONST__SIZE_mask = 0x1fff << 0, - VGT_HS_PATCH_CONST__SIZE_shift = 0, - VGT_HS_PATCH_CONST__STRIDE_mask = 0x1fff << 13, - VGT_HS_PATCH_CONST__STRIDE_shift = 13, - DB_ALPHA_TO_MASK = 0x00028b70, - ALPHA_TO_MASK_ENABLE_bit = 1 << 0, - ALPHA_TO_MASK_OFFSET0_mask = 0x03 << 8, - ALPHA_TO_MASK_OFFSET0_shift = 8, - ALPHA_TO_MASK_OFFSET1_mask = 0x03 << 10, - ALPHA_TO_MASK_OFFSET1_shift = 10, - ALPHA_TO_MASK_OFFSET2_mask = 0x03 << 12, - ALPHA_TO_MASK_OFFSET2_shift = 12, - ALPHA_TO_MASK_OFFSET3_mask = 0x03 << 14, - ALPHA_TO_MASK_OFFSET3_shift = 14, - OFFSET_ROUND_bit = 1 << 16, - PA_SU_POLY_OFFSET_DB_FMT_CNTL = 0x00028b78, - POLY_OFFSET_NEG_NUM_DB_BITS_mask = 0xff << 0, - POLY_OFFSET_NEG_NUM_DB_BITS_shift = 0, - POLY_OFFSET_DB_IS_FLOAT_FMT_bit = 1 << 8, - PA_SU_POLY_OFFSET_CLAMP = 0x00028b7c, - PA_SU_POLY_OFFSET_FRONT_SCALE = 0x00028b80, - PA_SU_POLY_OFFSET_FRONT_OFFSET = 0x00028b84, - PA_SU_POLY_OFFSET_BACK_SCALE = 0x00028b88, - PA_SU_POLY_OFFSET_BACK_OFFSET = 0x00028b8c, - VGT_GS_INSTANCE_CNT = 0x00028b90, - VGT_GS_INSTANCE_CNT__ENABLE_bit = 1 << 0, - CNT_mask = 0x7f << 2, - CNT_shift = 2, - VGT_STRMOUT_CONFIG = 0x00028b94, - STREAMOUT_0_EN_bit = 1 << 0, - STREAMOUT_1_EN_bit = 1 << 1, - STREAMOUT_2_EN_bit = 1 << 2, - STREAMOUT_3_EN_bit = 1 << 3, - RAST_STREAM_mask = 0x07 << 4, - RAST_STREAM_shift = 4, - VGT_STRMOUT_BUFFER_CONFIG = 0x00028b98, - STREAM_0_BUFFER_EN_mask = 0x0f << 0, - STREAM_0_BUFFER_EN_shift = 0, - STREAM_1_BUFFER_EN_mask = 0x0f << 4, - STREAM_1_BUFFER_EN_shift = 4, - STREAM_2_BUFFER_EN_mask = 0x0f << 8, - STREAM_2_BUFFER_EN_shift = 8, - STREAM_3_BUFFER_EN_mask = 0x0f << 12, - STREAM_3_BUFFER_EN_shift = 12, - CB_IMMED0_BASE = 0x00028b9c, - CB_IMMED0_BASE_num = 12, PA_SC_LINE_CNTL = 0x00028c00, + BRES_CNTL_mask = 0xff << 0, + BRES_CNTL_shift = 0, + USE_BRES_CNTL_bit = 1 << 8, EXPAND_LINE_WIDTH_bit = 1 << 9, LAST_PIXEL_bit = 1 << 10, - PERPENDICULAR_ENDCAP_ENA_bit = 1 << 11, - DX10_DIAMOND_TEST_ENA_bit = 1 << 12, PA_SC_AA_CONFIG = 0x00028c04, MSAA_NUM_SAMPLES_mask = 0x03 << 0, MSAA_NUM_SAMPLES_shift = 0, @@ -3368,30 +2645,11 @@ enum { X_1_2 = 0x03, X_1 = 0x04, X_1_256TH = 0x05, - X_1_1024TH = 0x06, - X_1_4096TH = 0x07, PA_CL_GB_VERT_CLIP_ADJ = 0x00028c0c, PA_CL_GB_VERT_DISC_ADJ = 0x00028c10, PA_CL_GB_HORZ_CLIP_ADJ = 0x00028c14, PA_CL_GB_HORZ_DISC_ADJ = 0x00028c18, - PA_SC_AA_SAMPLE_LOCS_0 = 0x00028c1c, - S0_X_mask = 0x0f << 0, - S0_X_shift = 0, - S0_Y_mask = 0x0f << 4, - S0_Y_shift = 4, - S1_X_mask = 0x0f << 8, - S1_X_shift = 8, - S1_Y_mask = 0x0f << 12, - S1_Y_shift = 12, - S2_X_mask = 0x0f << 16, - S2_X_shift = 16, - S2_Y_mask = 0x0f << 20, - S2_Y_shift = 20, - S3_X_mask = 0x0f << 24, - S3_X_shift = 24, - S3_Y_mask = 0x0f << 28, - S3_Y_shift = 28, - PA_SC_AA_SAMPLE_LOCS_1 = 0x00028c20, + PA_SC_AA_SAMPLE_LOCS_MCTX = 0x00028c1c, /* S0_X_mask = 0x0f << 0, */ /* S0_X_shift = 0, */ /* S0_Y_mask = 0x0f << 4, */ @@ -3408,306 +2666,165 @@ enum { /* S3_X_shift = 24, */ /* S3_Y_mask = 0x0f << 28, */ /* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_2 = 0x00028c24, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_3 = 0x00028c28, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_4 = 0x00028c2c, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_5 = 0x00028c30, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_6 = 0x00028c34, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_SAMPLE_LOCS_7 = 0x00028c38, -/* S0_X_mask = 0x0f << 0, */ -/* S0_X_shift = 0, */ -/* S0_Y_mask = 0x0f << 4, */ -/* S0_Y_shift = 4, */ -/* S1_X_mask = 0x0f << 8, */ -/* S1_X_shift = 8, */ -/* S1_Y_mask = 0x0f << 12, */ -/* S1_Y_shift = 12, */ -/* S2_X_mask = 0x0f << 16, */ -/* S2_X_shift = 16, */ -/* S2_Y_mask = 0x0f << 20, */ -/* S2_Y_shift = 20, */ -/* S3_X_mask = 0x0f << 24, */ -/* S3_X_shift = 24, */ -/* S3_Y_mask = 0x0f << 28, */ -/* S3_Y_shift = 28, */ - PA_SC_AA_MASK = 0x00028c3c, + PA_SC_AA_SAMPLE_LOCS_8S_WD1_MCTX = 0x00028c20, +/* S4_X_mask = 0x0f << 0, */ +/* S4_X_shift = 0, */ +/* S4_Y_mask = 0x0f << 4, */ +/* S4_Y_shift = 4, */ +/* S5_X_mask = 0x0f << 8, */ +/* S5_X_shift = 8, */ +/* S5_Y_mask = 0x0f << 12, */ +/* S5_Y_shift = 12, */ +/* S6_X_mask = 0x0f << 16, */ +/* S6_X_shift = 16, */ +/* S6_Y_mask = 0x0f << 20, */ +/* S6_Y_shift = 20, */ +/* S7_X_mask = 0x0f << 24, */ +/* S7_X_shift = 24, */ +/* S7_Y_mask = 0x0f << 28, */ +/* S7_Y_shift = 28, */ + CB_CLRCMP_CONTROL = 0x00028c30, + CLRCMP_FCN_SRC_mask = 0x07 << 0, + CLRCMP_FCN_SRC_shift = 0, + CLRCMP_DRAW_ALWAYS = 0x00, + CLRCMP_DRAW_NEVER = 0x01, + CLRCMP_DRAW_ON_NEQ = 0x04, + CLRCMP_DRAW_ON_EQ = 0x05, + CLRCMP_FCN_DST_mask = 0x07 << 8, + CLRCMP_FCN_DST_shift = 8, +/* CLRCMP_DRAW_ALWAYS = 0x00, */ +/* CLRCMP_DRAW_NEVER = 0x01, */ +/* CLRCMP_DRAW_ON_NEQ = 0x04, */ +/* CLRCMP_DRAW_ON_EQ = 0x05, */ + CLRCMP_FCN_SEL_mask = 0x03 << 24, + CLRCMP_FCN_SEL_shift = 24, + CLRCMP_SEL_DST = 0x00, + CLRCMP_SEL_SRC = 0x01, + CLRCMP_SEL_AND = 0x02, + CB_CLRCMP_SRC = 0x00028c34, + CB_CLRCMP_DST = 0x00028c38, + CB_CLRCMP_MSK = 0x00028c3c, + PA_SC_AA_MASK = 0x00028c48, VGT_VERTEX_REUSE_BLOCK_CNTL = 0x00028c58, VTX_REUSE_DEPTH_mask = 0xff << 0, VTX_REUSE_DEPTH_shift = 0, VGT_OUT_DEALLOC_CNTL = 0x00028c5c, DEALLOC_DIST_mask = 0x7f << 0, DEALLOC_DIST_shift = 0, - CB_COLOR0_BASE = 0x00028c60, - CB_COLOR0_BASE_num = 12, - CB_COLOR0_BASE_offset = 51, - CB_COLOR0_PITCH = 0x00028c64, - CB_COLOR0_PITCH_num = 12, - CB_COLOR0_PITCH_offset = 51, - CB_COLOR0_PITCH__TILE_MAX_mask = 0x7ff << 0, - CB_COLOR0_PITCH__TILE_MAX_shift = 0, - CB_COLOR0_SLICE = 0x00028c68, - CB_COLOR0_SLICE_num = 12, - CB_COLOR0_SLICE_offset = 51, - CB_COLOR0_SLICE__TILE_MAX_mask = 0x3fffff << 0, - CB_COLOR0_SLICE__TILE_MAX_shift = 0, - CB_COLOR0_VIEW = 0x00028c6c, - CB_COLOR0_VIEW_num = 12, - CB_COLOR0_VIEW_offset = 51, -/* SLICE_START_mask = 0x7ff << 0, */ -/* SLICE_START_shift = 0, */ -/* SLICE_MAX_mask = 0x7ff << 13, */ -/* SLICE_MAX_shift = 13, */ - CB_COLOR0_INFO = 0x00028c70, - CB_COLOR0_INFO_num = 12, - CB_COLOR0_INFO_offset = 51, - ENDIAN_mask = 0x03 << 0, - ENDIAN_shift = 0, - ENDIAN_NONE = 0x00, - ENDIAN_8IN16 = 0x01, - ENDIAN_8IN32 = 0x02, - ENDIAN_8IN64 = 0x03, - CB_COLOR0_INFO__FORMAT_mask = 0x3f << 2, - CB_COLOR0_INFO__FORMAT_shift = 2, - COLOR_INVALID = 0x00, - COLOR_8 = 0x01, - COLOR_16 = 0x05, - COLOR_16_FLOAT = 0x06, - COLOR_8_8 = 0x07, - COLOR_5_6_5 = 0x08, - COLOR_1_5_5_5 = 0x0a, - COLOR_4_4_4_4 = 0x0b, - COLOR_5_5_5_1 = 0x0c, - COLOR_32 = 0x0d, - COLOR_32_FLOAT = 0x0e, - COLOR_16_16 = 0x0f, - COLOR_16_16_FLOAT = 0x10, - COLOR_8_24 = 0x11, - COLOR_24_8 = 0x13, - COLOR_10_11_11 = 0x15, - COLOR_10_11_11_FLOAT = 0x16, - COLOR_2_10_10_10 = 0x19, - COLOR_8_8_8_8 = 0x1a, - COLOR_10_10_10_2 = 0x1b, - COLOR_X24_8_32_FLOAT = 0x1c, - COLOR_32_32 = 0x1d, - COLOR_32_32_FLOAT = 0x1e, - COLOR_16_16_16_16 = 0x1f, - COLOR_16_16_16_16_FLOAT = 0x20, - COLOR_32_32_32_32 = 0x22, - COLOR_32_32_32_32_FLOAT = 0x23, - CB_COLOR0_INFO__ARRAY_MODE_mask = 0x0f << 8, - CB_COLOR0_INFO__ARRAY_MODE_shift = 8, -/* ARRAY_LINEAR_GENERAL = 0x00, */ -/* ARRAY_LINEAR_ALIGNED = 0x01, */ -/* ARRAY_1D_TILED_THIN1 = 0x02, */ -/* ARRAY_2D_TILED_THIN1 = 0x04, */ - NUMBER_TYPE_mask = 0x07 << 12, - NUMBER_TYPE_shift = 12, - NUMBER_UNORM = 0x00, - NUMBER_SNORM = 0x01, - NUMBER_UINT = 0x04, - NUMBER_SINT = 0x05, - NUMBER_SRGB = 0x06, - NUMBER_FLOAT = 0x07, - COMP_SWAP_mask = 0x03 << 15, - COMP_SWAP_shift = 15, - SWAP_STD = 0x00, - SWAP_ALT = 0x01, - SWAP_STD_REV = 0x02, - SWAP_ALT_REV = 0x03, - FAST_CLEAR_bit = 1 << 17, - COMPRESSION_bit = 1 << 18, - BLEND_CLAMP_bit = 1 << 19, - BLEND_BYPASS_bit = 1 << 20, - SIMPLE_FLOAT_bit = 1 << 21, - CB_COLOR0_INFO__ROUND_MODE_bit = 1 << 22, - CB_COLOR0_INFO__TILE_COMPACT_bit = 1 << 23, - SOURCE_FORMAT_mask = 0x03 << 24, - SOURCE_FORMAT_shift = 24, - EXPORT_4C_32BPC = 0x00, - EXPORT_4C_16BPC = 0x01, - RAT_bit = 1 << 26, - RESOURCE_TYPE_mask = 0x07 << 27, - RESOURCE_TYPE_shift = 27, - BUFFER = 0x00, - TEXTURE1D = 0x01, - TEXTURE1DARRAY = 0x02, - TEXTURE2D = 0x03, - TEXTURE2DARRAY = 0x04, - TEXTURE3D = 0x05, - CB_COLOR0_ATTRIB = 0x00028c74, - CB_COLOR0_ATTRIB_num = 12, - CB_COLOR0_ATTRIB_offset = 51, - IGNORE_SHADER_ENGINE_TILING_bit = 1 << 3, - CB_COLOR0_ATTRIB__NON_DISP_TILING_ORDER_bit = 1 << 4, - CB_COLOR0_ATTRIB__TILE_SPLIT_mask = 0x0f << 5, - CB_COLOR0_ATTRIB__TILE_SPLIT_shift = 5, -/* ADDR_SURF_TILE_SPLIT_64B = 0x00, */ -/* ADDR_SURF_TILE_SPLIT_128B = 0x01, */ -/* ADDR_SURF_TILE_SPLIT_256B = 0x02, */ -/* ADDR_SURF_TILE_SPLIT_512B = 0x03, */ -/* ADDR_SURF_TILE_SPLIT_1KB = 0x04, */ -/* ADDR_SURF_TILE_SPLIT_2KB = 0x05, */ -/* ADDR_SURF_TILE_SPLIT_4KB = 0x06, */ - CB_COLOR0_ATTRIB__NUM_BANKS_mask = 0x03 << 10, - CB_COLOR0_ATTRIB__NUM_BANKS_shift = 10, -/* ADDR_SURF_2_BANK = 0x00, */ -/* ADDR_SURF_4_BANK = 0x01, */ -/* ADDR_SURF_8_BANK = 0x02, */ -/* ADDR_SURF_16_BANK = 0x03, */ - CB_COLOR0_ATTRIB__BANK_WIDTH_mask = 0x03 << 13, - CB_COLOR0_ATTRIB__BANK_WIDTH_shift = 13, -/* ADDR_SURF_BANK_WIDTH_1 = 0x00, */ -/* ADDR_SURF_BANK_WIDTH_2 = 0x01, */ -/* ADDR_SURF_BANK_WIDTH_4 = 0x02, */ -/* ADDR_SURF_BANK_WIDTH_8 = 0x03, */ - CB_COLOR0_ATTRIB__BANK_HEIGHT_mask = 0x03 << 16, - CB_COLOR0_ATTRIB__BANK_HEIGHT_shift = 16, -/* ADDR_SURF_BANK_HEIGHT_1 = 0x00, */ -/* ADDR_SURF_BANK_HEIGHT_2 = 0x01, */ -/* ADDR_SURF_BANK_HEIGHT_4 = 0x02, */ -/* ADDR_SURF_BANK_HEIGHT_8 = 0x03, */ - CB_COLOR0_ATTRIB__MACRO_TILE_ASPECT_mask = 0x03 << 19, - CB_COLOR0_ATTRIB__MACRO_TILE_ASPECT_shift = 19, -/* ADDR_SURF_MACRO_ASPECT_1 = 0x00, */ -/* ADDR_SURF_MACRO_ASPECT_2 = 0x01, */ -/* ADDR_SURF_MACRO_ASPECT_4 = 0x02, */ -/* ADDR_SURF_MACRO_ASPECT_8 = 0x03, */ - FMASK_BANK_HEIGHT_mask = 0x03 << 22, - FMASK_BANK_HEIGHT_shift = 22, -/* ADDR_SURF_BANK_HEIGHT_1 = 0x00, */ -/* ADDR_SURF_BANK_HEIGHT_2 = 0x01, */ -/* ADDR_SURF_BANK_HEIGHT_4 = 0x02, */ -/* ADDR_SURF_BANK_HEIGHT_8 = 0x03, */ - CB_COLOR0_DIM = 0x00028c78, - CB_COLOR0_DIM_num = 12, - CB_COLOR0_DIM_offset = 51, - WIDTH_MAX_mask = 0xffff << 0, - WIDTH_MAX_shift = 0, - HEIGHT_MAX_mask = 0xffff << 16, - HEIGHT_MAX_shift = 16, - CB_COLOR0_CMASK = 0x00028c7c, - CB_COLOR0_CMASK_num = 8, - CB_COLOR0_CMASK_offset = 60, - CB_COLOR0_CMASK_SLICE = 0x00028c80, - CB_COLOR0_CMASK_SLICE_num = 8, - CB_COLOR0_CMASK_SLICE_offset = 60, - CB_COLOR0_CMASK_SLICE__TILE_MAX_mask = 0x3fff << 0, - CB_COLOR0_CMASK_SLICE__TILE_MAX_shift = 0, - CB_COLOR0_FMASK = 0x00028c84, - CB_COLOR0_FMASK_num = 8, - CB_COLOR0_FMASK_offset = 60, - CB_COLOR0_FMASK_SLICE = 0x00028c88, - CB_COLOR0_FMASK_SLICE_num = 8, - CB_COLOR0_FMASK_SLICE_offset = 60, - CB_COLOR0_FMASK_SLICE__TILE_MAX_mask = 0x3fffff << 0, - CB_COLOR0_FMASK_SLICE__TILE_MAX_shift = 0, - CB_COLOR0_CLEAR_WORD0 = 0x00028c8c, - CB_COLOR0_CLEAR_WORD0_num = 8, - CB_COLOR0_CLEAR_WORD0_offset = 60, - CB_COLOR0_CLEAR_WORD1 = 0x00028c90, - CB_COLOR0_CLEAR_WORD1_num = 8, - CB_COLOR0_CLEAR_WORD1_offset = 60, - CB_COLOR0_CLEAR_WORD2 = 0x00028c94, - CB_COLOR0_CLEAR_WORD2_num = 8, - CB_COLOR0_CLEAR_WORD2_offset = 60, - CB_COLOR0_CLEAR_WORD3 = 0x00028c98, - CB_COLOR0_CLEAR_WORD3_num = 8, - CB_COLOR0_CLEAR_WORD3_offset = 60, - SQ_ALU_CONST_CACHE_HS_0 = 0x00028f00, - SQ_ALU_CONST_CACHE_HS_0_num = 16, - SQ_ALU_CONST_CACHE_LS_0 = 0x00028f40, - SQ_ALU_CONST_CACHE_LS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_HS_0 = 0x00028f80, - SQ_ALU_CONST_BUFFER_SIZE_HS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_HS_0__DATA_mask = 0x1ff << 0, - SQ_ALU_CONST_BUFFER_SIZE_HS_0__DATA_shift = 0, - SQ_ALU_CONST_BUFFER_SIZE_LS_0 = 0x00028fc0, - SQ_ALU_CONST_BUFFER_SIZE_LS_0_num = 16, - SQ_ALU_CONST_BUFFER_SIZE_LS_0__DATA_mask = 0x1ff << 0, - SQ_ALU_CONST_BUFFER_SIZE_LS_0__DATA_shift = 0, - SQ_VTX_CONSTANT_WORD0_0 = 0x00030000, - SQ_TEX_RESOURCE_WORD0_0 = 0x00030000, + DB_RENDER_CONTROL = 0x00028d0c, + DEPTH_CLEAR_ENABLE_bit = 1 << 0, + STENCIL_CLEAR_ENABLE_bit = 1 << 1, + DEPTH_COPY_bit = 1 << 2, + STENCIL_COPY_bit = 1 << 3, + RESUMMARIZE_ENABLE_bit = 1 << 4, + STENCIL_COMPRESS_DISABLE_bit = 1 << 5, + DEPTH_COMPRESS_DISABLE_bit = 1 << 6, + COPY_CENTROID_bit = 1 << 7, + COPY_SAMPLE_mask = 0x07 << 8, + COPY_SAMPLE_shift = 8, + ZPASS_INCREMENT_DISABLE_bit = 1 << 11, + DB_RENDER_OVERRIDE = 0x00028d10, + FORCE_HIZ_ENABLE_mask = 0x03 << 0, + FORCE_HIZ_ENABLE_shift = 0, + FORCE_OFF = 0x00, + FORCE_ENABLE = 0x01, + FORCE_DISABLE = 0x02, + FORCE_RESERVED = 0x03, + FORCE_HIS_ENABLE0_mask = 0x03 << 2, + FORCE_HIS_ENABLE0_shift = 2, +/* FORCE_OFF = 0x00, */ +/* FORCE_ENABLE = 0x01, */ +/* FORCE_DISABLE = 0x02, */ +/* FORCE_RESERVED = 0x03, */ + FORCE_HIS_ENABLE1_mask = 0x03 << 4, + FORCE_HIS_ENABLE1_shift = 4, +/* FORCE_OFF = 0x00, */ +/* FORCE_ENABLE = 0x01, */ +/* FORCE_DISABLE = 0x02, */ +/* FORCE_RESERVED = 0x03, */ + FORCE_SHADER_Z_ORDER_bit = 1 << 6, + FAST_Z_DISABLE_bit = 1 << 7, + FAST_STENCIL_DISABLE_bit = 1 << 8, + NOOP_CULL_DISABLE_bit = 1 << 9, + FORCE_COLOR_KILL_bit = 1 << 10, + FORCE_Z_READ_bit = 1 << 11, + FORCE_STENCIL_READ_bit = 1 << 12, + FORCE_FULL_Z_RANGE_mask = 0x03 << 13, + FORCE_FULL_Z_RANGE_shift = 13, +/* FORCE_OFF = 0x00, */ +/* FORCE_ENABLE = 0x01, */ +/* FORCE_DISABLE = 0x02, */ +/* FORCE_RESERVED = 0x03, */ + FORCE_QC_SMASK_CONFLICT_bit = 1 << 15, + DISABLE_VIEWPORT_CLAMP_bit = 1 << 16, + IGNORE_SC_ZRANGE_bit = 1 << 17, + DB_HTILE_SURFACE = 0x00028d24, + HTILE_WIDTH_bit = 1 << 0, + HTILE_HEIGHT_bit = 1 << 1, + LINEAR_bit = 1 << 2, + FULL_CACHE_bit = 1 << 3, + HTILE_USES_PRELOAD_WIN_bit = 1 << 4, + PRELOAD_bit = 1 << 5, + PREFETCH_WIDTH_mask = 0x3f << 6, + PREFETCH_WIDTH_shift = 6, + PREFETCH_HEIGHT_mask = 0x3f << 12, + PREFETCH_HEIGHT_shift = 12, + DB_SRESULTS_COMPARE_STATE1 = 0x00028d2c, + COMPAREFUNC1_mask = 0x07 << 0, + COMPAREFUNC1_shift = 0, +/* REF_NEVER = 0x00, */ +/* REF_LESS = 0x01, */ +/* REF_EQUAL = 0x02, */ +/* REF_LEQUAL = 0x03, */ +/* REF_GREATER = 0x04, */ +/* REF_NOTEQUAL = 0x05, */ +/* REF_GEQUAL = 0x06, */ +/* REF_ALWAYS = 0x07, */ + COMPAREVALUE1_mask = 0xff << 4, + COMPAREVALUE1_shift = 4, + COMPAREMASK1_mask = 0xff << 12, + COMPAREMASK1_shift = 12, + ENABLE1_bit = 1 << 24, + DB_PRELOAD_CONTROL = 0x00028d30, + START_X_mask = 0xff << 0, + START_X_shift = 0, + START_Y_mask = 0xff << 8, + START_Y_shift = 8, + MAX_X_mask = 0xff << 16, + MAX_X_shift = 16, + MAX_Y_mask = 0xff << 24, + MAX_Y_shift = 24, + DB_PREFETCH_LIMIT = 0x00028d34, + DEPTH_HEIGHT_TILE_MAX_mask = 0x3ff << 0, + DEPTH_HEIGHT_TILE_MAX_shift = 0, + PA_SU_POLY_OFFSET_DB_FMT_CNTL = 0x00028df8, + POLY_OFFSET_NEG_NUM_DB_BITS_mask = 0xff << 0, + POLY_OFFSET_NEG_NUM_DB_BITS_shift = 0, + POLY_OFFSET_DB_IS_FLOAT_FMT_bit = 1 << 8, + PA_SU_POLY_OFFSET_CLAMP = 0x00028dfc, + PA_SU_POLY_OFFSET_FRONT_SCALE = 0x00028e00, + PA_SU_POLY_OFFSET_FRONT_OFFSET = 0x00028e04, + PA_SU_POLY_OFFSET_BACK_SCALE = 0x00028e08, + PA_SU_POLY_OFFSET_BACK_OFFSET = 0x00028e0c, + PA_CL_POINT_X_RAD = 0x00028e10, + PA_CL_POINT_Y_RAD = 0x00028e14, + PA_CL_POINT_SIZE = 0x00028e18, + PA_CL_POINT_CULL_RAD = 0x00028e1c, + PA_CL_UCP_0_X = 0x00028e20, + PA_CL_UCP_0_X_num = 6, + PA_CL_UCP_0_X_offset = 16, + PA_CL_UCP_0_Y = 0x00028e24, + PA_CL_UCP_0_Y_num = 6, + PA_CL_UCP_0_Y_offset = 16, + PA_CL_UCP_0_Z = 0x00028e28, + PA_CL_UCP_0_Z_num = 6, + PA_CL_UCP_0_Z_offset = 16, + SQ_ALU_CONSTANT0_0 = 0x00030000, + SQ_ALU_CONSTANT1_0 = 0x00030004, + SQ_ALU_CONSTANT2_0 = 0x00030008, + SQ_ALU_CONSTANT3_0 = 0x0003000c, + SQ_VTX_CONSTANT_WORD0_0 = 0x00038000, + SQ_TEX_RESOURCE_WORD0_0 = 0x00038000, DIM_mask = 0x07 << 0, DIM_shift = 0, SQ_TEX_DIM_1D = 0x00, @@ -3718,21 +2835,22 @@ enum { SQ_TEX_DIM_2D_ARRAY = 0x05, SQ_TEX_DIM_2D_MSAA = 0x06, SQ_TEX_DIM_2D_ARRAY_MSAA = 0x07, -/* IGNORE_SHADER_ENGINE_TILING_bit = 1 << 3, */ - SQ_TEX_RESOURCE_WORD0_0__NON_DISP_TILING_ORDER_bit= 1 << 5, - PITCH_mask = 0xfff << 6, - PITCH_shift = 6, - TEX_WIDTH_mask = 0x3fff << 18, - TEX_WIDTH_shift = 18, - SQ_VTX_CONSTANT_WORD1_0 = 0x00030004, - SQ_TEX_RESOURCE_WORD1_0 = 0x00030004, - TEX_HEIGHT_mask = 0x3fff << 0, + SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_mask = 0x0f << 3, + SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift = 3, + TILE_TYPE_bit = 1 << 7, + PITCH_mask = 0x7ff << 8, + PITCH_shift = 8, + TEX_WIDTH_mask = 0x1fff << 19, + TEX_WIDTH_shift = 19, + SQ_VTX_CONSTANT_WORD1_0 = 0x00038004, + SQ_TEX_RESOURCE_WORD1_0 = 0x00038004, + TEX_HEIGHT_mask = 0x1fff << 0, TEX_HEIGHT_shift = 0, - TEX_DEPTH_mask = 0x1fff << 14, - TEX_DEPTH_shift = 14, - SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_mask = 0x0f << 28, - SQ_TEX_RESOURCE_WORD1_0__ARRAY_MODE_shift = 28, - SQ_VTX_CONSTANT_WORD2_0 = 0x00030008, + TEX_DEPTH_mask = 0x1fff << 13, + TEX_DEPTH_shift = 13, + SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_mask = 0x3f << 26, + SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift = 26, + SQ_VTX_CONSTANT_WORD2_0 = 0x00038008, BASE_ADDRESS_HI_mask = 0xff << 0, BASE_ADDRESS_HI_shift = 0, SQ_VTX_CONSTANT_WORD2_0__STRIDE_mask = 0x7ff << 8, @@ -3752,43 +2870,12 @@ enum { /* SQ_ENDIAN_NONE = 0x00, */ /* SQ_ENDIAN_8IN16 = 0x01, */ /* SQ_ENDIAN_8IN32 = 0x02, */ - SQ_TEX_RESOURCE_WORD2_0 = 0x00030008, - SQ_VTX_CONSTANT_WORD3_0 = 0x0003000c, - SQ_VTX_CONSTANT_WORD3_0__UNCACHED_bit = 1 << 2, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_mask = 0x07 << 3, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_X_shift = 3, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_mask = 0x07 << 6, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Y_shift = 6, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_mask = 0x07 << 9, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_Z_shift = 9, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_mask = 0x07 << 12, - SQ_VTX_CONSTANT_WORD3_0__DST_SEL_W_shift = 12, -/* SQ_SEL_X = 0x00, */ -/* SQ_SEL_Y = 0x01, */ -/* SQ_SEL_Z = 0x02, */ -/* SQ_SEL_W = 0x03, */ -/* SQ_SEL_0 = 0x04, */ -/* SQ_SEL_1 = 0x05, */ - SQ_TEX_RESOURCE_WORD3_0 = 0x0003000c, - SQ_TEX_RESOURCE_WORD4_0 = 0x00030010, + SQ_TEX_RESOURCE_WORD2_0 = 0x00038008, + SQ_VTX_CONSTANT_WORD3_0 = 0x0003800c, + MEM_REQUEST_SIZE_mask = 0x03 << 0, + MEM_REQUEST_SIZE_shift = 0, + SQ_TEX_RESOURCE_WORD3_0 = 0x0003800c, + SQ_TEX_RESOURCE_WORD4_0 = 0x00038010, FORMAT_COMP_X_mask = 0x03 << 0, FORMAT_COMP_X_shift = 0, SQ_FORMAT_COMP_UNSIGNED = 0x00, @@ -3821,6 +2908,8 @@ enum { /* SQ_ENDIAN_NONE = 0x00, */ /* SQ_ENDIAN_8IN16 = 0x01, */ /* SQ_ENDIAN_8IN32 = 0x02, */ + REQUEST_SIZE_mask = 0x03 << 14, + REQUEST_SIZE_shift = 14, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_mask = 0x07 << 16, SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift = 16, /* SQ_SEL_X = 0x00, */ @@ -3855,89 +2944,35 @@ enum { /* SQ_SEL_1 = 0x05, */ BASE_LEVEL_mask = 0x0f << 28, BASE_LEVEL_shift = 28, - SQ_VTX_CONSTANT_WORD4_0 = 0x00030010, - SQ_TEX_RESOURCE_WORD5_0 = 0x00030014, + SQ_TEX_RESOURCE_WORD5_0 = 0x00038014, LAST_LEVEL_mask = 0x0f << 0, LAST_LEVEL_shift = 0, BASE_ARRAY_mask = 0x1fff << 4, BASE_ARRAY_shift = 4, LAST_ARRAY_mask = 0x1fff << 17, LAST_ARRAY_shift = 17, - SQ_TEX_RESOURCE_WORD6_0 = 0x00030018, - PERF_MODULATION_mask = 0x07 << 3, - PERF_MODULATION_shift = 3, - INTERLACED_bit = 1 << 6, - SQ_TEX_RESOURCE_WORD6_0__MIN_LOD_mask = 0xfff << 8, - SQ_TEX_RESOURCE_WORD6_0__MIN_LOD_shift = 8, - SQ_TEX_RESOURCE_WORD6_0__TILE_SPLIT_mask = 0x07 << 29, - SQ_TEX_RESOURCE_WORD6_0__TILE_SPLIT_shift = 29, - SQ_ADDR_SURF_TILE_SPLIT_64B = 0x00, - SQ_ADDR_SURF_TILE_SPLIT_128B = 0x01, - SQ_ADDR_SURF_TILE_SPLIT_256B = 0x02, - SQ_ADDR_SURF_TILE_SPLIT_512B = 0x03, - SQ_ADDR_SURF_TILE_SPLIT_1KB = 0x04, - SQ_ADDR_SURF_TILE_SPLIT_2KB = 0x05, - SQ_ADDR_SURF_TILE_SPLIT_4KB = 0x06, - SQ_VTX_CONSTANT_WORD7_0 = 0x0003001c, - SQ_VTX_CONSTANT_WORD7_0__TYPE_mask = 0x03 << 30, - SQ_VTX_CONSTANT_WORD7_0__TYPE_shift = 30, + SQ_TEX_RESOURCE_WORD6_0 = 0x00038018, + MPEG_CLAMP_mask = 0x03 << 0, + MPEG_CLAMP_shift = 0, + SQ_TEX_MPEG_CLAMP_OFF = 0x00, + SQ_TEX_MPEG_9 = 0x01, + SQ_TEX_MPEG_10 = 0x02, + PERF_MODULATION_mask = 0x07 << 5, + PERF_MODULATION_shift = 5, + INTERLACED_bit = 1 << 8, + SQ_TEX_RESOURCE_WORD6_0__TYPE_mask = 0x03 << 30, + SQ_TEX_RESOURCE_WORD6_0__TYPE_shift = 30, SQ_TEX_VTX_INVALID_TEXTURE = 0x00, SQ_TEX_VTX_INVALID_BUFFER = 0x01, SQ_TEX_VTX_VALID_TEXTURE = 0x02, SQ_TEX_VTX_VALID_BUFFER = 0x03, - SQ_TEX_RESOURCE_WORD7_0 = 0x0003001c, - SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_mask = 0x3f << 0, - SQ_TEX_RESOURCE_WORD7_0__DATA_FORMAT_shift = 0, - SQ_TEX_RESOURCE_WORD7_0__MACRO_TILE_ASPECT_mask = 0x03 << 6, - SQ_TEX_RESOURCE_WORD7_0__MACRO_TILE_ASPECT_shift = 6, - SQ_ADDR_SURF_MACRO_ASPECT_1 = 0x00, - SQ_ADDR_SURF_MACRO_ASPECT_2 = 0x01, - SQ_ADDR_SURF_MACRO_ASPECT_4 = 0x02, - SQ_ADDR_SURF_MACRO_ASPECT_8 = 0x03, - SQ_TEX_RESOURCE_WORD7_0__BANK_WIDTH_mask = 0x03 << 8, - SQ_TEX_RESOURCE_WORD7_0__BANK_WIDTH_shift = 8, - SQ_ADDR_SURF_BANK_WH_1 = 0x00, - SQ_ADDR_SURF_BANK_WH_2 = 0x01, - SQ_ADDR_SURF_BANK_WH_4 = 0x02, - SQ_ADDR_SURF_BANK_WH_8 = 0x03, - SQ_TEX_RESOURCE_WORD7_0__BANK_HEIGHT_mask = 0x03 << 10, - SQ_TEX_RESOURCE_WORD7_0__BANK_HEIGHT_shift = 10, -/* SQ_ADDR_SURF_BANK_WH_1 = 0x00, */ -/* SQ_ADDR_SURF_BANK_WH_2 = 0x01, */ -/* SQ_ADDR_SURF_BANK_WH_4 = 0x02, */ -/* SQ_ADDR_SURF_BANK_WH_8 = 0x03, */ - DEPTH_SAMPLE_ORDER_bit = 1 << 15, - SQ_TEX_RESOURCE_WORD7_0__NUM_BANKS_mask = 0x03 << 16, - SQ_TEX_RESOURCE_WORD7_0__NUM_BANKS_shift = 16, - SQ_ADDR_SURF_2_BANK = 0x00, - SQ_ADDR_SURF_4_BANK = 0x01, - SQ_ADDR_SURF_8_BANK = 0x02, - SQ_ADDR_SURF_16_BANK = 0x03, - SQ_TEX_RESOURCE_WORD7_0__TYPE_mask = 0x03 << 30, - SQ_TEX_RESOURCE_WORD7_0__TYPE_shift = 30, + SQ_VTX_CONSTANT_WORD6_0 = 0x00038018, + SQ_VTX_CONSTANT_WORD6_0__TYPE_mask = 0x03 << 30, + SQ_VTX_CONSTANT_WORD6_0__TYPE_shift = 30, /* SQ_TEX_VTX_INVALID_TEXTURE = 0x00, */ /* SQ_TEX_VTX_INVALID_BUFFER = 0x01, */ /* SQ_TEX_VTX_VALID_TEXTURE = 0x02, */ /* SQ_TEX_VTX_VALID_BUFFER = 0x03, */ - SQ_LOOP_CONST_DX10_0 = 0x0003a200, - SQ_LOOP_CONST_0 = 0x0003a200, - SQ_LOOP_CONST_0__COUNT_mask = 0xfff << 0, - SQ_LOOP_CONST_0__COUNT_shift = 0, - INIT_mask = 0xfff << 12, - INIT_shift = 12, - INC_mask = 0xff << 24, - INC_shift = 24, - SQ_JUMPTABLE_CONST_0 = 0x0003a200, - CONST_A_mask = 0xff << 0, - CONST_A_shift = 0, - CONST_B_mask = 0xff << 8, - CONST_B_shift = 8, - CONST_C_mask = 0xff << 16, - CONST_C_shift = 16, - CONST_D_mask = 0xff << 24, - CONST_D_shift = 24, - SQ_BOOL_CONST_0 = 0x0003a500, - SQ_BOOL_CONST_0_num = 6, SQ_TEX_SAMPLER_WORD0_0 = 0x0003c000, SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_mask = 0x07 << 0, SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift = 0, @@ -3969,32 +3004,36 @@ enum { /* SQ_TEX_MIRROR_ONCE_HALF_BORDER = 0x05, */ /* SQ_TEX_CLAMP_BORDER = 0x06, */ /* SQ_TEX_MIRROR_ONCE_BORDER = 0x07, */ - XY_MAG_FILTER_mask = 0x03 << 9, + XY_MAG_FILTER_mask = 0x07 << 9, XY_MAG_FILTER_shift = 9, SQ_TEX_XY_FILTER_POINT = 0x00, SQ_TEX_XY_FILTER_BILINEAR = 0x01, - XY_MIN_FILTER_mask = 0x03 << 11, - XY_MIN_FILTER_shift = 11, + SQ_TEX_XY_FILTER_BICUBIC = 0x02, + XY_MIN_FILTER_mask = 0x07 << 12, + XY_MIN_FILTER_shift = 12, /* SQ_TEX_XY_FILTER_POINT = 0x00, */ /* SQ_TEX_XY_FILTER_BILINEAR = 0x01, */ - Z_FILTER_mask = 0x03 << 13, - Z_FILTER_shift = 13, +/* SQ_TEX_XY_FILTER_BICUBIC = 0x02, */ + Z_FILTER_mask = 0x03 << 15, + Z_FILTER_shift = 15, SQ_TEX_Z_FILTER_NONE = 0x00, SQ_TEX_Z_FILTER_POINT = 0x01, SQ_TEX_Z_FILTER_LINEAR = 0x02, - MIP_FILTER_mask = 0x03 << 15, - MIP_FILTER_shift = 15, + MIP_FILTER_mask = 0x03 << 17, + MIP_FILTER_shift = 17, /* SQ_TEX_Z_FILTER_NONE = 0x00, */ /* SQ_TEX_Z_FILTER_POINT = 0x01, */ /* SQ_TEX_Z_FILTER_LINEAR = 0x02, */ - BORDER_COLOR_TYPE_mask = 0x03 << 20, - BORDER_COLOR_TYPE_shift = 20, + BORDER_COLOR_TYPE_mask = 0x03 << 22, + BORDER_COLOR_TYPE_shift = 22, SQ_TEX_BORDER_COLOR_TRANS_BLACK = 0x00, SQ_TEX_BORDER_COLOR_OPAQUE_BLACK = 0x01, SQ_TEX_BORDER_COLOR_OPAQUE_WHITE = 0x02, SQ_TEX_BORDER_COLOR_REGISTER = 0x03, - DEPTH_COMPARE_FUNCTION_mask = 0x07 << 22, - DEPTH_COMPARE_FUNCTION_shift = 22, + POINT_SAMPLING_CLAMP_bit = 1 << 24, + TEX_ARRAY_OVERRIDE_bit = 1 << 25, + DEPTH_COMPARE_FUNCTION_mask = 0x07 << 26, + DEPTH_COMPARE_FUNCTION_shift = 26, SQ_TEX_DEPTH_COMPARE_NEVER = 0x00, SQ_TEX_DEPTH_COMPARE_LESS = 0x01, SQ_TEX_DEPTH_COMPARE_EQUAL = 0x02, @@ -4003,37 +3042,46 @@ enum { SQ_TEX_DEPTH_COMPARE_NOTEQUAL = 0x05, SQ_TEX_DEPTH_COMPARE_GREATEREQUAL = 0x06, SQ_TEX_DEPTH_COMPARE_ALWAYS = 0x07, - CHROMA_KEY_mask = 0x03 << 25, - CHROMA_KEY_shift = 25, + CHROMA_KEY_mask = 0x03 << 29, + CHROMA_KEY_shift = 29, SQ_TEX_CHROMA_KEY_DISABLED = 0x00, SQ_TEX_CHROMA_KEY_KILL = 0x01, SQ_TEX_CHROMA_KEY_BLEND = 0x02, + LOD_USES_MINOR_AXIS_bit = 1 << 31, SQ_TEX_SAMPLER_WORD1_0 = 0x0003c004, - SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_mask = 0xfff << 0, - SQ_TEX_SAMPLER_WORD1_0__MIN_LOD_shift = 0, - MAX_LOD_mask = 0xfff << 12, - MAX_LOD_shift = 12, - PERF_MIP_mask = 0x0f << 24, - PERF_MIP_shift = 24, - PERF_Z_mask = 0x0f << 28, - PERF_Z_shift = 28, + MIN_LOD_mask = 0x3ff << 0, + MIN_LOD_shift = 0, + MAX_LOD_mask = 0x3ff << 10, + MAX_LOD_shift = 10, + SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_mask = 0xfff << 20, + SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_shift = 20, SQ_TEX_SAMPLER_WORD2_0 = 0x0003c008, - SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_mask = 0x3fff << 0, - SQ_TEX_SAMPLER_WORD2_0__LOD_BIAS_shift = 0, - LOD_BIAS_SEC_mask = 0x3f << 14, - LOD_BIAS_SEC_shift = 14, - MC_COORD_TRUNCATE_bit = 1 << 20, - SQ_TEX_SAMPLER_WORD2_0__FORCE_DEGAMMA_bit = 1 << 21, - TRUNCATE_COORD_bit = 1 << 28, - SQ_TEX_SAMPLER_WORD2_0__DISABLE_CUBE_WRAP_bit = 1 << 29, + LOD_BIAS_SEC_mask = 0xfff << 0, + LOD_BIAS_SEC_shift = 0, + MC_COORD_TRUNCATE_bit = 1 << 12, + SQ_TEX_SAMPLER_WORD2_0__FORCE_DEGAMMA_bit = 1 << 13, + HIGH_PRECISION_FILTER_bit = 1 << 14, + PERF_MIP_mask = 0x07 << 15, + PERF_MIP_shift = 15, + PERF_Z_mask = 0x03 << 18, + PERF_Z_shift = 18, + FETCH_4_bit = 1 << 26, + SAMPLE_IS_PCF_bit = 1 << 27, SQ_TEX_SAMPLER_WORD2_0__TYPE_bit = 1 << 31, SQ_VTX_BASE_VTX_LOC = 0x0003cff0, SQ_VTX_START_INST_LOC = 0x0003cff4, - SQ_TEX_SAMPLER_CLEAR = 0x0003ff00, - SQ_TEX_RESOURCE_CLEAR = 0x0003ff04, - SQ_LOOP_BOOL_CLEAR = 0x0003ff08, + SQ_LOOP_CONST_DX10_0 = 0x0003e200, + SQ_LOOP_CONST_0 = 0x0003e200, + SQ_LOOP_CONST_0__COUNT_mask = 0xfff << 0, + SQ_LOOP_CONST_0__COUNT_shift = 0, + INIT_mask = 0xfff << 12, + INIT_shift = 12, + INC_mask = 0xff << 24, + INC_shift = 24, + SQ_BOOL_CONST_0 = 0x0003e380, + SQ_BOOL_CONST_0_num = 3 } ; -#endif /* _EVERGREEN_REG_AUTO_H */ +#endif /* _AUTOREGS */ diff --git a/driver/xf86-video-radeonhd/src/r600_reg_r6xx.h b/driver/xf86-video-radeonhd/src/r600_reg_r6xx.h new file mode 100644 index 000000000..0a09074e8 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_reg_r6xx.h @@ -0,0 +1,504 @@ +/* + * RadeonHD R6xx, R7xx Register documentation + * + * Copyright (C) 2008-2009 Advanced Micro Devices, Inc. + * Copyright (C) 2008-2009 Matthias Hopf + * + * 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 COPYRIGHT HOLDER(S) 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. + */ + +#ifndef _R600_REG_R6xx_H_ +#define _R600_REG_R6xx_H_ + +/* + * Registers for R6xx chips that are not documented yet + */ + +enum { + + MM_INDEX = 0x0000, + MM_DATA = 0x0004, + + SRBM_STATUS = 0x0e50, + RLC_RQ_PENDING_bit = 1 << 3, + RCU_RQ_PENDING_bit = 1 << 4, + GRBM_RQ_PENDING_bit = 1 << 5, + HI_RQ_PENDING_bit = 1 << 6, + IO_EXTERN_SIGNAL_bit = 1 << 7, + VMC_BUSY_bit = 1 << 8, + MCB_BUSY_bit = 1 << 9, + MCDZ_BUSY_bit = 1 << 10, + MCDY_BUSY_bit = 1 << 11, + MCDX_BUSY_bit = 1 << 12, + MCDW_BUSY_bit = 1 << 13, + SEM_BUSY_bit = 1 << 14, + SRBM_STATUS__RLC_BUSY_bit = 1 << 15, + PDMA_BUSY_bit = 1 << 16, + IH_BUSY_bit = 1 << 17, + CSC_BUSY_bit = 1 << 20, + CMC7_BUSY_bit = 1 << 21, + CMC6_BUSY_bit = 1 << 22, + CMC5_BUSY_bit = 1 << 23, + CMC4_BUSY_bit = 1 << 24, + CMC3_BUSY_bit = 1 << 25, + CMC2_BUSY_bit = 1 << 26, + CMC1_BUSY_bit = 1 << 27, + CMC0_BUSY_bit = 1 << 28, + BIF_BUSY_bit = 1 << 29, + IDCT_BUSY_bit = 1 << 30, + + SRBM_READ_ERROR = 0x0e98, + READ_ADDRESS_mask = 0xffff << 2, + READ_ADDRESS_shift = 2, + READ_REQUESTER_HI_bit = 1 << 24, + READ_REQUESTER_GRBM_bit = 1 << 25, + READ_REQUESTER_RCU_bit = 1 << 26, + READ_REQUESTER_RLC_bit = 1 << 27, + READ_ERROR_bit = 1 << 31, + + SRBM_INT_STATUS = 0x0ea4, + RDERR_INT_STAT_bit = 1 << 0, + GFX_CNTX_SWITCH_INT_STAT_bit = 1 << 1, + SRBM_INT_ACK = 0x0ea8, + RDERR_INT_ACK_bit = 1 << 0, + GFX_CNTX_SWITCH_INT_ACK_bit = 1 << 1, + + /* R6XX_MC_VM_FB_LOCATION = 0x2180, */ + + VENDOR_DEVICE_ID = 0x4000, + + HDP_MEM_COHERENCY_FLUSH_CNTL = 0x5480, + + /* D1GRPH_PRIMARY_SURFACE_ADDRESS = 0x6110, */ + /* D1GRPH_PITCH = 0x6120, */ + /* D1GRPH_Y_END = 0x6138, */ + + GRBM_STATUS = 0x8010, + R600_CMDFIFO_AVAIL_mask = 0x1f << 0, + R700_CMDFIFO_AVAIL_mask = 0xf << 0, + CMDFIFO_AVAIL_shift = 0, + SRBM_RQ_PENDING_bit = 1 << 5, + CP_RQ_PENDING_bit = 1 << 6, + CF_RQ_PENDING_bit = 1 << 7, + PF_RQ_PENDING_bit = 1 << 8, + GRBM_EE_BUSY_bit = 1 << 10, + GRBM_STATUS__VC_BUSY_bit = 1 << 11, + DB03_CLEAN_bit = 1 << 12, + CB03_CLEAN_bit = 1 << 13, + VGT_BUSY_NO_DMA_bit = 1 << 16, + GRBM_STATUS__VGT_BUSY_bit = 1 << 17, + TA03_BUSY_bit = 1 << 18, + GRBM_STATUS__TC_BUSY_bit = 1 << 19, + SX_BUSY_bit = 1 << 20, + SH_BUSY_bit = 1 << 21, + SPI03_BUSY_bit = 1 << 22, + SMX_BUSY_bit = 1 << 23, + SC_BUSY_bit = 1 << 24, + PA_BUSY_bit = 1 << 25, + DB03_BUSY_bit = 1 << 26, + CR_BUSY_bit = 1 << 27, + CP_COHERENCY_BUSY_bit = 1 << 28, + GRBM_STATUS__CP_BUSY_bit = 1 << 29, + CB03_BUSY_bit = 1 << 30, + GUI_ACTIVE_bit = 1 << 31, + GRBM_STATUS2 = 0x8014, + CR_CLEAN_bit = 1 << 0, + SMX_CLEAN_bit = 1 << 1, + SPI0_BUSY_bit = 1 << 8, + SPI1_BUSY_bit = 1 << 9, + SPI2_BUSY_bit = 1 << 10, + SPI3_BUSY_bit = 1 << 11, + TA0_BUSY_bit = 1 << 12, + TA1_BUSY_bit = 1 << 13, + TA2_BUSY_bit = 1 << 14, + TA3_BUSY_bit = 1 << 15, + DB0_BUSY_bit = 1 << 16, + DB1_BUSY_bit = 1 << 17, + DB2_BUSY_bit = 1 << 18, + DB3_BUSY_bit = 1 << 19, + CB0_BUSY_bit = 1 << 20, + CB1_BUSY_bit = 1 << 21, + CB2_BUSY_bit = 1 << 22, + CB3_BUSY_bit = 1 << 23, + GRBM_SOFT_RESET = 0x8020, + SOFT_RESET_CP_bit = 1 << 0, + SOFT_RESET_CB_bit = 1 << 1, + SOFT_RESET_CR_bit = 1 << 2, + SOFT_RESET_DB_bit = 1 << 3, + SOFT_RESET_PA_bit = 1 << 5, + SOFT_RESET_SC_bit = 1 << 6, + SOFT_RESET_SMX_bit = 1 << 7, + SOFT_RESET_SPI_bit = 1 << 8, + SOFT_RESET_SH_bit = 1 << 9, + SOFT_RESET_SX_bit = 1 << 10, + SOFT_RESET_TC_bit = 1 << 11, + SOFT_RESET_TA_bit = 1 << 12, + SOFT_RESET_VC_bit = 1 << 13, + SOFT_RESET_VGT_bit = 1 << 14, + SOFT_RESET_GRBM_GCA_bit = 1 << 15, + + WAIT_UNTIL = 0x8040, + WAIT_CP_DMA_IDLE_bit = 1 << 8, + WAIT_CMDFIFO_bit = 1 << 10, + WAIT_2D_IDLE_bit = 1 << 14, + WAIT_3D_IDLE_bit = 1 << 15, + WAIT_2D_IDLECLEAN_bit = 1 << 16, + WAIT_3D_IDLECLEAN_bit = 1 << 17, + WAIT_EXTERN_SIG_bit = 1 << 19, + CMDFIFO_ENTRIES_mask = 0x1f << 20, + CMDFIFO_ENTRIES_shift = 20, + + GRBM_READ_ERROR = 0x8058, +/* READ_ADDRESS_mask = 0xffff << 2, */ +/* READ_ADDRESS_shift = 2, */ + READ_REQUESTER_SRBM_bit = 1 << 28, + READ_REQUESTER_CP_bit = 1 << 29, + READ_REQUESTER_WU_POLL_bit = 1 << 30, +/* READ_ERROR_bit = 1 << 31, */ + + SCRATCH_REG0 = 0x8500, + SCRATCH_REG1 = 0x8504, + SCRATCH_REG2 = 0x8508, + SCRATCH_REG3 = 0x850c, + SCRATCH_REG4 = 0x8510, + SCRATCH_REG5 = 0x8514, + SCRATCH_REG6 = 0x8518, + SCRATCH_REG7 = 0x851c, + SCRATCH_UMSK = 0x8540, + SCRATCH_ADDR = 0x8544, + + CP_COHER_CNTL = 0x85f0, + DEST_BASE_0_ENA_bit = 1 << 0, + DEST_BASE_1_ENA_bit = 1 << 1, + SO0_DEST_BASE_ENA_bit = 1 << 2, + SO1_DEST_BASE_ENA_bit = 1 << 3, + SO2_DEST_BASE_ENA_bit = 1 << 4, + SO3_DEST_BASE_ENA_bit = 1 << 5, + CB0_DEST_BASE_ENA_bit = 1 << 6, + CB1_DEST_BASE_ENA_bit = 1 << 7, + CB2_DEST_BASE_ENA_bit = 1 << 8, + CB3_DEST_BASE_ENA_bit = 1 << 9, + CB4_DEST_BASE_ENA_bit = 1 << 10, + CB5_DEST_BASE_ENA_bit = 1 << 11, + CB6_DEST_BASE_ENA_bit = 1 << 12, + CB7_DEST_BASE_ENA_bit = 1 << 13, + DB_DEST_BASE_ENA_bit = 1 << 14, + CR_DEST_BASE_ENA_bit = 1 << 15, + TC_ACTION_ENA_bit = 1 << 23, + VC_ACTION_ENA_bit = 1 << 24, + CB_ACTION_ENA_bit = 1 << 25, + DB_ACTION_ENA_bit = 1 << 26, + SH_ACTION_ENA_bit = 1 << 27, + SMX_ACTION_ENA_bit = 1 << 28, + CR0_ACTION_ENA_bit = 1 << 29, + CR1_ACTION_ENA_bit = 1 << 30, + CR2_ACTION_ENA_bit = 1 << 31, + CP_COHER_SIZE = 0x85f4, + CP_COHER_BASE = 0x85f8, + CP_COHER_STATUS = 0x85fc, + MATCHING_GFX_CNTX_mask = 0xff << 0, + MATCHING_GFX_CNTX_shift = 0, + MATCHING_CR_CNTX_mask = 0xffff << 8, + MATCHING_CR_CNTX_shift = 8, + STATUS_bit = 1 << 31, + + CP_STALLED_STAT1 = 0x8674, + RBIU_TO_DMA_NOT_RDY_TO_RCV_bit = 1 << 0, + RBIU_TO_IBS_NOT_RDY_TO_RCV_bit = 1 << 1, + RBIU_TO_SEM_NOT_RDY_TO_RCV_bit = 1 << 2, + RBIU_TO_2DREGS_NOT_RDY_TO_RCV_bit = 1 << 3, + RBIU_TO_MEMWR_NOT_RDY_TO_RCV_bit = 1 << 4, + RBIU_TO_MEMRD_NOT_RDY_TO_RCV_bit = 1 << 5, + RBIU_TO_EOPD_NOT_RDY_TO_RCV_bit = 1 << 6, + RBIU_TO_RECT_NOT_RDY_TO_RCV_bit = 1 << 7, + RBIU_TO_STRMO_NOT_RDY_TO_RCV_bit = 1 << 8, + RBIU_TO_PSTAT_NOT_RDY_TO_RCV_bit = 1 << 9, + MIU_WAITING_ON_RDREQ_FREE_bit = 1 << 16, + MIU_WAITING_ON_WRREQ_FREE_bit = 1 << 17, + MIU_NEEDS_AVAIL_WRREQ_PHASE_bit = 1 << 18, + RCIU_WAITING_ON_GRBM_FREE_bit = 1 << 24, + RCIU_WAITING_ON_VGT_FREE_bit = 1 << 25, + RCIU_STALLED_ON_ME_READ_bit = 1 << 26, + RCIU_STALLED_ON_DMA_READ_bit = 1 << 27, + RCIU_HALTED_BY_REG_VIOLATION_bit = 1 << 28, + CP_STALLED_STAT2 = 0x8678, + PFP_TO_CSF_NOT_RDY_TO_RCV_bit = 1 << 0, + PFP_TO_MEQ_NOT_RDY_TO_RCV_bit = 1 << 1, + PFP_TO_VGT_NOT_RDY_TO_RCV_bit = 1 << 2, + PFP_HALTED_BY_INSTR_VIOLATION_bit = 1 << 3, + MULTIPASS_IB_PENDING_IN_PFP_bit = 1 << 4, + ME_BRUSH_WC_NOT_RDY_TO_RCV_bit = 1 << 8, + ME_STALLED_ON_BRUSH_LOGIC_bit = 1 << 9, + CR_CNTX_NOT_AVAIL_TO_ME_bit = 1 << 10, + GFX_CNTX_NOT_AVAIL_TO_ME_bit = 1 << 11, + ME_RCIU_NOT_RDY_TO_RCV_bit = 1 << 12, + ME_TO_CONST_NOT_RDY_TO_RCV_bit = 1 << 13, + ME_WAITING_DATA_FROM_PFP_bit = 1 << 14, + ME_WAITING_ON_PARTIAL_FLUSH_bit = 1 << 15, + RECT_FIFO_NEEDS_CR_RECT_DONE_bit = 1 << 16, + RECT_FIFO_NEEDS_WR_CONFIRM_bit = 1 << 17, + EOPD_FIFO_NEEDS_SC_EOP_DONE_bit = 1 << 18, + EOPD_FIFO_NEEDS_SMX_EOP_DONE_bit = 1 << 19, + EOPD_FIFO_NEEDS_WR_CONFIRM_bit = 1 << 20, + EOPD_FIFO_NEEDS_SIGNAL_SEM_bit = 1 << 21, + SO_NUMPRIM_FIFO_NEEDS_SOADDR_bit = 1 << 22, + SO_NUMPRIM_FIFO_NEEDS_NUMPRIM_bit = 1 << 23, + PIPE_STATS_FIFO_NEEDS_SAMPLE_bit = 1 << 24, + SURF_SYNC_NEEDS_IDLE_CNTXS_bit = 1 << 30, + SURF_SYNC_NEEDS_ALL_CLEAN_bit = 1 << 31, + CP_BUSY_STAT = 0x867c, + REG_BUS_FIFO_BUSY_bit = 1 << 0, + RING_FETCHING_DATA_bit = 1 << 1, + INDR1_FETCHING_DATA_bit = 1 << 2, + INDR2_FETCHING_DATA_bit = 1 << 3, + STATE_FETCHING_DATA_bit = 1 << 4, + PRED_FETCHING_DATA_bit = 1 << 5, + COHER_CNTR_NEQ_ZERO_bit = 1 << 6, + PFP_PARSING_PACKETS_bit = 1 << 7, + ME_PARSING_PACKETS_bit = 1 << 8, + RCIU_PFP_BUSY_bit = 1 << 9, + RCIU_ME_BUSY_bit = 1 << 10, + OUTSTANDING_READ_TAGS_bit = 1 << 11, + SEM_CMDFIFO_NOT_EMPTY_bit = 1 << 12, + SEM_FAILED_AND_HOLDING_bit = 1 << 13, + SEM_POLLING_FOR_PASS_bit = 1 << 14, + _3D_BUSY_bit = 1 << 15, + _2D_BUSY_bit = 1 << 16, + CP_STAT = 0x8680, + CSF_RING_BUSY_bit = 1 << 0, + CSF_WPTR_POLL_BUSY_bit = 1 << 1, + CSF_INDIRECT1_BUSY_bit = 1 << 2, + CSF_INDIRECT2_BUSY_bit = 1 << 3, + CSF_STATE_BUSY_bit = 1 << 4, + CSF_PREDICATE_BUSY_bit = 1 << 5, + CSF_BUSY_bit = 1 << 6, + MIU_RDREQ_BUSY_bit = 1 << 7, + MIU_WRREQ_BUSY_bit = 1 << 8, + ROQ_RING_BUSY_bit = 1 << 9, + ROQ_INDIRECT1_BUSY_bit = 1 << 10, + ROQ_INDIRECT2_BUSY_bit = 1 << 11, + ROQ_STATE_BUSY_bit = 1 << 12, + ROQ_PREDICATE_BUSY_bit = 1 << 13, + ROQ_ALIGN_BUSY_bit = 1 << 14, + PFP_BUSY_bit = 1 << 15, + MEQ_BUSY_bit = 1 << 16, + ME_BUSY_bit = 1 << 17, + QUERY_BUSY_bit = 1 << 18, + SEMAPHORE_BUSY_bit = 1 << 19, + INTERRUPT_BUSY_bit = 1 << 20, + SURFACE_SYNC_BUSY_bit = 1 << 21, + DMA_BUSY_bit = 1 << 22, + RCIU_BUSY_bit = 1 << 23, + CP_STAT__CP_BUSY_bit = 1 << 31, + + CP_ME_CNTL = 0x86d8, + ME_STATMUX_mask = 0xff << 0, + ME_STATMUX_shift = 0, + ME_HALT_bit = 1 << 28, + CP_ME_STATUS = 0x86dc, + + CP_RB_RPTR = 0x8700, + RB_RPTR_mask = 0xfffff << 0, + RB_RPTR_shift = 0, + CP_RB_WPTR_DELAY = 0x8704, + PRE_WRITE_TIMER_mask = 0xfffffff << 0, + PRE_WRITE_TIMER_shift = 0, + PRE_WRITE_LIMIT_mask = 0x0f << 28, + PRE_WRITE_LIMIT_shift = 28, + + CP_ROQ_RB_STAT = 0x8780, + ROQ_RPTR_PRIMARY_mask = 0x3ff << 0, + ROQ_RPTR_PRIMARY_shift = 0, + ROQ_WPTR_PRIMARY_mask = 0x3ff << 16, + ROQ_WPTR_PRIMARY_shift = 16, + CP_ROQ_IB1_STAT = 0x8784, + ROQ_RPTR_INDIRECT1_mask = 0x3ff << 0, + ROQ_RPTR_INDIRECT1_shift = 0, + ROQ_WPTR_INDIRECT1_mask = 0x3ff << 16, + ROQ_WPTR_INDIRECT1_shift = 16, + CP_ROQ_IB2_STAT = 0x8788, + ROQ_RPTR_INDIRECT2_mask = 0x3ff << 0, + ROQ_RPTR_INDIRECT2_shift = 0, + ROQ_WPTR_INDIRECT2_mask = 0x3ff << 16, + ROQ_WPTR_INDIRECT2_shift = 16, + + CP_MEQ_STAT = 0x8794, + MEQ_RPTR_mask = 0x3ff << 0, + MEQ_RPTR_shift = 0, + MEQ_WPTR_mask = 0x3ff << 16, + MEQ_WPTR_shift = 16, + + CC_GC_SHADER_PIPE_CONFIG = 0x8950, + INACTIVE_QD_PIPES_mask = 0xff << 8, + INACTIVE_QD_PIPES_shift = 8, + R6XX_MAX_QD_PIPES = 8, + INACTIVE_SIMDS_mask = 0xff << 16, + INACTIVE_SIMDS_shift = 16, + R6XX_MAX_SIMDS = 8, + GC_USER_SHADER_PIPE_CONFIG = 0x8954, + + VC_ENHANCE = 0x9714, + DB_DEBUG = 0x9830, + PREZ_MUST_WAIT_FOR_POSTZ_DONE = 1 << 31, + + DB_WATERMARKS = 0x00009838, + DEPTH_FREE_mask = 0x1f << 0, + DEPTH_FREE_shift = 0, + DEPTH_FLUSH_mask = 0x3f << 5, + DEPTH_FLUSH_shift = 5, + FORCE_SUMMARIZE_mask = 0x0f << 11, + FORCE_SUMMARIZE_shift = 11, + DEPTH_PENDING_FREE_mask = 0x1f << 15, + DEPTH_PENDING_FREE_shift = 15, + DEPTH_CACHELINE_FREE_mask = 0x1f << 20, + DEPTH_CACHELINE_FREE_shift = 20, + EARLY_Z_PANIC_DISABLE_bit = 1 << 25, + LATE_Z_PANIC_DISABLE_bit = 1 << 26, + RE_Z_PANIC_DISABLE_bit = 1 << 27, + DB_EXTRA_DEBUG_mask = 0x0f << 28, + DB_EXTRA_DEBUG_shift = 28, + + CP_RB_BASE = 0xc100, + CP_RB_CNTL = 0xc104, + RB_BUFSZ_mask = 0x3f << 0, + CP_RB_WPTR = 0xc114, + RB_WPTR_mask = 0xfffff << 0, + RB_WPTR_shift = 0, + CP_RB_RPTR_WR = 0xc108, + RB_RPTR_WR_mask = 0xfffff << 0, + RB_RPTR_WR_shift = 0, + + CP_INT_STATUS = 0xc128, + DISABLE_CNTX_SWITCH_INT_STAT_bit = 1 << 0, + ENABLE_CNTX_SWITCH_INT_STAT_bit = 1 << 1, + SEM_SIGNAL_INT_STAT_bit = 1 << 18, + CNTX_BUSY_INT_STAT_bit = 1 << 19, + CNTX_EMPTY_INT_STAT_bit = 1 << 20, + WAITMEM_SEM_INT_STAT_bit = 1 << 21, + PRIV_INSTR_INT_STAT_bit = 1 << 22, + PRIV_REG_INT_STAT_bit = 1 << 23, + OPCODE_ERROR_INT_STAT_bit = 1 << 24, + SCRATCH_INT_STAT_bit = 1 << 25, + TIME_STAMP_INT_STAT_bit = 1 << 26, + RESERVED_BIT_ERROR_INT_STAT_bit = 1 << 27, + DMA_INT_STAT_bit = 1 << 28, + IB2_INT_STAT_bit = 1 << 29, + IB1_INT_STAT_bit = 1 << 30, + RB_INT_STAT_bit = 1 << 31, + +/* SX_ALPHA_TEST_CONTROL = 0x00028410, */ + ALPHA_FUNC__REF_NEVER = 0, + ALPHA_FUNC__REF_ALWAYS = 7, +/* DB_SHADER_CONTROL = 0x0002880c, */ + Z_ORDER__EARLY_Z_THEN_LATE_Z = 2, +/* PA_SU_SC_MODE_CNTL = 0x00028814, */ +/* POLY_MODE_mask = 0x03 << 3, */ + POLY_MODE__TRIANGLES = 0, POLY_MODE__DUAL_MODE, +/* POLYMODE_FRONT_PTYPE_mask = 0x07 << 5, */ + POLYMODE_PTYPE__POINTS = 0, POLYMODE_PTYPE__LINES, POLYMODE_PTYPE__TRIANGLES, + PA_SC_AA_SAMPLE_LOCS_8S_WD1_M = 0x00028c20, + DB_SRESULTS_COMPARE_STATE0 = 0x00028d28, /* See autoregs: DB_SRESULTS_COMPARE_STATE1 */ +/* DB_SRESULTS_COMPARE_STATE1 = 0x00028d2c, */ + DB_ALPHA_TO_MASK = 0x00028d44, + ALPHA_TO_MASK_ENABLE = 1 << 0, + ALPHA_TO_MASK_OFFSET0_mask = 0x03 << 8, + ALPHA_TO_MASK_OFFSET0_shift = 8, + ALPHA_TO_MASK_OFFSET1_mask = 0x03 << 8, + ALPHA_TO_MASK_OFFSET1_shift = 10, + ALPHA_TO_MASK_OFFSET2_mask = 0x03 << 8, + ALPHA_TO_MASK_OFFSET2_shift = 12, + ALPHA_TO_MASK_OFFSET3_mask = 0x03 << 8, + ALPHA_TO_MASK_OFFSET3_shift = 14, + +/* SQ_VTX_CONSTANT_WORD2_0 = 0x00038008, */ +/* SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_mask = 0x3f << 20, */ + FMT_INVALID=0, FMT_8, FMT_4_4, FMT_3_3_2, + FMT_16=5, FMT_16_FLOAT, FMT_8_8, + FMT_5_6_5, FMT_6_5_5, FMT_1_5_5_5, FMT_4_4_4_4, + FMT_5_5_5_1, FMT_32, FMT_32_FLOAT, FMT_16_16, + FMT_16_16_FLOAT=16, FMT_8_24, FMT_8_24_FLOAT, FMT_24_8, + FMT_24_8_FLOAT, FMT_10_11_11, FMT_10_11_11_FLOAT, FMT_11_11_10, + FMT_11_11_10_FLOAT, FMT_2_10_10_10, FMT_8_8_8_8, FMT_10_10_10_2, + FMT_X24_8_32_FLOAT, FMT_32_32, FMT_32_32_FLOAT, FMT_16_16_16_16, + FMT_16_16_16_16_FLOAT=32, FMT_32_32_32_32=34, FMT_32_32_32_32_FLOAT, + FMT_1 = 37, FMT_GB_GR=39, + FMT_BG_RG, FMT_32_AS_8, FMT_32_AS_8_8, FMT_5_9_9_9_SHAREDEXP, + FMT_8_8_8, FMT_16_16_16, FMT_16_16_16_FLOAT, FMT_32_32_32, + FMT_32_32_32_FLOAT=48, + +/* High level register file lengths */ + SQ_ALU_CONSTANT = SQ_ALU_CONSTANT0_0, /* 256 PS, 256 VS */ + SQ_ALU_CONSTANT_ps_num = 256, + SQ_ALU_CONSTANT_vs_num = 256, + SQ_ALU_CONSTANT_all_num = 512, + SQ_ALU_CONSTANT_offset = 16, + SQ_ALU_CONSTANT_ps = 0, + SQ_ALU_CONSTANT_vs = SQ_ALU_CONSTANT_ps + SQ_ALU_CONSTANT_ps_num, + SQ_TEX_RESOURCE = SQ_TEX_RESOURCE_WORD0_0, /* 160 PS, 160 VS, 16 FS, 160 GS */ + SQ_TEX_RESOURCE_ps_num = 160, + SQ_TEX_RESOURCE_vs_num = 160, + SQ_TEX_RESOURCE_fs_num = 16, + SQ_TEX_RESOURCE_gs_num = 160, + SQ_TEX_RESOURCE_all_num = 496, + SQ_TEX_RESOURCE_offset = 28, + SQ_TEX_RESOURCE_ps = 0, + SQ_TEX_RESOURCE_vs = SQ_TEX_RESOURCE_ps + SQ_TEX_RESOURCE_ps_num, + SQ_TEX_RESOURCE_fs = SQ_TEX_RESOURCE_vs + SQ_TEX_RESOURCE_vs_num, + SQ_TEX_RESOURCE_gs = SQ_TEX_RESOURCE_fs + SQ_TEX_RESOURCE_fs_num, + SQ_VTX_RESOURCE = SQ_VTX_CONSTANT_WORD0_0, /* 160 PS, 160 VS, 16 FS, 160 GS */ + SQ_VTX_RESOURCE_ps_num = 160, + SQ_VTX_RESOURCE_vs_num = 160, + SQ_VTX_RESOURCE_fs_num = 16, + SQ_VTX_RESOURCE_gs_num = 160, + SQ_VTX_RESOURCE_all_num = 496, + SQ_VTX_RESOURCE_offset = 28, + SQ_VTX_RESOURCE_ps = 0, + SQ_VTX_RESOURCE_vs = SQ_VTX_RESOURCE_ps + SQ_VTX_RESOURCE_ps_num, + SQ_VTX_RESOURCE_fs = SQ_VTX_RESOURCE_vs + SQ_VTX_RESOURCE_vs_num, + SQ_VTX_RESOURCE_gs = SQ_VTX_RESOURCE_fs + SQ_VTX_RESOURCE_fs_num, + SQ_TEX_SAMPLER_WORD = SQ_TEX_SAMPLER_WORD0_0, /* 18 per PS, VS, GS */ + SQ_TEX_SAMPLER_WORD_ps_num = 18, + SQ_TEX_SAMPLER_WORD_vs_num = 18, + SQ_TEX_SAMPLER_WORD_gs_num = 18, + SQ_TEX_SAMPLER_WORD_all_num = 54, + SQ_TEX_SAMPLER_WORD_offset = 12, + SQ_TEX_SAMPLER_WORD_ps = 0, + SQ_TEX_SAMPLER_WORD_vs = SQ_TEX_SAMPLER_WORD_ps + SQ_TEX_SAMPLER_WORD_ps_num, + SQ_TEX_SAMPLER_WORD_gs = SQ_TEX_SAMPLER_WORD_vs + SQ_TEX_SAMPLER_WORD_vs_num, + SQ_LOOP_CONST = SQ_LOOP_CONST_0, /* 32 per PS, VS, GS */ + SQ_LOOP_CONST_ps_num = 32, + SQ_LOOP_CONST_vs_num = 32, + SQ_LOOP_CONST_gs_num = 32, + SQ_LOOP_CONST_all_num = 96, + SQ_LOOP_CONST_offset = 4, + SQ_LOOP_CONST_ps = 0, + SQ_LOOP_CONST_vs = SQ_LOOP_CONST_ps + SQ_LOOP_CONST_ps_num, + SQ_LOOP_CONST_gs = SQ_LOOP_CONST_vs + SQ_LOOP_CONST_vs_num, + SQ_BOOL_CONST = SQ_BOOL_CONST_0, /* 32 bits per PS, VS, GS */ + SQ_BOOL_CONST_ps_num = 1, + SQ_BOOL_CONST_vs_num = 1, + SQ_BOOL_CONST_gs_num = 1, + SQ_BOOL_CONST_all_num = 3, + SQ_BOOL_CONST_offset = 4, + SQ_BOOL_CONST_ps = 0, + SQ_BOOL_CONST_vs = SQ_BOOL_CONST_ps + SQ_BOOL_CONST_ps_num, + SQ_BOOL_CONST_gs = SQ_BOOL_CONST_vs + SQ_BOOL_CONST_vs_num +}; + + +#endif diff --git a/driver/xf86-video-radeonhd/src/r600_reg_r7xx.h b/driver/xf86-video-radeonhd/src/r600_reg_r7xx.h new file mode 100644 index 000000000..f9c2b661f --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_reg_r7xx.h @@ -0,0 +1,149 @@ +/* + * RadeonHD R6xx, R7xx Register documentation + * + * Copyright (C) 2008-2009 Advanced Micro Devices, Inc. + * Copyright (C) 2008-2009 Matthias Hopf + * + * 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 COPYRIGHT HOLDER(S) 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. + */ + +#ifndef _R600_REG_R7xx_H_ +#define _R600_REG_R7xx_H_ + +/* + * Register update for R7xx chips + */ + +enum { + + /* R7XX_MC_VM_FB_LOCATION = 0x00002024, */ + +/* GRBM_STATUS = 0x00008010, */ + R7XX_TA_BUSY_bit = 1 << 14, + + R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ = 0x00008d8c, + RING0_OFFSET_mask = 0xff << 0, + RING0_OFFSET_shift = 0, + ISOLATE_ES_ENABLE_bit = 1 << 12, + ISOLATE_GS_ENABLE_bit = 1 << 13, + VS_PC_LIMIT_ENABLE_bit = 1 << 14, + +/* SQ_ALU_WORD0 = 0x00008dfc, */ +/* SRC0_SEL_mask = 0x1ff << 0, */ +/* SRC1_SEL_mask = 0x1ff << 13, */ + R7xx_SQ_ALU_SRC_1_DBL_L = 0xf4, + R7xx_SQ_ALU_SRC_1_DBL_M = 0xf5, + R7xx_SQ_ALU_SRC_0_5_DBL_L = 0xf6, + R7xx_SQ_ALU_SRC_0_5_DBL_M = 0xf7, +/* INDEX_MODE_mask = 0x07 << 26, */ + R7xx_SQ_INDEX_GLOBAL = 0x05, + R7xx_SQ_INDEX_GLOBAL_AR_X = 0x06, + R6xx_SQ_ALU_WORD1_OP2 = 0x00008dfc, + R7xx_SQ_ALU_WORD1_OP2_V2 = 0x00008dfc, + R6xx_FOG_MERGE_bit = 1 << 5, + R6xx_OMOD_mask = 0x03 << 6, + R7xx_OMOD_mask = 0x03 << 5, + R6xx_OMOD_shift = 6, + R7xx_OMOD_shift = 5, + R6xx_SQ_ALU_WORD1_OP2__ALU_INST_mask = 0x3ff << 8, + R7xx_SQ_ALU_WORD1_OP2_V2__ALU_INST_mask = 0x7ff << 7, + R6xx_SQ_ALU_WORD1_OP2__ALU_INST_shift = 8, + R7xx_SQ_ALU_WORD1_OP2_V2__ALU_INST_shift = 7, + R7xx_SQ_OP2_INST_FREXP_64 = 0x07, + R7xx_SQ_OP2_INST_ADD_64 = 0x17, + R7xx_SQ_OP2_INST_MUL_64 = 0x1b, + R7xx_SQ_OP2_INST_FLT64_TO_FLT32 = 0x1c, + R7xx_SQ_OP2_INST_FLT32_TO_FLT64 = 0x1d, + R7xx_SQ_OP2_INST_LDEXP_64 = 0x7a, + R7xx_SQ_OP2_INST_FRACT_64 = 0x7b, + R7xx_SQ_OP2_INST_PRED_SETGT_64 = 0x7c, + R7xx_SQ_OP2_INST_PRED_SETE_64 = 0x7d, + R7xx_SQ_OP2_INST_PRED_SETGE_64 = 0x7e, +/* SQ_ALU_WORD1_OP3 = 0x00008dfc, */ +/* SRC2_SEL_mask = 0x1ff << 0, */ +/* R7xx_SQ_ALU_SRC_1_DBL_L = 0xf4, */ +/* R7xx_SQ_ALU_SRC_1_DBL_M = 0xf5, */ +/* R7xx_SQ_ALU_SRC_0_5_DBL_L = 0xf6, */ +/* R7xx_SQ_ALU_SRC_0_5_DBL_M = 0xf7, */ +/* SQ_ALU_WORD1_OP3__ALU_INST_mask = 0x1f << 13, */ + R7xx_SQ_OP3_INST_MULADD_64 = 0x08, + R7xx_SQ_OP3_INST_MULADD_64_M2 = 0x09, + R7xx_SQ_OP3_INST_MULADD_64_M4 = 0x0a, + R7xx_SQ_OP3_INST_MULADD_64_D2 = 0x0b, +/* SQ_CF_ALU_WORD1 = 0x00008dfc, */ + R6xx_USES_WATERFALL_bit = 1 << 25, + R7xx_SQ_CF_ALU_WORD1__ALT_CONST_bit = 1 << 25, +/* SQ_CF_ALLOC_EXPORT_WORD0 = 0x00008dfc, */ +/* ARRAY_BASE_mask = 0x1fff << 0, */ +/* TYPE_mask = 0x03 << 13, */ +/* SQ_EXPORT_PARAM = 0x02, */ +/* X_UNUSED_FOR_SX_EXPORTS = 0x03, */ +/* ELEM_SIZE_mask = 0x03 << 30, */ +/* SQ_CF_ALLOC_EXPORT_WORD1 = 0x00008dfc, */ +/* SQ_CF_ALLOC_EXPORT_WORD1__CF_INST_mask = 0x7f << 23, */ + R7xx_SQ_CF_INST_MEM_EXPORT = 0x3a, +/* SQ_CF_WORD1 = 0x00008dfc, */ +/* SQ_CF_WORD1__COUNT_mask = 0x07 << 10, */ + R7xx_COUNT_3_bit = 1 << 19, +/* SQ_CF_WORD1__CF_INST_mask = 0x7f << 23, */ + R7xx_SQ_CF_INST_END_PROGRAM = 0x19, + R7xx_SQ_CF_INST_WAIT_ACK = 0x1a, + R7xx_SQ_CF_INST_TEX_ACK = 0x1b, + R7xx_SQ_CF_INST_VTX_ACK = 0x1c, + R7xx_SQ_CF_INST_VTX_TC_ACK = 0x1d, +/* SQ_VTX_WORD0 = 0x00008dfc, */ +/* VTX_INST_mask = 0x1f << 0, */ + R7xx_SQ_VTX_INST_MEM = 0x02, +/* SQ_VTX_WORD2 = 0x00008dfc, */ + R7xx_SQ_VTX_WORD2__ALT_CONST_bit = 1 << 20, + +/* SQ_TEX_WORD0 = 0x00008dfc, */ +/* TEX_INST_mask = 0x1f << 0, */ + R7xx_X_MEMORY_READ = 0x02, + R7xx_SQ_TEX_INST_KEEP_GRADIENTS = 0x0a, + R7xx_X_FETCH4_LOAD4_INSTRUCTION_FOR_DX10_1 = 0x0f, + R7xx_SQ_TEX_WORD0__ALT_CONST_bit = 1 << 24, + + R7xx_PA_SC_EDGERULE = 0x00028230, + R7xx_SPI_THREAD_GROUPING = 0x000286c8, + PS_GROUPING_mask = 0x1f << 0, + PS_GROUPING_shift = 0, + VS_GROUPING_mask = 0x1f << 8, + VS_GROUPING_shift = 8, + GS_GROUPING_mask = 0x1f << 16, + GS_GROUPING_shift = 16, + ES_GROUPING_mask = 0x1f << 24, + ES_GROUPING_shift = 24, + R7xx_CB_SHADER_CONTROL = 0x000287a0, + RT0_ENABLE_bit = 1 << 0, + RT1_ENABLE_bit = 1 << 1, + RT2_ENABLE_bit = 1 << 2, + RT3_ENABLE_bit = 1 << 3, + RT4_ENABLE_bit = 1 << 4, + RT5_ENABLE_bit = 1 << 5, + RT6_ENABLE_bit = 1 << 6, + RT7_ENABLE_bit = 1 << 7, +/* DB_ALPHA_TO_MASK = 0x00028d44, */ + R7xx_OFFSET_ROUND_bit = 1 << 16, +/* SQ_TEX_SAMPLER_MISC_0 = 0x0003d03c, */ + R7xx_TRUNCATE_COORD_bit = 1 << 9, + R7xx_DISABLE_CUBE_WRAP_bit = 1 << 10 + +} ; + +#endif /* _R600_REG_R7xx_H_ */ diff --git a/driver/xf86-video-radeonhd/src/r600_shader.c b/driver/xf86-video-radeonhd/src/r600_shader.c new file mode 100644 index 000000000..ab6e9b2fa --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_shader.c @@ -0,0 +1,1848 @@ +/* + * Copyright 2008 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 (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 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. + * + * Author: Alex Deucher + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "r600_shader.h" +#include "r600_reg.h" + +/* solid vs --------------------------------------- */ +int R600_solid_vs(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i=0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(4)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(1), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_VTX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 1 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), + TYPE(SQ_EXPORT_POS), + RW_GPR(1), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 2 - always export a param whether it's used or not */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(0), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 3 - padding */ + shader[i++] = 0x00000000; + shader[i++] = 0x00000000; + /* 4/5 */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(0), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(1)); + shader[i++] = VTX_DWORD_PAD; + + return i; +} + +/* solid ps --------------------------------------- */ +int R600_solid_ps(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i=0; + + /* 0 */ + shader[i++] = CF_ALU_DWORD0(ADDR(2), + KCACHE_BANK0(0), + KCACHE_BANK1(0), + KCACHE_MODE0(SQ_CF_KCACHE_NOP)); + shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), + KCACHE_ADDR0(0), + KCACHE_ADDR1(0), + I_COUNT(4), + USES_WATERFALL(0), + CF_INST(SQ_CF_INST_ALU), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 1 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), + TYPE(SQ_EXPORT_PIXEL), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(1)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + + /* 2 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(256), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_AR_X), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MOV), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 3 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(256), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_AR_X), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MOV), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 4 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(256), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_AR_X), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MOV), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 5 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(256), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_AR_X), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MOV), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(1)); + + return i; +} + +/* copy vs --------------------------------------- */ +int R600_copy_vs(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i=0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(4)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(2), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_VTX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 1 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), + TYPE(SQ_EXPORT_POS), + RW_GPR(1), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 2 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(0), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 3 */ + shader[i++] = 0x00000000; + shader[i++] = 0x00000000; + /* 4/5 */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(16)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(0), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(1)); + shader[i++] = VTX_DWORD_PAD; + /* 6/7 */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(8), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + + return i; +} + +/* copy ps --------------------------------------- */ +int R600_copy_ps(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i=0; + + /* CF INST 0 */ + shader[i++] = CF_DWORD0(ADDR(2)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(1), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_TEX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* CF INST 1 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), + TYPE(SQ_EXPORT_PIXEL), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(1)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* TEX INST 0 */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(0), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), /* R */ + DST_SEL_Y(SQ_SEL_Y), /* G */ + DST_SEL_Z(SQ_SEL_Z), /* B */ + DST_SEL_W(SQ_SEL_W), /* A */ + LOD_BIAS(0), + COORD_TYPE_X(TEX_UNNORMALIZED), + COORD_TYPE_Y(TEX_UNNORMALIZED), + COORD_TYPE_Z(TEX_UNNORMALIZED), + COORD_TYPE_W(TEX_UNNORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(0), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + + return i; +} + +/* + * ; xv vertex shader + * 00 VTX: ADDR(4) CNT(2) + * 0 VFETCH R1.xy01, R0.x, fc0 MEGA(16) FORMAT(32_32_FLOAT) + * FORMAT_COMP(SIGNED) + * 1 VFETCH R0.xy01, R0.x, fc0 MINI(8) OFFSET(8) FORMAT(32_32_FLOAT) + * FORMAT_COMP(SIGNED) + * 01 EXP_DONE: POS0, R1 + * 02 EXP_DONE: PARAM0, R0 NO_BARRIER + * END_OF_PROGRAM + */ +int R600_xv_vs(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i=0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(4)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(2), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_VTX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 1 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), + TYPE(SQ_EXPORT_POS), + RW_GPR(1), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(3)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 2 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(3)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + shader[i++] = 0x00000000; + shader[i++] = 0x00000000; + /* 4/5 */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(16)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(0), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(1)); + shader[i++] = VTX_DWORD_PAD; + /* 6/7 */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(8), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + + return i; +} + +/* + * ; xv ps planar + * 00 TEX: ADDR(20) CNT(3) NO_BARRIER + * 0 SAMPLE R1.x__1, R0.xy01, t0, s0 + * 1 SAMPLE R1.__x_, R0.xy01, t1, s1 + * 2 SAMPLE R1._x__, R0.xy01, t2, s2 + * 01 TEX: ADDR(28) CNT(2) NO_BARRIER + * 0 SAMPLE R1.x__1, R0.xy01, t0, s0 + * 1 SAMPLE R1._xy_, R0.xy01, t1, s1 + * 02 ALU: ADDR(4) CNT(16) + * 3 x: MULADD R1.x, R1.x, C3.x, C3.y CLAMP + * y: MULADD R1.y, R1.y, C3.z, C3.w + * z: MULADD R1.z, R1.z, C3.z, C3.w + * w: MOV R1.w, 0.0f + * 4 x: DOT4 R2.x, R1.x, C0.x CLAMP VEC_102 + * y: DOT4 ____, R1.y, C0.y CLAMP VEC_102 + * z: DOT4 ____, R1.z, C0.z CLAMP VEC_102 + * w: DOT4 ____, R1.w, C0.w CLAMP VEC_021 + * 5 x: DOT4 ____, R1.x, C1.x CLAMP VEC_102 + * y: DOT4 R2.y, R1.y, C1.y CLAMP VEC_102 + * z: DOT4 ____, R1.z, C1.z CLAMP VEC_102 + * w: DOT4 ____, R1.w, C1.w CLAMP VEC_021 + * 6 x: DOT4 ____, R1.x, C2.x CLAMP VEC_102 + * y: DOT4 ____, R1.y, C2.y CLAMP VEC_102 + * z: DOT4 R2.z, R1.z, C2.z CLAMP VEC_102 + * w: DOT4 ____, R1.w, C2.w CLAMP VEC_021 + * 03 EXP_DONE: PIX0, R2 + * END_OF_PROGRAM + */ +int R600_xv_ps(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i = 0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(20)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_BOOL), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_CALL), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 1 */ + shader[i++] = CF_DWORD0(ADDR(28)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_NOT_BOOL), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_CALL), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 2 */ + shader[i++] = CF_ALU_DWORD0(ADDR(4), + KCACHE_BANK0(0), + KCACHE_BANK1(0), + KCACHE_MODE0(SQ_CF_KCACHE_NOP)); + shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), + KCACHE_ADDR0(0), + KCACHE_ADDR1(0), + I_COUNT(16), + USES_WATERFALL(0), + CF_INST(SQ_CF_INST_ALU), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 3 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), + TYPE(SQ_EXPORT_PIXEL), + RW_GPR(2), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(3)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 4 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(259), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(259), + SRC2_REL(ABSOLUTE), + SRC2_ELEM(ELEM_Y), + SRC2_NEG(0), + ALU_INST(SQ_OP3_INST_MULADD), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(1), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 5 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(259), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(259), + SRC2_REL(ABSOLUTE), + SRC2_ELEM(ELEM_W), + SRC2_NEG(0), + ALU_INST(SQ_OP3_INST_MULADD), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(1), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(0)); + /* 6 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(259), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP3(SRC2_SEL(259), + SRC2_REL(ABSOLUTE), + SRC2_ELEM(ELEM_W), + SRC2_NEG(0), + ALU_INST(SQ_OP3_INST_MULADD), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(1), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(0)); + /* 7 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(SQ_ALU_SRC_0), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(SQ_ALU_SRC_0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MOV), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(1), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(0)); + /* 8 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 9 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 10 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 11 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(256), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_021), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(1)); + /* 12 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 13 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 14 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 15 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(257), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_021), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(1)); + /* 16 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 17 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 18 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_102), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 19 */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(258), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(0), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_DOT4), + BANK_SWIZZLE(SQ_ALU_VEC_021), + DST_GPR(0), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(1)); + /* 20 */ + shader[i++] = CF_DWORD0(ADDR(22)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(3), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_TEX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 21 */ + shader[i++] = CF_DWORD0(ADDR(0)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_RETURN), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 22/23 */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(1), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_MASK), + DST_SEL_Z(SQ_SEL_MASK), + DST_SEL_W(SQ_SEL_1), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(0), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + /* 24/25 */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(1), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(1), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_MASK), + DST_SEL_Y(SQ_SEL_MASK), + DST_SEL_Z(SQ_SEL_X), + DST_SEL_W(SQ_SEL_MASK), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(1), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + /* 26/27 */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(2), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(1), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_MASK), + DST_SEL_Y(SQ_SEL_X), + DST_SEL_Z(SQ_SEL_MASK), + DST_SEL_W(SQ_SEL_MASK), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(2), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + /* 28 */ + shader[i++] = CF_DWORD0(ADDR(30)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(2), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_TEX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 29 */ + shader[i++] = CF_DWORD0(ADDR(0)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_RETURN), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 30/31 */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(1), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_MASK), + DST_SEL_Z(SQ_SEL_MASK), + DST_SEL_W(SQ_SEL_1), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(0), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + /* 32/33 */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(1), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(1), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_MASK), + DST_SEL_Y(SQ_SEL_X), + DST_SEL_Z(SQ_SEL_Y), + DST_SEL_W(SQ_SEL_MASK), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(1), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + + return i; +} + +/* comp mask ps --------------------------------------- */ +int R600_comp_mask_ps(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i=0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(8)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(2), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_TEX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + + /* 1 */ + shader[i++] = CF_ALU_DWORD0(ADDR(3), + KCACHE_BANK0(0), + KCACHE_BANK1(0), + KCACHE_MODE0(SQ_CF_KCACHE_NOP)); + shader[i++] = CF_ALU_DWORD1(KCACHE_MODE1(SQ_CF_KCACHE_NOP), + KCACHE_ADDR0(0), + KCACHE_ADDR1(0), + I_COUNT(4), + USES_WATERFALL(0), + CF_INST(SQ_CF_INST_ALU), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + + /* 2 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), + TYPE(SQ_EXPORT_PIXEL), + RW_GPR(2), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(1)); + + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + + /* 3 - alu 0 */ + /* MUL gpr[2].x gpr[1].x gpr[0].x */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_X), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_X), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MUL), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_X), + CLAMP(1)); + /* 4 - alu 1 */ + /* MUL gpr[2].y gpr[1].y gpr[0].y */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Y), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Y), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MUL), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Y), + CLAMP(1)); + /* 5 - alu 2 */ + /* MUL gpr[2].z gpr[1].z gpr[0].z */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_Z), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_Z), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(0)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MUL), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_Z), + CLAMP(1)); + /* 6 - alu 3 */ + /* MUL gpr[2].w gpr[1].w gpr[0].w */ + shader[i++] = ALU_DWORD0(SRC0_SEL(1), + SRC0_REL(ABSOLUTE), + SRC0_ELEM(ELEM_W), + SRC0_NEG(0), + SRC1_SEL(0), + SRC1_REL(ABSOLUTE), + SRC1_ELEM(ELEM_W), + SRC1_NEG(0), + INDEX_MODE(SQ_INDEX_LOOP), + PRED_SEL(SQ_PRED_SEL_OFF), + LAST(1)); + shader[i++] = ALU_DWORD1_OP2(ChipSet, + SRC0_ABS(0), + SRC1_ABS(0), + UPDATE_EXECUTE_MASK(0), + UPDATE_PRED(0), + WRITE_MASK(1), + FOG_MERGE(0), + OMOD(SQ_ALU_OMOD_OFF), + ALU_INST(SQ_OP2_INST_MUL), + BANK_SWIZZLE(SQ_ALU_VEC_012), + DST_GPR(2), + DST_REL(ABSOLUTE), + DST_ELEM(ELEM_W), + CLAMP(1)); + /* 7 */ + shader[i++] = 0x00000000; + shader[i++] = 0x00000000; + + /* 8/9 - src */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(0), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_Z), + DST_SEL_W(SQ_SEL_W), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(0), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + /* 10/11 - mask */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(1), + SRC_GPR(1), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(1), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_Z), + DST_SEL_W(SQ_SEL_W), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(1), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + + return i; +} + +/* comp vs --------------------------------------- */ +int R600_comp_vs(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i = 0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(3)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_BOOL), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_CALL), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 1 */ + shader[i++] = CF_DWORD0(ADDR(14)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_NOT_BOOL), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_CALL), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 2 */ + shader[i++] = CF_DWORD0(0); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_NOP), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 3 - mask sub */ + shader[i++] = CF_DWORD0(ADDR(8)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(3), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_VTX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 4 - dst */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), + TYPE(SQ_EXPORT_POS), + RW_GPR(2), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 5 - src */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(1), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 6 - mask */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(1), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 7 */ + shader[i++] = CF_DWORD0(ADDR(0)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_RETURN), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 8/9 - dst */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(24)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(2), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(0), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(1)); + shader[i++] = VTX_DWORD_PAD; + /* 10/11 - src */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(8), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + /* 12/13 - mask */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(16), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + + /* 14 - non-mask sub */ + shader[i++] = CF_DWORD0(ADDR(18)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(2), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_VTX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 15 - dst */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_POS0), + TYPE(SQ_EXPORT_POS), + RW_GPR(1), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 16 - src */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(0), + TYPE(SQ_EXPORT_PARAM), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(0)); + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(0)); + /* 17 */ + shader[i++] = CF_DWORD0(ADDR(0)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(0), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_RETURN), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 18/19 - dst */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(16)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(1), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(0), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(1)); + shader[i++] = VTX_DWORD_PAD; + /* 20/21 - src */ + shader[i++] = VTX_DWORD0(VTX_INST(SQ_VTX_INST_FETCH), + FETCH_TYPE(SQ_VTX_FETCH_VERTEX_DATA), + FETCH_WHOLE_QUAD(0), + BUFFER_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + SRC_SEL_X(SQ_SEL_X), + MEGA_FETCH_COUNT(8)); + shader[i++] = VTX_DWORD1_GPR(DST_GPR(0), + DST_REL(0), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_0), + DST_SEL_W(SQ_SEL_1), + USE_CONST_FIELDS(0), + DATA_FORMAT(FMT_32_32_FLOAT), /* xxx */ + NUM_FORMAT_ALL(SQ_NUM_FORMAT_NORM), /* xxx */ + FORMAT_COMP_ALL(SQ_FORMAT_COMP_SIGNED), /* xxx */ + SRF_MODE_ALL(SRF_MODE_ZERO_CLAMP_MINUS_ONE)); + shader[i++] = VTX_DWORD2(OFFSET(8), + ENDIAN_SWAP(ENDIAN_NONE), + CONST_BUF_NO_STRIDE(0), + MEGA_FETCH(0)); + shader[i++] = VTX_DWORD_PAD; + + return i; +} + +/* comp ps --------------------------------------- */ +int R600_comp_ps(enum RHD_CHIPSETS ChipSet, CARD32* shader) +{ + int i=0; + + /* 0 */ + shader[i++] = CF_DWORD0(ADDR(2)); + shader[i++] = CF_DWORD1(POP_COUNT(0), + CF_CONST(0), + COND(SQ_CF_COND_ACTIVE), + I_COUNT(1), + CALL_COUNT(0), + END_OF_PROGRAM(0), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_TEX), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + /* 1 */ + shader[i++] = CF_ALLOC_IMP_EXP_DWORD0(ARRAY_BASE(CF_PIXEL_MRT0), + TYPE(SQ_EXPORT_PIXEL), + RW_GPR(0), + RW_REL(ABSOLUTE), + INDEX_GPR(0), + ELEM_SIZE(1)); + + shader[i++] = CF_ALLOC_IMP_EXP_DWORD1_SWIZ(SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_Z), + SRC_SEL_W(SQ_SEL_W), + R6xx_ELEM_LOOP(0), + BURST_COUNT(1), + END_OF_PROGRAM(1), + VALID_PIXEL_MODE(0), + CF_INST(SQ_CF_INST_EXPORT_DONE), + WHOLE_QUAD_MODE(0), + BARRIER(1)); + + + /* 2/3 - src */ + shader[i++] = TEX_DWORD0(TEX_INST(SQ_TEX_INST_SAMPLE), + BC_FRAC_MODE(0), + FETCH_WHOLE_QUAD(0), + RESOURCE_ID(0), + SRC_GPR(0), + SRC_REL(ABSOLUTE), + R7xx_ALT_CONST(0)); + shader[i++] = TEX_DWORD1(DST_GPR(0), + DST_REL(ABSOLUTE), + DST_SEL_X(SQ_SEL_X), + DST_SEL_Y(SQ_SEL_Y), + DST_SEL_Z(SQ_SEL_Z), + DST_SEL_W(SQ_SEL_W), + LOD_BIAS(0), + COORD_TYPE_X(TEX_NORMALIZED), + COORD_TYPE_Y(TEX_NORMALIZED), + COORD_TYPE_Z(TEX_NORMALIZED), + COORD_TYPE_W(TEX_NORMALIZED)); + shader[i++] = TEX_DWORD2(OFFSET_X(0), + OFFSET_Y(0), + OFFSET_Z(0), + SAMPLER_ID(0), + SRC_SEL_X(SQ_SEL_X), + SRC_SEL_Y(SQ_SEL_Y), + SRC_SEL_Z(SQ_SEL_0), + SRC_SEL_W(SQ_SEL_1)); + shader[i++] = TEX_DWORD_PAD; + + return i; +} diff --git a/driver/xf86-video-radeonhd/src/r600_shader.h b/driver/xf86-video-radeonhd/src/r600_shader.h new file mode 100644 index 000000000..01ec1223e --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_shader.h @@ -0,0 +1,359 @@ +/* + * RadeonHD R6xx, R7xx DRI driver + * + * Copyright (C) 2008-2009 Alexander Deucher + * Copyright (C) 2008-2009 Matthias Hopf + * + * 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 + * BRIAN PAUL 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. + */ + +/* + * Shader macros + */ + +#ifndef __SHADER_H__ +#define __SHADER_H__ + + +/* Restrictions of ALU instructions + * order of scalar ops is always x,y,z,w,t(rans), last to be indicated by last==1. + * max of 3 different src GPRs per instr. + * max of 4 different cfile constant components per instr. + * max of 2 (different) constants (any type) for t. + * bank swizzle (see below). + * GPR write stalls read of same register. Auto-replaced by PV/PS, NOP needed if registers are relative to + * different indices (gpr,loop,nothing). + * may use constant registers or constant cache, but not both. + */ + +/* Bank_swizzle: (pp. 297ff) + * Only one of each x,y,z,w GPR component can be loaded per cycle (3 cycles per instr, called 0-2). + * per scalar instruction bank_swizzle can select which cycle each operand comes from. e.g.: + * SRC0 SRC1 SRC2 SWIZZLE cycle0 cycle1 cycle2 + * 1.x 2.x 012 1.x 2.x - + * 3.x 1.y 201 1.y - 3.x + * 2.x 1.y 102 (1.y) (2.x) - + * If data is read in a cycle, multiple scalar instructions can reference it. + * Special case: square() - i.e. same component in src0+src1 doesn't need read port -> ignores swizzle for src1. + * No restrictions for constants or PV/PS. + * t can load multiple components in a single cycle slot, but has to share cycles with xyzw. + * t with single constant may not load GPRs or PV/PS in cycle 0 (carefull with ALU_TRANS_210). + * t with two constants may only load GPRs or PV/PS in cycle 2. + */ + + +/* Oder of instructions: All CF, All ALU, All Tex/Vtx fetches */ + + +/* CF insts */ +/* addr */ +#define ADDR(x) (x) +/* pc */ +#define POP_COUNT(x) (x) +/* const */ +#define CF_CONST(x) (x) +/* cond */ +#define COND(x) (x) /* SQ_COND_* */ +/* count */ +#define I_COUNT(x) ((x) ? ((x) - 1) : 0) +/*r7xx */ +#define COUNT_3(x) (x) +/* call count */ +#define CALL_COUNT(x) (x) +/* eop */ +#define END_OF_PROGRAM(x) (x) +/* vpm */ +#define VALID_PIXEL_MODE(x) (x) +/* cf inst */ +#define CF_INST(x) (x) /* SQ_CF_INST_* */ + +/* wqm */ +#define WHOLE_QUAD_MODE(x) (x) +/* barrier */ +#define BARRIER(x) (x) +/*kb0 */ +#define KCACHE_BANK0(x) (x) +/*kb1 */ +#define KCACHE_BANK1(x) (x) +/* km0/1 */ +#define KCACHE_MODE0(x) (x) +#define KCACHE_MODE1(x) (x) /* SQ_CF_KCACHE_* */ +/* */ +#define KCACHE_ADDR0(x) (x) +#define KCACHE_ADDR1(x) (x) +/* uw */ +#define USES_WATERFALL(x) (x) + +#define ARRAY_BASE(x) (x) +/* export pixel */ +#define CF_PIXEL_MRT0 0 +#define CF_PIXEL_MRT1 1 +#define CF_PIXEL_MRT2 2 +#define CF_PIXEL_MRT3 3 +#define CF_PIXEL_MRT4 4 +#define CF_PIXEL_MRT5 5 +#define CF_PIXEL_MRT6 6 +#define CF_PIXEL_MRT7 7 +/* *_FOG: r6xx only */ +#define CF_PIXEL_MRT0_FOG 16 +#define CF_PIXEL_MRT1_FOG 17 +#define CF_PIXEL_MRT2_FOG 18 +#define CF_PIXEL_MRT3_FOG 19 +#define CF_PIXEL_MRT4_FOG 20 +#define CF_PIXEL_MRT5_FOG 21 +#define CF_PIXEL_MRT6_FOG 22 +#define CF_PIXEL_MRT7_FOG 23 +#define CF_PIXEL_Z 61 +/* export pos */ +#define CF_POS0 60 +#define CF_POS1 61 +#define CF_POS2 62 +#define CF_POS3 63 +/* export param */ +/* 0...31 */ +#define TYPE(x) (x) /* SQ_EXPORT_* */ +#if 0 +/* type export */ +#define SQ_EXPORT_PIXEL 0 +#define SQ_EXPORT_POS 1 +#define SQ_EXPORT_PARAM 2 +/* reserved 3 */ +/* type mem */ +#define SQ_EXPORT_WRITE 0 +#define SQ_EXPORT_WRITE_IND 1 +#define SQ_EXPORT_WRITE_ACK 2 +#define SQ_EXPORT_WRITE_IND_ACK 3 +#endif + +#define RW_GPR(x) (x) +#define RW_REL(x) (x) +#define ABSOLUTE 0 +#define RELATIVE 1 +#define INDEX_GPR(x) (x) +#define ELEM_SIZE(x) (x ? (x - 1) : 0) +#define COMP_MASK(x) (x) +#define R6xx_ELEM_LOOP(x) (x) +#define BURST_COUNT(x) (x ? (x - 1) : 0) + +/* swiz */ +#define SRC_SEL_X(x) (x) /* SQ_SEL_* each */ +#define SRC_SEL_Y(x) (x) +#define SRC_SEL_Z(x) (x) +#define SRC_SEL_W(x) (x) + +#define CF_DWORD0(addr) (addr) +/* R7xx has another entry (COUNT3), but that is only used for adding a bit to count. */ +/* We allow one more bit for count in the argument of the macro on R7xx instead. */ +/* R6xx: [0,7] R7xx: [1,16] */ +#define CF_DWORD1(pc, cf_const, cond, count, call_count, eop, vpm, cf_inst, wqm, b) \ + (((pc) << 0) | ((cf_const) << 3) | ((cond) << 8) | (((count) & 7) << 10) | (((count) >> 3) << 19) | \ + ((call_count) << 13) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31)) + +#define CF_ALU_DWORD0(addr, kb0, kb1, km0) (((addr) << 0) | ((kb0) << 22) | ((kb1) << 26) | ((km0) << 30)) +#define CF_ALU_DWORD1(km1, kcache_addr0, kcache_addr1, count, uw, cf_inst, wqm, b) \ + (((km1) << 0) | ((kcache_addr0) << 2) | ((kcache_addr1) << 10) | \ + ((count) << 18) | ((uw) << 25) | ((cf_inst) << 26) | ((wqm) << 30) | ((b) << 31)) + +#define CF_ALLOC_IMP_EXP_DWORD0(array_base, type, rw_gpr, rr, index_gpr, es) \ + (((array_base) << 0) | ((type) << 13) | ((rw_gpr) << 15) | ((rr) << 22) | ((index_gpr) << 23) | \ + ((es) << 30)) +/* R7xx apparently doesn't have the ELEM_LOOP entry any more */ +/* We still expose it, but ELEM_LOOP is explicitely R6xx now. */ +/* TODO: is this just forgotten in the docs, or really not available any more? */ +#define CF_ALLOC_IMP_EXP_DWORD1_BUF(array_size, comp_mask, el, bc, eop, vpm, cf_inst, wqm, b) \ + (((array_size) << 0) | ((comp_mask) << 12) | ((el) << 16) | ((bc) << 17) | \ + ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | ((wqm) << 30) | ((b) << 31)) +#define CF_ALLOC_IMP_EXP_DWORD1_SWIZ(sel_x, sel_y, sel_z, sel_w, el, bc, eop, vpm, cf_inst, wqm, b) \ + (((sel_x) << 0) | ((sel_y) << 3) | ((sel_z) << 6) | ((sel_w) << 9) | ((el) << 16) | \ + ((bc) << 17) | ((eop) << 21) | ((vpm) << 22) | ((cf_inst) << 23) | \ + ((wqm) << 30) | ((b) << 31)) + +/* ALU clause insts */ +#define SRC0_SEL(x) (x) +#define SRC1_SEL(x) (x) +#define SRC2_SEL(x) (x) +/* src[0-2]_sel */ +/* 0-127 GPR */ +/* 128-159 kcache constants bank 0 */ +/* 160-191 kcache constants bank 1 */ +/* 248-255 special SQ_ALU_SRC_* (0, 1, etc.) */ + +#define SRC0_REL(x) (x) +#define SRC1_REL(x) (x) +#define SRC2_REL(x) (x) +/* elem */ +#define SRC0_ELEM(x) (x) +#define SRC1_ELEM(x) (x) +#define SRC2_ELEM(x) (x) +#define ELEM_X 0 +#define ELEM_Y 1 +#define ELEM_Z 2 +#define ELEM_W 3 +/* neg */ +#define SRC0_NEG(x) (x) +#define SRC1_NEG(x) (x) +#define SRC2_NEG(x) (x) +/* im */ +#define INDEX_MODE(x) (x) /* SQ_INDEX_* */ +/* ps */ +#define PRED_SEL(x) (x) /* SQ_PRED_SEL_* */ +/* last */ +#define LAST(x) (x) +/* abs */ +#define SRC0_ABS(x) (x) +#define SRC1_ABS(x) (x) +/* uem */ +#define UPDATE_EXECUTE_MASK(x) (x) +/* up */ +#define UPDATE_PRED(x) (x) +/* wm */ +#define WRITE_MASK(x) (x) +/* fm */ +#define FOG_MERGE(x) (x) +/* omod */ +#define OMOD(x) (x) /* SQ_ALU_OMOD_* */ +/* alu inst */ +#define ALU_INST(x) (x) /* SQ_ALU_INST_* */ +/*bs */ +#define BANK_SWIZZLE(x) (x) /* SQ_ALU_VEC_* */ +#define DST_GPR(x) (x) +#define DST_REL(x) (x) +#define DST_ELEM(x) (x) +#define CLAMP(x) (x) + +#define ALU_DWORD0(src0_sel, s0r, s0e, s0n, src1_sel, s1r, s1e, s1n, im, ps, last) \ + (((src0_sel) << 0) | ((s0r) << 9) | ((s0e) << 10) | ((s0n) << 12) | \ + ((src1_sel) << 13) | ((s1r) << 22) | ((s1e) << 23) | ((s1n) << 25) | \ + ((im) << 26) | ((ps) << 29) | ((last) << 31)) +/* R7xx has alu_inst at a different slot, and no fog merge any more (no fix function fog any more) */ +#define R6xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ + (((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ + ((fm) << 5) | ((omod) << 6) | ((alu_inst) << 8) | ((bs) << 18) | ((dst_gpr) << 21) | \ + ((dr) << 28) | ((de) << 29) | ((clamp) << 31)) +#define R7xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ + (((s0a) << 0) | ((s1a) << 1) | ((uem) << 2) | ((up) << 3) | ((wm) << 4) | \ + ((omod) << 5) | ((alu_inst) << 7) | ((bs) << 18) | ((dst_gpr) << 21) | \ + ((dr) << 28) | ((de) << 29) | ((clamp) << 31)) +/* This is a general chipset macro, but due to selection by chipid typically not usable in static arrays */ +/* Fog is NOT USED on R7xx, even if specified. */ +#define ALU_DWORD1_OP2(chipid, s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) \ + ((chipid) < RHD_RV770 ? \ + R6xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, fm, omod, alu_inst, bs, dst_gpr, dr, de, clamp) : \ + R7xx_ALU_DWORD1_OP2(s0a, s1a, uem, up, wm, omod, alu_inst, bs, dst_gpr, dr, de, clamp)) +#define ALU_DWORD1_OP3(src2_sel, s2r, s2e, s2n, alu_inst, bs, dst_gpr, dr, de, clamp) \ + (((src2_sel) << 0) | ((s2r) << 9) | ((s2e) << 10) | ((s2n) << 12) | \ + ((alu_inst) << 13) | ((bs) << 18) | ((dst_gpr) << 21) | ((dr) << 28) | \ + ((de) << 29) | ((clamp) << 31)) + +/* VTX clause insts */ +/* vxt insts */ +#define VTX_INST(x) (x) /* SQ_VTX_INST_* */ + +/* fetch type */ +#define FETCH_TYPE(x) (x) /* SQ_VTX_FETCH_* */ + +#define FETCH_WHOLE_QUAD(x) (x) +#define BUFFER_ID(x) (x) +#define SRC_GPR(x) (x) +#define SRC_REL(x) (x) +#define MEGA_FETCH_COUNT(x) ((x) ? ((x) - 1) : 0) + +#define SEMANTIC_ID(x) (x) +#define DST_SEL_X(x) (x) +#define DST_SEL_Y(x) (x) +#define DST_SEL_Z(x) (x) +#define DST_SEL_W(x) (x) +#define USE_CONST_FIELDS(x) (x) +#define DATA_FORMAT(x) (x) +/* num format */ +#define NUM_FORMAT_ALL(x) (x) /* SQ_NUM_FORMAT_* */ +/* format comp */ +#define FORMAT_COMP_ALL(x) (x) /* SQ_FORMAT_COMP_* */ +/* sma */ +#define SRF_MODE_ALL(x) (x) +#define SRF_MODE_ZERO_CLAMP_MINUS_ONE 0 +#define SRF_MODE_NO_ZERO 1 +#define OFFSET(x) (x) +/* endian swap */ +#define ENDIAN_SWAP(x) (x) /* SQ_ENDIAN_* */ +#define CONST_BUF_NO_STRIDE(x) (x) +/* mf */ +#define MEGA_FETCH(x) (x) + +#define VTX_DWORD0(vtx_inst, ft, fwq, buffer_id, src_gpr, sr, ssx, mfc) \ + (((vtx_inst) << 0) | ((ft) << 5) | ((fwq) << 7) | ((buffer_id) << 8) | \ + ((src_gpr) << 16) | ((sr) << 23) | ((ssx) << 24) | ((mfc) << 26)) +#define VTX_DWORD1_SEM(semantic_id, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ + (((semantic_id) << 0) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ + ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31)) +#define VTX_DWORD1_GPR(dst_gpr, dr, dsx, dsy, dsz, dsw, ucf, data_format, nfa, fca, sma) \ + (((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ + ((ucf) << 21) | ((data_format) << 22) | ((nfa) << 28) | ((fca) << 30) | ((sma) << 31)) +#define VTX_DWORD2(offset, es, cbns, mf) \ + (((offset) << 0) | ((es) << 16) | ((cbns) << 18) | ((mf) << 19)) +#define VTX_DWORD_PAD 0x00000000 + +/* TEX clause insts */ +/* tex insts */ +#define TEX_INST(x) (x) /* SQ_TEX_INST_* */ + +#define BC_FRAC_MODE(x) (x) +#define FETCH_WHOLE_QUAD(x) (x) +#define RESOURCE_ID(x) (x) +#define R7xx_ALT_CONST(x) (x) + +#define LOD_BIAS(x) (x) +/*ct */ +#define COORD_TYPE_X(x) (x) +#define COORD_TYPE_Y(x) (x) +#define COORD_TYPE_Z(x) (x) +#define COORD_TYPE_W(x) (x) +#define TEX_UNNORMALIZED 0 +#define TEX_NORMALIZED 1 +#define OFFSET_X(x) (((int)(x) * 2) & 0x1f) /* 4:1-bits 2's-complement fixed-point: [-8.0..7.5] */ +#define OFFSET_Y(x) (((int)(x) * 2) & 0x1f) +#define OFFSET_Z(x) (((int)(x) * 2) & 0x1f) +#define SAMPLER_ID(x) (x) + +/* R7xx has an additional parameter ALT_CONST. We always expose it, but ALT_CONST is R7xx only */ +#define TEX_DWORD0(tex_inst, bfm, fwq, resource_id, src_gpr, sr, ac) \ + (((tex_inst) << 0) | ((bfm) << 5) | ((fwq) << 7) | ((resource_id) << 8) | \ + ((src_gpr) << 16) | ((sr) << 23) | ((ac) << 24)) +#define TEX_DWORD1(dst_gpr, dr, dsx, dsy, dsz, dsw, lod_bias, ctx, cty, ctz, ctw) \ + (((dst_gpr) << 0) | ((dr) << 7) | ((dsx) << 9) | ((dsy) << 12) | ((dsz) << 15) | ((dsw) << 18) | \ + ((lod_bias) << 21) | ((ctx) << 28) | ((cty) << 29) | ((ctz) << 30) | ((ctw) << 31)) +#define TEX_DWORD2(offset_x, offset_y, offset_z, sampler_id, ssx, ssy, ssz, ssw) \ + (((offset_x) << 0) | ((offset_y) << 5) | ((offset_z) << 10) | ((sampler_id) << 15) | \ + ((ssx) << 20) | ((ssy) << 23) | ((ssz) << 26) | ((ssw) << 29)) +#define TEX_DWORD_PAD 0x00000000 + + +#endif + +extern int R600_solid_vs(enum RHD_CHIPSETS ChipSet, CARD32* vs); +extern int R600_solid_ps(enum RHD_CHIPSETS ChipSet, CARD32* ps); + +extern int R600_copy_vs(enum RHD_CHIPSETS ChipSet, CARD32* vs); +extern int R600_copy_ps(enum RHD_CHIPSETS ChipSet, CARD32* ps); + +extern int R600_xv_vs(enum RHD_CHIPSETS ChipSet, CARD32* shader); +extern int R600_xv_ps(enum RHD_CHIPSETS ChipSet, CARD32* shader); + +extern int R600_comp_vs(enum RHD_CHIPSETS ChipSet, CARD32* vs); +extern int R600_comp_mask_ps(enum RHD_CHIPSETS ChipSet, CARD32* ps); +extern int R600_comp_ps(enum RHD_CHIPSETS ChipSet, CARD32* ps); diff --git a/driver/xf86-video-radeonhd/src/r600_state.h b/driver/xf86-video-radeonhd/src/r600_state.h new file mode 100644 index 000000000..4339665fa --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_state.h @@ -0,0 +1,293 @@ +#ifndef __R600_STATE_H__ +#define __R600_STATE_H__ + +#include "xf86drm.h" + +typedef int bool_t; + +/* seriously ?! @#$%% */ +# define uint32_t CARD32 +# define uint64_t CARD64 + +#define CLEAR(x) memset (&x, 0, sizeof(x)) + +/* Sequencer / thread handling */ +typedef struct { + int ps_prio; + int vs_prio; + int gs_prio; + int es_prio; + int num_ps_gprs; + int num_vs_gprs; + int num_gs_gprs; + int num_es_gprs; + int num_temp_gprs; + int num_ps_threads; + int num_vs_threads; + int num_gs_threads; + int num_es_threads; + int num_ps_stack_entries; + int num_vs_stack_entries; + int num_gs_stack_entries; + int num_es_stack_entries; +} sq_config_t; + +/* Color buffer / render target */ +typedef struct { + int id; + int w; + int h; + uint64_t base; + int format; + int endian; + int array_mode; /* tiling */ + int number_type; + int read_size; + int comp_swap; + int tile_mode; + int blend_clamp; + int clear_color; + int blend_bypass; + int blend_float32; + int simple_float; + int round_mode; + int tile_compact; + int source_format; +} cb_config_t; + +/* Depth buffer */ +typedef struct { + int w; + int h; + uint64_t base; + int format; + int read_size; + int array_mode; /* tiling */ + int tile_surface_en; + int tile_compact; + int zrange_precision; +} db_config_t; + +/* Shader */ +typedef struct { + uint64_t shader_addr; + int num_gprs; + int stack_size; + int dx10_clamp; + int prime_cache_pgm_en; + int prime_cache_on_draw; + int fetch_cache_lines; + int prime_cache_en; + int prime_cache_on_const; + int clamp_consts; + int export_mode; + int uncached_first_inst; +} shader_config_t; + +/* Vertex buffer / vtx resource */ +typedef struct { + int id; + uint64_t vb_addr; + uint32_t vtx_num_entries; + uint32_t vtx_size_dw; + int clamp_x; + int format; + int num_format_all; + int format_comp_all; + int srf_mode_all; + int endian; + int mem_req_size; +} vtx_resource_t; + +/* Texture resource */ +typedef struct { + int id; + int w; + int h; + int pitch; + int depth; + int dim; + int tile_mode; + int tile_type; + int format; + uint64_t base; + uint64_t mip_base; + int format_comp_x; + int format_comp_y; + int format_comp_z; + int format_comp_w; + int num_format_all; + int srf_mode_all; + int force_degamma; + int endian; + int request_size; + int dst_sel_x; + int dst_sel_y; + int dst_sel_z; + int dst_sel_w; + int base_level; + int last_level; + int base_array; + int last_array; + int mpeg_clamp; + int perf_modulation; + int interlaced; +} tex_resource_t; + +/* Texture sampler */ +typedef struct { + int id; + /* Clamping */ + int clamp_x, clamp_y, clamp_z; + int border_color; + /* Filtering */ + int xy_mag_filter, xy_min_filter; + int z_filter; + int mip_filter; + bool_t high_precision_filter; /* ? */ + int perf_mip; /* ? 0-7 */ + int perf_z; /* ? 3 */ + /* LoD selection */ + int min_lod, max_lod; /* 0-0x3ff */ + int lod_bias; /* 0-0xfff (signed?) */ + int lod_bias2; /* ? 0-0xfff (signed?) */ + bool_t lod_uses_minor_axis; /* ? */ + /* Other stuff */ + bool_t point_sampling_clamp; /* ? */ + bool_t tex_array_override; /* ? */ + bool_t mc_coord_truncate; /* ? */ + bool_t force_degamma; /* ? */ + bool_t fetch_4; /* ? */ + bool_t sample_is_pcf; /* ? */ + bool_t type; /* ? */ + int depth_compare; /* only depth textures? */ + int chroma_key; +} tex_sampler_t; + +/* Draw command */ +typedef struct { + uint32_t prim_type; + uint32_t vgt_draw_initiator; + uint32_t index_type; + uint32_t num_instances; + uint32_t num_indices; +} draw_config_t; + + /* CP packet types */ +#define RADEON_CP_PACKET0 0x00000000 +#define RADEON_CP_PACKET1 0x40000000 +#define RADEON_CP_PACKET2 0x80000000 +#define RADEON_CP_PACKET3 0xC0000000 + +#define RADEON_TIMEOUT 2000000 + +#define E32(ib, dword) \ +do { \ + uint32_t *ib_head = (pointer)(char*)(ib)->address; \ + ib_head[(ib)->used >> 2] = (dword); \ + (ib)->used += 4; \ +} while (0) + +#define EFLOAT(ib, val) \ +do { \ + union { float f; uint32_t d; } a; \ + a.f = (val); \ + E32((ib), a.d); \ +} while (0) + +#define PACK3(ib, cmd, num) \ +do { \ + E32((ib), RADEON_CP_PACKET3 | ((cmd) << 8) | ((((num) - 1) & 0x3fff) << 16)); \ +} while (0) + +/* write num registers, start at reg */ +/* If register falls in a special area, special commands are issued */ +#define PACK0(ib, reg, num) \ +do { \ + if ((reg) >= SET_CONFIG_REG_offset && (reg) < SET_CONFIG_REG_end) { \ + PACK3((ib), IT_SET_CONFIG_REG, (num) + 1); \ + E32(ib, ((reg) - SET_CONFIG_REG_offset) >> 2); \ + } else if ((reg) >= SET_CONTEXT_REG_offset && (reg) < SET_CONTEXT_REG_end) { \ + PACK3((ib), IT_SET_CONTEXT_REG, (num) + 1); \ + E32(ib, ((reg) - 0x28000) >> 2); \ + } else if ((reg) >= SET_ALU_CONST_offset && (reg) < SET_ALU_CONST_end) { \ + PACK3((ib), IT_SET_ALU_CONST, (num) + 1); \ + E32(ib, ((reg) - SET_ALU_CONST_offset) >> 2); \ + } else if ((reg) >= SET_RESOURCE_offset && (reg) < SET_RESOURCE_end) { \ + PACK3((ib), IT_SET_RESOURCE, num + 1); \ + E32((ib), ((reg) - SET_RESOURCE_offset) >> 2); \ + } else if ((reg) >= SET_SAMPLER_offset && (reg) < SET_SAMPLER_end) { \ + PACK3((ib), IT_SET_SAMPLER, (num) + 1); \ + E32((ib), (reg - SET_SAMPLER_offset) >> 2); \ + } else if ((reg) >= SET_CTL_CONST_offset && (reg) < SET_CTL_CONST_end) { \ + PACK3((ib), IT_SET_CTL_CONST, (num) + 1); \ + E32((ib), ((reg) - SET_CTL_CONST_offset) >> 2); \ + } else if ((reg) >= SET_LOOP_CONST_offset && (reg) < SET_LOOP_CONST_end) { \ + PACK3((ib), IT_SET_LOOP_CONST, (num) + 1); \ + E32((ib), ((reg) - SET_LOOP_CONST_offset) >> 2); \ + } else if ((reg) >= SET_BOOL_CONST_offset && (reg) < SET_BOOL_CONST_end) { \ + PACK3((ib), IT_SET_BOOL_CONST, (num) + 1); \ + E32((ib), ((reg) - SET_BOOL_CONST_offset) >> 2); \ + } else { \ + E32((ib), CP_PACKET0 ((reg), (num))); \ + } \ +} while (0) + +/* write a single register */ +#define EREG(ib, reg, val) \ +do { \ + PACK0((ib), (reg), 1); \ + E32((ib), (val)); \ +} while (0) + +void R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib); +void R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib); + +uint64_t +upload (ScrnInfoPtr pScrn, void *shader, int size, int offset); +void +wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib); +void +wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib); +void +wait_vline_range(ScrnInfoPtr pScrn, drmBufPtr ib, int crtc, int start, int stop); +void +start_3d(ScrnInfoPtr pScrn, drmBufPtr ib); +void +set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf); +void +cp_set_surface_sync(ScrnInfoPtr pScrn, drmBufPtr ib, uint32_t sync_type, uint32_t size, uint64_t mc_addr); +void +fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf); +void +vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf); +void +ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf); +void +set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf); +void +set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val); +void +set_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res); +void +set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res); +void +set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s); +void +set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); +void +set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); +void +set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); +void +set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2); +void +set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2); +void +set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib); +void +draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices); +void +draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf); + +#endif diff --git a/driver/xf86-video-radeonhd/src/r600_textured_videofuncs.c b/driver/xf86-video-radeonhd/src/r600_textured_videofuncs.c new file mode 100644 index 000000000..44d2d775c --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r600_textured_videofuncs.c @@ -0,0 +1,558 @@ +/* + * Copyright 2008 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 (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 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. + * + * Author: Alex Deucher + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "exa.h" + +#include "rhd.h" +#include "rhd_cs.h" +#include "r6xx_accel.h" +#include "r600_shader.h" +#include "r600_reg.h" +#include "r600_state.h" + +#include "rhd_video.h" + +#include +#include "fourcc.h" + +# ifdef DAMAGE +# include "damage.h" +# endif + +/* seriously ?! @#$%% */ +# define uint32_t CARD32 +# define uint64_t CARD64 + +static void +R600DoneTexturedVideo(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + draw_config_t draw_conf; + vtx_resource_t vtx_res; + + CLEAR (draw_conf); + CLEAR (vtx_res); + + if (accel_state->vb_index == 0) { + R600IBDiscard(pScrn, accel_state->ib); + return; + } + + accel_state->vb_mc_addr = RHDDRIGetIntGARTLocation(pScrn) + + (accel_state->ib->idx * accel_state->ib->total) + (accel_state->ib->total / 2); + accel_state->vb_size = accel_state->vb_index * 16; + + /* flush vertex cache */ + if ((rhdPtr->ChipSet == RHD_RV610) || + (rhdPtr->ChipSet == RHD_RV620) || + (rhdPtr->ChipSet == RHD_M72) || + (rhdPtr->ChipSet == RHD_M74) || + (rhdPtr->ChipSet == RHD_M82) || + (rhdPtr->ChipSet == RHD_RS780) || + (rhdPtr->ChipSet == RHD_RS880) || + (rhdPtr->ChipSet == RHD_RV710)) + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + else + cp_set_surface_sync(pScrn, accel_state->ib, VC_ACTION_ENA_bit, + accel_state->vb_size, accel_state->vb_mc_addr); + + /* Vertex buffer setup */ + vtx_res.id = SQ_VTX_RESOURCE_vs; + vtx_res.vtx_size_dw = 16 / 4; + vtx_res.vtx_num_entries = accel_state->vb_size / 4; + vtx_res.mem_req_size = 1; + vtx_res.vb_addr = accel_state->vb_mc_addr; + set_vtx_resource (pScrn, accel_state->ib, &vtx_res); + + draw_conf.prim_type = DI_PT_RECTLIST; + draw_conf.vgt_draw_initiator = DI_SRC_SEL_AUTO_INDEX; + draw_conf.num_instances = 1; + draw_conf.num_indices = vtx_res.vtx_num_entries / vtx_res.vtx_size_dw; + draw_conf.index_type = DI_INDEX_SIZE_16_BIT; + + draw_auto(pScrn, accel_state->ib, &draw_conf); + + wait_3d_idle_clean(pScrn, accel_state->ib); + + /* sync destination surface */ + cp_set_surface_sync(pScrn, accel_state->ib, (CB_ACTION_ENA_bit | CB0_DEST_BASE_ENA_bit), + accel_state->dst_size, accel_state->dst_mc_addr); + + R600CPFlushIndirect(pScrn, accel_state->ib); +} + +void +R600DisplayTexturedVideo(ScrnInfoPtr pScrn, struct RHDPortPriv *pPriv) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + PixmapPtr pPixmap = pPriv->pPixmap; + BoxPtr pBox = REGION_RECTS(&pPriv->clip); + int nBox = REGION_NUM_RECTS(&pPriv->clip); + int dstxoff, dstyoff; + cb_config_t cb_conf; + tex_resource_t tex_res; + tex_sampler_t tex_samp; + shader_config_t vs_conf, ps_conf; + int uv_offset; + + /* Constants for Rec.709 */ + static float ps_alu_consts_rec709[] = { + 1.0, 0.0, 1.5748, 0, /* r - c[0] */ + 1.0, -0.18732, -0.46812, 0, /* g - c[1] */ + 1.0, 1.8556, 0.0, 0, /* b - c[2] */ + /* Constants for undoing Y'CbCr scaling + * - Y' is scaled from 16:235 + * - Cb/Cr are scaled from 16:240 + * Unscaled value N' = N * N_mul + N_shift (N' in range [-0.5, 0.5]) + * Vector is [Y_mul, Y_shfit, C_mul, C_shift] + */ + 255.0/219.0, -16.0/219.0, 255.0/224.0, -128.0/224.0, + }; + + /* Constants for Rec.601 + * Same structure as above */ + static float ps_alu_consts_rec601[] = { + 1.0, 0.0, 1.4020, 0, /* r - c[0] */ + 1.0, -0.34414, -0.71414, 0, /* g - c[1] */ + 1.0, 1.7720, 0.0, 0, /* b - c[2] */ + 255.0/219.0, -16.0/219.0, 255.0/224.0, -128.0/224.0, + }; + + float *ps_alu_consts; + + /* Pick Y'CbCr color space to use + * For video with _encoded_ width of 928 or above, choose Rec. 709. This should cover + * 720p and 1080i/p, as well as most videos with non-standard resolutions that most likely + * came from such a source. + * The exact value of the cutoff is aribrary as there is no standarization of resolution + * between "EDTV" and 720p HD content. + * */ + if ((pPriv->color_space == RHD_XV_COLOR_SPACE_REC709) || + (pPriv->color_space == RHD_XV_COLOR_SPACE_AUTODETECT && pPriv->src_w >= 928)) { + ps_alu_consts = ps_alu_consts_rec709; + } else { + ps_alu_consts = ps_alu_consts_rec601; + } + + CLEAR (cb_conf); + CLEAR (tex_res); + CLEAR (tex_samp); + CLEAR (vs_conf); + CLEAR (ps_conf); + + accel_state->dst_pitch = exaGetPixmapPitch(pPixmap) / (pPixmap->drawable.bitsPerPixel / 8); + accel_state->src_pitch[0] = pPriv->BufferPitch; + + /* bad pitch */ + if (accel_state->src_pitch[0] & 7) + return; + if (accel_state->dst_pitch & 7) + return; + +#ifdef COMPOSITE + dstxoff = -pPixmap->screen_x + pPixmap->drawable.x; + dstyoff = -pPixmap->screen_y + pPixmap->drawable.y; +#else + dstxoff = 0; + dstyoff = 0; +#endif + + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + + /* Init */ + start_3d(pScrn, accel_state->ib); + + /* cp_set_surface_sync(pScrn, accel_state->ib); */ + + set_default_state(pScrn, accel_state->ib); + + /* Scissor / viewport */ + EREG(accel_state->ib, PA_CL_VTE_CNTL, VTX_XY_FMT_bit); + EREG(accel_state->ib, PA_CL_CLIP_CNTL, CLIP_DISABLE_bit); + + accel_state->vs_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->xv_vs_offset; + + accel_state->ps_mc_addr = rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart + accel_state->shaders->offset + + accel_state->xv_ps_offset; + + switch(pPriv->id) { + case FOURCC_YV12: + case FOURCC_I420: + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (1 << 0)); + break; + case FOURCC_UYVY: + case FOURCC_YUY2: + default: + set_bool_consts(pScrn, accel_state->ib, SQ_BOOL_CONST_ps, (0 << 0)); + break; + } + + accel_state->vs_size = 512; + accel_state->ps_size = 512; + + /* Shader */ + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->vs_size, accel_state->vs_mc_addr); + + vs_conf.shader_addr = accel_state->vs_mc_addr; + vs_conf.num_gprs = 2; + vs_conf.stack_size = 0; + vs_setup (pScrn, accel_state->ib, &vs_conf); + + /* flush SQ cache */ + cp_set_surface_sync(pScrn, accel_state->ib, SH_ACTION_ENA_bit, + accel_state->ps_size, accel_state->ps_mc_addr); + + ps_conf.shader_addr = accel_state->ps_mc_addr; + ps_conf.num_gprs = 3; + ps_conf.stack_size = 1; + ps_conf.uncached_first_inst = 1; + ps_conf.clamp_consts = 0; + ps_conf.export_mode = 2; + ps_setup (pScrn, accel_state->ib, &ps_conf); + + /* PS alu constants */ + set_alu_consts(pScrn, accel_state->ib, 0, sizeof(ps_alu_consts_rec709) / SQ_ALU_CONSTANT_offset, ps_alu_consts); + + /* Texture */ + switch(pPriv->id) { + case FOURCC_YV12: + case FOURCC_I420: + accel_state->src_mc_addr[0] = pPriv->BufferOffset + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + accel_state->src_size[0] = accel_state->src_pitch[0] * pPriv->h; + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, accel_state->src_size[0], + accel_state->src_mc_addr[0]); + + /* Y texture */ + tex_res.id = 0; + tex_res.w = pPriv->w; + tex_res.h = pPriv->h; + tex_res.pitch = accel_state->src_pitch[0]; + tex_res.depth = 0; + tex_res.dim = SQ_TEX_DIM_2D; + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; + + tex_res.format = FMT_8; + tex_res.dst_sel_x = SQ_SEL_X; /* Y */ + tex_res.dst_sel_y = SQ_SEL_1; + tex_res.dst_sel_z = SQ_SEL_1; + tex_res.dst_sel_w = SQ_SEL_1; + + tex_res.request_size = 1; + tex_res.base_level = 0; + tex_res.last_level = 0; + tex_res.perf_modulation = 0; + tex_res.interlaced = 0; + set_tex_resource (pScrn, accel_state->ib, &tex_res); + + /* Y sampler */ + tex_samp.id = 0; + tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_z = SQ_TEX_WRAP; + + + /* UV texture */ + uv_offset = accel_state->src_pitch[0] * pPriv->h; + uv_offset = (uv_offset + 255) & ~255; + + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[0] / 4, + accel_state->src_mc_addr[0] + uv_offset); + + tex_res.id = 1; + tex_res.format = FMT_8; + tex_res.w = pPriv->w >> 1; + tex_res.h = pPriv->h >> 1; + tex_res.pitch = accel_state->src_pitch[0] >> 1; + tex_res.dst_sel_x = SQ_SEL_X; /* V or U */ + tex_res.dst_sel_y = SQ_SEL_1; + tex_res.dst_sel_z = SQ_SEL_1; + tex_res.dst_sel_w = SQ_SEL_1; + tex_res.interlaced = 0; + /* XXX tex bases need to be 256B aligned */ + tex_res.base = accel_state->src_mc_addr[0] + uv_offset; + tex_res.mip_base = accel_state->src_mc_addr[0] + uv_offset; + set_tex_resource (pScrn, accel_state->ib, &tex_res); + + /* xxx: switch to bicubic */ + tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; + tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_BILINEAR; + + tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; + tex_samp.mip_filter = 0; /* no mipmap */ + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + + /* UV sampler */ + tex_samp.id = 1; + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + + /* UV texture */ + uv_offset += ((accel_state->src_pitch[0] >> 1) * (pPriv->h >> 1)); + uv_offset = (uv_offset + 255) & ~255; + + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, + accel_state->src_size[0] / 4, + accel_state->src_mc_addr[0] + uv_offset); + + tex_res.id = 2; + tex_res.format = FMT_8; + tex_res.w = pPriv->w >> 1; + tex_res.h = pPriv->h >> 1; + tex_res.pitch = accel_state->src_pitch[0] >> 1; + tex_res.dst_sel_x = SQ_SEL_X; /* V or U */ + tex_res.dst_sel_y = SQ_SEL_1; + tex_res.dst_sel_z = SQ_SEL_1; + tex_res.dst_sel_w = SQ_SEL_1; + tex_res.interlaced = 0; + /* XXX tex bases need to be 256B aligned */ + tex_res.base = accel_state->src_mc_addr[0] + uv_offset; + tex_res.mip_base = accel_state->src_mc_addr[0] + uv_offset; + set_tex_resource (pScrn, accel_state->ib, &tex_res); + + /* xxx: switch to bicubic */ + tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; + tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_BILINEAR; + + tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; + tex_samp.mip_filter = 0; /* no mipmap */ + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + + /* UV sampler */ + tex_samp.id = 2; + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + break; + case FOURCC_UYVY: + case FOURCC_YUY2: + default: + accel_state->src_mc_addr[0] = pPriv->BufferOffset + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + accel_state->src_size[0] = accel_state->src_pitch[0] * pPriv->h; + + /* flush texture cache */ + cp_set_surface_sync(pScrn, accel_state->ib, TC_ACTION_ENA_bit, accel_state->src_size[0], + accel_state->src_mc_addr[0]); + + /* Y texture */ + tex_res.id = 0; + tex_res.w = pPriv->w; + tex_res.h = pPriv->h; + tex_res.pitch = accel_state->src_pitch[0] >> 1; + tex_res.depth = 0; + tex_res.dim = SQ_TEX_DIM_2D; + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; + + tex_res.format = FMT_8_8; + if (pPriv->id == FOURCC_UYVY) + tex_res.dst_sel_x = SQ_SEL_Y; /* Y */ + else + tex_res.dst_sel_x = SQ_SEL_X; /* Y */ + tex_res.dst_sel_y = SQ_SEL_1; + tex_res.dst_sel_z = SQ_SEL_1; + tex_res.dst_sel_w = SQ_SEL_1; + + tex_res.request_size = 1; + tex_res.base_level = 0; + tex_res.last_level = 0; + tex_res.perf_modulation = 0; + tex_res.interlaced = 0; + set_tex_resource (pScrn, accel_state->ib, &tex_res); + + /* Y sampler */ + tex_samp.id = 0; + tex_samp.clamp_x = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_y = SQ_TEX_CLAMP_LAST_TEXEL; + tex_samp.clamp_z = SQ_TEX_WRAP; + + + /* UV texture */ + tex_res.id = 1; + tex_res.format = FMT_8_8_8_8; + tex_res.w = pPriv->w >> 1; + tex_res.h = pPriv->h; + tex_res.pitch = accel_state->src_pitch[0] >> 2; + if (pPriv->id == FOURCC_UYVY) { + tex_res.dst_sel_x = SQ_SEL_X; /* V */ + tex_res.dst_sel_y = SQ_SEL_Z; /* U */ + } else { + tex_res.dst_sel_x = SQ_SEL_Y; /* V */ + tex_res.dst_sel_y = SQ_SEL_W; /* U */ + } + tex_res.dst_sel_z = SQ_SEL_1; + tex_res.dst_sel_w = SQ_SEL_1; + tex_res.interlaced = 0; + /* XXX tex bases need to be 256B aligned */ + tex_res.base = accel_state->src_mc_addr[0]; + tex_res.mip_base = accel_state->src_mc_addr[0]; + set_tex_resource (pScrn, accel_state->ib, &tex_res); + + /* xxx: switch to bicubic */ + tex_samp.xy_mag_filter = SQ_TEX_XY_FILTER_BILINEAR; + tex_samp.xy_min_filter = SQ_TEX_XY_FILTER_BILINEAR; + + tex_samp.z_filter = SQ_TEX_Z_FILTER_NONE; + tex_samp.mip_filter = 0; /* no mipmap */ + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + + /* UV sampler */ + tex_samp.id = 1; + set_tex_sampler (pScrn, accel_state->ib, &tex_samp); + break; + } + + /* Render setup */ + EREG(accel_state->ib, CB_SHADER_MASK, (0x0f << OUTPUT0_ENABLE_shift)); + EREG(accel_state->ib, R7xx_CB_SHADER_CONTROL, (RT0_ENABLE_bit)); + EREG(accel_state->ib, CB_COLOR_CONTROL, (0xcc << ROP3_shift)); /* copy */ + + cb_conf.id = 0; + + accel_state->dst_mc_addr = exaGetPixmapOffset(pPixmap) + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart; + + cb_conf.w = accel_state->dst_pitch; + cb_conf.h = pPixmap->drawable.height; + cb_conf.base = accel_state->dst_mc_addr; + + switch (pPixmap->drawable.bitsPerPixel) { + case 16: + if (pPixmap->drawable.depth == 15) { + cb_conf.format = COLOR_1_5_5_5; + cb_conf.comp_swap = 1; /* ARGB */ + } else { + cb_conf.format = COLOR_5_6_5; + cb_conf.comp_swap = 2; /* RGB */ + } + break; + case 32: + cb_conf.format = COLOR_8_8_8_8; + cb_conf.comp_swap = 1; /* ARGB */ + break; + default: + return; + } + + cb_conf.source_format = 1; + cb_conf.blend_clamp = 1; + set_render_target(pScrn, accel_state->ib, &cb_conf); + + EREG(accel_state->ib, PA_SU_SC_MODE_CNTL, (FACE_bit | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_FRONT_PTYPE_shift) | + (POLYMODE_PTYPE__TRIANGLES << POLYMODE_BACK_PTYPE_shift))); + EREG(accel_state->ib, DB_SHADER_CONTROL, ((1 << Z_ORDER_shift) | /* EARLY_Z_THEN_LATE_Z */ + DUAL_EXPORT_ENABLE_bit)); /* Only useful if no depth export */ + + /* Interpolator setup */ + /* export tex coords from VS */ + EREG(accel_state->ib, SPI_VS_OUT_CONFIG, ((1 - 1) << VS_EXPORT_COUNT_shift)); + EREG(accel_state->ib, SPI_VS_OUT_ID_0, (0 << SEMANTIC_0_shift)); + + /* Enabling flat shading needs both FLAT_SHADE_bit in SPI_PS_INPUT_CNTL_x + * *and* FLAT_SHADE_ENA_bit in SPI_INTERP_CONTROL_0 */ + EREG(accel_state->ib, SPI_PS_IN_CONTROL_0, ((1 << NUM_INTERP_shift))); + EREG(accel_state->ib, SPI_PS_IN_CONTROL_1, 0); + EREG(accel_state->ib, SPI_PS_INPUT_CNTL_0 + (0 <<2), ((0 << SEMANTIC_shift) | + (0x03 << DEFAULT_VAL_shift) | + SEL_CENTROID_bit)); + EREG(accel_state->ib, SPI_INTERP_CONTROL_0, 0); + + if (exaGetPixmapOffset(pPixmap) == 0) + wait_vline_range( + pScrn, + accel_state->ib, + 0 /* TODO */, + dstyoff + pPriv->drw_y, + dstyoff + pPriv->drw_y + pPriv->dst_h - 1 + ); + + accel_state->vb_index = 0; + + while (nBox--) { + int srcX, srcY, srcw, srch; + int dstX, dstY, dstw, dsth; + float *vb; + + if (((accel_state->vb_index + 3) * 16) > (accel_state->ib->total / 2)) { + R600DoneTexturedVideo(pScrn); + accel_state->vb_index = 0; + accel_state->ib = RHDDRMCPBuffer(pScrn->scrnIndex); + } + + vb = (pointer)((char*)accel_state->ib->address + + (accel_state->ib->total / 2) + + accel_state->vb_index * 16); + + dstX = pBox->x1 + dstxoff; + dstY = pBox->y1 + dstyoff; + dstw = pBox->x2 - pBox->x1; + dsth = pBox->y2 - pBox->y1; + + srcX = ((pBox->x1 - pPriv->drw_x) * + pPriv->src_w) / pPriv->dst_w; + srcY = ((pBox->y1 - pPriv->drw_y) * + pPriv->src_h) / pPriv->dst_h; + + srcw = (pPriv->src_w * dstw) / pPriv->dst_w; + srch = (pPriv->src_h * dsth) / pPriv->dst_h; + + vb[0] = (float)dstX; + vb[1] = (float)dstY; + vb[2] = (float)srcX / pPriv->w; + vb[3] = (float)srcY / pPriv->h; + + vb[4] = (float)dstX; + vb[5] = (float)(dstY + dsth); + vb[6] = (float)srcX / pPriv->w; + vb[7] = (float)(srcY + srch) / pPriv->h; + + vb[8] = (float)(dstX + dstw); + vb[9] = (float)(dstY + dsth); + vb[10] = (float)(srcX + srcw) / pPriv->w; + vb[11] = (float)(srcY + srch) / pPriv->h; + + accel_state->vb_index += 3; + + pBox++; + } + + R600DoneTexturedVideo(pScrn); + + DamageDamageRegion(pPriv->pDraw, &pPriv->clip); +} diff --git a/driver/xf86-video-radeonhd/src/r6xx_accel.c b/driver/xf86-video-radeonhd/src/r6xx_accel.c new file mode 100644 index 000000000..bdbc4058d --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r6xx_accel.c @@ -0,0 +1,1202 @@ +/* + * Copyright 2008 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 (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 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. + * + * Authors: Alex Deucher + * Matthias Hopf + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_regs.h" +#include "rhd_crtc.h" +#include "rhd_cs.h" +#include "r6xx_accel.h" +#include "r600_shader.h" +#include "r600_reg.h" +#include "r600_state.h" + +#include "xf86drm.h" +/* Workaround for header mismatches */ +#ifndef DEPRECATED +# define DEPRECATED __attribute__ ((deprecated)) +# define __user +#endif +#include "radeon_drm.h" + + +/* seriously ?! @#$%% */ +# define uint32_t CARD32 +# define uint64_t CARD64 + + +/* Flush the indirect buffer to the kernel for submission to the card */ +void R600CPFlushIndirect(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + drmBufPtr buffer = ib; + int start = 0; + drm_radeon_indirect_t indirect; + int drmFD = RHDDRMFDGet(pScrn->scrnIndex); + + if (!buffer) return; + + while (buffer->used & 0x3c){ + E32(buffer, CP_PACKET2()); /* fill up to multiple of 16 dwords */ + } + + indirect.idx = buffer->idx; + indirect.start = start; + indirect.end = buffer->used; + indirect.discard = 1; + + drmCommandWriteRead(drmFD, DRM_RADEON_INDIRECT, + &indirect, sizeof(drm_radeon_indirect_t)); + +} + +void R600IBDiscard(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + if (!ib) return; + + ib->used = 0; + R600CPFlushIndirect(pScrn, ib); +} + +void +wait_3d_idle_clean(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + + /* flush caches, don't generate timestamp */ + PACK3(ib, IT_EVENT_WRITE, 1); + E32(ib, CACHE_FLUSH_AND_INV_EVENT); + /* wait for 3D idle clean */ + EREG(ib, WAIT_UNTIL, (WAIT_3D_IDLE_bit | + WAIT_3D_IDLECLEAN_bit)); +} + +void +wait_3d_idle(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + EREG(ib, WAIT_UNTIL, WAIT_3D_IDLE_bit); +} + +/* + * inserts a wait for vline in the command stream + */ +void +wait_vline_range(ScrnInfoPtr pScrn, drmBufPtr ib, int crtc, int start, int stop) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdCrtc *rhdCrtc; + + if ((crtc < 0) || (crtc > 1)) + return; + + rhdCrtc = rhdPtr->Crtc[crtc]; + if(!rhdCrtc || !rhdCrtc->CurrentMode) + return; + + start = max(start, 0); + stop = min(stop, rhdCrtc->CurrentMode->VDisplay-1); + +#if 0 + ErrorF("wait_vline_range: start %d stop %d\n", start, stop); +#endif + + if (stop <= start) + return; + + /* set the VLINE range */ + if(crtc == 0) + EREG(ib, D1MODE_VLINE_START_END, start | (stop << 16)); + else + EREG(ib, D2MODE_VLINE_START_END, start | (stop << 16)); + + /* tell the CP to poll the VLINE state register */ + PACK3(ib, IT_WAIT_REG_MEM, 6); + E32(ib, WAIT_REG | WAIT_EQ); + if(crtc == 0) + E32(ib, D1MODE_VLINE_STATUS >> 2); + else + E32(ib, D2MODE_VLINE_STATUS >> 2); + E32(ib, 0); + E32(ib, 0); /* Ref value */ + E32(ib, 0x1000); /* Mask */ + E32(ib, 10); /* Wait interval */ +} + +static void +reset_cb(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + PACK0(ib, CB_COLOR0_INFO, 8); + for (i = 0; i < 8; i++) + E32(ib, 0); +} + +static void +reset_td_samplers(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + wait_3d_idle(pScrn, ib); + + PACK0(ib, TD_PS_SAMPLER0_BORDER_RED, 4*TD_PS_SAMPLER0_BORDER_RED_num); + for (i = 0; i < 4*TD_PS_SAMPLER0_BORDER_RED_num; i++) + E32(ib, 0); + PACK0(ib, TD_VS_SAMPLER0_BORDER_RED, 4*TD_VS_SAMPLER0_BORDER_RED_num); + for (i = 0; i < 4*TD_VS_SAMPLER0_BORDER_RED_num; i++) + E32(ib, 0); + + wait_3d_idle(pScrn, ib); +} + +static void +reset_sampler_const (ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + for (i = 0; i < SQ_TEX_SAMPLER_WORD_all_num; i++) { + PACK0 (ib, SQ_TEX_SAMPLER_WORD + i * SQ_TEX_SAMPLER_WORD_offset, 3); + E32 (ib, SQ_TEX_DEPTH_COMPARE_LESSEQUAL << DEPTH_COMPARE_FUNCTION_shift); + E32 (ib, MAX_LOD_mask); + E32 (ib, 0); + } +} + +static void +reset_dx9_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + const int count = SQ_ALU_CONSTANT_all_num * (SQ_ALU_CONSTANT_offset >> 2); + + PACK0(ib, SQ_ALU_CONSTANT, count); + for (i = 0; i < count; i++) + EFLOAT(ib, 0.0); +} + +static void +reset_bool_loop_const(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + int i; + + PACK0(ib, SQ_BOOL_CONST, SQ_BOOL_CONST_all_num); + for (i = 0; i < SQ_BOOL_CONST_all_num; i++) + E32(ib, 0); + + PACK0(ib, SQ_LOOP_CONST, SQ_LOOP_CONST_all_num); + + for (i = 0; i < SQ_LOOP_CONST_all_num; i++) + E32(ib, 0); + +} + +void +start_3d(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + if (rhdPtr->ChipSet < RHD_RV770) { + PACK3(ib, IT_START_3D_CMDBUF, 1); + E32(ib, 0); + } + + PACK3(ib, IT_CONTEXT_CONTROL, 2); + E32(ib, 0x80000000); + E32(ib, 0x80000000); + + wait_3d_idle_clean (pScrn, ib); +} + +/* + * Setup of functional groups + */ + +/* asic stack/thread/gpr limits - need to query the drm */ +static void +sq_setup(ScrnInfoPtr pScrn, drmBufPtr ib, sq_config_t *sq_conf) +{ + uint32_t sq_config, sq_gpr_resource_mgmt_1, sq_gpr_resource_mgmt_2; + uint32_t sq_thread_resource_mgmt, sq_stack_resource_mgmt_1, sq_stack_resource_mgmt_2; + RHDPtr rhdPtr = RHDPTR(pScrn); + + if ((rhdPtr->ChipSet == RHD_RV610) || + (rhdPtr->ChipSet == RHD_RV620) || + (rhdPtr->ChipSet == RHD_M72) || + (rhdPtr->ChipSet == RHD_M74) || + (rhdPtr->ChipSet == RHD_M82) || + (rhdPtr->ChipSet == RHD_RS780) || + (rhdPtr->ChipSet == RHD_RS880) || + (rhdPtr->ChipSet == RHD_RV710)) + sq_config = 0; /* no VC */ + else + sq_config = VC_ENABLE_bit; + + sq_config |= (DX9_CONSTS_bit | + ALU_INST_PREFER_VECTOR_bit | + (sq_conf->ps_prio << PS_PRIO_shift) | + (sq_conf->vs_prio << VS_PRIO_shift) | + (sq_conf->gs_prio << GS_PRIO_shift) | + (sq_conf->es_prio << ES_PRIO_shift)); + + sq_gpr_resource_mgmt_1 = ((sq_conf->num_ps_gprs << NUM_PS_GPRS_shift) | + (sq_conf->num_vs_gprs << NUM_VS_GPRS_shift) | + (sq_conf->num_temp_gprs << NUM_CLAUSE_TEMP_GPRS_shift)); + sq_gpr_resource_mgmt_2 = ((sq_conf->num_gs_gprs << NUM_GS_GPRS_shift) | + (sq_conf->num_es_gprs << NUM_ES_GPRS_shift)); + + sq_thread_resource_mgmt = ((sq_conf->num_ps_threads << NUM_PS_THREADS_shift) | + (sq_conf->num_vs_threads << NUM_VS_THREADS_shift) | + (sq_conf->num_gs_threads << NUM_GS_THREADS_shift) | + (sq_conf->num_es_threads << NUM_ES_THREADS_shift)); + + sq_stack_resource_mgmt_1 = ((sq_conf->num_ps_stack_entries << NUM_PS_STACK_ENTRIES_shift) | + (sq_conf->num_vs_stack_entries << NUM_VS_STACK_ENTRIES_shift)); + + sq_stack_resource_mgmt_2 = ((sq_conf->num_gs_stack_entries << NUM_GS_STACK_ENTRIES_shift) | + (sq_conf->num_es_stack_entries << NUM_ES_STACK_ENTRIES_shift)); + + PACK0(ib, SQ_CONFIG, 6); + E32(ib, sq_config); + E32(ib, sq_gpr_resource_mgmt_1); + E32(ib, sq_gpr_resource_mgmt_2); + E32(ib, sq_thread_resource_mgmt); + E32(ib, sq_stack_resource_mgmt_1); + E32(ib, sq_stack_resource_mgmt_2); + +} + +void +set_render_target(ScrnInfoPtr pScrn, drmBufPtr ib, cb_config_t *cb_conf) +{ + uint32_t cb_color_info; + int pitch, slice, h; + RHDPtr rhdPtr = RHDPTR(pScrn); + + cb_color_info = ((cb_conf->endian << ENDIAN_shift) | + (cb_conf->format << CB_COLOR0_INFO__FORMAT_shift) | + (cb_conf->array_mode << CB_COLOR0_INFO__ARRAY_MODE_shift) | + (cb_conf->number_type << NUMBER_TYPE_shift) | + (cb_conf->comp_swap << COMP_SWAP_shift) | + (cb_conf->tile_mode << CB_COLOR0_INFO__TILE_MODE_shift)); + if (cb_conf->read_size) + cb_color_info |= CB_COLOR0_INFO__READ_SIZE_bit; + if (cb_conf->blend_clamp) + cb_color_info |= BLEND_CLAMP_bit; + if (cb_conf->clear_color) + cb_color_info |= CLEAR_COLOR_bit; + if (cb_conf->blend_bypass) + cb_color_info |= BLEND_BYPASS_bit; + if (cb_conf->blend_float32) + cb_color_info |= BLEND_FLOAT32_bit; + if (cb_conf->simple_float) + cb_color_info |= SIMPLE_FLOAT_bit; + if (cb_conf->round_mode) + cb_color_info |= CB_COLOR0_INFO__ROUND_MODE_bit; + if (cb_conf->tile_compact) + cb_color_info |= TILE_COMPACT_bit; + if (cb_conf->source_format) + cb_color_info |= SOURCE_FORMAT_bit; + + pitch = (cb_conf->w / 8) - 1; + h = (cb_conf->h + 7) & ~7; + slice = ((cb_conf->w * h) / 64) - 1; + + EREG(ib, (CB_COLOR0_BASE + (4 * cb_conf->id)), (cb_conf->base >> 8)); + + /* rv6xx workaround */ + if ((rhdPtr->ChipSet > RHD_R600) && + (rhdPtr->ChipSet < RHD_RV770)) { + PACK3(ib, IT_SURFACE_BASE_UPDATE, 1); + E32(ib, (2 << cb_conf->id)); + } + + /* pitch only for ARRAY_LINEAR_GENERAL, other tiling modes require addrlib */ + EREG(ib, (CB_COLOR0_SIZE + (4 * cb_conf->id)), ((pitch << PITCH_TILE_MAX_shift) | + (slice << SLICE_TILE_MAX_shift))); + EREG(ib, (CB_COLOR0_VIEW + (4 * cb_conf->id)), ((0 << SLICE_START_shift) | + (0 << SLICE_MAX_shift))); + EREG(ib, (CB_COLOR0_INFO + (4 * cb_conf->id)), cb_color_info); + EREG(ib, (CB_COLOR0_TILE + (4 * cb_conf->id)), (0 >> 8)); /* CMASK per-tile data base/256 */ + EREG(ib, (CB_COLOR0_FRAG + (4 * cb_conf->id)), (0 >> 8)); /* FMASK per-tile data base/256 */ + EREG(ib, (CB_COLOR0_MASK + (4 * cb_conf->id)), ((0 << CMASK_BLOCK_MAX_shift) | + (0 << FMASK_TILE_MAX_shift))); +} + +void +cp_set_surface_sync(ScrnInfoPtr pScrn, drmBufPtr ib, uint32_t sync_type, uint32_t size, uint64_t mc_addr) +{ + uint32_t cp_coher_size; + if (size == 0xffffffff) + cp_coher_size = 0xffffffff; + else + cp_coher_size = ((size + 255) >> 8); + + PACK3(ib, IT_SURFACE_SYNC, 4); + E32(ib, sync_type); + E32(ib, cp_coher_size); + E32(ib, (mc_addr >> 8)); + E32(ib, 10); /* poll interval */ +} + +void +fs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *fs_conf) +{ + uint32_t sq_pgm_resources; + + sq_pgm_resources = ((fs_conf->num_gprs << NUM_GPRS_shift) | + (fs_conf->stack_size << STACK_SIZE_shift)); + + if (fs_conf->dx10_clamp) + sq_pgm_resources |= SQ_PGM_RESOURCES_FS__DX10_CLAMP_bit; + + EREG(ib, SQ_PGM_START_FS, fs_conf->shader_addr >> 8); + EREG(ib, SQ_PGM_RESOURCES_FS, sq_pgm_resources); + EREG(ib, SQ_PGM_CF_OFFSET_FS, 0); +} + +void +vs_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *vs_conf) +{ + uint32_t sq_pgm_resources; + + sq_pgm_resources = ((vs_conf->num_gprs << NUM_GPRS_shift) | + (vs_conf->stack_size << STACK_SIZE_shift)); + + if (vs_conf->dx10_clamp) + sq_pgm_resources |= SQ_PGM_RESOURCES_VS__DX10_CLAMP_bit; + if (vs_conf->fetch_cache_lines) + sq_pgm_resources |= (vs_conf->fetch_cache_lines << FETCH_CACHE_LINES_shift); + if (vs_conf->uncached_first_inst) + sq_pgm_resources |= UNCACHED_FIRST_INST_bit; + + EREG(ib, SQ_PGM_START_VS, vs_conf->shader_addr >> 8); + EREG(ib, SQ_PGM_RESOURCES_VS, sq_pgm_resources); + EREG(ib, SQ_PGM_CF_OFFSET_VS, 0); +} + +void +ps_setup(ScrnInfoPtr pScrn, drmBufPtr ib, shader_config_t *ps_conf) +{ + uint32_t sq_pgm_resources; + + sq_pgm_resources = ((ps_conf->num_gprs << NUM_GPRS_shift) | + (ps_conf->stack_size << STACK_SIZE_shift)); + + if (ps_conf->dx10_clamp) + sq_pgm_resources |= SQ_PGM_RESOURCES_PS__DX10_CLAMP_bit; + if (ps_conf->fetch_cache_lines) + sq_pgm_resources |= (ps_conf->fetch_cache_lines << FETCH_CACHE_LINES_shift); + if (ps_conf->uncached_first_inst) + sq_pgm_resources |= UNCACHED_FIRST_INST_bit; + if (ps_conf->clamp_consts) + sq_pgm_resources |= CLAMP_CONSTS_bit; + + EREG(ib, SQ_PGM_START_PS, ps_conf->shader_addr >> 8); + EREG(ib, SQ_PGM_RESOURCES_PS, sq_pgm_resources); + EREG(ib, SQ_PGM_EXPORTS_PS, ps_conf->export_mode); + EREG(ib, SQ_PGM_CF_OFFSET_PS, 0); +} + +void +set_alu_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, int count, float *const_buf) +{ + int i; + const int countreg = count * (SQ_ALU_CONSTANT_offset >> 2); + + PACK0(ib, SQ_ALU_CONSTANT + offset * SQ_ALU_CONSTANT_offset, countreg); + for (i = 0; i < countreg; i++) + EFLOAT(ib, const_buf[i]); +} + +void +set_bool_consts(ScrnInfoPtr pScrn, drmBufPtr ib, int offset, uint32_t val) +{ + /* bool register order is: ps, vs, gs; one register each + * 1 bits per bool; 32 bools each for ps, vs, gs. + */ + EREG(ib, SQ_BOOL_CONST + offset * SQ_BOOL_CONST_offset, val); +} + +void +set_vtx_resource(ScrnInfoPtr pScrn, drmBufPtr ib, vtx_resource_t *res) +{ + uint32_t sq_vtx_constant_word2; + + sq_vtx_constant_word2 = ((((res->vb_addr) >> 32) & BASE_ADDRESS_HI_mask) | + ((res->vtx_size_dw << 2) << SQ_VTX_CONSTANT_WORD2_0__STRIDE_shift) | + (res->format << SQ_VTX_CONSTANT_WORD2_0__DATA_FORMAT_shift) | + (res->num_format_all << SQ_VTX_CONSTANT_WORD2_0__NUM_FORMAT_ALL_shift) | + (res->endian << SQ_VTX_CONSTANT_WORD2_0__ENDIAN_SWAP_shift)); + if (res->clamp_x) + sq_vtx_constant_word2 |= SQ_VTX_CONSTANT_WORD2_0__CLAMP_X_bit; + + if (res->format_comp_all) + sq_vtx_constant_word2 |= SQ_VTX_CONSTANT_WORD2_0__FORMAT_COMP_ALL_bit; + + if (res->srf_mode_all) + sq_vtx_constant_word2 |= SQ_VTX_CONSTANT_WORD2_0__SRF_MODE_ALL_bit; + + PACK0(ib, SQ_VTX_RESOURCE + res->id * SQ_VTX_RESOURCE_offset, 7); + E32(ib, res->vb_addr & 0xffffffff); /* 0: BASE_ADDRESS */ + E32(ib, (res->vtx_num_entries << 2) - 1); /* 1: SIZE */ + E32(ib, sq_vtx_constant_word2); /* 2: BASE_HI, STRIDE, CLAMP, FORMAT, ENDIAN */ + E32(ib, res->mem_req_size << MEM_REQUEST_SIZE_shift); /* 3: MEM_REQUEST_SIZE ?!? */ + E32(ib, 0); /* 4: n/a */ + E32(ib, 0); /* 5: n/a */ + E32(ib, SQ_TEX_VTX_VALID_BUFFER << SQ_VTX_CONSTANT_WORD6_0__TYPE_shift); /* 6: TYPE */ +} + +void +set_tex_resource(ScrnInfoPtr pScrn, drmBufPtr ib, tex_resource_t *tex_res) +{ + uint32_t sq_tex_resource_word0, sq_tex_resource_word1, sq_tex_resource_word4; + uint32_t sq_tex_resource_word5, sq_tex_resource_word6; + + sq_tex_resource_word0 = ((tex_res->dim << DIM_shift) | + (tex_res->tile_mode << SQ_TEX_RESOURCE_WORD0_0__TILE_MODE_shift)); + + if (tex_res->w) + sq_tex_resource_word0 |= (((((tex_res->pitch + 7) >> 3) - 1) << PITCH_shift) | + ((tex_res->w - 1) << TEX_WIDTH_shift)); + + if (tex_res->tile_type) + sq_tex_resource_word0 |= TILE_TYPE_bit; + + sq_tex_resource_word1 = (tex_res->format << SQ_TEX_RESOURCE_WORD1_0__DATA_FORMAT_shift); + + if (tex_res->h) + sq_tex_resource_word1 |= ((tex_res->h - 1) << TEX_HEIGHT_shift); + if (tex_res->depth) + sq_tex_resource_word1 |= ((tex_res->depth - 1) << TEX_DEPTH_shift); + + sq_tex_resource_word4 = ((tex_res->format_comp_x << FORMAT_COMP_X_shift) | + (tex_res->format_comp_y << FORMAT_COMP_Y_shift) | + (tex_res->format_comp_z << FORMAT_COMP_Z_shift) | + (tex_res->format_comp_w << FORMAT_COMP_W_shift) | + (tex_res->num_format_all << SQ_TEX_RESOURCE_WORD4_0__NUM_FORMAT_ALL_shift) | + (tex_res->endian << SQ_TEX_RESOURCE_WORD4_0__ENDIAN_SWAP_shift) | + (tex_res->request_size << REQUEST_SIZE_shift) | + (tex_res->dst_sel_x << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_X_shift) | + (tex_res->dst_sel_y << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Y_shift) | + (tex_res->dst_sel_z << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_Z_shift) | + (tex_res->dst_sel_w << SQ_TEX_RESOURCE_WORD4_0__DST_SEL_W_shift) | + (tex_res->base_level << BASE_LEVEL_shift)); + + if (tex_res->srf_mode_all) + sq_tex_resource_word4 |= SQ_TEX_RESOURCE_WORD4_0__SRF_MODE_ALL_bit; + if (tex_res->force_degamma) + sq_tex_resource_word4 |= SQ_TEX_RESOURCE_WORD4_0__FORCE_DEGAMMA_bit; + + sq_tex_resource_word5 = ((tex_res->last_level << LAST_LEVEL_shift) | + (tex_res->base_array << BASE_ARRAY_shift) | + (tex_res->last_array << LAST_ARRAY_shift)); + + sq_tex_resource_word6 = ((tex_res->mpeg_clamp << MPEG_CLAMP_shift) | + (tex_res->perf_modulation << PERF_MODULATION_shift) | + (SQ_TEX_VTX_VALID_TEXTURE << SQ_TEX_RESOURCE_WORD6_0__TYPE_shift)); + + if (tex_res->interlaced) + sq_tex_resource_word6 |= INTERLACED_bit; + + PACK0(ib, SQ_TEX_RESOURCE + tex_res->id * SQ_TEX_RESOURCE_offset, 7); + E32(ib, sq_tex_resource_word0); + E32(ib, sq_tex_resource_word1); + E32(ib, ((tex_res->base) >> 8)); + E32(ib, ((tex_res->mip_base) >> 8)); + E32(ib, sq_tex_resource_word4); + E32(ib, sq_tex_resource_word5); + E32(ib, sq_tex_resource_word6); +} + +void +set_tex_sampler (ScrnInfoPtr pScrn, drmBufPtr ib, tex_sampler_t *s) +{ + uint32_t sq_tex_sampler_word0, sq_tex_sampler_word1, sq_tex_sampler_word2; + + sq_tex_sampler_word0 = ((s->clamp_x << SQ_TEX_SAMPLER_WORD0_0__CLAMP_X_shift) | + (s->clamp_y << CLAMP_Y_shift) | + (s->clamp_z << CLAMP_Z_shift) | + (s->xy_mag_filter << XY_MAG_FILTER_shift) | + (s->xy_min_filter << XY_MIN_FILTER_shift) | + (s->z_filter << Z_FILTER_shift) | + (s->mip_filter << MIP_FILTER_shift) | + (s->border_color << BORDER_COLOR_TYPE_shift) | + (s->depth_compare << DEPTH_COMPARE_FUNCTION_shift) | + (s->chroma_key << CHROMA_KEY_shift)); + if (s->point_sampling_clamp) + sq_tex_sampler_word0 |= POINT_SAMPLING_CLAMP_bit; + if (s->tex_array_override) + sq_tex_sampler_word0 |= TEX_ARRAY_OVERRIDE_bit; + if (s->lod_uses_minor_axis) + sq_tex_sampler_word0 |= LOD_USES_MINOR_AXIS_bit; + + sq_tex_sampler_word1 = ((s->min_lod << MIN_LOD_shift) | + (s->max_lod << MAX_LOD_shift) | + (s->lod_bias << SQ_TEX_SAMPLER_WORD1_0__LOD_BIAS_shift)); + + sq_tex_sampler_word2 = ((s->lod_bias2 << LOD_BIAS_SEC_shift) | + (s->perf_mip << PERF_MIP_shift) | + (s->perf_z << PERF_Z_shift)); + if (s->mc_coord_truncate) + sq_tex_sampler_word2 |= MC_COORD_TRUNCATE_bit; + if (s->force_degamma) + sq_tex_sampler_word2 |= SQ_TEX_SAMPLER_WORD2_0__FORCE_DEGAMMA_bit; + if (s->high_precision_filter) + sq_tex_sampler_word2 |= HIGH_PRECISION_FILTER_bit; + if (s->fetch_4) + sq_tex_sampler_word2 |= FETCH_4_bit; + if (s->sample_is_pcf) + sq_tex_sampler_word2 |= SAMPLE_IS_PCF_bit; + if (s->type) + sq_tex_sampler_word2 |= SQ_TEX_SAMPLER_WORD2_0__TYPE_bit; + + PACK0(ib, SQ_TEX_SAMPLER_WORD + s->id * SQ_TEX_SAMPLER_WORD_offset, 3); + E32(ib, sq_tex_sampler_word0); + E32(ib, sq_tex_sampler_word1); + E32(ib, sq_tex_sampler_word2); +} + +/* XXX deal with clip offsets in clip setup */ +void +set_screen_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) +{ + + EREG(ib, PA_SC_SCREEN_SCISSOR_TL, ((x1 << PA_SC_SCREEN_SCISSOR_TL__TL_X_shift) | + (y1 << PA_SC_SCREEN_SCISSOR_TL__TL_Y_shift))); + EREG(ib, PA_SC_SCREEN_SCISSOR_BR, ((x2 << PA_SC_SCREEN_SCISSOR_BR__BR_X_shift) | + (y2 << PA_SC_SCREEN_SCISSOR_BR__BR_Y_shift))); +} + +void +set_vport_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2) +{ + EREG(ib, PA_SC_VPORT_SCISSOR_0_TL + + id * PA_SC_VPORT_SCISSOR_0_TL_offset, ((x1 << PA_SC_VPORT_SCISSOR_0_TL__TL_X_shift) | + (y1 << PA_SC_VPORT_SCISSOR_0_TL__TL_Y_shift) | + WINDOW_OFFSET_DISABLE_bit)); + EREG(ib, PA_SC_VPORT_SCISSOR_0_BR + + id * PA_SC_VPORT_SCISSOR_0_BR_offset, ((x2 << PA_SC_VPORT_SCISSOR_0_BR__BR_X_shift) | + (y2 << PA_SC_VPORT_SCISSOR_0_BR__BR_Y_shift))); +} + +void +set_generic_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) +{ + EREG(ib, PA_SC_GENERIC_SCISSOR_TL, ((x1 << PA_SC_GENERIC_SCISSOR_TL__TL_X_shift) | + (y1 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift) | + WINDOW_OFFSET_DISABLE_bit)); + EREG(ib, PA_SC_GENERIC_SCISSOR_BR, ((x2 << PA_SC_GENERIC_SCISSOR_BR__BR_X_shift) | + (y2 << PA_SC_GENERIC_SCISSOR_TL__TL_Y_shift))); +} + +void +set_window_scissor(ScrnInfoPtr pScrn, drmBufPtr ib, int x1, int y1, int x2, int y2) +{ + EREG(ib, PA_SC_WINDOW_SCISSOR_TL, ((x1 << PA_SC_WINDOW_SCISSOR_TL__TL_X_shift) | + (y1 << PA_SC_WINDOW_SCISSOR_TL__TL_Y_shift) | + WINDOW_OFFSET_DISABLE_bit)); + EREG(ib, PA_SC_WINDOW_SCISSOR_BR, ((x2 << PA_SC_WINDOW_SCISSOR_BR__BR_X_shift) | + (y2 << PA_SC_WINDOW_SCISSOR_BR__BR_Y_shift))); +} + +void +set_clip_rect(ScrnInfoPtr pScrn, drmBufPtr ib, int id, int x1, int y1, int x2, int y2) +{ + EREG(ib, PA_SC_CLIPRECT_0_TL + + id * PA_SC_CLIPRECT_0_TL_offset, ((x1 << PA_SC_CLIPRECT_0_TL__TL_X_shift) | + (y1 << PA_SC_CLIPRECT_0_TL__TL_Y_shift))); + EREG(ib, PA_SC_CLIPRECT_0_BR + + id * PA_SC_CLIPRECT_0_BR_offset, ((x2 << PA_SC_CLIPRECT_0_BR__BR_X_shift) | + (y2 << PA_SC_CLIPRECT_0_BR__BR_Y_shift))); +} + +/* + * Setup of default state + */ + +void +set_default_state(ScrnInfoPtr pScrn, drmBufPtr ib) +{ + tex_resource_t tex_res; + shader_config_t fs_conf; + sq_config_t sq_conf; + int i; + + RHDPtr rhdPtr = RHDPTR(pScrn); + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + + memset(&tex_res, 0, sizeof(tex_resource_t)); + memset(&fs_conf, 0, sizeof(shader_config_t)); + +#if 1 + if (accel_state->XHas3DEngineState) + return; +#endif + + accel_state->XHas3DEngineState = TRUE; + + wait_3d_idle(pScrn, ib); + + /* ASIC specific setup, see drm */ + if (rhdPtr->ChipSet < RHD_RV770) { + EREG(ib, TA_CNTL_AUX, (( 3 << GRADIENT_CREDIT_shift) | + (28 << TD_FIFO_CREDIT_shift))); + EREG(ib, VC_ENHANCE, 0); + EREG(ib, R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, 0); + EREG(ib, DB_DEBUG, 0x82000000); /* ? */ + EREG(ib, DB_WATERMARKS, ((4 << DEPTH_FREE_shift) | + (16 << DEPTH_FLUSH_shift) | + (0 << FORCE_SUMMARIZE_shift) | + (4 << DEPTH_PENDING_FREE_shift) | + (16 << DEPTH_CACHELINE_FREE_shift) | + 0)); + } else { + EREG(ib, TA_CNTL_AUX, (( 2 << GRADIENT_CREDIT_shift) | + (28 << TD_FIFO_CREDIT_shift))); + EREG(ib, VC_ENHANCE, 0); + EREG(ib, R7xx_SQ_DYN_GPR_CNTL_PS_FLUSH_REQ, VS_PC_LIMIT_ENABLE_bit); + EREG(ib, DB_DEBUG, 0); + EREG(ib, DB_WATERMARKS, ((4 << DEPTH_FREE_shift) | + (16 << DEPTH_FLUSH_shift) | + (0 << FORCE_SUMMARIZE_shift) | + (4 << DEPTH_PENDING_FREE_shift) | + (4 << DEPTH_CACHELINE_FREE_shift) | + 0)); + } + + reset_td_samplers(pScrn, ib); + reset_dx9_alu_consts(pScrn, ib); + reset_bool_loop_const (pScrn, ib); + reset_sampler_const (pScrn, ib); + + /* SQ */ + sq_conf.ps_prio = 0; + sq_conf.vs_prio = 1; + sq_conf.gs_prio = 2; + sq_conf.es_prio = 3; + /* need to set stack/thread/gpr limits based on the asic + * for now just set them low enough so any card will work + * see r600_cp.c in the drm + */ + switch (rhdPtr->ChipSet) { + case RHD_R600: + sq_conf.num_ps_gprs = 192; + sq_conf.num_vs_gprs = 56; + sq_conf.num_temp_gprs = 4; + sq_conf.num_gs_gprs = 0; + sq_conf.num_es_gprs = 0; + sq_conf.num_ps_threads = 136; + sq_conf.num_vs_threads = 48; + sq_conf.num_gs_threads = 4; + sq_conf.num_es_threads = 4; + sq_conf.num_ps_stack_entries = 128; + sq_conf.num_vs_stack_entries = 128; + sq_conf.num_gs_stack_entries = 0; + sq_conf.num_es_stack_entries = 0; + break; + case RHD_RV630: + case RHD_M76: + case RHD_RV635: + case RHD_M86: + sq_conf.num_ps_gprs = 84; + sq_conf.num_vs_gprs = 36; + sq_conf.num_temp_gprs = 4; + sq_conf.num_gs_gprs = 0; + sq_conf.num_es_gprs = 0; + sq_conf.num_ps_threads = 144; + sq_conf.num_vs_threads = 40; + sq_conf.num_gs_threads = 4; + sq_conf.num_es_threads = 4; + sq_conf.num_ps_stack_entries = 40; + sq_conf.num_vs_stack_entries = 40; + sq_conf.num_gs_stack_entries = 32; + sq_conf.num_es_stack_entries = 16; + break; + case RHD_RV610: + case RHD_M74: + case RHD_M72: + case RHD_M82: + case RHD_RV620: + case RHD_RS780: + case RHD_RS880: + default: + sq_conf.num_ps_gprs = 84; + sq_conf.num_vs_gprs = 36; + sq_conf.num_temp_gprs = 4; + sq_conf.num_gs_gprs = 0; + sq_conf.num_es_gprs = 0; + sq_conf.num_ps_threads = 136; + sq_conf.num_vs_threads = 48; + sq_conf.num_gs_threads = 4; + sq_conf.num_es_threads = 4; + sq_conf.num_ps_stack_entries = 40; + sq_conf.num_vs_stack_entries = 40; + sq_conf.num_gs_stack_entries = 32; + sq_conf.num_es_stack_entries = 16; + break; + case RHD_RV670: + case RHD_R680: + sq_conf.num_ps_gprs = 144; + sq_conf.num_vs_gprs = 40; + sq_conf.num_temp_gprs = 4; + sq_conf.num_gs_gprs = 0; + sq_conf.num_es_gprs = 0; + sq_conf.num_ps_threads = 136; + sq_conf.num_vs_threads = 48; + sq_conf.num_gs_threads = 4; + sq_conf.num_es_threads = 4; + sq_conf.num_ps_stack_entries = 40; + sq_conf.num_vs_stack_entries = 40; + sq_conf.num_gs_stack_entries = 32; + sq_conf.num_es_stack_entries = 16; + break; + case RHD_RV770: + case RHD_RV790: + case RHD_M98: + sq_conf.num_ps_gprs = 192; + sq_conf.num_vs_gprs = 56; + sq_conf.num_temp_gprs = 4; + sq_conf.num_gs_gprs = 0; + sq_conf.num_es_gprs = 0; + sq_conf.num_ps_threads = 188; + sq_conf.num_vs_threads = 60; + sq_conf.num_gs_threads = 0; + sq_conf.num_es_threads = 0; + sq_conf.num_ps_stack_entries = 256; + sq_conf.num_vs_stack_entries = 256; + sq_conf.num_gs_stack_entries = 0; + sq_conf.num_es_stack_entries = 0; + break; + case RHD_RV730: + case RHD_RV740: + case RHD_M96: + sq_conf.num_ps_gprs = 84; + sq_conf.num_vs_gprs = 36; + sq_conf.num_temp_gprs = 4; + sq_conf.num_gs_gprs = 0; + sq_conf.num_es_gprs = 0; + sq_conf.num_ps_threads = 188; + sq_conf.num_vs_threads = 60; + sq_conf.num_gs_threads = 0; + sq_conf.num_es_threads = 0; + sq_conf.num_ps_stack_entries = 128; + sq_conf.num_vs_stack_entries = 128; + sq_conf.num_gs_stack_entries = 0; + sq_conf.num_es_stack_entries = 0; + break; + case RHD_RV710: + sq_conf.num_ps_gprs = 192; + sq_conf.num_vs_gprs = 56; + sq_conf.num_temp_gprs = 4; + sq_conf.num_gs_gprs = 0; + sq_conf.num_es_gprs = 0; + sq_conf.num_ps_threads = 144; + sq_conf.num_vs_threads = 48; + sq_conf.num_gs_threads = 0; + sq_conf.num_es_threads = 0; + sq_conf.num_ps_stack_entries = 128; + sq_conf.num_vs_stack_entries = 128; + sq_conf.num_gs_stack_entries = 0; + sq_conf.num_es_stack_entries = 0; + break; + } + + sq_setup(pScrn, ib, &sq_conf); + + EREG(ib, SQ_VTX_BASE_VTX_LOC, 0); + EREG(ib, SQ_VTX_START_INST_LOC, 0); + + PACK0(ib, SQ_ESGS_RING_ITEMSIZE, 9); + E32(ib, 0); /* SQ_ESGS_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_GSVS_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_ESTMP_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_GSTMP_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_VSTMP_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_PSTMP_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_FBUF_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_REDUC_RING_ITEMSIZE */ + E32(ib, 0); /* SQ_GS_VERT_ITEMSIZE */ + + /* DB */ + EREG(ib, DB_DEPTH_INFO, 0); + EREG(ib, DB_STENCIL_CLEAR, 0); + EREG(ib, DB_DEPTH_CLEAR, 0); + EREG(ib, DB_STENCILREFMASK, 0); + EREG(ib, DB_STENCILREFMASK_BF, 0); + EREG(ib, DB_DEPTH_CONTROL, 0); + EREG(ib, DB_RENDER_CONTROL, STENCIL_COMPRESS_DISABLE_bit | DEPTH_COMPRESS_DISABLE_bit); + if (rhdPtr->ChipSet < RHD_RV770) + EREG(ib, DB_RENDER_OVERRIDE, FORCE_SHADER_Z_ORDER_bit); + else + EREG(ib, DB_RENDER_OVERRIDE, 0); + EREG(ib, DB_ALPHA_TO_MASK, ((2 << ALPHA_TO_MASK_OFFSET0_shift) | + (2 << ALPHA_TO_MASK_OFFSET1_shift) | + (2 << ALPHA_TO_MASK_OFFSET2_shift) | + (2 << ALPHA_TO_MASK_OFFSET3_shift))); + + /* SX */ + EREG(ib, SX_ALPHA_TEST_CONTROL, 0); + EREG(ib, SX_ALPHA_REF, 0); + + /* CB */ + reset_cb(pScrn, ib); + + PACK0(ib, CB_BLEND_RED, 4); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + + /* CB_COLOR_CONTROL.PER_MRT_BLEND is off */ + /* RV6xx+ have per-MRT blend */ + if (rhdPtr->ChipSet > RHD_R600) { + PACK0(ib, CB_BLEND0_CONTROL, CB_BLEND0_CONTROL_num); + for (i = 0; i < CB_BLEND0_CONTROL_num; i++) + E32(ib, 0); + } + + EREG(ib, CB_BLEND_CONTROL, 0); + + if (rhdPtr->ChipSet < RHD_RV770) { + PACK0(ib, CB_FOG_RED, 3); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + E32(ib, 0x00000000); + } + + EREG(ib, CB_COLOR_CONTROL, 0); + PACK0(ib, CB_CLRCMP_CONTROL, 4); + E32(ib, 1 << CLRCMP_FCN_SEL_shift); /* CB_CLRCMP_CONTROL: use CLRCMP_FCN_SRC */ + E32(ib, 0); /* CB_CLRCMP_SRC */ + E32(ib, 0); /* CB_CLRCMP_DST */ + E32(ib, 0); /* CB_CLRCMP_MSK */ + + + if (rhdPtr->ChipSet < RHD_RV770) { + PACK0(ib, CB_CLEAR_RED, 4); + EFLOAT(ib, 1.0); /* WTF? */ + EFLOAT(ib, 0.0); + EFLOAT(ib, 1.0); + EFLOAT(ib, 1.0); + } + EREG(ib, CB_TARGET_MASK, (0x0f << TARGET0_ENABLE_shift)); + + /* SC */ + set_generic_scissor(pScrn, ib, 0, 0, 8192, 8192); + set_screen_scissor (pScrn, ib, 0, 0, 8192, 8192); + EREG(ib, PA_SC_WINDOW_OFFSET, ((0 << WINDOW_X_OFFSET_shift) | + (0 << WINDOW_Y_OFFSET_shift))); + set_window_scissor (pScrn, ib, 0, 0, 8192, 8192); + + EREG(ib, PA_SC_CLIPRECT_RULE, CLIP_RULE_mask); + + /* clip boolean is set to always visible -> doesn't matter */ + for (i = 0; i < PA_SC_CLIPRECT_0_TL_num; i++) + set_clip_rect (pScrn, ib, i, 0, 0, 8192, 8192); + + if (rhdPtr->ChipSet < RHD_RV770) + EREG(ib, R7xx_PA_SC_EDGERULE, 0x00000000); + else + EREG(ib, R7xx_PA_SC_EDGERULE, 0xAAAAAAAA); /* ? */ + + for (i = 0; i < PA_SC_VPORT_SCISSOR_0_TL_num; i++) { + set_vport_scissor (pScrn, ib, i, 0, 0, 8192, 8192); + PACK0(ib, PA_SC_VPORT_ZMIN_0 + i * PA_SC_VPORT_ZMIN_0_offset, 2); + EFLOAT(ib, 0.0); + EFLOAT(ib, 1.0); + } + + if (rhdPtr->ChipSet < RHD_RV770) + EREG(ib, PA_SC_MODE_CNTL, (WALK_ORDER_ENABLE_bit | FORCE_EOV_CNTDWN_ENABLE_bit)); + else + EREG(ib, PA_SC_MODE_CNTL, (FORCE_EOV_CNTDWN_ENABLE_bit | FORCE_EOV_REZ_ENABLE_bit | + 0x00500000)); /* ? */ + + EREG(ib, PA_SC_LINE_CNTL, 0); + EREG(ib, PA_SC_AA_CONFIG, 0); + EREG(ib, PA_SC_AA_MASK, 0xFFFFFFFF); + + /* XXX: double check this */ + if (rhdPtr->ChipSet > RHD_R600) { + EREG(ib, PA_SC_AA_SAMPLE_LOCS_MCTX, 0); + EREG(ib, PA_SC_AA_SAMPLE_LOCS_8S_WD1_M, 0); + } + + EREG(ib, PA_SC_LINE_STIPPLE, 0); + EREG(ib, PA_SC_MPASS_PS_CNTL, 0); + + /* CL */ + PACK0(ib, PA_CL_VPORT_XSCALE_0, 6); + EFLOAT(ib, 0.0f); /* PA_CL_VPORT_XSCALE */ + EFLOAT(ib, 0.0f); /* PA_CL_VPORT_XOFFSET */ + EFLOAT(ib, 0.0f); /* PA_CL_VPORT_YSCALE */ + EFLOAT(ib, 0.0f); /* PA_CL_VPORT_YOFFSET */ + EFLOAT(ib, 0.0f); /* PA_CL_VPORT_ZSCALE */ + EFLOAT(ib, 0.0f); /* PA_CL_VPORT_ZOFFSET */ + EREG(ib, PA_CL_CLIP_CNTL, (CLIP_DISABLE_bit | DX_CLIP_SPACE_DEF_bit)); + EREG(ib, PA_CL_VTE_CNTL, 0); + EREG(ib, PA_CL_VS_OUT_CNTL, 0); + EREG(ib, PA_CL_NANINF_CNTL, 0); + PACK0(ib, PA_CL_GB_VERT_CLIP_ADJ, 4); + EFLOAT(ib, 1.0); /* PA_CL_GB_VERT_CLIP_ADJ */ + EFLOAT(ib, 1.0); /* PA_CL_GB_VERT_DISC_ADJ */ + EFLOAT(ib, 1.0); /* PA_CL_GB_HORZ_CLIP_ADJ */ + EFLOAT(ib, 1.0); /* PA_CL_GB_HORZ_DISC_ADJ */ + + /* user clipping planes are disabled by default */ + PACK0(ib, PA_CL_UCP_0_X, 24); + for (i = 0; i < 24; i++) + EFLOAT(ib, 0.0); + + /* SU */ + EREG(ib, PA_SU_SC_MODE_CNTL, FACE_bit); + EREG(ib, PA_SU_POINT_SIZE, 0); + EREG(ib, PA_SU_POINT_MINMAX, 0); + EREG(ib, PA_SU_POLY_OFFSET_DB_FMT_CNTL, 0); + EREG(ib, PA_SU_POLY_OFFSET_BACK_SCALE, 0); + EREG(ib, PA_SU_POLY_OFFSET_FRONT_SCALE, 0); + EREG(ib, PA_SU_POLY_OFFSET_BACK_OFFSET, 0); + EREG(ib, PA_SU_POLY_OFFSET_FRONT_OFFSET, 0); + + EREG(ib, PA_SU_LINE_CNTL, (8 << PA_SU_LINE_CNTL__WIDTH_shift)); /* Line width 1 pixel */ + EREG(ib, PA_SU_VTX_CNTL, ((2 << PA_SU_VTX_CNTL__ROUND_MODE_shift) | PIX_CENTER_bit | + (5 << QUANT_MODE_shift))); /* Round to Even, fixed point 1/256 */ + EREG(ib, PA_SU_POLY_OFFSET_CLAMP, 0); + + /* SPI */ + if (rhdPtr->ChipSet < RHD_RV770) + EREG(ib, R7xx_SPI_THREAD_GROUPING, 0); + else + EREG(ib, R7xx_SPI_THREAD_GROUPING, (1 << PS_GROUPING_shift)); + + EREG(ib, SPI_INTERP_CONTROL_0, ((2 << PNT_SPRITE_OVRD_X_shift) | + (3 << PNT_SPRITE_OVRD_Y_shift) | + (0 << PNT_SPRITE_OVRD_Z_shift) | + (1 << PNT_SPRITE_OVRD_W_shift))); /* s,t,0,1 */ + EREG(ib, SPI_INPUT_Z, 0); + EREG(ib, SPI_FOG_CNTL, 0); + EREG(ib, SPI_FOG_FUNC_SCALE, 0); + EREG(ib, SPI_FOG_FUNC_BIAS, 0); + + PACK0(ib, SPI_VS_OUT_ID_0, SPI_VS_OUT_ID_0_num); + for (i = 0; i < SPI_VS_OUT_ID_0_num; i++) /* identity mapping */ + E32(ib, 0x03020100 + i*0x04040404); + EREG(ib, SPI_VS_OUT_CONFIG, 0); + + /* clear FS */ + fs_setup(pScrn, ib, &fs_conf); + + /* VGT */ + EREG(ib, VGT_MAX_VTX_INDX, 2048); /* XXX set to a reasonably large number of indices */ + EREG(ib, VGT_MIN_VTX_INDX, 0); + EREG(ib, VGT_INDX_OFFSET, 0); + EREG(ib, VGT_INSTANCE_STEP_RATE_0, 0); + EREG(ib, VGT_INSTANCE_STEP_RATE_1, 0); + + EREG(ib, VGT_MULTI_PRIM_IB_RESET_INDX, 0); + EREG(ib, VGT_OUTPUT_PATH_CNTL, 0); + EREG(ib, VGT_GS_MODE, 0); + EREG(ib, VGT_HOS_CNTL, 0); + EREG(ib, VGT_HOS_MAX_TESS_LEVEL, 0); + EREG(ib, VGT_HOS_MIN_TESS_LEVEL, 0); + EREG(ib, VGT_HOS_REUSE_DEPTH, 0); + EREG(ib, VGT_GROUP_PRIM_TYPE, 0); + EREG(ib, VGT_GROUP_FIRST_DECR, 0); + EREG(ib, VGT_GROUP_DECR, 0); + EREG(ib, VGT_GROUP_VECT_0_CNTL, 0); + EREG(ib, VGT_GROUP_VECT_1_CNTL, 0); + EREG(ib, VGT_GROUP_VECT_0_FMT_CNTL, 0); + EREG(ib, VGT_GROUP_VECT_1_FMT_CNTL, 0); + EREG(ib, VGT_PRIMITIVEID_EN, 0); + EREG(ib, VGT_MULTI_PRIM_IB_RESET_EN, 0); + EREG(ib, VGT_STRMOUT_EN, 0); + EREG(ib, VGT_REUSE_OFF, 0); + EREG(ib, VGT_VTX_CNT_EN, 0); + EREG(ib, VGT_STRMOUT_BUFFER_EN, 0); + + /* clear tex resources - PS */ + for (i = 0; i < 16; i++) { + tex_res.id = i; + set_tex_resource(pScrn, ib, &tex_res); + } + + /* clear tex resources - VS */ + for (i = 160; i < 164; i++) { + tex_res.id = i; + set_tex_resource(pScrn, ib, &tex_res); + } + + /* clear tex resources - FS */ + for (i = 320; i < 335; i++) { + tex_res.id = i; + set_tex_resource(pScrn, ib, &tex_res); + } + +} + + +/* + * Commands + */ + +void +draw_immd(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf, uint32_t *indices) +{ + uint32_t i, count; + + EREG(ib, VGT_PRIMITIVE_TYPE, draw_conf->prim_type); + PACK3(ib, IT_INDEX_TYPE, 1); + E32(ib, draw_conf->index_type); + PACK3(ib, IT_NUM_INSTANCES, 1); + E32(ib, draw_conf->num_instances); + + /* calculate num of packets */ + count = 2; + if (draw_conf->index_type == DI_INDEX_SIZE_16_BIT) + count += (draw_conf->num_indices + 1) / 2; + else + count += draw_conf->num_indices; + + PACK3(ib, IT_DRAW_INDEX_IMMD, count); + E32(ib, draw_conf->num_indices); + E32(ib, draw_conf->vgt_draw_initiator); + + if (draw_conf->index_type == DI_INDEX_SIZE_16_BIT) { + for (i = 0; i < draw_conf->num_indices; i += 2) { + if ((i + 1) == draw_conf->num_indices) + E32(ib, indices[i]); + else + E32(ib, (indices[i] | (indices[i + 1] << 16))); + } + } else { + for (i = 0; i < draw_conf->num_indices; i++) + E32(ib, indices[i]); + } +} + +void +draw_auto(ScrnInfoPtr pScrn, drmBufPtr ib, draw_config_t *draw_conf) +{ + EREG(ib, VGT_PRIMITIVE_TYPE, draw_conf->prim_type); + PACK3(ib, IT_INDEX_TYPE, 1); + E32(ib, draw_conf->index_type); + PACK3(ib, IT_NUM_INSTANCES, 1); + E32(ib, draw_conf->num_instances); + PACK3(ib, IT_DRAW_INDEX_AUTO, 2); + E32(ib, draw_conf->num_indices); + E32(ib, draw_conf->vgt_draw_initiator); +} + +#define R6XX_LOOP_COUNT 2000000 + +static Bool +R6xxIdleLocal(int scrnIndex) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + /* wait for fifo to clear */ + for (i = 0; i < R6XX_LOOP_COUNT; i++) { + if (rhdPtr->ChipSet >= RHD_RV770) { + if (8 == (RHDRegRead(pScrn, GRBM_STATUS) & R700_CMDFIFO_AVAIL_mask)) + break; + } else { + if (16 == (RHDRegRead(pScrn, GRBM_STATUS) & R600_CMDFIFO_AVAIL_mask)) + break; + } + } + + if (i == R6XX_LOOP_COUNT) { + xf86DrvMsg(scrnIndex, X_ERROR, "%s: FIFO Timeout 0x%08X.\n", __func__, + (unsigned int) RHDRegRead(pScrn, GRBM_STATUS)); + return FALSE; + } + + /* wait for engine to go idle */ + for (i = 0; i < R6XX_LOOP_COUNT; i++) + if (!(RHDRegRead(pScrn, GRBM_STATUS) & GUI_ACTIVE_bit)) + break; + + if (i == R6XX_LOOP_COUNT) { + xf86DrvMsg(scrnIndex, X_ERROR, "%s: Idle Timeout 0x%08X.\n", __func__, + (unsigned int) RHDRegRead(pScrn, GRBM_STATUS)); + return FALSE; + } + + return TRUE; +} + +static void +R6xxEngineReset(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + uint32_t cp_ptr, cp_me_cntl, cp_rb_cntl; + + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s!!!!!\n", __func__); + + cp_ptr = RHDRegRead(pScrn, CP_RB_WPTR); + + cp_me_cntl = RHDRegRead(pScrn, CP_ME_CNTL); + RHDRegWrite(pScrn, CP_ME_CNTL, 0x10000000); + + RHDRegWrite(pScrn, GRBM_SOFT_RESET, 0x7fff); + RHDRegRead(pScrn, GRBM_SOFT_RESET); + usleep (50); + RHDRegWrite(pScrn, GRBM_SOFT_RESET, 0); + RHDRegRead(pScrn, GRBM_SOFT_RESET); + + RHDRegWrite(pScrn, CP_RB_WPTR_DELAY, 0); + cp_rb_cntl = RHDRegRead(pScrn, CP_RB_CNTL); + RHDRegWrite(pScrn, CP_RB_CNTL, 0x80000000); + + RHDRegWrite(pScrn, CP_RB_RPTR_WR, cp_ptr); + RHDRegWrite(pScrn, CP_RB_WPTR, cp_ptr); + RHDRegWrite(pScrn, CP_RB_CNTL, cp_rb_cntl); + RHDRegWrite(pScrn, CP_ME_CNTL, cp_me_cntl); + + if (rhdPtr->TwoDPrivate) + ((struct r6xx_accel_state *) rhdPtr->TwoDPrivate)->XHas3DEngineState = FALSE; + +} + +void +R6xxIdle(ScrnInfoPtr pScrn) +{ + if (!R6xxIdleLocal(pScrn->scrnIndex)) + R6xxEngineReset(pScrn); +} diff --git a/driver/xf86-video-radeonhd/src/r6xx_accel.h b/driver/xf86-video-radeonhd/src/r6xx_accel.h new file mode 100644 index 000000000..b96501d22 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/r6xx_accel.h @@ -0,0 +1,89 @@ + +#include "exa.h" + +#include "xf86drm.h" + +/* seriously ?! @#$%% */ +# define uint32_t CARD32 +# define uint64_t CARD64 + +/* r600_exa.c */ +Bool R6xxEXAInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); +void R6xxEXACloseScreen(ScreenPtr pScreen); +void R6xxEXADestroy(ScrnInfoPtr pScrn); + +void R6xxCacheFlush(struct RhdCS *CS); +void R6xxEngineWaitIdleFull(struct RhdCS *CS); + +extern unsigned int +RHDDRIGetIntGARTLocation(ScrnInfoPtr pScrn); + +extern PixmapPtr +RADEONGetDrawablePixmap(DrawablePtr pDrawable); + +/* r6xx_accel.c */ +void +R6xxIdle(ScrnInfoPtr pScrn); + +Bool +R600LoadShaders(ScrnInfoPtr pScrn); + +struct r6xx_accel_state { + Bool XHas3DEngineState; + + int exaSyncMarker; + int exaMarkerSynced; + + drmBufPtr ib; + int vb_index; + + /* shader storage */ + ExaOffscreenArea *shaders; + uint32_t solid_vs_offset; + uint32_t solid_ps_offset; + uint32_t copy_vs_offset; + uint32_t copy_ps_offset; + uint32_t comp_vs_offset; + uint32_t comp_ps_offset; + uint32_t comp_mask_ps_offset; + uint32_t xv_vs_offset; + uint32_t xv_ps_offset; + + /*size/addr stuff */ + uint32_t src_size[2]; + uint64_t src_mc_addr[2]; + uint32_t src_pitch[2]; + uint32_t src_width[2]; + uint32_t src_height[2]; + uint32_t src_bpp[2]; + uint32_t dst_size; + uint64_t dst_mc_addr; + uint32_t dst_pitch; + uint32_t dst_height; + uint32_t dst_bpp; + uint32_t vs_size; + uint64_t vs_mc_addr; + uint32_t ps_size; + uint64_t ps_mc_addr; + uint32_t vb_size; + uint64_t vb_mc_addr; + + /* UTS/DFS */ + drmBufPtr scratch; + + /* copy */ + ExaOffscreenArea *copy_area; + Bool same_surface; + int rop; + uint32_t planemask; + + /*comp */ + unsigned short texW[2]; + unsigned short texH[2]; + Bool is_transform[2]; + struct pixman_transform *transform[2]; + Bool has_mask; + Bool component_alpha; + Bool src_alpha; +}; + diff --git a/driver/xf86-video-radeonhd/src/radeon_3d.c b/driver/xf86-video-radeonhd/src/radeon_3d.c new file mode 100644 index 000000000..d70052a70 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/radeon_3d.c @@ -0,0 +1,851 @@ +/* BROKEN DISCLAIMER */ + +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and + * VA Linux Systems Inc., Fremont, California. + * + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ + +#ifdef IS_QUICK_AND_DIRTY /* make this IS_RADEON_DRIVER */ +/* + * Radeon driver specifics. + */ +#if defined(ACCEL_MMIO) && defined(ACCEL_CP) +#error Cannot define both MMIO and CP acceleration! +#endif + +#if !defined(UNIXCPP) || defined(ANSICPP) +#define FUNC_NAME_CAT(prefix,suffix) prefix##suffix +#else +#define FUNC_NAME_CAT(prefix,suffix) prefix/**/suffix +#endif + +#ifdef ACCEL_MMIO +#define FUNC_NAME(prefix) FUNC_NAME_CAT(prefix,MMIO) +#else +#ifdef ACCEL_CP +#define FUNC_NAME(prefix) FUNC_NAME_CAT(prefix,CP) +#else +#error No accel type defined! +#endif +#endif + +#ifdef ACCEL_MMIO +#define ONLY_ONCE +#else +#undef ONLY_ONCE +#endif + +#ifdef ONLY_ONCE + +# define VAR_PREAMBLE() RHDPtr info = RHDPTR(pScrn) +# define THREEDSTATE_PREAMBLE() struct rhdAccel *accel_state = info->accel_state + +# define HAS_TCL info->has_tcl + +# define R5XXPowerPipes(p) {} + +/* Map the number of GB Pipes the hardware has. */ +static int +R5xxGBPipesCount(ScrnInfoPtr pScrn) +{ + return ((RHDRegRead(pScrn, R400_GB_PIPE_SELECT) >> 12) & 0x03) + 1; +} +#define NUM_GB_PIPES R5xxGBPipesCount(pScrn) + +/* Map the number of FPUs the VPS has. */ +static int +R5xxPVSFPUCount(ScrnInfoPtr pScrn) +{ + switch (RHDPTR(pScrn)->ChipSet) { + case RHD_RV515: + case RHD_RV516: + case RHD_RV550: + case RHD_M52: + case RHD_M54: + case RHD_M62: + case RHD_M64: + return 2; + case RHD_RV530: + case RHD_RV560: + case RHD_RV570: + case RHD_M56: + case RHD_M58: + case RHD_M66: + return 5; + case RHD_R520: + case RHD_R580: + case RHD_M68: + return 8; + default: + return 4; + } +} +#define NUM_PVS_FPUS R5xxPVSFPUCount(pScrn) + +# define END_ACCEL() + +#endif /* ONLY_ONCE */ + +#else /* IS_RADEON_DRIVER */ +/* + * RadeonHD driver specifics. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_cs.h" + +#include "r5xx_accel.h" +#include "r5xx_3dregs.h" + +#ifdef USE_DRI +/* for claiming the context */ +#include "rhd_dri.h" +#endif + +#define VAR_PREAMBLE() RHDPtr rhdPtr = RHDPTR(pScrn) +#define THREEDSTATE_PREAMBLE() struct R5xx3D *accel_state = rhdPtr->ThreeDPrivate + +/* + * Map the macros. + */ +#define ACCEL_PREAMBLE() struct RhdCS *CS = rhdPtr->CS + +#define BEGIN_ACCEL(Count) RHDCSGrab(CS, 2 * (Count)) +#define OUT_ACCEL_REG(Reg, Value) RHDCSRegWrite(CS, (Reg), (Value)) +#define FINISH_ACCEL() + +#ifdef USE_DRI +#define END_ACCEL() RHDCSAdvance(CS); \ + if (pScrn->pScreen) \ + RHDDRIContextClaim(pScrn) +#else +#define END_ACCEL() RHDCSAdvance(CS) +#endif + +#define uint32_t CARD32 + +#define IS_R300_3D \ + ((rhdPtr->ChipSet == RHD_RS690) || \ + (rhdPtr->ChipSet == RHD_RS600) || \ + (rhdPtr->ChipSet == RHD_RS740)) + +#define IS_R500_3D \ + ((rhdPtr->ChipSet != RHD_RS690) && \ + (rhdPtr->ChipSet != RHD_RS600) && \ + (rhdPtr->ChipSet != RHD_RS740)) + +#define HAS_TCL IS_R500_3D + +/* Map the number of GB Pipes the hardware has. */ +static int +R5xxGBPipesCount(ScrnInfoPtr pScrn) +{ + return ((RHDRegRead(pScrn, R400_GB_PIPE_SELECT) >> 12) & 0x03) + 1; +} +#define NUM_GB_PIPES R5xxGBPipesCount(pScrn) + +/* Map the number of FPUs the VPS has. */ +static int +R5xxPVSFPUCount(ScrnInfoPtr pScrn) +{ + switch (RHDPTR(pScrn)->ChipSet) { + case RHD_RV515: + case RHD_RV516: + case RHD_RV550: + case RHD_M52: + case RHD_M54: + case RHD_M62: + case RHD_M64: + return 2; + case RHD_RV530: + case RHD_RV560: + case RHD_RV570: + case RHD_M56: + case RHD_M58: + case RHD_M66: + return 5; + case RHD_R520: + case RHD_R580: + case RHD_M68: + return 8; + default: + return 4; + } +} +#define NUM_PVS_FPUS R5xxPVSFPUCount(pScrn) + +/* + * + */ +static void +R5XXPowerPipes(ScrnInfoPtr pScrn) +{ + CARD32 tmp = RHDRegRead(pScrn, R400_GB_PIPE_SELECT); + RHDWritePLL(pScrn, R500_DYN_SCLK_PWMEM_PIPE, (1 | ((tmp >> 8) & 0xf) << 4)); +} +/* for radeon, this is done elsewhere, so use: + * #define R5XXPowerPipes(x) + */ + +#endif /* IS_RADEON_DRIVER */ + +#if defined(IS_RADEON_DRIVER) || defined(IS_QUICK_AND_DIRTY) +static void +FUNC_NAME(RADEONInit3DEngine)(int scrnIndex) +#else +void +R5xx3DSetup(int scrnIndex) +#endif +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + VAR_PREAMBLE(); + THREEDSTATE_PREAMBLE(); + uint32_t gb_tile_config, su_reg_dest, vap_cntl; + int num_gb_pipes = NUM_GB_PIPES; + int num_pvs_fpus = NUM_PVS_FPUS; + Bool HasTCL = HAS_TCL; + ACCEL_PREAMBLE(); + + accel_state->texW[0] = 1; + accel_state->texH[0] = 1; + accel_state->texW[1] = 1; + accel_state->texH[1] = 1; + +#ifdef IS_RADEON_DRIVER + if (IS_R300_3D || IS_R500_3D) { +#endif + BEGIN_ACCEL(3); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); + OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); + FINISH_ACCEL(); + + if (IS_R500_3D) + R5XXPowerPipes(pScrn); + + gb_tile_config = (R300_ENABLE_TILING | R300_TILE_SIZE_16); + + switch(num_gb_pipes) { + case 2: gb_tile_config |= R300_PIPE_COUNT_R300; break; + case 3: gb_tile_config |= R300_PIPE_COUNT_R420_3P; break; + case 4: gb_tile_config |= R300_PIPE_COUNT_R420; break; + default: + case 1: gb_tile_config |= R300_PIPE_COUNT_RV350; break; + } + + BEGIN_ACCEL(5); + OUT_ACCEL_REG(R300_GB_TILE_CONFIG, gb_tile_config); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); + OUT_ACCEL_REG(R300_DST_PIPE_CONFIG, R300_PIPE_AUTO_CONFIG); + OUT_ACCEL_REG(R300_GB_SELECT, 0); + OUT_ACCEL_REG(R300_GB_ENABLE, 0); + FINISH_ACCEL(); + + if (IS_R500_3D) { + su_reg_dest = ((1 << num_gb_pipes) - 1); + BEGIN_ACCEL(2); + OUT_ACCEL_REG(R500_SU_REG_DEST, su_reg_dest); + OUT_ACCEL_REG(R500_VAP_INDEX_OFFSET, 0); + FINISH_ACCEL(); + } + + BEGIN_ACCEL(3); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); + OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_2D_IDLECLEAN | RADEON_WAIT_3D_IDLECLEAN); + FINISH_ACCEL(); + + BEGIN_ACCEL(5); + OUT_ACCEL_REG(R300_GB_AA_CONFIG, 0); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); + OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); + OUT_ACCEL_REG(R300_GB_MSPOS0, ((6 << R300_MS_X0_SHIFT) | + (6 << R300_MS_Y0_SHIFT) | + (6 << R300_MS_X1_SHIFT) | + (6 << R300_MS_Y1_SHIFT) | + (6 << R300_MS_X2_SHIFT) | + (6 << R300_MS_Y2_SHIFT) | + (6 << R300_MSBD0_Y_SHIFT) | + (6 << R300_MSBD0_X_SHIFT))); + OUT_ACCEL_REG(R300_GB_MSPOS1, ((6 << R300_MS_X3_SHIFT) | + (6 << R300_MS_Y3_SHIFT) | + (6 << R300_MS_X4_SHIFT) | + (6 << R300_MS_Y4_SHIFT) | + (6 << R300_MS_X5_SHIFT) | + (6 << R300_MS_Y5_SHIFT) | + (6 << R300_MSBD1_SHIFT))); + FINISH_ACCEL(); + + BEGIN_ACCEL(5); + OUT_ACCEL_REG(R300_GA_ENHANCE, R300_GA_DEADLOCK_CNTL | R300_GA_FASTSYNC_CNTL); + OUT_ACCEL_REG(R300_GA_POLY_MODE, R300_FRONT_PTYPE_TRIANGE | R300_BACK_PTYPE_TRIANGE); + OUT_ACCEL_REG(R300_GA_ROUND_MODE, (R300_GEOMETRY_ROUND_NEAREST | + R300_COLOR_ROUND_NEAREST)); + OUT_ACCEL_REG(R300_GA_COLOR_CONTROL, (R300_RGB0_SHADING_GOURAUD | + R300_ALPHA0_SHADING_GOURAUD | + R300_RGB1_SHADING_GOURAUD | + R300_ALPHA1_SHADING_GOURAUD | + R300_RGB2_SHADING_GOURAUD | + R300_ALPHA2_SHADING_GOURAUD | + R300_RGB3_SHADING_GOURAUD | + R300_ALPHA3_SHADING_GOURAUD)); + OUT_ACCEL_REG(R300_GA_OFFSET, 0); + FINISH_ACCEL(); + + BEGIN_ACCEL(5); + OUT_ACCEL_REG(R300_SU_TEX_WRAP, 0); + OUT_ACCEL_REG(R300_SU_POLY_OFFSET_ENABLE, 0); + OUT_ACCEL_REG(R300_SU_CULL_MODE, R300_FACE_NEG); + OUT_ACCEL_REG(R300_SU_DEPTH_SCALE, 0x4b7fffff); + OUT_ACCEL_REG(R300_SU_DEPTH_OFFSET, 0); + FINISH_ACCEL(); + + /* setup the VAP */ + if (HasTCL) + vap_cntl = ((5 << R300_PVS_NUM_SLOTS_SHIFT) | + (5 << R300_PVS_NUM_CNTLRS_SHIFT) | + (9 << R300_VF_MAX_VTX_NUM_SHIFT) | + (num_pvs_fpus << R300_PVS_NUM_FPUS_SHIFT)); + else + vap_cntl = ((10 << R300_PVS_NUM_SLOTS_SHIFT) | + (5 << R300_PVS_NUM_CNTLRS_SHIFT) | + (5 << R300_VF_MAX_VTX_NUM_SHIFT) | + (num_pvs_fpus << R300_PVS_NUM_FPUS_SHIFT)); + + if (HasTCL) + BEGIN_ACCEL(15); + else + BEGIN_ACCEL(9); + OUT_ACCEL_REG(R300_VAP_VTX_STATE_CNTL, 0); + OUT_ACCEL_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0); + + if (HasTCL) + OUT_ACCEL_REG(R300_VAP_CNTL_STATUS, 0); + else + OUT_ACCEL_REG(R300_VAP_CNTL_STATUS, R300_PVS_BYPASS); + OUT_ACCEL_REG(R300_VAP_CNTL, vap_cntl); + OUT_ACCEL_REG(R300_VAP_PVS_STATE_FLUSH_REG, 0); + OUT_ACCEL_REG(R300_VAP_VTE_CNTL, R300_VTX_XY_FMT | R300_VTX_Z_FMT); + OUT_ACCEL_REG(R300_VAP_PSC_SGN_NORM_CNTL, 0); + + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_EXT_0, + ((R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_0_SHIFT) | + (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_0_SHIFT) | + (R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_0_SHIFT) | + (R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_0_SHIFT) | + ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W) + << R300_WRITE_ENA_0_SHIFT) | + (R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_1_SHIFT) | + (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_1_SHIFT) | + (R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_1_SHIFT) | + (R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_1_SHIFT) | + ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W) + << R300_WRITE_ENA_1_SHIFT))); + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_EXT_1, + ((R300_SWIZZLE_SELECT_X << R300_SWIZZLE_SELECT_X_2_SHIFT) | + (R300_SWIZZLE_SELECT_Y << R300_SWIZZLE_SELECT_Y_2_SHIFT) | + (R300_SWIZZLE_SELECT_Z << R300_SWIZZLE_SELECT_Z_2_SHIFT) | + (R300_SWIZZLE_SELECT_W << R300_SWIZZLE_SELECT_W_2_SHIFT) | + ((R300_WRITE_ENA_X | R300_WRITE_ENA_Y | R300_WRITE_ENA_Z | R300_WRITE_ENA_W) + << R300_WRITE_ENA_2_SHIFT))); + + if (HasTCL) { + OUT_ACCEL_REG(R300_VAP_PVS_FLOW_CNTL_OPC, 0); + OUT_ACCEL_REG(R300_VAP_GB_VERT_CLIP_ADJ, 0x3f800000); + OUT_ACCEL_REG(R300_VAP_GB_VERT_DISC_ADJ, 0x3f800000); + OUT_ACCEL_REG(R300_VAP_GB_HORZ_CLIP_ADJ, 0x3f800000); + OUT_ACCEL_REG(R300_VAP_GB_HORZ_DISC_ADJ, 0x3f800000); + OUT_ACCEL_REG(R300_VAP_CLIP_CNTL, R300_CLIP_DISABLE); + } + FINISH_ACCEL(); + + /* pre-load the vertex shaders */ + if (HasTCL) { + /* exa mask shader program */ + BEGIN_ACCEL(13); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 0); + /* PVS inst 0 */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(0) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + + /* PVS inst 1 */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(1) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + + /* PVS inst 2 */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(2) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(7) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(7) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(7) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + FINISH_ACCEL(); + + BEGIN_ACCEL(9); + /* exa no mask instruction */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 3); + /* PVS inst 0 */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(0) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + + /* PVS inst 1 */ + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(1) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + FINISH_ACCEL(); + + /* Xv shader program */ + BEGIN_ACCEL(9); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_INDX_REG, 5); + + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(0) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(0) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_DST_OPCODE(R300_VE_ADD) | + R300_PVS_DST_REG_TYPE(R300_PVS_DST_REG_OUT) | + R300_PVS_DST_OFFSET(1) | + R300_PVS_DST_WE_X | R300_PVS_DST_WE_Y | + R300_PVS_DST_WE_Z | R300_PVS_DST_WE_W)); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_X) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_Y) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_Z) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_W))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + OUT_ACCEL_REG(R300_VAP_PVS_VECTOR_DATA_REG, + (R300_PVS_SRC_REG_TYPE(R300_PVS_SRC_REG_INPUT) | + R300_PVS_SRC_OFFSET(6) | + R300_PVS_SRC_SWIZZLE_X(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Y(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_Z(R300_PVS_SRC_SELECT_FORCE_0) | + R300_PVS_SRC_SWIZZLE_W(R300_PVS_SRC_SELECT_FORCE_0))); + FINISH_ACCEL(); + } + + /* pre-load the RS instructions */ + BEGIN_ACCEL(4); + if (IS_R300_3D) { + /* rasterizer source table + * R300_RS_TEX_PTR is the offset into the input RS stream + * 0,1 are tex0 + * 2,3 are tex1 + */ + OUT_ACCEL_REG(R300_RS_IP_0, + (R300_RS_TEX_PTR(0) | + R300_RS_SEL_S(R300_RS_SEL_C0) | + R300_RS_SEL_T(R300_RS_SEL_C1) | + R300_RS_SEL_R(R300_RS_SEL_K0) | + R300_RS_SEL_Q(R300_RS_SEL_K1))); + OUT_ACCEL_REG(R300_RS_IP_1, + (R300_RS_TEX_PTR(2) | + R300_RS_SEL_S(R300_RS_SEL_C0) | + R300_RS_SEL_T(R300_RS_SEL_C1) | + R300_RS_SEL_R(R300_RS_SEL_K0) | + R300_RS_SEL_Q(R300_RS_SEL_K1))); + /* src tex */ + /* R300_INST_TEX_ID - select the RS source table entry + * R300_INST_TEX_ADDR - the FS temp register for the texture data + */ + OUT_ACCEL_REG(R300_RS_INST_0, (R300_INST_TEX_ID(0) | + R300_RS_INST_TEX_CN_WRITE | + R300_INST_TEX_ADDR(0))); + /* mask tex */ + OUT_ACCEL_REG(R300_RS_INST_1, (R300_INST_TEX_ID(1) | + R300_RS_INST_TEX_CN_WRITE | + R300_INST_TEX_ADDR(1))); + + } else { + /* rasterizer source table + * R300_RS_TEX_PTR is the offset into the input RS stream + * 0,1 are tex0 + * 2,3 are tex1 + */ + OUT_ACCEL_REG(R500_RS_IP_0, ((0 << R500_RS_IP_TEX_PTR_S_SHIFT) | + (1 << R500_RS_IP_TEX_PTR_T_SHIFT) | + (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT) | + (R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT))); + + OUT_ACCEL_REG(R500_RS_IP_1, ((2 << R500_RS_IP_TEX_PTR_S_SHIFT) | + (3 << R500_RS_IP_TEX_PTR_T_SHIFT) | + (R500_RS_IP_PTR_K0 << R500_RS_IP_TEX_PTR_R_SHIFT) | + (R500_RS_IP_PTR_K1 << R500_RS_IP_TEX_PTR_Q_SHIFT))); + /* src tex */ + /* R500_RS_INST_TEX_ID_SHIFT - select the RS source table entry + * R500_RS_INST_TEX_ADDR_SHIFT - the FS temp register for the texture data + */ + OUT_ACCEL_REG(R500_RS_INST_0, ((0 << R500_RS_INST_TEX_ID_SHIFT) | + R500_RS_INST_TEX_CN_WRITE | + (0 << R500_RS_INST_TEX_ADDR_SHIFT))); + /* mask tex */ + OUT_ACCEL_REG(R500_RS_INST_1, ((1 << R500_RS_INST_TEX_ID_SHIFT) | + R500_RS_INST_TEX_CN_WRITE | + (1 << R500_RS_INST_TEX_ADDR_SHIFT))); + } + FINISH_ACCEL(); + + /* pre-load FS tex instructions */ + if (IS_R300_3D) { + BEGIN_ACCEL(2); + /* tex inst for src texture */ + OUT_ACCEL_REG(R300_US_TEX_INST_0, + (R300_TEX_SRC_ADDR(0) | + R300_TEX_DST_ADDR(0) | + R300_TEX_ID(0) | + R300_TEX_INST(R300_TEX_INST_LD))); + + /* tex inst for mask texture */ + OUT_ACCEL_REG(R300_US_TEX_INST_1, + (R300_TEX_SRC_ADDR(1) | + R300_TEX_DST_ADDR(1) | + R300_TEX_ID(1) | + R300_TEX_INST(R300_TEX_INST_LD))); + FINISH_ACCEL(); + } + + if (IS_R300_3D) { + BEGIN_ACCEL(9); + OUT_ACCEL_REG(R300_US_CONFIG, (0 << R300_NLEVEL_SHIFT) | R300_FIRST_TEX); + OUT_ACCEL_REG(R300_US_PIXSIZE, 1); /* highest temp used */ + OUT_ACCEL_REG(R300_US_CODE_ADDR_0, + (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(0))); + OUT_ACCEL_REG(R300_US_CODE_ADDR_1, + (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(0))); + OUT_ACCEL_REG(R300_US_CODE_ADDR_2, + (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(0))); + } else { + BEGIN_ACCEL(7); + OUT_ACCEL_REG(R300_US_CONFIG, R500_ZERO_TIMES_ANYTHING_EQUALS_ZERO); + OUT_ACCEL_REG(R300_US_PIXSIZE, 1); /* highest temp used */ + OUT_ACCEL_REG(R500_US_FC_CTRL, 0); + } + OUT_ACCEL_REG(R300_US_W_FMT, 0); + OUT_ACCEL_REG(R300_US_OUT_FMT_1, (R300_OUT_FMT_UNUSED | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA)); + OUT_ACCEL_REG(R300_US_OUT_FMT_2, (R300_OUT_FMT_UNUSED | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA)); + OUT_ACCEL_REG(R300_US_OUT_FMT_3, (R300_OUT_FMT_UNUSED | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA)); + FINISH_ACCEL(); + + + BEGIN_ACCEL(3); + OUT_ACCEL_REG(R300_FG_DEPTH_SRC, 0); + OUT_ACCEL_REG(R300_FG_FOG_BLEND, 0); + OUT_ACCEL_REG(R300_FG_ALPHA_FUNC, 0); + FINISH_ACCEL(); + + BEGIN_ACCEL(13); + OUT_ACCEL_REG(R300_RB3D_ABLENDCNTL, 0); + OUT_ACCEL_REG(R300_RB3D_ZSTENCILCNTL, 0); + OUT_ACCEL_REG(R300_RB3D_ZCACHE_CTLSTAT, R300_ZC_FLUSH | R300_ZC_FREE); + OUT_ACCEL_REG(R300_RB3D_BW_CNTL, 0); + OUT_ACCEL_REG(R300_RB3D_ZCNTL, 0); + OUT_ACCEL_REG(R300_RB3D_ZTOP, 0); + OUT_ACCEL_REG(R300_RB3D_ROPCNTL, 0); + + OUT_ACCEL_REG(R300_RB3D_AARESOLVE_CTL, 0); + OUT_ACCEL_REG(R300_RB3D_COLOR_CHANNEL_MASK, (R300_BLUE_MASK_EN | + R300_GREEN_MASK_EN | + R300_RED_MASK_EN | + R300_ALPHA_MASK_EN)); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); + OUT_ACCEL_REG(R300_RB3D_CCTL, 0); + OUT_ACCEL_REG(R300_RB3D_DITHER_CTL, 0); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D | R300_DC_FREE_3D); + FINISH_ACCEL(); + + BEGIN_ACCEL(7); + OUT_ACCEL_REG(R300_SC_EDGERULE, 0xA5294A5); + + if (IS_R300_3D) { + /* clip has offset 1440 */ + OUT_ACCEL_REG(R300_SC_SCISSOR0, ((1440 << R300_SCISSOR_X_SHIFT) | + (1440 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, ((8191 << R300_SCISSOR_X_SHIFT) | + (8191 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_CLIP_0_A, ((1440 << R300_CLIP_X_SHIFT) | + (1440 << R300_CLIP_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_CLIP_0_B, ((4080 << R300_CLIP_X_SHIFT) | + (4080 << R300_CLIP_Y_SHIFT))); + } else { + OUT_ACCEL_REG(R300_SC_SCISSOR0, ((0 << R300_SCISSOR_X_SHIFT) | + (0 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_SCISSOR1, ((8191 << R300_SCISSOR_X_SHIFT) | + (8191 << R300_SCISSOR_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_CLIP_0_A, ((0 << R300_CLIP_X_SHIFT) | + (0 << R300_CLIP_Y_SHIFT))); + OUT_ACCEL_REG(R300_SC_CLIP_0_B, ((4080 << R300_CLIP_X_SHIFT) | + (4080 << R300_CLIP_Y_SHIFT))); + } + OUT_ACCEL_REG(R300_SC_CLIP_RULE, 0xAAAA); + OUT_ACCEL_REG(R300_SC_SCREENDOOR, 0xffffff); + FINISH_ACCEL(); + +#ifdef IS_RADEON_DRIVER + } else if ((info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280) || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_R200)) { + + BEGIN_ACCEL(7); + if (info->ChipFamily == CHIP_FAMILY_RS300) { + OUT_ACCEL_REG(R200_SE_VAP_CNTL_STATUS, RADEON_TCL_BYPASS); + } else { + OUT_ACCEL_REG(R200_SE_VAP_CNTL_STATUS, 0); + } + OUT_ACCEL_REG(R200_PP_CNTL_X, 0); + OUT_ACCEL_REG(R200_PP_TXMULTI_CTL_0, 0); + OUT_ACCEL_REG(R200_SE_VTX_STATE_CNTL, 0); + OUT_ACCEL_REG(R200_RE_CNTL, 0x0); + OUT_ACCEL_REG(R200_SE_VTE_CNTL, 0); + OUT_ACCEL_REG(R200_SE_VAP_CNTL, R200_VAP_FORCE_W_TO_ONE | + R200_VAP_VF_MAX_VTX_NUM); + FINISH_ACCEL(); + + BEGIN_ACCEL(5); + OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0); + OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, 0x07ff07ff); + OUT_ACCEL_REG(RADEON_AUX_SC_CNTL, 0); + OUT_ACCEL_REG(RADEON_RB3D_PLANEMASK, 0xffffffff); + OUT_ACCEL_REG(RADEON_SE_CNTL, (RADEON_DIFFUSE_SHADE_GOURAUD | + RADEON_BFACE_SOLID | + RADEON_FFACE_SOLID | + RADEON_VTX_PIX_CENTER_OGL | + RADEON_ROUND_MODE_ROUND | + RADEON_ROUND_PREC_4TH_PIX)); + FINISH_ACCEL(); + } else { + BEGIN_ACCEL(2); + if ((info->ChipFamily == CHIP_FAMILY_RADEON) || + (info->ChipFamily == CHIP_FAMILY_RV200)) + OUT_ACCEL_REG(RADEON_SE_CNTL_STATUS, 0); + else + OUT_ACCEL_REG(RADEON_SE_CNTL_STATUS, RADEON_TCL_BYPASS); + OUT_ACCEL_REG(RADEON_SE_COORD_FMT, + RADEON_VTX_XY_PRE_MULT_1_OVER_W0 | + RADEON_VTX_ST0_NONPARAMETRIC | + RADEON_VTX_ST1_NONPARAMETRIC | + RADEON_TEX1_W_ROUTING_USE_W0); + FINISH_ACCEL(); + + BEGIN_ACCEL(5); + OUT_ACCEL_REG(RADEON_RE_TOP_LEFT, 0); + OUT_ACCEL_REG(RADEON_RE_WIDTH_HEIGHT, 0x07ff07ff); + OUT_ACCEL_REG(RADEON_AUX_SC_CNTL, 0); + OUT_ACCEL_REG(RADEON_RB3D_PLANEMASK, 0xffffffff); + OUT_ACCEL_REG(RADEON_SE_CNTL, (RADEON_DIFFUSE_SHADE_GOURAUD | + RADEON_BFACE_SOLID | + RADEON_FFACE_SOLID | + RADEON_VTX_PIX_CENTER_OGL | + RADEON_ROUND_MODE_ROUND | + RADEON_ROUND_PREC_4TH_PIX)); + FINISH_ACCEL(); + } +#endif + + END_ACCEL(); + + accel_state->XHas3DEngineState = TRUE; +} + +#undef FUNC_NAME diff --git a/driver/xf86-video-radeonhd/src/radeon_dri.h b/driver/xf86-video-radeonhd/src/radeon_dri.h new file mode 100644 index 000000000..f946c5a55 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/radeon_dri.h @@ -0,0 +1,104 @@ +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, + * VA Linux Systems Inc., Fremont, California. + * + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ + +/* + * Authors: + * Kevin E. Martin + * Rickard E. Faith + * + */ + +#ifndef _RADEON_DRI_ +#define _RADEON_DRI_ + +#ifndef IS_RADEONHD_DRIVER + +#include "xf86drm.h" + +/* DRI Driver defaults */ +#define RADEON_DEFAULT_CP_PIO_MODE RADEON_CSQ_PRIPIO_INDPIO +#define RADEON_DEFAULT_CP_BM_MODE RADEON_CSQ_PRIBM_INDBM +#define RADEON_DEFAULT_GART_SIZE 8 /* MB (must be 2^n and > 4MB) */ +#define RADEON_DEFAULT_RING_SIZE 1 /* MB (must be page aligned) */ +#define RADEON_DEFAULT_BUFFER_SIZE 2 /* MB (must be page aligned) */ +#define RADEON_DEFAULT_GART_TEX_SIZE 1 /* MB (must be page aligned) */ + +#define RADEON_DEFAULT_CP_TIMEOUT 100000 /* usecs */ + +#define RADEON_DEFAULT_PCI_APER_SIZE 32 /* in MB */ + +#define RADEON_CARD_TYPE_RADEON 1 + +#define RADEONCP_USE_RING_BUFFER(m) \ + (((m) == RADEON_CSQ_PRIBM_INDDIS) || \ + ((m) == RADEON_CSQ_PRIBM_INDBM)) + +#endif /* !IS_RADEONHD_DRIVER */ + +typedef struct { + /* DRI screen private data */ + int deviceID; /* PCI device ID */ + int width; /* Width in pixels of display */ + int height; /* Height in scanlines of display */ + int depth; /* Depth of display (8, 15, 16, 24) */ + int bpp; /* Bit depth of display (8, 16, 24, 32) */ + + int IsPCI; /* Current card is a PCI card */ + int AGPMode; + + int frontOffset; /* Start of front buffer */ + int frontPitch; + int backOffset; /* Start of shared back buffer */ + int backPitch; + int depthOffset; /* Start of shared depth buffer */ + int depthPitch; + int textureOffset;/* Start of texture data in frame buffer */ + int textureSize; + int log2TexGran; + + /* MMIO register data */ + drm_handle_t registerHandle; + drmSize registerSize; + + /* CP in-memory status information */ + drm_handle_t statusHandle; + drmSize statusSize; + + /* CP GART Texture data */ + drm_handle_t gartTexHandle; + drmSize gartTexMapSize; + int log2GARTTexGran; + int gartTexOffset; + unsigned int sarea_priv_offset; + +#ifdef PER_CONTEXT_SAREA + drmSize perctx_sarea_size; +#endif +} RADEONDRIRec, *RADEONDRIPtr; + +#endif diff --git a/driver/xf86-video-radeonhd/src/radeon_drm.h b/driver/xf86-video-radeonhd/src/radeon_drm.h new file mode 100644 index 000000000..2199ecff6 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/radeon_drm.h @@ -0,0 +1,755 @@ +/* radeon_drm.h -- Public header for the radeon driver -*- linux-c -*- + * + * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas. + * Copyright 2000 VA Linux Systems, Inc., Fremont, California. + * Copyright 2002 Tungsten Graphics, Inc., Cedar Park, Texas. + * 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 + * 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 (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 NONINFRINGEMENT. IN NO EVENT SHALL + * PRECISION INSIGHT AND/OR ITS 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. + * + * Authors: + * Kevin E. Martin + * Gareth Hughes + * Keith Whitwell + */ + +#ifndef __RADEON_DRM_H__ +#define __RADEON_DRM_H__ + +/* WARNING: If you change any of these defines, make sure to change the + * defines in the X server file (radeon_sarea.h) + */ +#ifndef __RADEON_SAREA_DEFINES__ +#define __RADEON_SAREA_DEFINES__ + +/* Old style state flags, required for sarea interface (1.1 and 1.2 + * clears) and 1.2 drm_vertex2 ioctl. + */ +#define RADEON_UPLOAD_CONTEXT 0x00000001 +#define RADEON_UPLOAD_VERTFMT 0x00000002 +#define RADEON_UPLOAD_LINE 0x00000004 +#define RADEON_UPLOAD_BUMPMAP 0x00000008 +#define RADEON_UPLOAD_MASKS 0x00000010 +#define RADEON_UPLOAD_VIEWPORT 0x00000020 +#define RADEON_UPLOAD_SETUP 0x00000040 +#define RADEON_UPLOAD_TCL 0x00000080 +#define RADEON_UPLOAD_MISC 0x00000100 +#define RADEON_UPLOAD_TEX0 0x00000200 +#define RADEON_UPLOAD_TEX1 0x00000400 +#define RADEON_UPLOAD_TEX2 0x00000800 +#define RADEON_UPLOAD_TEX0IMAGES 0x00001000 +#define RADEON_UPLOAD_TEX1IMAGES 0x00002000 +#define RADEON_UPLOAD_TEX2IMAGES 0x00004000 +#define RADEON_UPLOAD_CLIPRECTS 0x00008000 /* handled client-side */ +#define RADEON_REQUIRE_QUIESCENCE 0x00010000 +#define RADEON_UPLOAD_ZBIAS 0x00020000 /* version 1.2 and newer */ +#define RADEON_UPLOAD_ALL 0x003effff +#define RADEON_UPLOAD_CONTEXT_ALL 0x003e01ff + +/* New style per-packet identifiers for use in cmd_buffer ioctl with + * the RADEON_EMIT_PACKET command. Comments relate new packets to old + * state bits and the packet size: + */ +#define RADEON_EMIT_PP_MISC 0 /* context/7 */ +#define RADEON_EMIT_PP_CNTL 1 /* context/3 */ +#define RADEON_EMIT_RB3D_COLORPITCH 2 /* context/1 */ +#define RADEON_EMIT_RE_LINE_PATTERN 3 /* line/2 */ +#define RADEON_EMIT_SE_LINE_WIDTH 4 /* line/1 */ +#define RADEON_EMIT_PP_LUM_MATRIX 5 /* bumpmap/1 */ +#define RADEON_EMIT_PP_ROT_MATRIX_0 6 /* bumpmap/2 */ +#define RADEON_EMIT_RB3D_STENCILREFMASK 7 /* masks/3 */ +#define RADEON_EMIT_SE_VPORT_XSCALE 8 /* viewport/6 */ +#define RADEON_EMIT_SE_CNTL 9 /* setup/2 */ +#define RADEON_EMIT_SE_CNTL_STATUS 10 /* setup/1 */ +#define RADEON_EMIT_RE_MISC 11 /* misc/1 */ +#define RADEON_EMIT_PP_TXFILTER_0 12 /* tex0/6 */ +#define RADEON_EMIT_PP_BORDER_COLOR_0 13 /* tex0/1 */ +#define RADEON_EMIT_PP_TXFILTER_1 14 /* tex1/6 */ +#define RADEON_EMIT_PP_BORDER_COLOR_1 15 /* tex1/1 */ +#define RADEON_EMIT_PP_TXFILTER_2 16 /* tex2/6 */ +#define RADEON_EMIT_PP_BORDER_COLOR_2 17 /* tex2/1 */ +#define RADEON_EMIT_SE_ZBIAS_FACTOR 18 /* zbias/2 */ +#define RADEON_EMIT_SE_TCL_OUTPUT_VTX_FMT 19 /* tcl/11 */ +#define RADEON_EMIT_SE_TCL_MATERIAL_EMMISSIVE_RED 20 /* material/17 */ +#define R200_EMIT_PP_TXCBLEND_0 21 /* tex0/4 */ +#define R200_EMIT_PP_TXCBLEND_1 22 /* tex1/4 */ +#define R200_EMIT_PP_TXCBLEND_2 23 /* tex2/4 */ +#define R200_EMIT_PP_TXCBLEND_3 24 /* tex3/4 */ +#define R200_EMIT_PP_TXCBLEND_4 25 /* tex4/4 */ +#define R200_EMIT_PP_TXCBLEND_5 26 /* tex5/4 */ +#define R200_EMIT_PP_TXCBLEND_6 27 /* /4 */ +#define R200_EMIT_PP_TXCBLEND_7 28 /* /4 */ +#define R200_EMIT_TCL_LIGHT_MODEL_CTL_0 29 /* tcl/7 */ +#define R200_EMIT_TFACTOR_0 30 /* tf/7 */ +#define R200_EMIT_VTX_FMT_0 31 /* vtx/5 */ +#define R200_EMIT_VAP_CTL 32 /* vap/1 */ +#define R200_EMIT_MATRIX_SELECT_0 33 /* msl/5 */ +#define R200_EMIT_TEX_PROC_CTL_2 34 /* tcg/5 */ +#define R200_EMIT_TCL_UCP_VERT_BLEND_CTL 35 /* tcl/1 */ +#define R200_EMIT_PP_TXFILTER_0 36 /* tex0/6 */ +#define R200_EMIT_PP_TXFILTER_1 37 /* tex1/6 */ +#define R200_EMIT_PP_TXFILTER_2 38 /* tex2/6 */ +#define R200_EMIT_PP_TXFILTER_3 39 /* tex3/6 */ +#define R200_EMIT_PP_TXFILTER_4 40 /* tex4/6 */ +#define R200_EMIT_PP_TXFILTER_5 41 /* tex5/6 */ +#define R200_EMIT_PP_TXOFFSET_0 42 /* tex0/1 */ +#define R200_EMIT_PP_TXOFFSET_1 43 /* tex1/1 */ +#define R200_EMIT_PP_TXOFFSET_2 44 /* tex2/1 */ +#define R200_EMIT_PP_TXOFFSET_3 45 /* tex3/1 */ +#define R200_EMIT_PP_TXOFFSET_4 46 /* tex4/1 */ +#define R200_EMIT_PP_TXOFFSET_5 47 /* tex5/1 */ +#define R200_EMIT_VTE_CNTL 48 /* vte/1 */ +#define R200_EMIT_OUTPUT_VTX_COMP_SEL 49 /* vtx/1 */ +#define R200_EMIT_PP_TAM_DEBUG3 50 /* tam/1 */ +#define R200_EMIT_PP_CNTL_X 51 /* cst/1 */ +#define R200_EMIT_RB3D_DEPTHXY_OFFSET 52 /* cst/1 */ +#define R200_EMIT_RE_AUX_SCISSOR_CNTL 53 /* cst/1 */ +#define R200_EMIT_RE_SCISSOR_TL_0 54 /* cst/2 */ +#define R200_EMIT_RE_SCISSOR_TL_1 55 /* cst/2 */ +#define R200_EMIT_RE_SCISSOR_TL_2 56 /* cst/2 */ +#define R200_EMIT_SE_VAP_CNTL_STATUS 57 /* cst/1 */ +#define R200_EMIT_SE_VTX_STATE_CNTL 58 /* cst/1 */ +#define R200_EMIT_RE_POINTSIZE 59 /* cst/1 */ +#define R200_EMIT_TCL_INPUT_VTX_VECTOR_ADDR_0 60 /* cst/4 */ +#define R200_EMIT_PP_CUBIC_FACES_0 61 +#define R200_EMIT_PP_CUBIC_OFFSETS_0 62 +#define R200_EMIT_PP_CUBIC_FACES_1 63 +#define R200_EMIT_PP_CUBIC_OFFSETS_1 64 +#define R200_EMIT_PP_CUBIC_FACES_2 65 +#define R200_EMIT_PP_CUBIC_OFFSETS_2 66 +#define R200_EMIT_PP_CUBIC_FACES_3 67 +#define R200_EMIT_PP_CUBIC_OFFSETS_3 68 +#define R200_EMIT_PP_CUBIC_FACES_4 69 +#define R200_EMIT_PP_CUBIC_OFFSETS_4 70 +#define R200_EMIT_PP_CUBIC_FACES_5 71 +#define R200_EMIT_PP_CUBIC_OFFSETS_5 72 +#define RADEON_EMIT_PP_TEX_SIZE_0 73 +#define RADEON_EMIT_PP_TEX_SIZE_1 74 +#define RADEON_EMIT_PP_TEX_SIZE_2 75 +#define R200_EMIT_RB3D_BLENDCOLOR 76 +#define R200_EMIT_TCL_POINT_SPRITE_CNTL 77 +#define RADEON_EMIT_PP_CUBIC_FACES_0 78 +#define RADEON_EMIT_PP_CUBIC_OFFSETS_T0 79 +#define RADEON_EMIT_PP_CUBIC_FACES_1 80 +#define RADEON_EMIT_PP_CUBIC_OFFSETS_T1 81 +#define RADEON_EMIT_PP_CUBIC_FACES_2 82 +#define RADEON_EMIT_PP_CUBIC_OFFSETS_T2 83 +#define R200_EMIT_PP_TRI_PERF_CNTL 84 +#define R200_EMIT_PP_AFS_0 85 +#define R200_EMIT_PP_AFS_1 86 +#define R200_EMIT_ATF_TFACTOR 87 +#define R200_EMIT_PP_TXCTLALL_0 88 +#define R200_EMIT_PP_TXCTLALL_1 89 +#define R200_EMIT_PP_TXCTLALL_2 90 +#define R200_EMIT_PP_TXCTLALL_3 91 +#define R200_EMIT_PP_TXCTLALL_4 92 +#define R200_EMIT_PP_TXCTLALL_5 93 +#define R200_EMIT_VAP_PVS_CNTL 94 +#define RADEON_MAX_STATE_PACKETS 95 + +/* Commands understood by cmd_buffer ioctl. More can be added but + * obviously these can't be removed or changed: + */ +#define RADEON_CMD_PACKET 1 /* emit one of the register packets above */ +#define RADEON_CMD_SCALARS 2 /* emit scalar data */ +#define RADEON_CMD_VECTORS 3 /* emit vector data */ +#define RADEON_CMD_DMA_DISCARD 4 /* discard current dma buf */ +#define RADEON_CMD_PACKET3 5 /* emit hw packet */ +#define RADEON_CMD_PACKET3_CLIP 6 /* emit hw packet wrapped in cliprects */ +#define RADEON_CMD_SCALARS2 7 /* r200 stopgap */ +#define RADEON_CMD_WAIT 8 /* emit hw wait commands -- note: + * doesn't make the cpu wait, just + * the graphics hardware */ +#define RADEON_CMD_VECLINEAR 9 /* another r200 stopgap */ + +typedef union { + int i; + struct { + unsigned char cmd_type, pad0, pad1, pad2; + } header; + struct { + unsigned char cmd_type, packet_id, pad0, pad1; + } packet; + struct { + unsigned char cmd_type, offset, stride, count; + } scalars; + struct { + unsigned char cmd_type, offset, stride, count; + } vectors; + struct { + unsigned char cmd_type, addr_lo, addr_hi, count; + } veclinear; + struct { + unsigned char cmd_type, buf_idx, pad0, pad1; + } dma; + struct { + unsigned char cmd_type, flags, pad0, pad1; + } wait; +} drm_radeon_cmd_header_t; + +#define RADEON_WAIT_2D 0x1 +#define RADEON_WAIT_3D 0x2 + +/* Allowed parameters for R300_CMD_PACKET3 + */ +#define R300_CMD_PACKET3_CLEAR 0 +#define R300_CMD_PACKET3_RAW 1 + +/* Commands understood by cmd_buffer ioctl for R300. + * The interface has not been stabilized, so some of these may be removed + * and eventually reordered before stabilization. + */ +#define R300_CMD_PACKET0 1 +#define R300_CMD_VPU 2 /* emit vertex program upload */ +#define R300_CMD_PACKET3 3 /* emit a packet3 */ +#define R300_CMD_END3D 4 /* emit sequence ending 3d rendering */ +#define R300_CMD_CP_DELAY 5 +#define R300_CMD_DMA_DISCARD 6 +#define R300_CMD_WAIT 7 +# define R300_WAIT_2D 0x1 +# define R300_WAIT_3D 0x2 +/* these two defines are DOING IT WRONG - however + * we have userspace which relies on using these. + * The wait interface is backwards compat new + * code should use the NEW_WAIT defines below + * THESE ARE NOT BIT FIELDS + */ +# define R300_WAIT_2D_CLEAN 0x3 +# define R300_WAIT_3D_CLEAN 0x4 + +# define R300_NEW_WAIT_2D_3D 0x3 +# define R300_NEW_WAIT_2D_2D_CLEAN 0x4 +# define R300_NEW_WAIT_3D_3D_CLEAN 0x6 +# define R300_NEW_WAIT_2D_2D_CLEAN_3D_3D_CLEAN 0x8 + +#define R300_CMD_SCRATCH 8 +#define R300_CMD_R500FP 9 + +typedef union { + unsigned int u; + struct { + unsigned char cmd_type, pad0, pad1, pad2; + } header; + struct { + unsigned char cmd_type, count, reglo, reghi; + } packet0; + struct { + unsigned char cmd_type, count, adrlo, adrhi; + } vpu; + struct { + unsigned char cmd_type, packet, pad0, pad1; + } packet3; + struct { + unsigned char cmd_type, packet; + unsigned short count; /* amount of packet2 to emit */ + } delay; + struct { + unsigned char cmd_type, buf_idx, pad0, pad1; + } dma; + struct { + unsigned char cmd_type, flags, pad0, pad1; + } wait; + struct { + unsigned char cmd_type, reg, n_bufs, flags; + } scratch; + struct { + unsigned char cmd_type, count, adrlo, adrhi_flags; + } r500fp; +} drm_r300_cmd_header_t; + +#define RADEON_FRONT 0x1 +#define RADEON_BACK 0x2 +#define RADEON_DEPTH 0x4 +#define RADEON_STENCIL 0x8 +#define RADEON_CLEAR_FASTZ 0x80000000 +#define RADEON_USE_HIERZ 0x40000000 +#define RADEON_USE_COMP_ZBUF 0x20000000 + +#define R500FP_CONSTANT_TYPE (1 << 1) +#define R500FP_CONSTANT_CLAMP (1 << 2) + +/* Primitive types + */ +#define RADEON_POINTS 0x1 +#define RADEON_LINES 0x2 +#define RADEON_LINE_STRIP 0x3 +#define RADEON_TRIANGLES 0x4 +#define RADEON_TRIANGLE_FAN 0x5 +#define RADEON_TRIANGLE_STRIP 0x6 + +/* Vertex/indirect buffer size + */ +#define RADEON_BUFFER_SIZE 65536 + +/* Byte offsets for indirect buffer data + */ +#define RADEON_INDEX_PRIM_OFFSET 20 + +#define RADEON_SCRATCH_REG_OFFSET 32 +#define R600_SCRATCH_REG_OFFSET 256 + +#define RADEON_NR_SAREA_CLIPRECTS 12 + +/* There are 2 heaps (local/GART). Each region within a heap is a + * minimum of 64k, and there are at most 64 of them per heap. + */ +#define RADEON_LOCAL_TEX_HEAP 0 +#define RADEON_GART_TEX_HEAP 1 +#define RADEON_NR_TEX_HEAPS 2 +#define RADEON_NR_TEX_REGIONS 64 +#define RADEON_LOG_TEX_GRANULARITY 16 + +#define RADEON_MAX_TEXTURE_LEVELS 12 +#define RADEON_MAX_TEXTURE_UNITS 3 + +#define RADEON_MAX_SURFACES 8 + +/* Blits have strict offset rules. All blit offset must be aligned on + * a 1K-byte boundary. + */ +#define RADEON_OFFSET_SHIFT 10 +#define RADEON_OFFSET_ALIGN (1 << RADEON_OFFSET_SHIFT) +#define RADEON_OFFSET_MASK (RADEON_OFFSET_ALIGN - 1) + +#endif /* __RADEON_SAREA_DEFINES__ */ + +typedef struct { + unsigned int red; + unsigned int green; + unsigned int blue; + unsigned int alpha; +} radeon_color_regs_t; + +typedef struct { + /* Context state */ + unsigned int pp_misc; /* 0x1c14 */ + unsigned int pp_fog_color; + unsigned int re_solid_color; + unsigned int rb3d_blendcntl; + unsigned int rb3d_depthoffset; + unsigned int rb3d_depthpitch; + unsigned int rb3d_zstencilcntl; + + unsigned int pp_cntl; /* 0x1c38 */ + unsigned int rb3d_cntl; + unsigned int rb3d_coloroffset; + unsigned int re_width_height; + unsigned int rb3d_colorpitch; + unsigned int se_cntl; + + /* Vertex format state */ + unsigned int se_coord_fmt; /* 0x1c50 */ + + /* Line state */ + unsigned int re_line_pattern; /* 0x1cd0 */ + unsigned int re_line_state; + + unsigned int se_line_width; /* 0x1db8 */ + + /* Bumpmap state */ + unsigned int pp_lum_matrix; /* 0x1d00 */ + + unsigned int pp_rot_matrix_0; /* 0x1d58 */ + unsigned int pp_rot_matrix_1; + + /* Mask state */ + unsigned int rb3d_stencilrefmask; /* 0x1d7c */ + unsigned int rb3d_ropcntl; + unsigned int rb3d_planemask; + + /* Viewport state */ + unsigned int se_vport_xscale; /* 0x1d98 */ + unsigned int se_vport_xoffset; + unsigned int se_vport_yscale; + unsigned int se_vport_yoffset; + unsigned int se_vport_zscale; + unsigned int se_vport_zoffset; + + /* Setup state */ + unsigned int se_cntl_status; /* 0x2140 */ + + /* Misc state */ + unsigned int re_top_left; /* 0x26c0 */ + unsigned int re_misc; +} drm_radeon_context_regs_t; + +typedef struct { + /* Zbias state */ + unsigned int se_zbias_factor; /* 0x1dac */ + unsigned int se_zbias_constant; +} drm_radeon_context2_regs_t; + +/* Setup registers for each texture unit + */ +typedef struct { + unsigned int pp_txfilter; + unsigned int pp_txformat; + unsigned int pp_txoffset; + unsigned int pp_txcblend; + unsigned int pp_txablend; + unsigned int pp_tfactor; + unsigned int pp_border_color; +} drm_radeon_texture_regs_t; + +typedef struct { + unsigned int start; + unsigned int finish; + unsigned int prim:8; + unsigned int stateidx:8; + unsigned int numverts:16; /* overloaded as offset/64 for elt prims */ + unsigned int vc_format; /* vertex format */ +} drm_radeon_prim_t; + +typedef struct { + drm_radeon_context_regs_t context; + drm_radeon_texture_regs_t tex[RADEON_MAX_TEXTURE_UNITS]; + drm_radeon_context2_regs_t context2; + unsigned int dirty; +} drm_radeon_state_t; + +typedef struct { + /* The channel for communication of state information to the + * kernel on firing a vertex buffer with either of the + * obsoleted vertex/index ioctls. + */ + drm_radeon_context_regs_t context_state; + drm_radeon_texture_regs_t tex_state[RADEON_MAX_TEXTURE_UNITS]; + unsigned int dirty; + unsigned int vertsize; + unsigned int vc_format; + + /* The current cliprects, or a subset thereof. + */ + struct drm_clip_rect boxes[RADEON_NR_SAREA_CLIPRECTS]; + unsigned int nbox; + + /* Counters for client-side throttling of rendering clients. + */ + unsigned int last_frame; + unsigned int last_dispatch; + unsigned int last_clear; + + struct drm_tex_region tex_list[RADEON_NR_TEX_HEAPS][RADEON_NR_TEX_REGIONS + + 1]; + unsigned int tex_age[RADEON_NR_TEX_HEAPS]; + int ctx_owner; + int pfState; /* number of 3d windows (0,1,2ormore) */ + int pfCurrentPage; /* which buffer is being displayed? */ + int crtc2_base; /* CRTC2 frame offset */ + int tiling_enabled; /* set by drm, read by 2d + 3d clients */ +} drm_radeon_sarea_t; + +/* WARNING: If you change any of these defines, make sure to change the + * defines in the Xserver file (xf86drmRadeon.h) + * + * KW: actually it's illegal to change any of this (backwards compatibility). + */ + +/* Radeon specific ioctls + * The device specific ioctl range is 0x40 to 0x79. + */ +#define DRM_RADEON_CP_INIT 0x00 +#define DRM_RADEON_CP_START 0x01 +#define DRM_RADEON_CP_STOP 0x02 +#define DRM_RADEON_CP_RESET 0x03 +#define DRM_RADEON_CP_IDLE 0x04 +#define DRM_RADEON_RESET 0x05 +#define DRM_RADEON_FULLSCREEN 0x06 +#define DRM_RADEON_SWAP 0x07 +#define DRM_RADEON_CLEAR 0x08 +#define DRM_RADEON_VERTEX 0x09 +#define DRM_RADEON_INDICES 0x0A +#define DRM_RADEON_NOT_USED +#define DRM_RADEON_STIPPLE 0x0C +#define DRM_RADEON_INDIRECT 0x0D +#define DRM_RADEON_TEXTURE 0x0E +#define DRM_RADEON_VERTEX2 0x0F +#define DRM_RADEON_CMDBUF 0x10 +#define DRM_RADEON_GETPARAM 0x11 +#define DRM_RADEON_FLIP 0x12 +#define DRM_RADEON_ALLOC 0x13 +#define DRM_RADEON_FREE 0x14 +#define DRM_RADEON_INIT_HEAP 0x15 +#define DRM_RADEON_IRQ_EMIT 0x16 +#define DRM_RADEON_IRQ_WAIT 0x17 +#define DRM_RADEON_CP_RESUME 0x18 +#define DRM_RADEON_SETPARAM 0x19 +#define DRM_RADEON_SURF_ALLOC 0x1a +#define DRM_RADEON_SURF_FREE 0x1b + +#define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) +#define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) +#define DRM_IOCTL_RADEON_CP_STOP DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_STOP, drm_radeon_cp_stop_t) +#define DRM_IOCTL_RADEON_CP_RESET DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_RESET) +#define DRM_IOCTL_RADEON_CP_IDLE DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_IDLE) +#define DRM_IOCTL_RADEON_RESET DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_RESET) +#define DRM_IOCTL_RADEON_FULLSCREEN DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_FULLSCREEN, drm_radeon_fullscreen_t) +#define DRM_IOCTL_RADEON_SWAP DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_SWAP) +#define DRM_IOCTL_RADEON_CLEAR DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CLEAR, drm_radeon_clear_t) +#define DRM_IOCTL_RADEON_VERTEX DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_VERTEX, drm_radeon_vertex_t) +#define DRM_IOCTL_RADEON_INDICES DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_INDICES, drm_radeon_indices_t) +#define DRM_IOCTL_RADEON_STIPPLE DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_STIPPLE, drm_radeon_stipple_t) +#define DRM_IOCTL_RADEON_INDIRECT DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_INDIRECT, drm_radeon_indirect_t) +#define DRM_IOCTL_RADEON_TEXTURE DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_TEXTURE, drm_radeon_texture_t) +#define DRM_IOCTL_RADEON_VERTEX2 DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_VERTEX2, drm_radeon_vertex2_t) +#define DRM_IOCTL_RADEON_CMDBUF DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CMDBUF, drm_radeon_cmd_buffer_t) +#define DRM_IOCTL_RADEON_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GETPARAM, drm_radeon_getparam_t) +#define DRM_IOCTL_RADEON_FLIP DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_FLIP) +#define DRM_IOCTL_RADEON_ALLOC DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_ALLOC, drm_radeon_mem_alloc_t) +#define DRM_IOCTL_RADEON_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_FREE, drm_radeon_mem_free_t) +#define DRM_IOCTL_RADEON_INIT_HEAP DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_INIT_HEAP, drm_radeon_mem_init_heap_t) +#define DRM_IOCTL_RADEON_IRQ_EMIT DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_IRQ_EMIT, drm_radeon_irq_emit_t) +#define DRM_IOCTL_RADEON_IRQ_WAIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_IRQ_WAIT, drm_radeon_irq_wait_t) +#define DRM_IOCTL_RADEON_CP_RESUME DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_RESUME) +#define DRM_IOCTL_RADEON_SETPARAM DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SETPARAM, drm_radeon_setparam_t) +#define DRM_IOCTL_RADEON_SURF_ALLOC DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_ALLOC, drm_radeon_surface_alloc_t) +#define DRM_IOCTL_RADEON_SURF_FREE DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_SURF_FREE, drm_radeon_surface_free_t) + +typedef struct drm_radeon_init { + enum { + RADEON_INIT_CP = 0x01, + RADEON_CLEANUP_CP = 0x02, + RADEON_INIT_R200_CP = 0x03, + RADEON_INIT_R300_CP = 0x04, + RADEON_INIT_R600_CP = 0x05 + } func; + unsigned long sarea_priv_offset; + int is_pci; /* for overriding only */ + int cp_mode; + int gart_size; + int ring_size; + int usec_timeout; + + unsigned int fb_bpp; + unsigned int front_offset, front_pitch; + unsigned int back_offset, back_pitch; + unsigned int depth_bpp; + unsigned int depth_offset, depth_pitch; + + unsigned long fb_offset DEPRECATED; /* deprecated, driver asks hardware */ + unsigned long mmio_offset DEPRECATED; /* deprecated, driver asks hardware */ + unsigned long ring_offset; + unsigned long ring_rptr_offset; + unsigned long buffers_offset; + unsigned long gart_textures_offset; +} drm_radeon_init_t; + +typedef struct drm_radeon_cp_stop { + int flush; + int idle; +} drm_radeon_cp_stop_t; + +typedef struct drm_radeon_fullscreen { + enum { + RADEON_INIT_FULLSCREEN = 0x01, + RADEON_CLEANUP_FULLSCREEN = 0x02 + } func; +} drm_radeon_fullscreen_t; + +#define CLEAR_X1 0 +#define CLEAR_Y1 1 +#define CLEAR_X2 2 +#define CLEAR_Y2 3 +#define CLEAR_DEPTH 4 + +typedef union drm_radeon_clear_rect { + float f[5]; + unsigned int ui[5]; +} drm_radeon_clear_rect_t; + +typedef struct drm_radeon_clear { + unsigned int flags; + unsigned int clear_color; + unsigned int clear_depth; + unsigned int color_mask; + unsigned int depth_mask; /* misnamed field: should be stencil */ + drm_radeon_clear_rect_t __user *depth_boxes; +} drm_radeon_clear_t; + +typedef struct drm_radeon_vertex { + int prim; + int idx; /* Index of vertex buffer */ + int count; /* Number of vertices in buffer */ + int discard; /* Client finished with buffer? */ +} drm_radeon_vertex_t; + +typedef struct drm_radeon_indices { + int prim; + int idx; + int start; + int end; + int discard; /* Client finished with buffer? */ +} drm_radeon_indices_t; + +/* v1.2 - obsoletes drm_radeon_vertex and drm_radeon_indices + * - allows multiple primitives and state changes in a single ioctl + * - supports driver change to emit native primitives + */ +typedef struct drm_radeon_vertex2 { + int idx; /* Index of vertex buffer */ + int discard; /* Client finished with buffer? */ + int nr_states; + drm_radeon_state_t __user *state; + int nr_prims; + drm_radeon_prim_t __user *prim; +} drm_radeon_vertex2_t; + +/* v1.3 - obsoletes drm_radeon_vertex2 + * - allows arbitarily large cliprect list + * - allows updating of tcl packet, vector and scalar state + * - allows memory-efficient description of state updates + * - allows state to be emitted without a primitive + * (for clears, ctx switches) + * - allows more than one dma buffer to be referenced per ioctl + * - supports tcl driver + * - may be extended in future versions with new cmd types, packets + */ +typedef struct drm_radeon_cmd_buffer { + int bufsz; + char __user *buf; + int nbox; + struct drm_clip_rect __user *boxes; +} drm_radeon_cmd_buffer_t; + +typedef struct drm_radeon_tex_image { + unsigned int x, y; /* Blit coordinates */ + unsigned int width, height; + const void __user *data; +} drm_radeon_tex_image_t; + +typedef struct drm_radeon_texture { + unsigned int offset; + int pitch; + int format; + int width; /* Texture image coordinates */ + int height; + drm_radeon_tex_image_t __user *image; +} drm_radeon_texture_t; + +typedef struct drm_radeon_stipple { + unsigned int __user *mask; +} drm_radeon_stipple_t; + +typedef struct drm_radeon_indirect { + int idx; + int start; + int end; + int discard; +} drm_radeon_indirect_t; + +#define RADEON_INDIRECT_DISCARD (1 << 0) +#define RADEON_INDIRECT_NOFLUSH (1 << 1) + +/* enum for card type parameters */ +#define RADEON_CARD_PCI 0 +#define RADEON_CARD_AGP 1 +#define RADEON_CARD_PCIE 2 + +/* 1.3: An ioctl to get parameters that aren't available to the 3d + * client any other way. + */ +#define RADEON_PARAM_GART_BUFFER_OFFSET 1 /* card offset of 1st GART buffer */ +#define RADEON_PARAM_LAST_FRAME 2 +#define RADEON_PARAM_LAST_DISPATCH 3 +#define RADEON_PARAM_LAST_CLEAR 4 +/* Added with DRM version 1.6. */ +#define RADEON_PARAM_IRQ_NR 5 +#define RADEON_PARAM_GART_BASE 6 /* card offset of GART base */ +/* Added with DRM version 1.8. */ +#define RADEON_PARAM_REGISTER_HANDLE 7 /* for drmMap() */ +#define RADEON_PARAM_STATUS_HANDLE 8 +#define RADEON_PARAM_SAREA_HANDLE 9 +#define RADEON_PARAM_GART_TEX_HANDLE 10 +#define RADEON_PARAM_SCRATCH_OFFSET 11 +#define RADEON_PARAM_CARD_TYPE 12 +#define RADEON_PARAM_VBLANK_CRTC 13 /* VBLANK CRTC */ +#define RADEON_PARAM_FB_LOCATION 14 /* FB location */ +#define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */ + +typedef struct drm_radeon_getparam { + int param; + void __user *value; +} drm_radeon_getparam_t; + +/* 1.6: Set up a memory manager for regions of shared memory: + */ +#define RADEON_MEM_REGION_GART 1 +#define RADEON_MEM_REGION_FB 2 + +typedef struct drm_radeon_mem_alloc { + int region; + int alignment; + int size; + int __user *region_offset; /* offset from start of fb or GART */ +} drm_radeon_mem_alloc_t; + +typedef struct drm_radeon_mem_free { + int region; + int region_offset; +} drm_radeon_mem_free_t; + +typedef struct drm_radeon_mem_init_heap { + int region; + int size; + int start; +} drm_radeon_mem_init_heap_t; + +/* 1.6: Userspace can request & wait on irq's: + */ +typedef struct drm_radeon_irq_emit { + int __user *irq_seq; +} drm_radeon_irq_emit_t; + +typedef struct drm_radeon_irq_wait { + int irq_seq; +} drm_radeon_irq_wait_t; + +/* 1.10: Clients tell the DRM where they think the framebuffer is located in + * the card's address space, via a new generic ioctl to set parameters + */ + +typedef struct drm_radeon_setparam { + unsigned int param; + int64_t value; +} drm_radeon_setparam_t; + +#define RADEON_SETPARAM_FB_LOCATION 1 /* determined framebuffer location */ +#define RADEON_SETPARAM_SWITCH_TILING 2 /* enable/disable color tiling */ +#define RADEON_SETPARAM_PCIGART_LOCATION 3 /* PCI Gart Location */ + +#define RADEON_SETPARAM_NEW_MEMMAP 4 /* Use new memory map */ +#define RADEON_SETPARAM_PCIGART_TABLE_SIZE 5 /* PCI GART Table Size */ +#define RADEON_SETPARAM_VBLANK_CRTC 6 /* VBLANK CRTC */ +/* 1.14: Clients can allocate/free a surface + */ +typedef struct drm_radeon_surface_alloc { + unsigned int address; + unsigned int size; + unsigned int flags; +} drm_radeon_surface_alloc_t; + +typedef struct drm_radeon_surface_free { + unsigned int address; +} drm_radeon_surface_free_t; + +#define DRM_RADEON_VBLANK_CRTC1 1 +#define DRM_RADEON_VBLANK_CRTC2 2 + +#endif diff --git a/driver/xf86-video-radeonhd/src/radeon_exa_render.c b/driver/xf86-video-radeonhd/src/radeon_exa_render.c new file mode 100644 index 000000000..252e7b0d2 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/radeon_exa_render.c @@ -0,0 +1,2293 @@ +/* + * Copyright 2005 Eric Anholt + * Copyright 2005 Benjamin Herrenschmidt + * 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 + * 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 (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 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. + * + * Authors: + * Eric Anholt + * Zack Rusin + * Benjamin Herrenschmidt + * Alex Deucher + * + */ +#if defined(IS_RADEON_DRIVER) || defined(IS_QUICK_AND_DIRTY) +#if defined(ACCEL_MMIO) && defined(ACCEL_CP) +#error Cannot define both MMIO and CP acceleration! +#endif + +#if !defined(UNIXCPP) || defined(ANSICPP) +#define FUNC_NAME_CAT(prefix,suffix) prefix##suffix +#else +#define FUNC_NAME_CAT(prefix,suffix) prefix/**/suffix +#endif + +#ifdef ACCEL_MMIO +#define FUNC_NAME(prefix) FUNC_NAME_CAT(prefix,MMIO) +#else +#ifdef ACCEL_CP +#define FUNC_NAME(prefix) FUNC_NAME_CAT(prefix,CP) +#else +#error No accel type defined! +#endif +#endif + +#ifndef ACCEL_CP +#define ONLY_ONCE + +#define VAR_PREAMBLE(pScreen) \ + ScrnInfoPtr pScrn = xf86Screens[(pScreen)->myNum]; \ + RHDPtr info = RHDPTR(pScrn) +#define THREEDSTATE_PREAMBLE() struct rhdAccel *accel_state = info->accel_state +#define HAS_TCL IS_R500_3D +#define FB_OFFSET (info->FbIntAddress + info->FbScanoutStart) + +#endif + +#else /* IS_RADEON_DRIVER */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_cs.h" + +#include "r5xx_regs.h" +#include "r5xx_accel.h" +#include "r5xx_3dregs.h" + +#include "exa.h" + +#define VAR_PREAMBLE(pScreen) RHDPtr rhdPtr = RHDPTR(xf86Screens[(pScreen)->myNum]) +#define THREEDSTATE_PREAMBLE() struct R5xx3D *accel_state = rhdPtr->ThreeDPrivate +/* + * Map the macros. + */ +#define ACCEL_PREAMBLE() struct RhdCS *CS = rhdPtr->CS + +#define BEGIN_ACCEL(Count) RHDCSGrab(CS, 2 * (Count)) +#define OUT_ACCEL_REG(Reg, Value) RHDCSRegWrite(CS, (Reg), (Value)) +#define FINISH_ACCEL() + +#define BEGIN_RING(Count) RHDCSGrab(CS, (Count)) +#define OUT_RING(Value) RHDCSWrite(CS, (Value)) +#define OUT_RING_F(x) OUT_RING(F_TO_DW(x)) +#define ADVANCE_RING() RHDCSAdvance(CS) + +#define uint32_t CARD32 + +#define IS_R300_3D \ + ((rhdPtr->ChipSet == RHD_RS690) || \ + (rhdPtr->ChipSet == RHD_RS600) || \ + (rhdPtr->ChipSet == RHD_RS740)) + +#define IS_R500_3D \ + ((rhdPtr->ChipSet != RHD_RS690) && \ + (rhdPtr->ChipSet != RHD_RS600) && \ + (rhdPtr->ChipSet != RHD_RS740)) + +#define HAS_TCL IS_R500_3D + +#define ONLY_ONCE 1 /* we're always only once in the radeonhd driver */ +#define ACCEL_CP 1 + +/* RADEON_FALLBACK is not only error messages, but some things are meant to + * happen, which can make it unbelievably noisy. */ +#if 0 +/* i don't like ErrorF's as they don't tell you which driver and + which device, but no scrnIndex can be had in some of the calls here */ +#define RADEON_FALLBACK(x) \ +do { \ + ErrorF("%s: ", __FUNCTION__); \ + ErrorF x; \ + return FALSE; \ +} while (0) +#else +#define RADEON_FALLBACK(x) return FALSE +#endif + +#if !defined(UNIXCPP) || defined(ANSICPP) +#define FUNC_NAME_CAT(prefix,suffix) prefix##suffix +#else +#define FUNC_NAME_CAT(prefix,suffix) prefix/**/suffix +#endif + +#define FUNC_NAME(prefix) FUNC_NAME_CAT(RHD,prefix) + +#define TRACE +#define ENTER_DRAW(x) +#define LEAVE_DRAW(x) + +#define RADEONPixmapIsColortiled(x) FALSE + +#define FB_OFFSET (rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart) + +static __inline__ uint32_t +F_TO_DW(float val) +{ + union { + float f; + uint32_t l; + } tmp; + tmp.f = val; + return tmp.l; +} + +#define xFixedToFloat(f) (((float) (f)) / 65536) + +#define RADEON_SWITCH_TO_3D() R5xxEngineWaitIdle2D(rhdPtr->CS) +#define RADEONInit3DEngine(x) R5xx3DSetup(rhdPtr->scrnIndex) + +#endif /* IS_RADEON_DRIVER */ + +/* Only include the following (generic) bits once. */ +#ifdef ONLY_ONCE + +struct blendinfo { + Bool dst_alpha; + Bool src_alpha; + uint32_t blend_cntl; +}; + +static struct blendinfo RadeonBlendOp[] = { + /* Clear */ + {0, 0, RADEON_SRC_BLEND_GL_ZERO | RADEON_DST_BLEND_GL_ZERO}, + /* Src */ + {0, 0, RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO}, + /* Dst */ + {0, 0, RADEON_SRC_BLEND_GL_ZERO | RADEON_DST_BLEND_GL_ONE}, + /* Over */ + {0, 1, RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA}, + /* OverReverse */ + {1, 0, RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA | RADEON_DST_BLEND_GL_ONE}, + /* In */ + {1, 0, RADEON_SRC_BLEND_GL_DST_ALPHA | RADEON_DST_BLEND_GL_ZERO}, + /* InReverse */ + {0, 1, RADEON_SRC_BLEND_GL_ZERO | RADEON_DST_BLEND_GL_SRC_ALPHA}, + /* Out */ + {1, 0, RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA | RADEON_DST_BLEND_GL_ZERO}, + /* OutReverse */ + {0, 1, RADEON_SRC_BLEND_GL_ZERO | RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA}, + /* Atop */ + {1, 1, RADEON_SRC_BLEND_GL_DST_ALPHA | RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA}, + /* AtopReverse */ + {1, 1, RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA | RADEON_DST_BLEND_GL_SRC_ALPHA}, + /* Xor */ + {1, 1, RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA | RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA}, + /* Add */ + {0, 0, RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ONE}, +}; + +struct formatinfo { + unsigned int fmt; + uint32_t card_fmt; +}; + +/* Note on texture formats: + * TXFORMAT_Y8 expands to (Y,Y,Y,1). TXFORMAT_I8 expands to (I,I,I,I) + */ +#ifdef IS_RADEON_DRIVER +static struct formatinfo R100TexFormats[] = { + {PICT_a8r8g8b8, RADEON_TXFORMAT_ARGB8888 | RADEON_TXFORMAT_ALPHA_IN_MAP}, + {PICT_x8r8g8b8, RADEON_TXFORMAT_ARGB8888}, + {PICT_r5g6b5, RADEON_TXFORMAT_RGB565}, + {PICT_a1r5g5b5, RADEON_TXFORMAT_ARGB1555 | RADEON_TXFORMAT_ALPHA_IN_MAP}, + {PICT_x1r5g5b5, RADEON_TXFORMAT_ARGB1555}, + {PICT_a8, RADEON_TXFORMAT_I8 | RADEON_TXFORMAT_ALPHA_IN_MAP}, +}; + +static struct formatinfo R200TexFormats[] = { + {PICT_a8r8g8b8, R200_TXFORMAT_ARGB8888 | R200_TXFORMAT_ALPHA_IN_MAP}, + {PICT_x8r8g8b8, R200_TXFORMAT_ARGB8888}, + {PICT_a8b8g8r8, R200_TXFORMAT_ABGR8888 | R200_TXFORMAT_ALPHA_IN_MAP}, + {PICT_x8b8g8r8, R200_TXFORMAT_ABGR8888}, + {PICT_r5g6b5, R200_TXFORMAT_RGB565}, + {PICT_a1r5g5b5, R200_TXFORMAT_ARGB1555 | R200_TXFORMAT_ALPHA_IN_MAP}, + {PICT_x1r5g5b5, R200_TXFORMAT_ARGB1555}, + {PICT_a8, R200_TXFORMAT_I8 | R200_TXFORMAT_ALPHA_IN_MAP}, +}; +#endif /* IS_RADEON_DRIVER */ + +static struct formatinfo R300TexFormats[] = { + {PICT_a8r8g8b8, R300_EASY_TX_FORMAT(X, Y, Z, W, W8Z8Y8X8)}, + {PICT_x8r8g8b8, R300_EASY_TX_FORMAT(X, Y, Z, ONE, W8Z8Y8X8)}, + {PICT_a8b8g8r8, R300_EASY_TX_FORMAT(Z, Y, X, W, W8Z8Y8X8)}, + {PICT_x8b8g8r8, R300_EASY_TX_FORMAT(Z, Y, X, ONE, W8Z8Y8X8)}, + {PICT_r5g6b5, R300_EASY_TX_FORMAT(X, Y, Z, ONE, Z5Y6X5)}, + {PICT_a1r5g5b5, R300_EASY_TX_FORMAT(X, Y, Z, W, W1Z5Y5X5)}, + {PICT_x1r5g5b5, R300_EASY_TX_FORMAT(X, Y, Z, ONE, W1Z5Y5X5)}, + {PICT_a8, R300_EASY_TX_FORMAT(ZERO, ZERO, ZERO, X, X8)}, +}; + +/* Common Radeon setup code */ +#ifdef IS_RADEON_DRIVER +static Bool RADEONGetDestFormat(PicturePtr pDstPicture, uint32_t *dst_format) +{ + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + *dst_format = RADEON_COLOR_FORMAT_ARGB8888; + break; + case PICT_r5g6b5: + *dst_format = RADEON_COLOR_FORMAT_RGB565; + break; + case PICT_a1r5g5b5: + case PICT_x1r5g5b5: + *dst_format = RADEON_COLOR_FORMAT_ARGB1555; + break; + case PICT_a8: + *dst_format = RADEON_COLOR_FORMAT_RGB8; + break; + default: + RADEON_FALLBACK(("Unsupported dest format 0x%x\n", + (int)pDstPicture->format)); + } + + return TRUE; +} +#endif /* IS_RADEON_DRIVER */ + +static Bool R300GetDestFormat(PicturePtr pDstPicture, uint32_t *dst_format) +{ + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + *dst_format = R300_COLORFORMAT_ARGB8888; + break; + case PICT_r5g6b5: + *dst_format = R300_COLORFORMAT_RGB565; + break; + case PICT_a1r5g5b5: + case PICT_x1r5g5b5: + *dst_format = R300_COLORFORMAT_ARGB1555; + break; + case PICT_a8: + *dst_format = R300_COLORFORMAT_I8; + break; + default: + RADEON_FALLBACK(("Unsupported dest format 0x%x\n", + (int)pDstPicture->format)); + } + return TRUE; +} + +static uint32_t RADEONGetBlendCntl(int op, PicturePtr pMask, uint32_t dst_format) +{ + uint32_t sblend, dblend; + + sblend = RadeonBlendOp[op].blend_cntl & RADEON_SRC_BLEND_MASK; + dblend = RadeonBlendOp[op].blend_cntl & RADEON_DST_BLEND_MASK; + + /* If there's no dst alpha channel, adjust the blend op so that we'll treat + * it as always 1. + */ + if (PICT_FORMAT_A(dst_format) == 0 && RadeonBlendOp[op].dst_alpha) { + if (sblend == RADEON_SRC_BLEND_GL_DST_ALPHA) + sblend = RADEON_SRC_BLEND_GL_ONE; + else if (sblend == RADEON_SRC_BLEND_GL_ONE_MINUS_DST_ALPHA) + sblend = RADEON_SRC_BLEND_GL_ZERO; + } + + /* If the source alpha is being used, then we should only be in a case where + * the source blend factor is 0, and the source blend value is the mask + * channels multiplied by the source picture's alpha. + */ + if (pMask && pMask->componentAlpha && RadeonBlendOp[op].src_alpha) { + if (dblend == RADEON_DST_BLEND_GL_SRC_ALPHA) { + dblend = RADEON_DST_BLEND_GL_SRC_COLOR; + } else if (dblend == RADEON_DST_BLEND_GL_ONE_MINUS_SRC_ALPHA) { + dblend = RADEON_DST_BLEND_GL_ONE_MINUS_SRC_COLOR; + } + } + + return sblend | dblend; +} + +union intfloat { + float f; + uint32_t i; +}; + +/* Check if we need a software-fallback because of a repeating + * non-power-of-two texture. + * + * canTile: whether we can emulate a repeat by drawing in tiles: + * possible for the source, but not for the mask. (Actually + * we could do tiling for the mask too, but dealing with the + * combination of a tiled mask and a tiled source would be + * a lot of complexity, so we handle only the most common + * case of a repeating mask.) + */ +static Bool RADEONCheckTexturePOT(PicturePtr pPict, Bool canTile) +{ + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + + if (pPict->repeat && ((w & (w - 1)) != 0 || (h & (h - 1)) != 0) && + !(!pPict->transform && canTile)) + RADEON_FALLBACK(("NPOT repeating %s unsupported (%dx%d), transform=%d\n", + canTile ? "source" : "mask", w, h, pPict->transform != 0)); + + return TRUE; +} + +/* Determine if the pitch of the pixmap meets the criteria for being + * used as a repeating texture: no padding or only a single line texture. + */ +static Bool RADEONPitchMatches(PixmapPtr pPix) +{ + int w = pPix->drawable.width; + int h = pPix->drawable.height; + uint32_t txpitch = exaGetPixmapPitch(pPix); + + if (h > 1 && (unsigned int)((w * pPix->drawable.bitsPerPixel / 8 + 31) & ~31) != txpitch) + return FALSE; + + return TRUE; +} + +/* We can't turn on repeats normally for a non-power-of-two dimension, + * but if the source isn't transformed, we can get the same effect + * by drawing the image in multiple tiles. (A common case that it's + * important to get right is drawing a strip of a NPOTxPOT texture + * repeating in the POT direction. With tiling, this ends up as a + * a single tile on R300 and newer, which is perfect.) + * + * canTile1d: On R300 and newer, we can repeat a texture that is NPOT in + * one direction and POT in the other in the POT direction; on + * older chips we can only repeat at all if the texture is POT in + * both directions. + * + * needMatchingPitch: On R100/R200, we can only repeat horizontally if + * there is no padding in the texture. Textures with small POT widths + * (1,2,4,8) thus can't be tiled. + */ +static Bool RADEONSetupSourceTile(PicturePtr pPict, + PixmapPtr pPix, + Bool canTile1d, + Bool needMatchingPitch) +{ + VAR_PREAMBLE(pPix->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + + accel_state->need_src_tile_x = accel_state->need_src_tile_y = FALSE; + accel_state->src_tile_width = accel_state->src_tile_height = 65536; /* "infinite" */ + + if (pPict->repeat) { + Bool badPitch = needMatchingPitch && !RADEONPitchMatches(pPix); + + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + + if (pPict->transform) { + if (badPitch) + RADEON_FALLBACK(("Width %d and pitch %u not compatible for repeat\n", + w, (unsigned)exaGetPixmapPitch(pPix))); + } else { + accel_state->need_src_tile_x = (w & (w - 1)) != 0 || badPitch; + accel_state->need_src_tile_y = (h & (h - 1)) != 0; + + if (!canTile1d) + accel_state->need_src_tile_x = accel_state->need_src_tile_y + = accel_state->need_src_tile_x || accel_state->need_src_tile_y; + } + + if (accel_state->need_src_tile_x) + accel_state->src_tile_width = w; + if (accel_state->need_src_tile_y) + accel_state->src_tile_height = h; + } + + return TRUE; +} + +PixmapPtr +RADEONGetDrawablePixmap(DrawablePtr pDrawable) +{ + if (pDrawable->type == DRAWABLE_WINDOW) + return pDrawable->pScreen->GetWindowPixmap((WindowPtr)pDrawable); + else + return (PixmapPtr)pDrawable; +} + +#endif /* ONLY_ONCE */ + +#ifdef IS_RADEON_DRIVER + +/* R100-specific code */ +# ifdef ONLY_ONCE +static Bool R100CheckCompositeTexture(PicturePtr pPict, int unit) +{ + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + unsigned int i; + + if ((w > 0x7ff) || (h > 0x7ff)) + RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h)); + + for (i = 0; i < sizeof(R100TexFormats) / sizeof(R100TexFormats[0]); i++) { + if (R100TexFormats[i].fmt == pPict->format) + break; + } + if (i == sizeof(R100TexFormats) / sizeof(R100TexFormats[0])) + RADEON_FALLBACK(("Unsupported picture format 0x%x\n", + (int)pPict->format)); + + if (!RADEONCheckTexturePOT(pPict, unit == 0)) + return FALSE; + + if (pPict->filter != PictFilterNearest && + pPict->filter != PictFilterBilinear) + { + RADEON_FALLBACK(("Unsupported filter 0x%x\n", pPict->filter)); + } + + if (pPict->repeat && pPict->repeatType != RepeatNormal) + { + RADEON_FALLBACK(("Unsupported repeat type %d\n", pPict->repeat)); + } + + return TRUE; +} +# endif ONLY_ONCE + +static Bool FUNC_NAME(R100TextureSetup)(PicturePtr pPict, PixmapPtr pPix, + int unit) +{ + VAR_PREAMBLE(pPix->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + uint32_t txfilter, txformat, txoffset, txpitch; + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + Bool repeat = pPict->repeat && !(unit == 0 && (accel_state->need_src_tile_x || accel_state->need_src_tile_y)); + unsigned int i; + ACCEL_PREAMBLE(); + + txpitch = exaGetPixmapPitch(pPix); + txoffset = exaGetPixmapOffset(pPix) + FB_OFFSET; + + if ((txoffset & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture offset 0x%x\n", (int)txoffset)); + if ((txpitch & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture pitch 0x%x\n", (int)txpitch)); + + for (i = 0; i < sizeof(R100TexFormats) / sizeof(R100TexFormats[0]); i++) + { + if (R100TexFormats[i].fmt == pPict->format) + break; + } + txformat = R100TexFormats[i].card_fmt; + if (RADEONPixmapIsColortiled(pPix)) + txoffset |= RADEON_TXO_MACRO_TILE; + + if (repeat) { + if (!RADEONPitchMatches(pPix)) + RADEON_FALLBACK(("Width %d and pitch %u not compatible for repeat\n", + w, (unsigned)txpitch)); + + txformat |= RADEONLog2(w) << RADEON_TXFORMAT_WIDTH_SHIFT; + txformat |= RADEONLog2(h) << RADEON_TXFORMAT_HEIGHT_SHIFT; + } else + txformat |= RADEON_TXFORMAT_NON_POWER2; + txformat |= unit << 24; /* RADEON_TXFORMAT_ST_ROUTE_STQX */ + + accel_state->texW[unit] = 1; + accel_state->texH[unit] = 1; + + switch (pPict->filter) { + case PictFilterNearest: + txfilter = (RADEON_MAG_FILTER_NEAREST | RADEON_MIN_FILTER_NEAREST); + break; + case PictFilterBilinear: + txfilter = (RADEON_MAG_FILTER_LINEAR | RADEON_MIN_FILTER_LINEAR); + break; + default: + RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); + } + + if (repeat) + txfilter |= RADEON_CLAMP_S_WRAP | RADEON_CLAMP_T_WRAP; + + BEGIN_ACCEL(5); + if (unit == 0) { + OUT_ACCEL_REG(RADEON_PP_TXFILTER_0, txfilter); + OUT_ACCEL_REG(RADEON_PP_TXFORMAT_0, txformat); + OUT_ACCEL_REG(RADEON_PP_TXOFFSET_0, txoffset); + OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_0, + (pPix->drawable.width - 1) | + ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_0, txpitch - 32); + } else { + OUT_ACCEL_REG(RADEON_PP_TXFILTER_1, txfilter); + OUT_ACCEL_REG(RADEON_PP_TXFORMAT_1, txformat); + OUT_ACCEL_REG(RADEON_PP_TXOFFSET_1, txoffset); + OUT_ACCEL_REG(RADEON_PP_TEX_SIZE_1, + (pPix->drawable.width - 1) | + ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(RADEON_PP_TEX_PITCH_1, txpitch - 32); + } + FINISH_ACCEL(); + + if (pPict->transform != 0) { + accel_state->is_transform[unit] = TRUE; + accel_state->transform[unit] = pPict->transform; + } else { + accel_state->is_transform[unit] = FALSE; + } + + return TRUE; +} + +# ifdef ONLY_ONCE + +static Bool R100CheckComposite(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, PicturePtr pDstPicture) +{ + PixmapPtr pSrcPixmap, pDstPixmap; + uint32_t tmp1; + + /* Check for unsupported compositing operations. */ + if ((unsigned int)op >= sizeof(RadeonBlendOp) / sizeof(RadeonBlendOp[0])) + RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op)); + + if (!pSrcPicture->pDrawable) + return FALSE; + + pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); + + if (pSrcPixmap->drawable.width >= 2048 || + pSrcPixmap->drawable.height >= 2048) { + RADEON_FALLBACK(("Source w/h too large (%d,%d).\n", + pSrcPixmap->drawable.width, + pSrcPixmap->drawable.height)); + } + + pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable); + + if (pDstPixmap->drawable.width >= 2048 || + pDstPixmap->drawable.height >= 2048) { + RADEON_FALLBACK(("Dest w/h too large (%d,%d).\n", + pDstPixmap->drawable.width, + pDstPixmap->drawable.height)); + } + + if (pMaskPicture) { + PixmapPtr pMaskPixmap = RADEONGetDrawablePixmap(pMaskPicture->pDrawable); + + if (pMaskPixmap->drawable.width >= 2048 || + pMaskPixmap->drawable.height >= 2048) { + RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n", + pMaskPixmap->drawable.width, + pMaskPixmap->drawable.height)); + } + + if (pMaskPicture->componentAlpha) { + /* Check if it's component alpha that relies on a source alpha and + * on the source value. We can only get one of those into the + * single source value that we get to blend with. + */ + if (RadeonBlendOp[op].src_alpha && + (RadeonBlendOp[op].blend_cntl & RADEON_SRC_BLEND_MASK) != + RADEON_SRC_BLEND_GL_ZERO) { + RADEON_FALLBACK(("Component alpha not supported with source " + "alpha and source value blending.\n")); + } + } + + if (!R100CheckCompositeTexture(pMaskPicture, 1)) + return FALSE; + } + + if (!R100CheckCompositeTexture(pSrcPicture, 0)) + return FALSE; + + if (!RADEONGetDestFormat(pDstPicture, &tmp1)) + return FALSE; + + return TRUE; +} +# endif /* ONLY_ONCE */ + +static Bool FUNC_NAME(R100PrepareComposite)(int op, + PicturePtr pSrcPicture, + PicturePtr pMaskPicture, + PicturePtr pDstPicture, + PixmapPtr pSrc, + PixmapPtr pMask, + PixmapPtr pDst) +{ + VAR_PREAMBLE(pDst->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + uint32_t dst_format, dst_offset, dst_pitch, colorpitch; + uint32_t pp_cntl, blendcntl, cblend, ablend; + int pixel_shift; + ACCEL_PREAMBLE(); + + TRACE; + + if (!accel_state->XHas3DEngineState) + RADEONInit3DEngine(pScrn); + + if (!RADEONGetDestFormat(pDstPicture, &dst_format)) + return FALSE; + + if (pMask) + accel_state->has_mask = TRUE; + else + accel_state->has_mask = FALSE; + + pixel_shift = pDst->drawable.bitsPerPixel >> 4; + + dst_offset = exaGetPixmapOffset(pDst) + FB_OFFSET; + dst_pitch = exaGetPixmapPitch(pDst); + colorpitch = dst_pitch >> pixel_shift; + if (RADEONPixmapIsColortiled(pDst)) + colorpitch |= RADEON_COLOR_TILE_ENABLE; + + dst_offset = exaGetPixmapOffset(pDst) + FB_OFFSET; + dst_pitch = exaGetPixmapPitch(pDst); + if ((dst_offset & 0x0f) != 0) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)dst_offset)); + if (((dst_pitch >> pixel_shift) & 0x7) != 0) + RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch)); + + if (!RADEONSetupSourceTile(pSrcPicture, pSrc, FALSE, TRUE)) + return FALSE; + + if (!FUNC_NAME(R100TextureSetup)(pSrcPicture, pSrc, 0)) + return FALSE; + pp_cntl = RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE; + + if (pMask != NULL) { + if (!FUNC_NAME(R100TextureSetup)(pMaskPicture, pMask, 1)) + return FALSE; + pp_cntl |= RADEON_TEX_1_ENABLE; + } else { + accel_state->is_transform[1] = FALSE; + } + + RADEON_SWITCH_TO_3D(); + + BEGIN_ACCEL(8); + OUT_ACCEL_REG(RADEON_PP_CNTL, pp_cntl); + OUT_ACCEL_REG(RADEON_RB3D_CNTL, dst_format | RADEON_ALPHA_BLEND_ENABLE); + OUT_ACCEL_REG(RADEON_RB3D_COLOROFFSET, dst_offset); + OUT_ACCEL_REG(RADEON_RB3D_COLORPITCH, colorpitch); + + /* IN operator: Multiply src by mask components or mask alpha. + * BLEND_CTL_ADD is A * B + C. + * If a source is a8, we have to explicitly zero its color values. + * If the destination is a8, we have to route the alpha to red, I think. + * If we're doing component alpha where the source for blending is going to + * be the source alpha (and there's no source value used), we have to zero + * the source's color values. + */ + cblend = RADEON_BLEND_CTL_ADD | RADEON_CLAMP_TX | RADEON_COLOR_ARG_C_ZERO; + ablend = RADEON_BLEND_CTL_ADD | RADEON_CLAMP_TX | RADEON_ALPHA_ARG_C_ZERO; + + if (pDstPicture->format == PICT_a8 || + (pMask && pMaskPicture->componentAlpha && RadeonBlendOp[op].src_alpha)) + { + cblend |= RADEON_COLOR_ARG_A_T0_ALPHA; + } else if (pSrcPicture->format == PICT_a8) + cblend |= RADEON_COLOR_ARG_A_ZERO; + else + cblend |= RADEON_COLOR_ARG_A_T0_COLOR; + ablend |= RADEON_ALPHA_ARG_A_T0_ALPHA; + + if (pMask) { + if (pMaskPicture->componentAlpha && + pDstPicture->format != PICT_a8) + cblend |= RADEON_COLOR_ARG_B_T1_COLOR; + else + cblend |= RADEON_COLOR_ARG_B_T1_ALPHA; + ablend |= RADEON_ALPHA_ARG_B_T1_ALPHA; + } else { + cblend |= RADEON_COLOR_ARG_B_ZERO | RADEON_COMP_ARG_B; + ablend |= RADEON_ALPHA_ARG_B_ZERO | RADEON_COMP_ARG_B; + } + + OUT_ACCEL_REG(RADEON_PP_TXCBLEND_0, cblend); + OUT_ACCEL_REG(RADEON_PP_TXABLEND_0, ablend); + if (pMask) + OUT_ACCEL_REG(RADEON_SE_VTX_FMT, (RADEON_SE_VTX_FMT_XY | + RADEON_SE_VTX_FMT_ST0 | + RADEON_SE_VTX_FMT_ST1)); + else + OUT_ACCEL_REG(RADEON_SE_VTX_FMT, (RADEON_SE_VTX_FMT_XY | + RADEON_SE_VTX_FMT_ST0)); + /* Op operator. */ + blendcntl = RADEONGetBlendCntl(op, pMaskPicture, pDstPicture->format); + + OUT_ACCEL_REG(RADEON_RB3D_BLENDCNTL, blendcntl); + FINISH_ACCEL(); + + return TRUE; +} + +# ifdef ONLY_ONCE +static Bool R200CheckCompositeTexture(PicturePtr pPict, int unit) +{ + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + unsigned int i; + + if ((w > 0x7ff) || (h > 0x7ff)) + RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h)); + + for (i = 0; i < sizeof(R200TexFormats) / sizeof(R200TexFormats[0]); i++) + { + if (R200TexFormats[i].fmt == pPict->format) + break; + } + if (i == sizeof(R200TexFormats) / sizeof(R200TexFormats[0])) + RADEON_FALLBACK(("Unsupported picture format 0x%x\n", + (int)pPict->format)); + + if (!RADEONCheckTexturePOT(pPict, unit == 0)) + return FALSE; + + if (pPict->filter != PictFilterNearest && + pPict->filter != PictFilterBilinear) + RADEON_FALLBACK(("Unsupported filter 0x%x\n", pPict->filter)); + + if (pPict->repeat && pPict->repeatType != RepeatNormal) + { + RADEON_FALLBACK(("Unsupported repeat type %d\n", pPict->repeat)); + } + + return TRUE; +} +# endif /* ONLY_ONCE */ + +static Bool FUNC_NAME(R200TextureSetup)(PicturePtr pPict, PixmapPtr pPix, + int unit) +{ + VAR_PREAMBLE(pPix->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + uint32_t txfilter, txformat, txoffset, txpitch; + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + Bool repeat = pPict->repeat && !(unit == 0 && (accel_state->need_src_tile_x || accel_state->need_src_tile_y)); + unsigned int i; + ACCEL_PREAMBLE(); + + txpitch = exaGetPixmapPitch(pPix); + txoffset = exaGetPixmapOffset(pPix) + FB_OFFSET; + + if ((txoffset & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture offset 0x%x\n", (int)txoffset)); + if ((txpitch & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture pitch 0x%x\n", (int)txpitch)); + + for (i = 0; i < sizeof(R200TexFormats) / sizeof(R200TexFormats[0]); i++) + { + if (R200TexFormats[i].fmt == pPict->format) + break; + } + txformat = R200TexFormats[i].card_fmt; + if (RADEONPixmapIsColortiled(pPix)) + txoffset |= R200_TXO_MACRO_TILE; + + if (repeat) { + if (!RADEONPitchMatches(pPix)) + RADEON_FALLBACK(("Width %d and pitch %u not compatible for repeat\n", + w, (unsigned)txpitch)); + + txformat |= RADEONLog2(w) << R200_TXFORMAT_WIDTH_SHIFT; + txformat |= RADEONLog2(h) << R200_TXFORMAT_HEIGHT_SHIFT; + } else + txformat |= R200_TXFORMAT_NON_POWER2; + txformat |= unit << R200_TXFORMAT_ST_ROUTE_SHIFT; + + accel_state->texW[unit] = w; + accel_state->texH[unit] = h; + + switch (pPict->filter) { + case PictFilterNearest: + txfilter = (R200_MAG_FILTER_NEAREST | + R200_MIN_FILTER_NEAREST); + break; + case PictFilterBilinear: + txfilter = (R200_MAG_FILTER_LINEAR | + R200_MIN_FILTER_LINEAR); + break; + default: + RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); + } + + if (repeat) + txfilter |= R200_CLAMP_S_WRAP | R200_CLAMP_T_WRAP; + + BEGIN_ACCEL(6); + if (unit == 0) { + OUT_ACCEL_REG(R200_PP_TXFILTER_0, txfilter); + OUT_ACCEL_REG(R200_PP_TXFORMAT_0, txformat); + OUT_ACCEL_REG(R200_PP_TXFORMAT_X_0, 0); + OUT_ACCEL_REG(R200_PP_TXSIZE_0, (pPix->drawable.width - 1) | + ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(R200_PP_TXPITCH_0, txpitch - 32); + OUT_ACCEL_REG(R200_PP_TXOFFSET_0, txoffset); + } else { + OUT_ACCEL_REG(R200_PP_TXFILTER_1, txfilter); + OUT_ACCEL_REG(R200_PP_TXFORMAT_1, txformat); + OUT_ACCEL_REG(R200_PP_TXFORMAT_X_1, 0); + OUT_ACCEL_REG(R200_PP_TXSIZE_1, (pPix->drawable.width - 1) | + ((pPix->drawable.height - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_ACCEL_REG(R200_PP_TXPITCH_1, txpitch - 32); + OUT_ACCEL_REG(R200_PP_TXOFFSET_1, txoffset); + } + FINISH_ACCEL(); + + if (pPict->transform != 0) { + accel_state->is_transform[unit] = TRUE; + accel_state->transform[unit] = pPict->transform; + } else { + accel_state->is_transform[unit] = FALSE; + } + + return TRUE; +} + +# ifdef ONLY_ONCE +static Bool R200CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, + PicturePtr pDstPicture) +{ + PixmapPtr pSrcPixmap, pDstPixmap; + uint32_t tmp1; + + TRACE; + + if (!pSrcPicture->pDrawable) + return FALSE; + + pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); + + if (pSrcPixmap->drawable.width >= 2048 || + pSrcPixmap->drawable.height >= 2048) { + RADEON_FALLBACK(("Source w/h too large (%d,%d).\n", + pSrcPixmap->drawable.width, + pSrcPixmap->drawable.height)); + } + + pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable); + + if (pDstPixmap->drawable.width >= 2048 || + pDstPixmap->drawable.height >= 2048) { + RADEON_FALLBACK(("Dest w/h too large (%d,%d).\n", + pDstPixmap->drawable.width, + pDstPixmap->drawable.height)); + } + + if (pMaskPicture) { + PixmapPtr pMaskPixmap = RADEONGetDrawablePixmap(pMaskPicture->pDrawable); + + if (pMaskPixmap->drawable.width >= 2048 || + pMaskPixmap->drawable.height >= 2048) { + RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n", + pMaskPixmap->drawable.width, + pMaskPixmap->drawable.height)); + } + + if (pMaskPicture->componentAlpha) { + /* Check if it's component alpha that relies on a source alpha and + * on the source value. We can only get one of those into the + * single source value that we get to blend with. + */ + if (RadeonBlendOp[op].src_alpha && + (RadeonBlendOp[op].blend_cntl & RADEON_SRC_BLEND_MASK) != + RADEON_SRC_BLEND_GL_ZERO) { + RADEON_FALLBACK(("Component alpha not supported with source " + "alpha and source value blending.\n")); + } + } + + if (!R200CheckCompositeTexture(pMaskPicture, 1)) + return FALSE; + } + + if (!R200CheckCompositeTexture(pSrcPicture, 0)) + return FALSE; + + if (!RADEONGetDestFormat(pDstPicture, &tmp1)) + return FALSE; + + return TRUE; +} +# endif /* ONLY_ONCE */ + +static Bool FUNC_NAME(R200PrepareComposite)(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, PicturePtr pDstPicture, + PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) +{ + VAR_PREAMBLE(pDst->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + uint32_t dst_format, dst_offset, dst_pitch; + uint32_t pp_cntl, blendcntl, cblend, ablend, colorpitch; + int pixel_shift; + ACCEL_PREAMBLE(); + + TRACE; + + if (!accel_state->XHas3DEngineState) + RADEONInit3DEngine(pScrn); + + if (!RADEONGetDestFormat(pDstPicture, &dst_format)) + return FALSE; + + if (pMask) + accel_state->has_mask = TRUE; + else + accel_state->has_mask = FALSE; + + pixel_shift = pDst->drawable.bitsPerPixel >> 4; + + dst_offset = exaGetPixmapOffset(pDst) + FB_OFFSET; + dst_pitch = exaGetPixmapPitch(pDst); + colorpitch = dst_pitch >> pixel_shift; + if (RADEONPixmapIsColortiled(pDst)) + colorpitch |= RADEON_COLOR_TILE_ENABLE; + + if ((dst_offset & 0x0f) != 0) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)dst_offset)); + if (((dst_pitch >> pixel_shift) & 0x7) != 0) + RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch)); + + if (!RADEONSetupSourceTile(pSrcPicture, pSrc, FALSE, TRUE)) + return FALSE; + + if (!FUNC_NAME(R200TextureSetup)(pSrcPicture, pSrc, 0)) + return FALSE; + pp_cntl = RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE; + + if (pMask != NULL) { + if (!FUNC_NAME(R200TextureSetup)(pMaskPicture, pMask, 1)) + return FALSE; + pp_cntl |= RADEON_TEX_1_ENABLE; + } else { + accel_state->is_transform[1] = FALSE; + } + + RADEON_SWITCH_TO_3D(); + + BEGIN_ACCEL(11); + + OUT_ACCEL_REG(RADEON_PP_CNTL, pp_cntl); + OUT_ACCEL_REG(RADEON_RB3D_CNTL, dst_format | RADEON_ALPHA_BLEND_ENABLE); + OUT_ACCEL_REG(RADEON_RB3D_COLOROFFSET, dst_offset); + + OUT_ACCEL_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); + if (pMask) + OUT_ACCEL_REG(R200_SE_VTX_FMT_1, + (2 << R200_VTX_TEX0_COMP_CNT_SHIFT) | + (2 << R200_VTX_TEX1_COMP_CNT_SHIFT)); + else + OUT_ACCEL_REG(R200_SE_VTX_FMT_1, + (2 << R200_VTX_TEX0_COMP_CNT_SHIFT)); + + OUT_ACCEL_REG(RADEON_RB3D_COLORPITCH, colorpitch); + + /* IN operator: Multiply src by mask components or mask alpha. + * BLEND_CTL_ADD is A * B + C. + * If a picture is a8, we have to explicitly zero its color values. + * If the destination is a8, we have to route the alpha to red, I think. + * If we're doing component alpha where the source for blending is going to + * be the source alpha (and there's no source value used), we have to zero + * the source's color values. + */ + cblend = R200_TXC_OP_MADD | R200_TXC_ARG_C_ZERO; + ablend = R200_TXA_OP_MADD | R200_TXA_ARG_C_ZERO; + + if (pDstPicture->format == PICT_a8 || + (pMask && pMaskPicture->componentAlpha && RadeonBlendOp[op].src_alpha)) + { + cblend |= R200_TXC_ARG_A_R0_ALPHA; + } else if (pSrcPicture->format == PICT_a8) + cblend |= R200_TXC_ARG_A_ZERO; + else + cblend |= R200_TXC_ARG_A_R0_COLOR; + ablend |= R200_TXA_ARG_A_R0_ALPHA; + + if (pMask) { + if (pMaskPicture->componentAlpha && + pDstPicture->format != PICT_a8) + cblend |= R200_TXC_ARG_B_R1_COLOR; + else + cblend |= R200_TXC_ARG_B_R1_ALPHA; + ablend |= R200_TXA_ARG_B_R1_ALPHA; + } else { + cblend |= R200_TXC_ARG_B_ZERO | R200_TXC_COMP_ARG_B; + ablend |= R200_TXA_ARG_B_ZERO | R200_TXA_COMP_ARG_B; + } + + OUT_ACCEL_REG(R200_PP_TXCBLEND_0, cblend); + OUT_ACCEL_REG(R200_PP_TXCBLEND2_0, + R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); + OUT_ACCEL_REG(R200_PP_TXABLEND_0, ablend); + OUT_ACCEL_REG(R200_PP_TXABLEND2_0, + R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); + + /* Op operator. */ + blendcntl = RADEONGetBlendCntl(op, pMaskPicture, pDstPicture->format); + OUT_ACCEL_REG(RADEON_RB3D_BLENDCNTL, blendcntl); + FINISH_ACCEL(); + + return TRUE; +} +#endif /* IS_RADEON_DRIVER */ + +#ifdef ONLY_ONCE + +static Bool R300CheckCompositeTexture(PicturePtr pPict, + PicturePtr pDstPict, + int op, + int unit, + Bool is_r500) +{ + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + unsigned int i; + int max_tex_w, max_tex_h; + + if (is_r500) { + max_tex_w = 4096; + max_tex_h = 4096; + } else { + max_tex_w = 2048; + max_tex_h = 2048; + } + + if ((w > max_tex_w) || (h > max_tex_h)) + RADEON_FALLBACK(("Picture w/h too large (%dx%d)\n", w, h)); + + for (i = 0; i < sizeof(R300TexFormats) / sizeof(R300TexFormats[0]); i++) + { + if (R300TexFormats[i].fmt == pPict->format) + break; + } + if (i == sizeof(R300TexFormats) / sizeof(R300TexFormats[0])) + RADEON_FALLBACK(("Unsupported picture format 0x%x\n", + (int)pPict->format)); + + if (!RADEONCheckTexturePOT(pPict, unit == 0)) + return FALSE; + + if (pPict->filter != PictFilterNearest && + pPict->filter != PictFilterBilinear) + RADEON_FALLBACK(("Unsupported filter 0x%x\n", pPict->filter)); + + /* for REPEAT_NONE, Render semantics are that sampling outside the source + * picture results in alpha=0 pixels. We can implement this with a border color + * *if* our source texture has an alpha channel, otherwise we need to fall + * back. If we're not transformed then we hope that upper layers have clipped + * rendering to the bounds of the source drawable, in which case it doesn't + * matter. I have not, however, verified that the X server always does such + * clipping. + */ + if (pPict->transform != 0 && !pPict->repeat && PICT_FORMAT_A(pPict->format) == 0) { + if (!(((op == PictOpSrc) || (op == PictOpClear)) && (PICT_FORMAT_A(pDstPict->format) == 0))) + RADEON_FALLBACK(("REPEAT_NONE unsupported for transformed xRGB source\n")); + } + + if (pPict->repeat && pPict->repeatType != RepeatNormal) + { + RADEON_FALLBACK(("Unsupported repeat type %d\n", pPict->repeat)); + } + + return TRUE; +} + +#endif /* ONLY_ONCE */ + +static Bool FUNC_NAME(R300TextureSetup)(PicturePtr pPict, PixmapPtr pPix, + int unit) +{ + VAR_PREAMBLE(pPix->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + uint32_t txfilter, txformat0, txformat1, txoffset, txpitch; + int w = pPict->pDrawable->width; + int h = pPict->pDrawable->height; + unsigned int i; + int pixel_shift; + ACCEL_PREAMBLE(); + + TRACE; + + txpitch = exaGetPixmapPitch(pPix); + txoffset = exaGetPixmapOffset(pPix) + FB_OFFSET; + + if ((txoffset & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture offset 0x%x\n", (int)txoffset)); + if ((txpitch & 0x1f) != 0) + RADEON_FALLBACK(("Bad texture pitch 0x%x\n", (int)txpitch)); + + /* TXPITCH = pixels (texels) per line - 1 */ + pixel_shift = pPix->drawable.bitsPerPixel >> 4; + txpitch >>= pixel_shift; + txpitch -= 1; + + if (RADEONPixmapIsColortiled(pPix)) + txoffset |= R300_MACRO_TILE; + + for (i = 0; i < sizeof(R300TexFormats) / sizeof(R300TexFormats[0]); i++) + { + if (R300TexFormats[i].fmt == pPict->format) + break; + } + + txformat1 = R300TexFormats[i].card_fmt; + + txformat0 = ((((w - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | + (((h - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT)); + + if (IS_R500_3D && ((w - 1) & 0x800)) + txpitch |= R500_TXWIDTH_11; + + if (IS_R500_3D && ((h - 1) & 0x800)) + txpitch |= R500_TXHEIGHT_11; + + /* Use TXPITCH instead of TXWIDTH for address computations: we could + * omit this if there is no padding, but there is no apparent advantage + * in doing so. + */ + txformat0 |= R300_TXPITCH_EN; + + accel_state->texW[unit] = w; + accel_state->texH[unit] = h; + + if (pPict->repeat && !(unit == 0 && accel_state->need_src_tile_x)) + txfilter = R300_TX_CLAMP_S(R300_TX_CLAMP_WRAP); + else + txfilter = R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_GL); + + if (pPict->repeat && !(unit == 0 && accel_state->need_src_tile_y)) + txfilter |= R300_TX_CLAMP_T(R300_TX_CLAMP_WRAP); + else + txfilter |= R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_GL); + + txfilter |= (unit << R300_TX_ID_SHIFT); + + switch (pPict->filter) { + case PictFilterNearest: + txfilter |= (R300_TX_MAG_FILTER_NEAREST | R300_TX_MIN_FILTER_NEAREST); + break; + case PictFilterBilinear: + txfilter |= (R300_TX_MAG_FILTER_LINEAR | R300_TX_MIN_FILTER_LINEAR); + break; + default: + RADEON_FALLBACK(("Bad filter 0x%x\n", pPict->filter)); + } + + BEGIN_ACCEL(pPict->repeat ? 6 : 7); + OUT_ACCEL_REG(R300_TX_FILTER0_0 + (unit * 4), txfilter); + OUT_ACCEL_REG(R300_TX_FILTER1_0 + (unit * 4), 0); + OUT_ACCEL_REG(R300_TX_FORMAT0_0 + (unit * 4), txformat0); + OUT_ACCEL_REG(R300_TX_FORMAT1_0 + (unit * 4), txformat1); + OUT_ACCEL_REG(R300_TX_FORMAT2_0 + (unit * 4), txpitch); + OUT_ACCEL_REG(R300_TX_OFFSET_0 + (unit * 4), txoffset); + if (!pPict->repeat) + OUT_ACCEL_REG(R300_TX_BORDER_COLOR_0 + (unit * 4), 0); + FINISH_ACCEL(); + + if (pPict->transform != 0) { + accel_state->is_transform[unit] = TRUE; + accel_state->transform[unit] = pPict->transform; + } else { + accel_state->is_transform[unit] = FALSE; + } + + return TRUE; +} + +#ifdef ONLY_ONCE + +static Bool R300CheckComposite(int op, PicturePtr pSrcPicture, PicturePtr pMaskPicture, + PicturePtr pDstPicture) +{ + VAR_PREAMBLE(pSrcPicture->pDrawable->pScreen); + uint32_t tmp1; + PixmapPtr pSrcPixmap, pDstPixmap; + int max_tex_w, max_tex_h, max_dst_w, max_dst_h; + + TRACE; + + /* Check for unsupported compositing operations. */ + if ((unsigned int)op >= sizeof(RadeonBlendOp) / sizeof(RadeonBlendOp[0])) + RADEON_FALLBACK(("Unsupported Composite op 0x%x\n", op)); + + pSrcPixmap = RADEONGetDrawablePixmap(pSrcPicture->pDrawable); + + if (IS_R500_3D) { + max_tex_w = 4096; + max_tex_h = 4096; + max_dst_w = 4096; + max_dst_h = 4096; + } else { + max_tex_w = 2048; + max_tex_h = 2048; + max_dst_w = 2560; + max_dst_h = 2560; + } + + if (pSrcPixmap->drawable.width >= max_tex_w || + pSrcPixmap->drawable.height >= max_tex_h) { + RADEON_FALLBACK(("Source w/h too large (%d,%d).\n", + pSrcPixmap->drawable.width, + pSrcPixmap->drawable.height)); + } + + pDstPixmap = RADEONGetDrawablePixmap(pDstPicture->pDrawable); + + if (pDstPixmap->drawable.width >= max_dst_w || + pDstPixmap->drawable.height >= max_dst_h) { + RADEON_FALLBACK(("Dest w/h too large (%d,%d).\n", + pDstPixmap->drawable.width, + pDstPixmap->drawable.height)); + } + + if (pMaskPicture) { + PixmapPtr pMaskPixmap = RADEONGetDrawablePixmap(pMaskPicture->pDrawable); + + if (pMaskPixmap->drawable.width >= max_tex_w || + pMaskPixmap->drawable.height >= max_tex_h) { + RADEON_FALLBACK(("Mask w/h too large (%d,%d).\n", + pMaskPixmap->drawable.width, + pMaskPixmap->drawable.height)); + } + + if (pMaskPicture->componentAlpha) { + /* Check if it's component alpha that relies on a source alpha and + * on the source value. We can only get one of those into the + * single source value that we get to blend with. + */ + if (RadeonBlendOp[op].src_alpha && + (RadeonBlendOp[op].blend_cntl & RADEON_SRC_BLEND_MASK) != + RADEON_SRC_BLEND_GL_ZERO) { + RADEON_FALLBACK(("Component alpha not supported with source " + "alpha and source value blending.\n")); + } + } + + if (!R300CheckCompositeTexture(pMaskPicture, pDstPicture, op, 1, IS_R500_3D)) + return FALSE; + } + + if (!R300CheckCompositeTexture(pSrcPicture, pDstPicture, op, 0, IS_R500_3D)) + return FALSE; + + if (!R300GetDestFormat(pDstPicture, &tmp1)) + return FALSE; + + return TRUE; + +} +#endif /* ONLY_ONCE */ + +static Bool FUNC_NAME(R300PrepareComposite)(int op, PicturePtr pSrcPicture, + PicturePtr pMaskPicture, PicturePtr pDstPicture, + PixmapPtr pSrc, PixmapPtr pMask, PixmapPtr pDst) +{ + VAR_PREAMBLE(pDst->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + uint32_t dst_format, dst_offset, dst_pitch; + uint32_t txenable, colorpitch; + uint32_t blendcntl; + int pixel_shift; + ACCEL_PREAMBLE(); + + TRACE; + + if (!accel_state->XHas3DEngineState) + RADEONInit3DEngine(pScrn); + + if (!R300GetDestFormat(pDstPicture, &dst_format)) + return FALSE; + + if (pMask) + accel_state->has_mask = TRUE; + else + accel_state->has_mask = FALSE; + + pixel_shift = pDst->drawable.bitsPerPixel >> 4; + + dst_offset = exaGetPixmapOffset(pDst) + FB_OFFSET; + dst_pitch = exaGetPixmapPitch(pDst); + colorpitch = dst_pitch >> pixel_shift; + + if (RADEONPixmapIsColortiled(pDst)) + colorpitch |= R300_COLORTILE; + + colorpitch |= dst_format; + + if ((dst_offset & 0x0f) != 0) + RADEON_FALLBACK(("Bad destination offset 0x%x\n", (int)dst_offset)); + if (((dst_pitch >> pixel_shift) & 0x7) != 0) + RADEON_FALLBACK(("Bad destination pitch 0x%x\n", (int)dst_pitch)); + + if (!RADEONSetupSourceTile(pSrcPicture, pSrc, TRUE, FALSE)) + return FALSE; + + if (!FUNC_NAME(R300TextureSetup)(pSrcPicture, pSrc, 0)) + return FALSE; + txenable = R300_TEX_0_ENABLE; + + if (pMask != NULL) { + if (!FUNC_NAME(R300TextureSetup)(pMaskPicture, pMask, 1)) + return FALSE; + txenable |= R300_TEX_1_ENABLE; + } else { + accel_state->is_transform[1] = FALSE; + } + + RADEON_SWITCH_TO_3D(); + + /* setup the VAP */ + if (HAS_TCL) { + if (pMask) + BEGIN_ACCEL(8); + else + BEGIN_ACCEL(7); + } else { + if (pMask) + BEGIN_ACCEL(6); + else + BEGIN_ACCEL(5); + } + + /* These registers define the number, type, and location of data submitted + * to the PVS unit of GA input (when PVS is disabled) + * DST_VEC_LOC is the slot in the PVS input vector memory when PVS/TCL is + * enabled. This memory provides the imputs to the vertex shader program + * and ordering is not important. When PVS/TCL is disabled, this field maps + * directly to the GA input memory and the order is signifigant. In + * PVS_BYPASS mode the order is as follows: + * Position + * Point Size + * Color 0-3 + * Textures 0-7 + * Fog + */ + if (pMask) { + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, + ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | + (0 << R300_SKIP_DWORDS_0_SHIFT) | + (0 << R300_DST_VEC_LOC_0_SHIFT) | + R300_SIGNED_0 | + (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | + (0 << R300_SKIP_DWORDS_1_SHIFT) | + (6 << R300_DST_VEC_LOC_1_SHIFT) | + R300_SIGNED_1)); + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_1, + ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_2_SHIFT) | + (0 << R300_SKIP_DWORDS_2_SHIFT) | + (7 << R300_DST_VEC_LOC_2_SHIFT) | + R300_LAST_VEC_2 | + R300_SIGNED_2)); + } else + OUT_ACCEL_REG(R300_VAP_PROG_STREAM_CNTL_0, + ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | + (0 << R300_SKIP_DWORDS_0_SHIFT) | + (0 << R300_DST_VEC_LOC_0_SHIFT) | + R300_SIGNED_0 | + (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | + (0 << R300_SKIP_DWORDS_1_SHIFT) | + (6 << R300_DST_VEC_LOC_1_SHIFT) | + R300_LAST_VEC_1 | + R300_SIGNED_1)); + + /* load the vertex shader + * We pre-load vertex programs in RADEONInit3DEngine(): + * - exa no mask + * - exa mask + * - Xv + * Here we select the offset of the vertex program we want to use + */ + if (HAS_TCL) { + if (pMask) { + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, + ((0 << R300_PVS_FIRST_INST_SHIFT) | + (2 << R300_PVS_XYZW_VALID_INST_SHIFT) | + (2 << R300_PVS_LAST_INST_SHIFT))); + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, + (2 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + } else { + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_0, + ((3 << R300_PVS_FIRST_INST_SHIFT) | + (4 << R300_PVS_XYZW_VALID_INST_SHIFT) | + (4 << R300_PVS_LAST_INST_SHIFT))); + OUT_ACCEL_REG(R300_VAP_PVS_CODE_CNTL_1, + (4 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + } + } + + /* Position and one or two sets of 2 texture coordinates */ + OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_0, R300_VTX_POS_PRESENT); + if (pMask) + OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, + ((2 << R300_TEX_0_COMP_CNT_SHIFT) | + (2 << R300_TEX_1_COMP_CNT_SHIFT))); + else + OUT_ACCEL_REG(R300_VAP_OUT_VTX_FMT_1, + (2 << R300_TEX_0_COMP_CNT_SHIFT)); + + OUT_ACCEL_REG(R300_TX_INVALTAGS, 0x0); + OUT_ACCEL_REG(R300_TX_ENABLE, txenable); + FINISH_ACCEL(); + + /* setup pixel shader */ + if (IS_R300_3D) { + uint32_t output_fmt; + int src_color, src_alpha; + int mask_color, mask_alpha; + + if (PICT_FORMAT_RGB(pSrcPicture->format) == 0) + src_color = R300_ALU_RGB_0_0; + else + src_color = R300_ALU_RGB_SRC0_RGB; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + src_alpha = R300_ALU_ALPHA_1_0; + else + src_alpha = R300_ALU_ALPHA_SRC0_A; + + if (pMask && pMaskPicture->componentAlpha) { + if (RadeonBlendOp[op].src_alpha) { + if (PICT_FORMAT_A(pSrcPicture->format) == 0) { + src_color = R300_ALU_RGB_1_0; + src_alpha = R300_ALU_ALPHA_1_0; + } else { + src_color = R300_ALU_RGB_SRC0_AAA; + src_alpha = R300_ALU_ALPHA_SRC0_A; + } + + mask_color = R300_ALU_RGB_SRC1_RGB; + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R300_ALU_ALPHA_1_0; + else + mask_alpha = R300_ALU_ALPHA_SRC1_A; + + } else { + src_color = R300_ALU_RGB_SRC0_RGB; + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + src_alpha = R300_ALU_ALPHA_1_0; + else + src_alpha = R300_ALU_ALPHA_SRC0_A; + + mask_color = R300_ALU_RGB_SRC1_RGB; + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R300_ALU_ALPHA_1_0; + else + mask_alpha = R300_ALU_ALPHA_SRC1_A; + + } + } else if (pMask) { + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_color = R300_ALU_RGB_1_0; + else + mask_color = R300_ALU_RGB_SRC1_AAA; + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R300_ALU_ALPHA_1_0; + else + mask_alpha = R300_ALU_ALPHA_SRC1_A; + } else { + mask_color = R300_ALU_RGB_1_0; + mask_alpha = R300_ALU_ALPHA_1_0; + } + + /* shader output swizzling */ + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + default: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_RED | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_BLUE | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_ALPHA); + break; + } + + + /* setup the rasterizer, load FS */ + BEGIN_ACCEL(9); + if (pMask) { + /* 4 components: 2 for tex0, 2 for tex1 */ + OUT_ACCEL_REG(R300_RS_COUNT, + ((4 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1)); + + OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | + R300_ALU_CODE_SIZE(0) | + R300_TEX_CODE_OFFSET(0) | + R300_TEX_CODE_SIZE(1))); + + OUT_ACCEL_REG(R300_US_CODE_ADDR_3, + (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(1) | + R300_RGBA_OUT)); + } else { + /* 2 components: 2 for tex0 */ + OUT_ACCEL_REG(R300_RS_COUNT, + ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); + + OUT_ACCEL_REG(R300_US_CODE_OFFSET, (R300_ALU_CODE_OFFSET(0) | + R300_ALU_CODE_SIZE(0) | + R300_TEX_CODE_OFFSET(0) | + R300_TEX_CODE_SIZE(0))); + + OUT_ACCEL_REG(R300_US_CODE_ADDR_3, + (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(0) | + R300_RGBA_OUT)); + } + + /* shader output swizzling */ + OUT_ACCEL_REG(R300_US_OUT_FMT_0, output_fmt); + + /* tex inst for src texture is pre-loaded in RADEONInit3DEngine() */ + /* tex inst for mask texture is pre-loaded in RADEONInit3DEngine() */ + + /* RGB inst + * temp addresses for texture inputs + * ALU_RGB_ADDR0 is src tex (temp 0) + * ALU_RGB_ADDR1 is mask tex (temp 1) + * R300_ALU_RGB_OMASK - output components to write + * R300_ALU_RGB_TARGET_A - render target + */ + OUT_ACCEL_REG(R300_US_ALU_RGB_ADDR_0, + (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR1(1) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_OMASK((R300_ALU_RGB_MASK_R | + R300_ALU_RGB_MASK_G | + R300_ALU_RGB_MASK_B)) | + R300_ALU_RGB_TARGET_A)); + /* RGB inst + * ALU operation + */ + OUT_ACCEL_REG(R300_US_ALU_RGB_INST_0, + (R300_ALU_RGB_SEL_A(src_color) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(mask_color) | + R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0) | + R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | + R300_ALU_RGB_CLAMP)); + /* Alpha inst + * temp addresses for texture inputs + * ALU_ALPHA_ADDR0 is src tex (0) + * ALU_ALPHA_ADDR1 is mask tex (1) + * R300_ALU_ALPHA_OMASK - output components to write + * R300_ALU_ALPHA_TARGET_A - render target + */ + OUT_ACCEL_REG(R300_US_ALU_ALPHA_ADDR_0, + (R300_ALU_ALPHA_ADDR0(0) | + R300_ALU_ALPHA_ADDR1(1) | + R300_ALU_ALPHA_ADDR2(0) | + R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | + R300_ALU_ALPHA_TARGET_A | + R300_ALU_ALPHA_OMASK_W(R300_ALU_ALPHA_MASK_NONE))); + /* Alpha inst + * ALU operation + */ + OUT_ACCEL_REG(R300_US_ALU_ALPHA_INST_0, + (R300_ALU_ALPHA_SEL_A(src_alpha) | + R300_ALU_ALPHA_MOD_A(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_B(mask_alpha) | + R300_ALU_ALPHA_MOD_B(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_MOD_C(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_OMOD(R300_ALU_ALPHA_OMOD_NONE) | + R300_ALU_ALPHA_CLAMP)); + FINISH_ACCEL(); + } else { + uint32_t output_fmt; + uint32_t src_color, src_alpha; + uint32_t mask_color, mask_alpha; + + if (PICT_FORMAT_RGB(pSrcPicture->format) == 0) + src_color = (R500_ALU_RGB_R_SWIZ_A_0 | + R500_ALU_RGB_G_SWIZ_A_0 | + R500_ALU_RGB_B_SWIZ_A_0); + else + src_color = (R500_ALU_RGB_R_SWIZ_A_R | + R500_ALU_RGB_G_SWIZ_A_G | + R500_ALU_RGB_B_SWIZ_A_B); + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + src_alpha = R500_ALPHA_SWIZ_A_1; + else + src_alpha = R500_ALPHA_SWIZ_A_A; + + if (pMask && pMaskPicture->componentAlpha) { + if (RadeonBlendOp[op].src_alpha) { + if (PICT_FORMAT_A(pSrcPicture->format) == 0) { + src_color = (R500_ALU_RGB_R_SWIZ_A_1 | + R500_ALU_RGB_G_SWIZ_A_1 | + R500_ALU_RGB_B_SWIZ_A_1); + src_alpha = R500_ALPHA_SWIZ_A_1; + } else { + src_color = (R500_ALU_RGB_R_SWIZ_A_A | + R500_ALU_RGB_G_SWIZ_A_A | + R500_ALU_RGB_B_SWIZ_A_A); + src_alpha = R500_ALPHA_SWIZ_A_A; + } + + mask_color = (R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B); + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R500_ALPHA_SWIZ_B_1; + else + mask_alpha = R500_ALPHA_SWIZ_B_A; + + } else { + src_color = (R500_ALU_RGB_R_SWIZ_A_R | + R500_ALU_RGB_G_SWIZ_A_G | + R500_ALU_RGB_B_SWIZ_A_B); + + if (PICT_FORMAT_A(pSrcPicture->format) == 0) + src_alpha = R500_ALPHA_SWIZ_A_1; + else + src_alpha = R500_ALPHA_SWIZ_A_A; + + mask_color = (R500_ALU_RGB_R_SWIZ_B_R | + R500_ALU_RGB_G_SWIZ_B_G | + R500_ALU_RGB_B_SWIZ_B_B); + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R500_ALPHA_SWIZ_B_1; + else + mask_alpha = R500_ALPHA_SWIZ_B_A; + + } + } else if (pMask) { + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_color = (R500_ALU_RGB_R_SWIZ_B_1 | + R500_ALU_RGB_G_SWIZ_B_1 | + R500_ALU_RGB_B_SWIZ_B_1); + else + mask_color = (R500_ALU_RGB_R_SWIZ_B_A | + R500_ALU_RGB_G_SWIZ_B_A | + R500_ALU_RGB_B_SWIZ_B_A); + + if (PICT_FORMAT_A(pMaskPicture->format) == 0) + mask_alpha = R500_ALPHA_SWIZ_B_1; + else + mask_alpha = R500_ALPHA_SWIZ_B_A; + } else { + mask_color = (R500_ALU_RGB_R_SWIZ_B_1 | + R500_ALU_RGB_G_SWIZ_B_1 | + R500_ALU_RGB_B_SWIZ_B_1); + mask_alpha = R500_ALPHA_SWIZ_B_1; + } + + /* shader output swizzling */ + switch (pDstPicture->format) { + case PICT_a8r8g8b8: + case PICT_x8r8g8b8: + default: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8b8g8r8: + case PICT_x8b8g8r8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_RED | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_BLUE | + R300_OUT_FMT_C3_SEL_ALPHA); + break; + case PICT_a8: + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_ALPHA); + break; + } + + BEGIN_ACCEL(6); + if (pMask) { + /* 4 components: 2 for tex0, 2 for tex1 */ + OUT_ACCEL_REG(R300_RS_COUNT, + ((4 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + /* 2 RS instructions: 1 for tex0 (src), 1 for tex1 (mask) */ + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(1)); + + OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | + R500_US_CODE_END_ADDR(2))); + OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | + R500_US_CODE_RANGE_SIZE(2))); + OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); + } else { + OUT_ACCEL_REG(R300_RS_COUNT, + ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + OUT_ACCEL_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); + + OUT_ACCEL_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | + R500_US_CODE_END_ADDR(1))); + OUT_ACCEL_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | + R500_US_CODE_RANGE_SIZE(1))); + OUT_ACCEL_REG(R500_US_CODE_OFFSET, 0); + } + + OUT_ACCEL_REG(R300_US_OUT_FMT_0, output_fmt); + FINISH_ACCEL(); + + if (pMask) { + BEGIN_ACCEL(19); + OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, 0); + /* tex inst for src texture */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_IGNORE_UNCOVERED)); + + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_DST_ADDR(0) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | + R500_DX_S_SWIZ_R | + R500_DX_T_SWIZ_R | + R500_DX_R_SWIZ_R | + R500_DX_Q_SWIZ_R | + R500_DY_ADDR(0) | + R500_DY_S_SWIZ_R | + R500_DY_T_SWIZ_R | + R500_DY_R_SWIZ_R | + R500_DY_Q_SWIZ_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* tex inst for mask texture */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(1) | + R500_TEX_INST_LD | + R500_TEX_SEM_ACQUIRE | + R500_TEX_IGNORE_UNCOVERED)); + + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(1) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_DST_ADDR(1) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(1) | + R500_DX_S_SWIZ_R | + R500_DX_T_SWIZ_R | + R500_DX_R_SWIZ_R | + R500_DX_Q_SWIZ_R | + R500_DY_ADDR(1) | + R500_DY_S_SWIZ_R | + R500_DY_T_SWIZ_R | + R500_DY_R_SWIZ_R | + R500_DY_Q_SWIZ_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + } else { + BEGIN_ACCEL(13); + OUT_ACCEL_REG(R500_GA_US_VECTOR_INDEX, 0); + /* tex inst for src texture */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_SEM_ACQUIRE | + R500_TEX_IGNORE_UNCOVERED)); + + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_DST_ADDR(0) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | + R500_DX_S_SWIZ_R | + R500_DX_T_SWIZ_R | + R500_DX_R_SWIZ_R | + R500_DX_Q_SWIZ_R | + R500_DY_ADDR(0) | + R500_DY_S_SWIZ_R | + R500_DY_T_SWIZ_R | + R500_DY_R_SWIZ_R | + R500_DY_Q_SWIZ_R)); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + } + + /* ALU inst */ + /* *_OMASK* - output component write mask */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | + R500_INST_TEX_SEM_WAIT | + R500_INST_LAST | + R500_INST_RGB_OMASK_R | + R500_INST_RGB_OMASK_G | + R500_INST_RGB_OMASK_B | + R500_INST_ALPHA_OMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + /* ALU inst + * temp addresses for texture inputs + * RGB_ADDR0 is src tex (temp 0) + * RGB_ADDR1 is mask tex (temp 1) + */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_ADDR1(1) | + R500_RGB_ADDR2(0))); + /* ALU inst + * temp addresses for texture inputs + * ALPHA_ADDR0 is src tex (temp 0) + * ALPHA_ADDR1 is mask tex (temp 1) + */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_ADDR1(1) | + R500_ALPHA_ADDR2(0))); + + /* R500_ALU_RGB_TARGET - RGB render target */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | + src_color | + R500_ALU_RGB_SEL_B_SRC1 | + mask_color | + R500_ALU_RGB_TARGET(0))); + + /* R500_ALPHA_RGB_TARGET - alpha render target */ + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | + R500_ALPHA_ADDRD(0) | + R500_ALPHA_SEL_A_SRC0 | + src_alpha | + R500_ALPHA_SEL_B_SRC1 | + mask_alpha | + R500_ALPHA_TARGET(0))); + + OUT_ACCEL_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_ADDRD(0) | + R500_ALU_RGBA_R_SWIZ_0 | + R500_ALU_RGBA_G_SWIZ_0 | + R500_ALU_RGBA_B_SWIZ_0 | + R500_ALU_RGBA_A_SWIZ_0)); + FINISH_ACCEL(); + } + + BEGIN_ACCEL(3); + + OUT_ACCEL_REG(R300_RB3D_COLOROFFSET0, dst_offset); + OUT_ACCEL_REG(R300_RB3D_COLORPITCH0, colorpitch); + + blendcntl = RADEONGetBlendCntl(op, pMaskPicture, pDstPicture->format); + OUT_ACCEL_REG(R300_RB3D_BLENDCNTL, blendcntl | R300_ALPHA_BLEND_ENABLE | R300_READ_ENABLE); + + FINISH_ACCEL(); + + return TRUE; +} + +#define VTX_COUNT_MASK 6 +#define VTX_COUNT 4 + +#ifdef ACCEL_CP + +#define VTX_OUT_MASK(_dstX, _dstY, _srcX, _srcY, _maskX, _maskY) \ +do { \ + OUT_RING_F(_dstX); \ + OUT_RING_F(_dstY); \ + OUT_RING_F(_srcX); \ + OUT_RING_F(_srcY); \ + OUT_RING_F(_maskX); \ + OUT_RING_F(_maskY); \ +} while (0) + +#define VTX_OUT(_dstX, _dstY, _srcX, _srcY) \ +do { \ + OUT_RING_F(_dstX); \ + OUT_RING_F(_dstY); \ + OUT_RING_F(_srcX); \ + OUT_RING_F(_srcY); \ +} while (0) + +#else /* ACCEL_CP */ + +#define VTX_OUT_MASK(_dstX, _dstY, _srcX, _srcY, _maskX, _maskY) \ +do { \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstX); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstY); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _srcX); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _srcY); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _maskX); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _maskY); \ +} while (0) + +#define VTX_OUT(_dstX, _dstY, _srcX, _srcY) \ +do { \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstX); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _dstY); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _srcX); \ + OUT_ACCEL_REG_F(RADEON_SE_PORT_DATA0, _srcY); \ +} while (0) + +#endif /* !ACCEL_CP */ + +#ifdef ONLY_ONCE +static inline void transformPoint(PictTransform *transform, xPointFixed *point) +{ + PictVector v; + v.vector[0] = point->x; + v.vector[1] = point->y; + v.vector[2] = xFixed1; + PictureTransformPoint(transform, &v); + point->x = v.vector[0]; + point->y = v.vector[1]; +} +#endif + +static void FUNC_NAME(RadeonCompositeTile)(PixmapPtr pDst, + int srcX, int srcY, + int maskX, int maskY, + int dstX, int dstY, + int w, int h) +{ + VAR_PREAMBLE(pDst->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + int vtx_count; + xPointFixed srcTopLeft, srcTopRight, srcBottomLeft, srcBottomRight; + xPointFixed maskTopLeft, maskTopRight, maskBottomLeft, maskBottomRight; + ACCEL_PREAMBLE(); + + ENTER_DRAW(0); + + /* ErrorF("RadeonComposite (%d,%d) (%d,%d) (%d,%d) (%d,%d)\n", + srcX, srcY, maskX, maskY,dstX, dstY, w, h); */ + + srcTopLeft.x = IntToxFixed(srcX); + srcTopLeft.y = IntToxFixed(srcY); + srcTopRight.x = IntToxFixed(srcX + w); + srcTopRight.y = IntToxFixed(srcY); + srcBottomLeft.x = IntToxFixed(srcX); + srcBottomLeft.y = IntToxFixed(srcY + h); + srcBottomRight.x = IntToxFixed(srcX + w); + srcBottomRight.y = IntToxFixed(srcY + h); + + maskTopLeft.x = IntToxFixed(maskX); + maskTopLeft.y = IntToxFixed(maskY); + maskTopRight.x = IntToxFixed(maskX + w); + maskTopRight.y = IntToxFixed(maskY); + maskBottomLeft.x = IntToxFixed(maskX); + maskBottomLeft.y = IntToxFixed(maskY + h); + maskBottomRight.x = IntToxFixed(maskX + w); + maskBottomRight.y = IntToxFixed(maskY + h); + + if (accel_state->is_transform[0]) { + transformPoint(accel_state->transform[0], &srcTopLeft); + transformPoint(accel_state->transform[0], &srcTopRight); + transformPoint(accel_state->transform[0], &srcBottomLeft); + transformPoint(accel_state->transform[0], &srcBottomRight); + } + if (accel_state->is_transform[1]) { + transformPoint(accel_state->transform[1], &maskTopLeft); + transformPoint(accel_state->transform[1], &maskTopRight); + transformPoint(accel_state->transform[1], &maskBottomLeft); + transformPoint(accel_state->transform[1], &maskBottomRight); + } + + if (accel_state->has_mask) + vtx_count = VTX_COUNT_MASK; + else + vtx_count = VTX_COUNT; + + if (IS_R300_3D || IS_R500_3D) { + BEGIN_ACCEL(1); + OUT_ACCEL_REG(R300_VAP_VTX_SIZE, vtx_count); + FINISH_ACCEL(); + } + +#ifdef ACCEL_CP +# ifdef IS_RADEON_DRIVER + if (info->ChipFamily < CHIP_FAMILY_R200) { + BEGIN_RING(3 * vtx_count + 3); + OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD, + 3 * vtx_count + 1)); + if (accel_state->has_mask) + OUT_RING(RADEON_CP_VC_FRMT_XY | + RADEON_CP_VC_FRMT_ST0 | + RADEON_CP_VC_FRMT_ST1); + else + OUT_RING(RADEON_CP_VC_FRMT_XY | + RADEON_CP_VC_FRMT_ST0); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + RADEON_CP_VC_CNTL_MAOS_ENABLE | + RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | + (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } else +# endif /* IS_RADEON_DRIVER */ + { + if (IS_R300_3D || IS_R500_3D) + BEGIN_RING(4 * vtx_count + 4); + else + BEGIN_RING(4 * vtx_count + 2); + + OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, + 4 * vtx_count)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } + +#else /* ACCEL_CP */ + if (IS_R300_3D || IS_R500_3D) + BEGIN_ACCEL(2 + vtx_count * 4); +# ifdef IS_RADEON_DRIVER + else if (info->ChipFamily < CHIP_FAMILY_R200) + BEGIN_ACCEL(1 + vtx_count * 3); +# endif /* IS_RADEON_DRIVER */ + else + BEGIN_ACCEL(1 + vtx_count * 4); + +# ifdef IS_RADEON_DRIVER + if (info->ChipFamily < CHIP_FAMILY_R200) + OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECANGLE_LIST | + RADEON_VF_PRIM_WALK_DATA | + RADEON_VF_RADEON_MODE | + (3 << RADEON_VF_NUM_VERTICES_SHIFT))); + else +# endif /* IS_RADEON_DRIVER */ + OUT_ACCEL_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_QUAD_LIST | + RADEON_VF_PRIM_WALK_DATA | + (4 << RADEON_VF_NUM_VERTICES_SHIFT))); +#endif /* ACCEL_CP */ + + if (accel_state->has_mask) { + +# ifdef IS_RADEON_DRIVER + if (info->ChipFamily >= CHIP_FAMILY_R200) +# endif /* IS_RADEON_DRIVER */ + VTX_OUT_MASK((float)dstX, (float)dstY, + xFixedToFloat(srcTopLeft.x) / accel_state->texW[0], xFixedToFloat(srcTopLeft.y) / accel_state->texH[0], + xFixedToFloat(maskTopLeft.x) / accel_state->texW[1], xFixedToFloat(maskTopLeft.y) / accel_state->texH[1]); + VTX_OUT_MASK((float)dstX, (float)(dstY + h), + xFixedToFloat(srcBottomLeft.x) / accel_state->texW[0], xFixedToFloat(srcBottomLeft.y) / accel_state->texH[0], + xFixedToFloat(maskBottomLeft.x) / accel_state->texW[1], xFixedToFloat(maskBottomLeft.y) / accel_state->texH[1]); + VTX_OUT_MASK((float)(dstX + w), (float)(dstY + h), + xFixedToFloat(srcBottomRight.x) / accel_state->texW[0], xFixedToFloat(srcBottomRight.y) / accel_state->texH[0], + xFixedToFloat(maskBottomRight.x) / accel_state->texW[1], xFixedToFloat(maskBottomRight.y) / accel_state->texH[1]); + VTX_OUT_MASK((float)(dstX + w), (float)dstY, + xFixedToFloat(srcTopRight.x) / accel_state->texW[0], xFixedToFloat(srcTopRight.y) / accel_state->texH[0], + xFixedToFloat(maskTopRight.x) / accel_state->texW[1], xFixedToFloat(maskTopRight.y) / accel_state->texH[1]); + } else { + +# ifdef IS_RADEON_DRIVER + if (info->ChipFamily >= CHIP_FAMILY_R200) +# endif /* IS_RADEON_DRIVER */ + VTX_OUT((float)dstX, (float)dstY, + xFixedToFloat(srcTopLeft.x) / accel_state->texW[0], xFixedToFloat(srcTopLeft.y) / accel_state->texH[0]); + VTX_OUT((float)dstX, (float)(dstY + h), + xFixedToFloat(srcBottomLeft.x) / accel_state->texW[0], xFixedToFloat(srcBottomLeft.y) / accel_state->texH[0]); + VTX_OUT((float)(dstX + w), (float)(dstY + h), + xFixedToFloat(srcBottomRight.x) / accel_state->texW[0], xFixedToFloat(srcBottomRight.y) / accel_state->texH[0]); + VTX_OUT((float)(dstX + w), (float)dstY, + xFixedToFloat(srcTopRight.x) / accel_state->texW[0], xFixedToFloat(srcTopRight.y) / accel_state->texH[0]); + } + + if (IS_R300_3D || IS_R500_3D) + /* flushing is pipelined, free/finish is not */ + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); + +#ifdef ACCEL_CP + ADVANCE_RING(); +#else + FINISH_ACCEL(); +#endif /* !ACCEL_CP */ + + LEAVE_DRAW(0); +} +#undef VTX_OUT +#undef VTX_OUT_MASK + +static void FUNC_NAME(RadeonComposite)(PixmapPtr pDst, + int srcX, int srcY, + int maskX, int maskY, + int dstX, int dstY, + int width, int height) +{ + VAR_PREAMBLE(pDst->drawable.pScreen); + THREEDSTATE_PREAMBLE(); + int tileSrcY, tileMaskY, tileDstY; + int remainingHeight; + + if (!accel_state->need_src_tile_x && !accel_state->need_src_tile_y) { + FUNC_NAME(RadeonCompositeTile)(pDst, + srcX, srcY, + maskX, maskY, + dstX, dstY, + width, height); + return; + } + + /* Tiling logic borrowed from exaFillRegionTiled */ + + modulus(srcY, accel_state->src_tile_height, tileSrcY); + tileMaskY = maskY; + tileDstY = dstY; + + remainingHeight = height; + while (remainingHeight > 0) { + int remainingWidth = width; + int tileSrcX, tileMaskX, tileDstX; + int h = accel_state->src_tile_height - tileSrcY; + + if (h > remainingHeight) + h = remainingHeight; + remainingHeight -= h; + + modulus(srcX, accel_state->src_tile_width, tileSrcX); + tileMaskX = maskX; + tileDstX = dstX; + + while (remainingWidth > 0) { + int w = accel_state->src_tile_width - tileSrcX; + if (w > remainingWidth) + w = remainingWidth; + remainingWidth -= w; + + FUNC_NAME(RadeonCompositeTile)(pDst, + tileSrcX, tileSrcY, + tileMaskX, tileMaskY, + tileDstX, tileDstY, + w, h); + + tileSrcX = 0; + tileMaskX += w; + tileDstX += w; + } + tileSrcY = 0; + tileMaskY += h; + tileDstY += h; + } +} + +static void FUNC_NAME(RadeonDoneComposite)(PixmapPtr pDst) +{ + VAR_PREAMBLE(pDst->drawable.pScreen); + ACCEL_PREAMBLE(); + + ENTER_DRAW(0); + + if (IS_R300_3D || IS_R500_3D) { + BEGIN_ACCEL(2); + OUT_ACCEL_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); + } else + BEGIN_ACCEL(1); + OUT_ACCEL_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); + FINISH_ACCEL(); + +#if defined(ACCEL_CP) && !defined(IS_RADEON_DRIVER) && !defined(IS_QUICK_AND_DIRTY) + ADVANCE_RING(); +#endif + + LEAVE_DRAW(0); +} + +#if !defined(IS_RADEON_DRIVER) && !defined(IS_QUICK_AND_DIRTY) +void +R5xxExaCompositeFuncs(int scrnIndex, struct _ExaDriver *Exa) +{ + + xf86DrvMsg(scrnIndex, X_INFO, "Attaching EXA Composite hooks for R5xx.\n"); + + Exa->CheckComposite = R300CheckComposite; + Exa->PrepareComposite = FUNC_NAME(R300PrepareComposite); + Exa->Composite = FUNC_NAME(RadeonComposite); + Exa->DoneComposite = FUNC_NAME(RadeonDoneComposite); +} +#endif /* IS_RADEON_DRIVER */ + +#undef ONLY_ONCE +#undef FUNC_NAME diff --git a/driver/xf86-video-radeonhd/src/radeon_textured_videofuncs.c b/driver/xf86-video-radeonhd/src/radeon_textured_videofuncs.c new file mode 100644 index 000000000..b51e14573 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/radeon_textured_videofuncs.c @@ -0,0 +1,810 @@ +/* + * Copyright 2008 Alex Deucher + * + * 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 (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 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. + * + * + * Based on radeon_exa_render.c and kdrive ati_video.c by Eric Anholt, et al. + * + */ +#if defined(IS_RADEON_DRIVER) || defined(IS_QUICK_AND_DIRTY) +#if defined(ACCEL_MMIO) && defined(ACCEL_CP) +#error Cannot define both MMIO and CP acceleration! +#endif + +#if !defined(UNIXCPP) || defined(ANSICPP) +#define FUNC_NAME_CAT(prefix,suffix) prefix##suffix +#else +#define FUNC_NAME_CAT(prefix,suffix) prefix/**/suffix +#endif + +#ifdef ACCEL_MMIO +#define FUNC_NAME(prefix) FUNC_NAME_CAT(prefix,MMIO) +#else +#ifdef ACCEL_CP +#define FUNC_NAME(prefix) FUNC_NAME_CAT(prefix,CP) +#else +#error No accel type defined! +#endif +#endif + +#define VTX_DWORD_COUNT 4 + +#ifdef ACCEL_CP + +#define VTX_OUT(_dstX, _dstY, _srcX, _srcY) \ +do { \ + OUT_VIDEO_RING_F(_dstX); \ + OUT_VIDEO_RING_F(_dstY); \ + OUT_VIDEO_RING_F(_srcX); \ + OUT_VIDEO_RING_F(_srcY); \ +} while (0) + +#else /* ACCEL_CP */ + +#define VTX_OUT(_dstX, _dstY, _srcX, _srcY) \ +do { \ + OUT_VIDEO_REG_F(RADEON_SE_PORT_DATA0, _dstX); \ + OUT_VIDEO_REG_F(RADEON_SE_PORT_DATA0, _dstY); \ + OUT_VIDEO_REG_F(RADEON_SE_PORT_DATA0, _srcX); \ + OUT_VIDEO_REG_F(RADEON_SE_PORT_DATA0, _srcY); \ +} while (0) + +# define VAR_PSCRN_PREAMBLE(pScrn) RHDPtr info = RHDPTR(pScrn) +# define THREEDSTATE_PREAMBLE() struct rhdAccel *accel_state = info->accel_state + +# define BUFFER_PITCH pPriv->src_pitch +# define FB_BUFFER_OFFSET pPriv->src_offset +# define FB_PIXMAP_OFFSET(x) (((char *)(x) - (char *)rhdPtr->FbBase) + rhdPtr->FbIntAddress) + +# ifdef USE_EXA +# define EXA_ENABLED (info->AccelMethod == RHD_ACCEL_EXA) +# define EXA_FB_OFFSET (info->FbIntAddress + info->FbScanoutStart) +# endif + +# define HAS_TCL IS_R500_3D + +#endif /* !ACCEL_CP */ + +#else /* IS_RADEON_DRIVER */ + +# ifdef HAVE_CONFIG_H +# include "config.h" +# endif + +# include "xf86.h" +# include "fourcc.h" +# include "picturestr.h" + +# include "rhd.h" +# include "rhd_cs.h" + +# include "r5xx_regs.h" +# include "r5xx_accel.h" +# include "r5xx_3dregs.h" +# include "rhd_video.h" + +# ifdef USE_EXA +# include "exa.h" +# endif + +# ifdef DAMAGE +# include "damage.h" +# endif + +# define uint32_t CARD32 + +/* + * Map the macros. + */ +# define VIDEO_PREAMBLE() struct RhdCS *CS = rhdPtr->CS + +# define BEGIN_VIDEO(Count) RHDCSGrab(CS, 2 * (Count)) +# define OUT_VIDEO_REG(Reg, Value) RHDCSRegWrite(CS, (Reg), (Value)) +# define FINISH_VIDEO() + +# define BEGIN_RING(Count) RHDCSGrab(CS, (Count)) +# define OUT_RING(Value) RHDCSWrite(CS, (Value)) +# define ADVANCE_RING() RHDCSAdvance(CS) + +# define OUT_VIDEO_RING_F(x) OUT_RING(F_TO_DW(x)) + +#define VTX_DWORD_COUNT 4 + +#define VTX_OUT(_dstX, _dstY, _srcX, _srcY) \ +do { \ + OUT_VIDEO_RING_F(_dstX); \ + OUT_VIDEO_RING_F(_dstY); \ + OUT_VIDEO_RING_F(_srcX); \ + OUT_VIDEO_RING_F(_srcY); \ +} while (0) + +# define IS_R300_3D \ + ((rhdPtr->ChipSet == RHD_RS690) || \ + (rhdPtr->ChipSet == RHD_RS600) || \ + (rhdPtr->ChipSet == RHD_RS740)) + +# define IS_R500_3D (!(IS_R300_3D)) + +# define HAS_TCL IS_R500_3D + +# define ONLY_ONCE 1 /* we're always only once in the radeonhd driver */ +# define ACCEL_CP 1 + +# if !defined(UNIXCPP) || defined(ANSICPP) +# define FUNC_NAME_CAT(prefix,suffix) prefix##suffix +# else +# define FUNC_NAME_CAT(prefix,suffix) prefix/**/suffix +# endif + +# define FUNC_NAME(postfix) FUNC_NAME_CAT(RHD,postfix) + +/* + * + */ +static __inline__ uint32_t +F_TO_DW(float val) +{ + union { + float f; + uint32_t l; + } tmp; + tmp.f = val; + return tmp.l; +} + +/* + * + */ +static __inline__ Bool +RADEONTilingEnabled(ScrnInfoPtr pScrn, PixmapPtr pPix) +{ + return FALSE; /* for now */ +} + +# define xFixedToFloat(f) (((float) (f)) / 65536) + +# define VAR_PSCRN_PREAMBLE(pScrn) RHDPtr rhdPtr = RHDPTR(pScrn) +# define THREEDSTATE_PREAMBLE() struct R5xx3D *accel_state = (struct R5xx3D *)rhdPtr->ThreeDPrivate + +# define BUFFER_PITCH pPriv->BufferPitch +# define FB_BUFFER_OFFSET (pPriv->BufferOffset + rhdPtr->FbIntAddress) +# define FB_PIXMAP_OFFSET(x) (((char *)(x) - (char *)rhdPtr->FbBase) + rhdPtr->FbIntAddress) + +# ifdef USE_EXA +# define EXA_ENABLED (rhdPtr->AccelMethod == RHD_ACCEL_EXA) +# define EXA_FB_OFFSET (rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart) +# endif + +#define RADEONInit3DEngine(p) R5xx3DSetup((p)->scrnIndex) + +typedef struct RHDPortPriv *RADEONPortPrivPtr; + +#endif /* IS_RADEON_DRIVER */ + +#ifdef IS_RADEON_DRIVER +static +#endif +void +FUNC_NAME(RADEONDisplayTexturedVideo)(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv) +{ + VAR_PSCRN_PREAMBLE(pScrn); + THREEDSTATE_PREAMBLE(); + PixmapPtr pPixmap = pPriv->pPixmap; +#if 0 + uint32_t txformat; +#endif + uint32_t txfilter, txformat0, txformat1, txpitch; + uint32_t dst_offset, dst_pitch, dst_format; + uint32_t txenable, colorpitch; + uint32_t blendcntl; + int dstxoff, dstyoff, pixel_shift; + BoxPtr pBox = REGION_RECTS(&pPriv->clip); + int nBox = REGION_NUM_RECTS(&pPriv->clip); + VIDEO_PREAMBLE(); + + pixel_shift = pPixmap->drawable.bitsPerPixel >> 4; + +#ifdef USE_EXA + if (EXA_ENABLED) { + dst_offset = exaGetPixmapOffset(pPixmap) + EXA_FB_OFFSET; + dst_pitch = exaGetPixmapPitch(pPixmap); + } else +#endif + { + dst_offset = FB_PIXMAP_OFFSET(pPixmap->devPrivate.ptr); + dst_pitch = pPixmap->devKind; + } + +#ifdef COMPOSITE + dstxoff = -pPixmap->screen_x + pPixmap->drawable.x; + dstyoff = -pPixmap->screen_y + pPixmap->drawable.y; +#else + dstxoff = 0; + dstyoff = 0; +#endif + + if (!accel_state->XHas3DEngineState) + RADEONInit3DEngine(pScrn); + + /* we can probably improve this */ + BEGIN_VIDEO(2); +#ifdef IS_RADEON_DRIVER + if (IS_R300_3D || IS_R500_3D) +#endif + OUT_VIDEO_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); +#ifdef IS_RADEON_DRIVER + else + OUT_VIDEO_REG(RADEON_RB3D_DSTCACHE_CTLSTAT, RADEON_RB3D_DC_FLUSH); +#endif + /* We must wait for 3d to idle, in case source was just written as a dest. */ + OUT_VIDEO_REG(RADEON_WAIT_UNTIL, + RADEON_WAIT_HOST_IDLECLEAN | + RADEON_WAIT_2D_IDLECLEAN | + RADEON_WAIT_3D_IDLECLEAN | + RADEON_WAIT_DMA_GUI_IDLE); + FINISH_VIDEO(); + + if (IS_R300_3D || IS_R500_3D) { + uint32_t output_fmt; + + switch (pPixmap->drawable.bitsPerPixel) { + case 16: + if (pPixmap->drawable.depth == 15) + dst_format = R300_COLORFORMAT_ARGB1555; + else + dst_format = R300_COLORFORMAT_RGB565; + break; + case 32: + dst_format = R300_COLORFORMAT_ARGB8888; + break; + default: + return; + } + + output_fmt = (R300_OUT_FMT_C4_8 | + R300_OUT_FMT_C0_SEL_BLUE | + R300_OUT_FMT_C1_SEL_GREEN | + R300_OUT_FMT_C2_SEL_RED | + R300_OUT_FMT_C3_SEL_ALPHA); + + colorpitch = dst_pitch >> pixel_shift; + colorpitch |= dst_format; + + if (RADEONTilingEnabled(pScrn, pPixmap)) + colorpitch |= R300_COLORTILE; + + if (pPriv->id == FOURCC_UYVY) + txformat1 = R300_TX_FORMAT_YVYU422; + else + txformat1 = R300_TX_FORMAT_VYUY422; + + txformat1 |= R300_TX_FORMAT_YUV_TO_RGB_CLAMP; + + txformat0 = ((((pPriv->w - 1) & 0x7ff) << R300_TXWIDTH_SHIFT) | + (((pPriv->h - 1) & 0x7ff) << R300_TXHEIGHT_SHIFT)); + + txformat0 |= R300_TXPITCH_EN; + + accel_state->texW[0] = pPriv->w; + accel_state->texH[0] = pPriv->h; + + txfilter = (R300_TX_CLAMP_S(R300_TX_CLAMP_CLAMP_LAST) | + R300_TX_CLAMP_T(R300_TX_CLAMP_CLAMP_LAST) | + R300_TX_MAG_FILTER_LINEAR | R300_TX_MIN_FILTER_LINEAR); + + /* pitch is in pixels */ + txpitch = BUFFER_PITCH / 2; + txpitch -= 1; + + if (IS_R500_3D && ((pPriv->w - 1) & 0x800)) + txpitch |= R500_TXWIDTH_11; + + if (IS_R500_3D && ((pPriv->h - 1) & 0x800)) + txpitch |= R500_TXHEIGHT_11; + + BEGIN_VIDEO(6); + OUT_VIDEO_REG(R300_TX_FILTER0_0, txfilter); + OUT_VIDEO_REG(R300_TX_FILTER1_0, 0); + OUT_VIDEO_REG(R300_TX_FORMAT0_0, txformat0); + OUT_VIDEO_REG(R300_TX_FORMAT1_0, txformat1); + OUT_VIDEO_REG(R300_TX_FORMAT2_0, txpitch); + OUT_VIDEO_REG(R300_TX_OFFSET_0, FB_BUFFER_OFFSET); + FINISH_VIDEO(); + + txenable = R300_TEX_0_ENABLE; + + /* setup the VAP */ + if (HAS_TCL) + BEGIN_VIDEO(6); + else + BEGIN_VIDEO(4); + + /* These registers define the number, type, and location of data submitted + * to the PVS unit of GA input (when PVS is disabled) + * DST_VEC_LOC is the slot in the PVS input vector memory when PVS/TCL is + * enabled. This memory provides the imputs to the vertex shader program + * and ordering is not important. When PVS/TCL is disabled, this field maps + * directly to the GA input memory and the order is signifigant. In + * PVS_BYPASS mode the order is as follows: + * Position + * Point Size + * Color 0-3 + * Textures 0-7 + * Fog + */ + OUT_VIDEO_REG(R300_VAP_PROG_STREAM_CNTL_0, + ((R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_0_SHIFT) | + (0 << R300_SKIP_DWORDS_0_SHIFT) | + (0 << R300_DST_VEC_LOC_0_SHIFT) | + R300_SIGNED_0 | + (R300_DATA_TYPE_FLOAT_2 << R300_DATA_TYPE_1_SHIFT) | + (0 << R300_SKIP_DWORDS_1_SHIFT) | + (6 << R300_DST_VEC_LOC_1_SHIFT) | + R300_LAST_VEC_1 | + R300_SIGNED_1)); + + /* load the vertex shader + * We pre-load vertex programs in RADEONInit3DEngine(): + * - exa no mask + * - exa mask + * - Xv + * Here we select the offset of the vertex program we want to use + */ + if (HAS_TCL) { + OUT_VIDEO_REG(R300_VAP_PVS_CODE_CNTL_0, + ((5 << R300_PVS_FIRST_INST_SHIFT) | + (6 << R300_PVS_XYZW_VALID_INST_SHIFT) | + (6 << R300_PVS_LAST_INST_SHIFT))); + OUT_VIDEO_REG(R300_VAP_PVS_CODE_CNTL_1, + (6 << R300_PVS_LAST_VTX_SRC_INST_SHIFT)); + } + + /* Position and one set of 2 texture coordinates */ + OUT_VIDEO_REG(R300_VAP_OUT_VTX_FMT_0, R300_VTX_POS_PRESENT); + OUT_VIDEO_REG(R300_VAP_OUT_VTX_FMT_1, (2 << R300_TEX_0_COMP_CNT_SHIFT)); + OUT_VIDEO_REG(R300_US_OUT_FMT_0, output_fmt); + FINISH_VIDEO(); + + /* setup pixel shader */ + if (IS_R300_3D) { + BEGIN_VIDEO(8); + /* 2 components: 2 for tex0 */ + OUT_VIDEO_REG(R300_RS_COUNT, + ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_VIDEO_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); + + OUT_VIDEO_REG(R300_US_CODE_OFFSET, + (R300_ALU_CODE_OFFSET(0) | + R300_ALU_CODE_SIZE(1) | + R300_TEX_CODE_OFFSET(0) | + R300_TEX_CODE_SIZE(1))); + + OUT_VIDEO_REG(R300_US_CODE_ADDR_3, + (R300_ALU_START(0) | + R300_ALU_SIZE(0) | + R300_TEX_START(0) | + R300_TEX_SIZE(0) | + R300_RGBA_OUT)); + + /* tex inst is preloaded in RADEONInit3DEngine() */ + + /* ALU inst */ + /* RGB */ + OUT_VIDEO_REG(R300_US_ALU_RGB_ADDR_0, + (R300_ALU_RGB_ADDR0(0) | + R300_ALU_RGB_ADDR1(0) | + R300_ALU_RGB_ADDR2(0) | + R300_ALU_RGB_ADDRD(0) | + R300_ALU_RGB_OMASK((R300_ALU_RGB_MASK_R | + R300_ALU_RGB_MASK_G | + R300_ALU_RGB_MASK_B)) | + R300_ALU_RGB_TARGET_A)); + OUT_VIDEO_REG(R300_US_ALU_RGB_INST_0, + (R300_ALU_RGB_SEL_A(R300_ALU_RGB_SRC0_RGB) | + R300_ALU_RGB_MOD_A(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_B(R300_ALU_RGB_1_0) | + R300_ALU_RGB_MOD_B(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_SEL_C(R300_ALU_RGB_0_0) | + R300_ALU_RGB_MOD_C(R300_ALU_RGB_MOD_NOP) | + R300_ALU_RGB_OP(R300_ALU_RGB_OP_MAD) | + R300_ALU_RGB_OMOD(R300_ALU_RGB_OMOD_NONE) | + R300_ALU_RGB_CLAMP)); + /* Alpha */ + OUT_VIDEO_REG(R300_US_ALU_ALPHA_ADDR_0, + (R300_ALU_ALPHA_ADDR0(0) | + R300_ALU_ALPHA_ADDR1(0) | + R300_ALU_ALPHA_ADDR2(0) | + R300_ALU_ALPHA_ADDRD(0) | + R300_ALU_ALPHA_OMASK(R300_ALU_ALPHA_MASK_A) | + R300_ALU_ALPHA_TARGET_A | + R300_ALU_ALPHA_OMASK_W(R300_ALU_ALPHA_MASK_NONE))); + OUT_VIDEO_REG(R300_US_ALU_ALPHA_INST_0, + (R300_ALU_ALPHA_SEL_A(R300_ALU_ALPHA_SRC0_A) | + R300_ALU_ALPHA_MOD_A(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_B(R300_ALU_ALPHA_1_0) | + R300_ALU_ALPHA_MOD_B(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_SEL_C(R300_ALU_ALPHA_0_0) | + R300_ALU_ALPHA_MOD_C(R300_ALU_ALPHA_MOD_NOP) | + R300_ALU_ALPHA_OP(R300_ALU_ALPHA_OP_MAD) | + R300_ALU_ALPHA_OMOD(R300_ALU_ALPHA_OMOD_NONE) | + R300_ALU_ALPHA_CLAMP)); + FINISH_VIDEO(); + } else { + BEGIN_VIDEO(18); + /* 2 components: 2 for tex0 */ + OUT_VIDEO_REG(R300_RS_COUNT, + ((2 << R300_RS_COUNT_IT_COUNT_SHIFT) | + R300_RS_COUNT_HIRES_EN)); + + /* R300_INST_COUNT_RS - highest RS instruction used */ + OUT_VIDEO_REG(R300_RS_INST_COUNT, R300_INST_COUNT_RS(0)); + + OUT_VIDEO_REG(R500_US_CODE_ADDR, (R500_US_CODE_START_ADDR(0) | + R500_US_CODE_END_ADDR(1))); + OUT_VIDEO_REG(R500_US_CODE_RANGE, (R500_US_CODE_RANGE_ADDR(0) | + R500_US_CODE_RANGE_SIZE(1))); + OUT_VIDEO_REG(R500_US_CODE_OFFSET, 0); + OUT_VIDEO_REG(R500_GA_US_VECTOR_INDEX, 0); + + /* tex inst */ + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_TEX | + R500_INST_TEX_SEM_WAIT | + R500_INST_RGB_WMASK_R | + R500_INST_RGB_WMASK_G | + R500_INST_RGB_WMASK_B | + R500_INST_ALPHA_WMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_ID(0) | + R500_TEX_INST_LD | + R500_TEX_SEM_ACQUIRE | + R500_TEX_IGNORE_UNCOVERED)); + + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_TEX_SRC_ADDR(0) | + R500_TEX_SRC_S_SWIZ_R | + R500_TEX_SRC_T_SWIZ_G | + R500_TEX_DST_ADDR(0) | + R500_TEX_DST_R_SWIZ_R | + R500_TEX_DST_G_SWIZ_G | + R500_TEX_DST_B_SWIZ_B | + R500_TEX_DST_A_SWIZ_A)); + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_DX_ADDR(0) | + R500_DX_S_SWIZ_R | + R500_DX_T_SWIZ_R | + R500_DX_R_SWIZ_R | + R500_DX_Q_SWIZ_R | + R500_DY_ADDR(0) | + R500_DY_S_SWIZ_R | + R500_DY_T_SWIZ_R | + R500_DY_R_SWIZ_R | + R500_DY_Q_SWIZ_R)); + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, 0x00000000); + + /* ALU inst */ + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_INST_TYPE_OUT | + R500_INST_TEX_SEM_WAIT | + R500_INST_LAST | + R500_INST_RGB_OMASK_R | + R500_INST_RGB_OMASK_G | + R500_INST_RGB_OMASK_B | + R500_INST_ALPHA_OMASK | + R500_INST_RGB_CLAMP | + R500_INST_ALPHA_CLAMP)); + + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_RGB_ADDR0(0) | + R500_RGB_ADDR1(0) | + R500_RGB_ADDR1_CONST | + R500_RGB_ADDR2(0) | + R500_RGB_ADDR2_CONST)); + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_ADDR0(0) | + R500_ALPHA_ADDR1(0) | + R500_ALPHA_ADDR1_CONST | + R500_ALPHA_ADDR2(0) | + R500_ALPHA_ADDR2_CONST)); + + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGB_SEL_A_SRC0 | + R500_ALU_RGB_R_SWIZ_A_R | + R500_ALU_RGB_G_SWIZ_A_G | + R500_ALU_RGB_B_SWIZ_A_B | + R500_ALU_RGB_SEL_B_SRC0 | + R500_ALU_RGB_R_SWIZ_B_1 | + R500_ALU_RGB_B_SWIZ_B_1 | + R500_ALU_RGB_G_SWIZ_B_1)); + + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_ALPHA_OP_MAD | + R500_ALPHA_SWIZ_A_A | + R500_ALPHA_SWIZ_B_1)); + + OUT_VIDEO_REG(R500_GA_US_VECTOR_DATA, (R500_ALU_RGBA_OP_MAD | + R500_ALU_RGBA_R_SWIZ_0 | + R500_ALU_RGBA_G_SWIZ_0 | + R500_ALU_RGBA_B_SWIZ_0 | + R500_ALU_RGBA_A_SWIZ_0)); + FINISH_VIDEO(); + } + + BEGIN_VIDEO(5); + OUT_VIDEO_REG(R300_TX_INVALTAGS, 0); + OUT_VIDEO_REG(R300_TX_ENABLE, txenable); + + OUT_VIDEO_REG(R300_RB3D_COLOROFFSET0, dst_offset); + OUT_VIDEO_REG(R300_RB3D_COLORPITCH0, colorpitch); + + blendcntl = RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO; + /* no need to enable blending */ + OUT_VIDEO_REG(R300_RB3D_BLENDCNTL, blendcntl); + FINISH_VIDEO(); + + BEGIN_VIDEO(1); + OUT_VIDEO_REG(R300_VAP_VTX_SIZE, VTX_DWORD_COUNT); + FINISH_VIDEO(); + + } else { +#ifdef IS_RADEON_DRIVER + /* Same for R100/R200 */ + switch (pPixmap->drawable.bitsPerPixel) { + case 16: + if (pPixmap->drawable.depth == 15) + dst_format = RADEON_COLOR_FORMAT_ARGB1555; + else + dst_format = RADEON_COLOR_FORMAT_RGB565; + break; + case 32: + dst_format = RADEON_COLOR_FORMAT_ARGB8888; + break; + default: + return; + } + + if (pPriv->id == FOURCC_UYVY) + txformat = RADEON_TXFORMAT_YVYU422; + else + txformat = RADEON_TXFORMAT_VYUY422; + + txformat |= RADEON_TXFORMAT_NON_POWER2; + + colorpitch = dst_pitch >> pixel_shift; + + if (RADEONTilingEnabled(pScrn, pPixmap)) + colorpitch |= RADEON_COLOR_TILE_ENABLE; + + BEGIN_VIDEO(5); + + OUT_VIDEO_REG(RADEON_PP_CNTL, + RADEON_TEX_0_ENABLE | RADEON_TEX_BLEND_0_ENABLE); + OUT_VIDEO_REG(RADEON_RB3D_CNTL, + dst_format | RADEON_ALPHA_BLEND_ENABLE); + OUT_VIDEO_REG(RADEON_RB3D_COLOROFFSET, dst_offset); + + OUT_VIDEO_REG(RADEON_RB3D_COLORPITCH, colorpitch); + + OUT_VIDEO_REG(RADEON_RB3D_BLENDCNTL, + RADEON_SRC_BLEND_GL_ONE | RADEON_DST_BLEND_GL_ZERO); + + FINISH_VIDEO(); + + + if ((info->ChipFamily == CHIP_FAMILY_RV250) || + (info->ChipFamily == CHIP_FAMILY_RV280) || + (info->ChipFamily == CHIP_FAMILY_RS300) || + (info->ChipFamily == CHIP_FAMILY_R200)) { + + accel_state->texW[0] = pPriv->w; + accel_state->texH[0] = pPriv->h; + + BEGIN_VIDEO(12); + + OUT_VIDEO_REG(R200_SE_VTX_FMT_0, R200_VTX_XY); + OUT_VIDEO_REG(R200_SE_VTX_FMT_1, + (2 << R200_VTX_TEX0_COMP_CNT_SHIFT)); + + OUT_VIDEO_REG(R200_PP_TXFILTER_0, + R200_MAG_FILTER_LINEAR | + R200_MIN_FILTER_LINEAR | + R200_YUV_TO_RGB); + OUT_VIDEO_REG(R200_PP_TXFORMAT_0, txformat); + OUT_VIDEO_REG(R200_PP_TXFORMAT_X_0, 0); + OUT_VIDEO_REG(R200_PP_TXSIZE_0, + (pPriv->w - 1) | + ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_VIDEO_REG(R200_PP_TXPITCH_0, pPriv->src_pitch - 32); + + OUT_VIDEO_REG(R200_PP_TXOFFSET_0, pPriv->src_offset); + + OUT_VIDEO_REG(R200_PP_TXCBLEND_0, + R200_TXC_ARG_A_ZERO | + R200_TXC_ARG_B_ZERO | + R200_TXC_ARG_C_R0_COLOR | + R200_TXC_OP_MADD); + OUT_VIDEO_REG(R200_PP_TXCBLEND2_0, + R200_TXC_CLAMP_0_1 | R200_TXC_OUTPUT_REG_R0); + OUT_VIDEO_REG(R200_PP_TXABLEND_0, + R200_TXA_ARG_A_ZERO | + R200_TXA_ARG_B_ZERO | + R200_TXA_ARG_C_R0_ALPHA | + R200_TXA_OP_MADD); + OUT_VIDEO_REG(R200_PP_TXABLEND2_0, + R200_TXA_CLAMP_0_1 | R200_TXA_OUTPUT_REG_R0); + FINISH_VIDEO(); + } else { + + accel_state->texW[0] = 1; + accel_state->texH[0] = 1; + + BEGIN_VIDEO(8); + + OUT_VIDEO_REG(RADEON_SE_VTX_FMT, RADEON_SE_VTX_FMT_XY | + RADEON_SE_VTX_FMT_ST0); + + OUT_VIDEO_REG(RADEON_PP_TXFILTER_0, RADEON_MAG_FILTER_LINEAR | + RADEON_MIN_FILTER_LINEAR | + RADEON_YUV_TO_RGB); + OUT_VIDEO_REG(RADEON_PP_TXFORMAT_0, txformat); + OUT_VIDEO_REG(RADEON_PP_TXOFFSET_0, pPriv->src_offset); + OUT_VIDEO_REG(RADEON_PP_TXCBLEND_0, + RADEON_COLOR_ARG_A_ZERO | + RADEON_COLOR_ARG_B_ZERO | + RADEON_COLOR_ARG_C_T0_COLOR | + RADEON_BLEND_CTL_ADD | + RADEON_CLAMP_TX); + OUT_VIDEO_REG(RADEON_PP_TXABLEND_0, + RADEON_ALPHA_ARG_A_ZERO | + RADEON_ALPHA_ARG_B_ZERO | + RADEON_ALPHA_ARG_C_T0_ALPHA | + RADEON_BLEND_CTL_ADD | + RADEON_CLAMP_TX); + + OUT_VIDEO_REG(RADEON_PP_TEX_SIZE_0, + (pPriv->w - 1) | + ((pPriv->h - 1) << RADEON_TEX_VSIZE_SHIFT)); + OUT_VIDEO_REG(RADEON_PP_TEX_PITCH_0, + pPriv->src_pitch - 32); + FINISH_VIDEO(); + } +#endif /* IS_RADEON_DRIVER */ + } + + while (nBox--) { + int srcX, srcY, srcw, srch; + int dstX, dstY, dstw, dsth; + xPointFixed srcTopLeft, srcTopRight, srcBottomLeft, srcBottomRight; + + dstX = pBox->x1 + dstxoff; + dstY = pBox->y1 + dstyoff; + dstw = pBox->x2 - pBox->x1; + dsth = pBox->y2 - pBox->y1; + + srcX = ((pBox->x1 - pPriv->drw_x) * pPriv->src_w) / pPriv->dst_w; + srcY = ((pBox->y1 - pPriv->drw_y) * pPriv->src_h) / pPriv->dst_h; + + srcw = (pPriv->src_w * dstw) / pPriv->dst_w; + srch = (pPriv->src_h * dsth) / pPriv->dst_h; + + srcTopLeft.x = IntToxFixed(srcX); + srcTopLeft.y = IntToxFixed(srcY); + srcTopRight.x = IntToxFixed(srcX + srcw); + srcTopRight.y = IntToxFixed(srcY); + srcBottomLeft.x = IntToxFixed(srcX); + srcBottomLeft.y = IntToxFixed(srcY + srch); + srcBottomRight.x = IntToxFixed(srcX + srcw); + srcBottomRight.y = IntToxFixed(srcY + srch); + + +#if 0 + ErrorF("dst: %d, %d, %d, %d\n", dstX, dstY, dstw, dsth); + ErrorF("src: %d, %d, %d, %d\n", srcX, srcY, srcw, srch); +#endif + +#ifdef ACCEL_CP +# ifdef IS_RADEON_DRIVER + if (info->ChipFamily < CHIP_FAMILY_R200) { + BEGIN_RING(3 * VTX_DWORD_COUNT + 3); + OUT_RING(CP_PACKET3(RADEON_CP_PACKET3_3D_DRAW_IMMD, + 3 * VTX_DWORD_COUNT + 1)); + OUT_RING(RADEON_CP_VC_FRMT_XY | + RADEON_CP_VC_FRMT_ST0); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_RECT_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + RADEON_CP_VC_CNTL_MAOS_ENABLE | + RADEON_CP_VC_CNTL_VTX_FMT_RADEON_MODE | + (3 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } else +# endif /* IS_RADEON_DRIVER */ + { + if (IS_R300_3D || IS_R500_3D) + BEGIN_RING(4 * VTX_DWORD_COUNT + 4); + else + BEGIN_RING(4 * VTX_DWORD_COUNT + 2); + OUT_RING(CP_PACKET3(R200_CP_PACKET3_3D_DRAW_IMMD_2, + 4 * VTX_DWORD_COUNT)); + OUT_RING(RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST | + RADEON_CP_VC_CNTL_PRIM_WALK_RING | + (4 << RADEON_CP_VC_CNTL_NUM_SHIFT)); + } +#else /* ACCEL_CP */ + if (IS_R300_3D || IS_R500_3D) + BEGIN_VIDEO(2 + VTX_DWORD_COUNT * 4); +# ifdef IS_RADEON_DRIVER + else if (info->ChipFamily < CHIP_FAMILY_R200) + BEGIN_VIDEO(1 + VTX_DWORD_COUNT * 3); +# endif /* IS_RADEON_DRIVER */ + else + BEGIN_VIDEO(1 + VTX_DWORD_COUNT * 4); + +# ifdef IS_RADEON_DRIVER + if (info->ChipFamily < CHIP_FAMILY_R200) { + OUT_VIDEO_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_RECTANGLE_LIST | + RADEON_VF_PRIM_WALK_DATA | + RADEON_VF_RADEON_MODE | + (3 << RADEON_VF_NUM_VERTICES_SHIFT))); + } else +# endif /* IS_RADEON_DRIVER */ + { + OUT_VIDEO_REG(RADEON_SE_VF_CNTL, (RADEON_VF_PRIM_TYPE_QUAD_LIST | + RADEON_VF_PRIM_WALK_DATA | + (4 << RADEON_VF_NUM_VERTICES_SHIFT))); + } +#endif + +# ifdef IS_RADEON_DRIVER + if (info->ChipFamily >= CHIP_FAMILY_R200) +# endif /* IS_RADEON_DRIVER */ + VTX_OUT((float)dstX, (float)dstY, + xFixedToFloat(srcTopLeft.x) / accel_state->texW[0], xFixedToFloat(srcTopLeft.y) / accel_state->texH[0]); + VTX_OUT((float)dstX, (float)(dstY + dsth), + xFixedToFloat(srcBottomLeft.x) / accel_state->texW[0], xFixedToFloat(srcBottomLeft.y) / accel_state->texH[0]); + VTX_OUT((float)(dstX + dstw), (float)(dstY + dsth), + xFixedToFloat(srcBottomRight.x) / accel_state->texW[0], xFixedToFloat(srcBottomRight.y) / accel_state->texH[0]); + VTX_OUT((float)(dstX + dstw), (float)dstY, + xFixedToFloat(srcTopRight.x) / accel_state->texW[0], xFixedToFloat(srcTopRight.y) / accel_state->texH[0]); + + if (IS_R300_3D || IS_R500_3D) + /* flushing is pipelined, free/finish is not */ + OUT_VIDEO_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_DC_FLUSH_3D); + +#ifdef ACCEL_CP + ADVANCE_RING(); +#else + FINISH_VIDEO(); +#endif /* !ACCEL_CP */ + + pBox++; + } + + if (IS_R300_3D || IS_R500_3D) { + BEGIN_VIDEO(2); + OUT_VIDEO_REG(R300_RB3D_DSTCACHE_CTLSTAT, R300_RB3D_DC_FLUSH_ALL); + } else + BEGIN_VIDEO(1); + OUT_VIDEO_REG(RADEON_WAIT_UNTIL, RADEON_WAIT_3D_IDLECLEAN); + FINISH_VIDEO(); + +#ifdef DAMAGE + DamageDamageRegion(pPriv->pDraw, &pPriv->clip); +#endif +} + +#undef VTX_OUT +#undef FUNC_NAME diff --git a/driver/xf86-video-radeonhd/src/rhd.h b/driver/xf86-video-radeonhd/src/rhd.h new file mode 100644 index 000000000..efa6bc26e --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd.h @@ -0,0 +1,488 @@ +/* + * Copyright 2007 - 2009 Luc Verhaegen + * Copyright 2007 - 2009 Matthias Hopf + * Copyright 2007 - 2009 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_H +# define _RHD_H + +# if defined HAVE_CONFIG_H && !defined _CONFIG_H +# error "config.h missing!" +# endif + +#include + +#define RHD_MAJOR_VERSION (PACKAGE_VERSION_MAJOR) +#define RHD_MINOR_VERSION (PACKAGE_VERSION_MINOR) +#define RHD_PATCHLEVEL (PACKAGE_VERSION_PATCHLEVEL) + +/* It does not seem to matter how exactly we construct this int for + + * DriverRec.driverVersion. So... choose 20/10/0 bitshift. */ +#define RHD_VERSION \ + ((RHD_MAJOR_VERSION<<20) | \ + (RHD_MINOR_VERSION<<10) | \ + (RHD_PATCHLEVEL)) + +#define RHD_NAME "RADEONHD" +#define RHD_DRIVER_NAME "radeonhd" + +enum RHD_CHIPSETS { + RHD_UNKNOWN = 0, + /* R500 */ + RHD_RV505, + RHD_RV515, + RHD_RV516, + RHD_R520, + RHD_RV530, + RHD_RV535, + RHD_RV550, + RHD_RV560, + RHD_RV570, + RHD_R580, + /* R500 Mobility */ + RHD_M52, + RHD_M54, + RHD_M56, + RHD_M58, + RHD_M62, + RHD_M64, + RHD_M66, + RHD_M68, + RHD_M71, + /* R500 integrated */ + RHD_RS600, + RHD_RS690, + RHD_RS740, + /* R600 */ + RHD_R600, + RHD_RV610, + RHD_RV630, + /* R600 Mobility */ + RHD_M72, + RHD_M74, + RHD_M76, + /* R600 second batch - RV670 came into existence after RV6x0 and M7x */ + RHD_RV670, + RHD_M88, + RHD_R680, + RHD_RV620, + RHD_M82, + RHD_RV635, + RHD_M86, + RHD_RS780, + RHD_RS880, + RHD_RV770, + /* R700 */ + RHD_R700, + RHD_M98, + RHD_RV730, + RHD_M96, + RHD_RV710, + RHD_M92, + RHD_M93, + RHD_M97, + RHD_RV790, + RHD_RV740, + RHD_CHIP_END +}; + +enum RHD_HPD_USAGE { + RHD_HPD_USAGE_AUTO = 0, + RHD_HPD_USAGE_OFF, + RHD_HPD_USAGE_NORMAL, + RHD_HPD_USAGE_SWAP, + RHD_HPD_USAGE_AUTO_SWAP, + RHD_HPD_USAGE_AUTO_OFF +}; + +enum RHD_TV_MODE { + RHD_TV_NONE = 0, + RHD_TV_NTSC = 1, + RHD_TV_NTSCJ = 1 << 2, + RHD_TV_PAL = 1 << 3, + RHD_TV_PALM = 1 << 4, + RHD_TV_PALCN = 1 << 5, + RHD_TV_PALN = 1 << 6, + RHD_TV_PAL60 = 1 << 7, + RHD_TV_SECAM = 1 << 8, + RHD_TV_CV = 1 << 9 +}; + +enum rhdPropertyAction { + rhdPropertyCheck, + rhdPropertyGet, + rhdPropertySet, + rhdPropertyCommit +}; + +union rhdPropertyData +{ + CARD32 integer; + char *string; + Bool Bool; +}; + +#define RHD_BACKLIGHT_PROPERTY_MAX 255 + +#define RHD_CONNECTORS_MAX 6 + +/* Just define where which PCI BAR lives for now. Will deal with different + * locations as soon as cards with a different BAR layout arrives. + */ +#define RHD_FB_BAR 0 +#define RHD_MMIO_BAR 2 + +/* More realistic powermanagement */ +#define RHD_POWER_ON 0 +#define RHD_POWER_RESET 1 /* off temporarily */ +#define RHD_POWER_SHUTDOWN 2 /* long term shutdown */ +#define RHD_POWER_UNKNOWN 3 /* initial state */ + +#define RHD_VBIOS_SIZE 0x10000 + +#ifndef XSERVER_LIBPCIACCESS +# define PCI_BUS(x) ((x)->bus) +# define PCI_DEV(x) ((x)->device) +# define PCI_FUNC(x) ((x)->func) +#else +# define PCI_BUS(x) (((x)->domain << 8) | (x)->bus) +# define PCI_DEV(x) ((x)->dev) +# define PCI_FUNC(x) ((x)->func) +typedef struct pci_device *pciVideoPtr; +#endif + +#ifndef NO_ASSERT +enum debugFlags { + VGA_SETUP, + MC_SETUP +}; +#endif + +enum rhdCardType { + RHD_CARD_NONE, + RHD_CARD_AGP, + RHD_CARD_PCIE +}; + +enum { + RHD_PCI_CAPID_AGP = 0x02, + RHD_PCI_CAPID_PCIE = 0x10 +}; + +typedef struct BIOSScratchOutputPrivate rhdOutputDriverPrivate; +typedef struct _rhdI2CRec *rhdI2CPtr; +typedef struct _atomBiosHandle *atomBiosHandlePtr; +typedef struct _rhdShadowRec *rhdShadowPtr; + +typedef struct RHDOpt { + Bool set; + union { + Bool bool; + int integer; + unsigned long uslong; + double real; + double freq; + char *string; + } val; +} RHDOpt, *RHDOptPtr; + +/* Some more intelligent handling of chosing which acceleration to use */ +enum AccelMethod { + RHD_ACCEL_NONE = 0, /* ultra slow, but might be desired for debugging. */ + RHD_ACCEL_FORCE_SHADOWFB = 1, /* shadowfb even with dri enabled. Known to have damage issues. */ + RHD_ACCEL_SHADOWFB = 2, /* cache in main ram. */ + RHD_ACCEL_XAA = 3, /* "old" X acceleration architecture. */ + RHD_ACCEL_EXA = 4, /* not done yet. */ + RHD_ACCEL_DEFAULT = 5 /* keep as highest. */ +}; + +typedef struct RHDRec { + int scrnIndex; + + enum RHD_CHIPSETS ChipSet; +#ifdef XSERVER_LIBPCIACCESS + struct pci_device *PciInfo; + struct pci_device *NBPciInfo; +#else + pciVideoRec *PciInfo; + PCITAG PciTag; + PCITAG NBPciTag; +#endif + unsigned int PciDeviceID; + enum rhdCardType cardType; + int entityIndex; + EntityInfoPtr pEnt; + struct rhdCard *Card; + OptionInfoPtr Options; + enum AccelMethod AccelMethod; + RHDOpt swCursor; + RHDOpt shadowFB; + RHDOpt forceReduced; + RHDOpt forceDPI; + RHDOpt noRandr; + RHDOpt rrUseXF86Edid; + RHDOpt rrOutputOrder; + RHDOpt useDRI; + RHDOpt tvModeName; + RHDOpt scaleTypeOpt; + RHDOpt unverifiedFeatures; + RHDOpt audio; + RHDOpt audioWorkaround; + RHDOpt hdmi; + RHDOpt coherent; + RHDOpt lowPowerMode; + RHDOpt lowPowerModeEngineClock; + RHDOpt lowPowerModeMemoryClock; + enum RHD_HPD_USAGE hpdUsage; + unsigned int FbMapSize; + pointer FbBase; /* map base of fb */ + unsigned int FbPhysAddress; /* card PCI BAR address of FB */ + unsigned int FbIntAddress; /* card internal address of FB */ + CARD32 FbIntSize; /* card internal FB aperture size */ + unsigned int FbPCIAddress; /* physical address of FB */ + + Bool directRenderingEnabled; + + /* Some simplistic memory handling */ +#define ALIGN(x,align) (((x)+(align)-1)&~((align)-1)) +#define RHD_FB_ALIGNMENT 0x1000 + /* Use this macro to always chew up 4096byte aligned pieces. */ +#define RHD_FB_CHUNK(x) ALIGN((x), RHD_FB_ALIGNMENT) + unsigned int FbFreeStart; + unsigned int FbFreeSize; + + /* visible part of the framebuffer */ + unsigned int FbScanoutStart; + unsigned int FbScanoutSize; + + /* for 2d acceleration: pixmapcache and such */ + RHDOpt OffscreenOption; + unsigned int FbOffscreenStart; + unsigned int FbOffscreenSize; + + unsigned int MMIOMapSize; + pointer MMIOBase; /* map base of mmio */ + unsigned int MMIOPCIAddress; /* physical address of mmio */ + + struct _xf86CursorInfoRec *CursorInfo; + struct rhd_Cursor_Bits *CursorBits; /* ARGB if NULL */ + CARD32 CursorColor0, CursorColor1; + CARD32 *CursorImage; + + CloseScreenProcPtr CloseScreen; + + struct _I2CBusRec **I2C; /* I2C bus list */ + atomBiosHandlePtr atomBIOS; /* handle for AtomBIOS */ + /* + * BIOS copy - kludge that should go away + * once we know how to read PCI BIOS on + * POSTed hardware + */ + unsigned char* BIOSCopy; + + struct rhdMC *MC; /* Memory Controller */ + struct rhdVGA *VGA; /* VGA compatibility HW */ + struct rhdCrtc *Crtc[2]; + struct rhdPLL *PLLs[2]; /* Pixelclock PLLs */ + struct rhdAudio *Audio; + + struct rhdLUTStore *LUTStore; + struct rhdLUT *LUT[2]; + + /* List of output devices: + * we can go up to 5: DACA, DACB, TMDS, shared LVDS/TMDS, DVO. + * Will also include displayport when this happens. */ + struct rhdOutput *Outputs; + + struct rhdConnector *Connector[RHD_CONNECTORS_MAX]; + struct rhdHPD *HPD; /* Hot plug detect subsystem */ + + /* don't ignore the Monitor section of the conf file */ + struct rhdMonitor *ConfigMonitor; + enum RHD_TV_MODE tvMode; + rhdShadowPtr shadowPtr; + + struct RhdCS *CS; + + struct _XAAInfoRec *XAAInfo; +#ifdef USE_EXA + struct _ExaDriver *EXAInfo; +#endif + void *TwoDPrivate; + + /* For EXA Render and Textured Video */ + void *ThreeDPrivate; + + /* RandR compatibility layer */ + struct rhdRandr *randr; + /* log verbosity - store this for convenience */ + int verbosity; + + /* DRI */ + struct rhdDri *dri; + + /* BIOS Scratch registers */ + struct rhdBiosScratchRegisters *BIOSScratch; + + /* AtomBIOS usage */ + RHDOpt UseAtomBIOS; + CARD32 UseAtomFlags; + + struct rhdPm *Pm; + + struct rhdOutput *DigEncoderOutput[2]; +# define RHD_CHECKDEBUGFLAG(rhdPtr, FLAG) (rhdPtr->DebugFlags & (1 << FLAG)) +#ifndef NO_ASSERT +# define RHD_SETDEBUGFLAG(rhdPtr, FLAG) (rhdPtr->DebugFlags |= (1 << FLAG)) +# define RHD_UNSETDEBUGFLAG(rhdPtr, FLAG) (rhdPtr->DebugFlags &= ~((CARD32)1 << FLAG)) + CARD32 DebugFlags; +#endif +} RHDRec, *RHDPtr; + +#define RHDPTR(p) ((RHDPtr)((p)->driverPrivate)) +#define RHDPTRI(p) (RHDPTR(xf86Screens[(p)->scrnIndex])) + +#if defined(__GNUC__) +# define NORETURN __attribute__((noreturn)) +# define CONST __attribute__((pure)) +#else +# define NORETURN +# define CONST +#endif + + +enum atomSubSystem { + atomUsageCrtc, + atomUsagePLL, + atomUsageOutput, + atomUsageAny +}; + +enum rhdOptStatus { + RHD_OPTION_NOT_SET, + RHD_OPTION_DEFAULT, + RHD_OPTION_OFF, + RHD_OPTION_ON +}; + +struct rhdPowerState { + /* All entries: 0 means unknown / unspecified / dontchange */ + /* Clocks in kHz, Voltage in mV */ + CARD32 EngineClock; + CARD32 MemoryClock; + CARD32 VDDCVoltage; +}; + +/* rhd_driver.c */ +/* Some handy functions that makes life so much more readable */ +extern unsigned int RHDReadPCIBios(RHDPtr rhdPtr, unsigned char **prt); +extern Bool RHDScalePolicy(struct rhdMonitor *Monitor, struct rhdConnector *Connector); +extern void RHDPrepareMode(RHDPtr rhdPtr); +extern Bool RHDUseAtom(RHDPtr rhdPtr, enum RHD_CHIPSETS *BlackList, enum atomSubSystem subsys); + +#define RHDRegRead(ptr, offset) MMIO_IN32(RHDPTRI(ptr)->MMIOBase, offset) +#define RHDRegWrite(ptr, offset, value) MMIO_OUT32(RHDPTRI(ptr)->MMIOBase, offset, value) +#define RHDRegMask(ptr, offset, value, mask) \ +do { \ + CARD32 tmp; \ + tmp = RHDRegRead((ptr), (offset)); \ + tmp &= ~(mask); \ + tmp |= ((value) & (mask)); \ + RHDRegWrite((ptr), (offset), tmp); \ +} while(0) + +extern CARD32 _RHDReadMC(int scrnIndex, CARD32 addr); +#define RHDReadMC(ptr,addr) _RHDReadMC((ptr)->scrnIndex,(addr)) +extern void _RHDWriteMC(int scrnIndex, CARD32 addr, CARD32 data); +#define RHDWriteMC(ptr,addr,value) _RHDWriteMC((ptr)->scrnIndex,(addr),(value)) +extern CARD32 _RHDReadPLL(int scrnIndex, CARD16 offset); +#define RHDReadPLL(ptr, off) _RHDReadPLL((ptr)->scrnIndex,(off)) +extern void _RHDWritePLL(int scrnIndex, CARD16 offset, CARD32 data); +#define RHDWritePLL(ptr, off, value) _RHDWritePLL((ptr)->scrnIndex,(off),(value)) +extern unsigned int RHDAllocFb(RHDPtr rhdPtr, unsigned int size, const char *name); + +/* rhd_id.c */ +Bool RHDIsIGP(enum RHD_CHIPSETS chipset); + +/* rhd_helper.c */ +void RhdGetOptValBool(const OptionInfoRec *table, int token, + RHDOptPtr optp, Bool def); +void RhdGetOptValInteger(const OptionInfoRec *table, int token, + RHDOptPtr optp, int def); +void RhdGetOptValULong(const OptionInfoRec *table, int token, + RHDOptPtr optp, unsigned long def); +void RhdGetOptValReal(const OptionInfoRec *table, int token, + RHDOptPtr optp, double def); +void RhdGetOptValFreq(const OptionInfoRec *table, int token, + OptFreqUnits expectedUnits, RHDOptPtr optp, double def); +void RhdGetOptValString(const OptionInfoRec *table, int token, + RHDOptPtr optp, char *def); +enum rhdOptStatus RhdParseBooleanOption(struct RHDOpt *Option, char *Name); +char *RhdAppendString(char *s1, const char *s2); +void RhdAssertFailed(const char *str, + const char *file, int line, const char *func) NORETURN; +void RhdAssertFailedFormat(const char *str, const char *file, int line, + const char *func, const char *format, ...) NORETURN; + +/* Extra debugging verbosity: decimates gdb usage */ + +/* __func__ is really nice, but not universal */ +#if !defined(__GNUC__) && !defined(C99) +#define __func__ "unknown" +#endif + +#ifndef NO_ASSERT +# define ASSERT(x) do { if (!(x)) RhdAssertFailed \ + (#x, __FILE__, __LINE__, __func__); } while(0) +# define ASSERTF(x,f...) do { if (!(x)) RhdAssertFailedFormat \ + (#x, __FILE__, __LINE__, __func__, ##f); } while(0) +#else +# define ASSERT(x) ((void)0) +# define ASSERTF(x,...) ((void)0) +#endif + +#define LOG_DEBUG 7 +void RHDDebug(int scrnIndex, const char *format, ...); +void RHDDebugCont(const char *format, ...); +void RHDDebugVerb(int scrnIndex, int verb, const char *format, ...); +void RHDDebugContVerb(int verb, const char *format, ...); +#define RHDFUNC(ptr) RHDDebug((ptr)->scrnIndex, "FUNCTION: %s\n", __func__) +#define RHDFUNCI(scrnIndex) RHDDebug(scrnIndex, "FUNCTION: %s\n", __func__) +void RhdDebugDump(int scrnIndex, unsigned char *start, int size); + +#ifdef RHD_DEBUG +CARD32 _RHDRegReadD(int scrnIndex, CARD16 offset); +# define RHDRegReadD(ptr, offset) _RHDRegReadD((ptr)->scrnIndex, (offset)) +void _RHDRegWriteD(int scrnIndex, CARD16 offset, CARD32 value); +# define RHDRegWriteD(ptr, offset, value) _RHDRegWriteD((ptr)->scrnIndex, (offset), (value)) +void _RHDRegMaskD(int scrnIndex, CARD16 offset, CARD32 value, CARD32 mask); +# define RHDRegMaskD(ptr, offset, value, mask) _RHDRegMaskD((ptr)->scrnIndex, (offset), (value), (mask)) +# define DEBUGP(x) {x;} +#else +# define RHDRegReadD(ptr, offset) RHDRegRead(ptr, offset) +# define RHDRegWriteD(ptr, offset, value) RHDRegWrite(ptr, offset, value) +# define RHDRegMaskD(ptr, offset, value, mask) RHDRegMask(ptr, offset, value, mask) +# define DEBUGP(x) +#endif + +#endif /* _RHD_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_acpi.c b/driver/xf86-video-radeonhd/src/rhd_acpi.c new file mode 100644 index 000000000..38319255c --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_acpi.c @@ -0,0 +1,150 @@ +/* + * Copyright 2009 Luc Verhaegen + * Copyright 2009 Matthias Hopf + * Copyright 2009 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +# include +# include +# include +# include +# include +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_acpi.h" + + +#define ACPI_PATH "/sys/class/backlight" + +/* + * + */ +static Bool +rhdDoBacklight(struct rhdOutput *Output, Bool do_write, int *val) +{ + DIR *dir = opendir(ACPI_PATH); + struct dirent *dirent; + char buf[10]; + RHDFUNC(Output); + + if (!dir) + return -1; + + while ((dirent = readdir(dir)) != NULL) { + char path[PATH_MAX]; + int fd_max; + + snprintf(path,PATH_MAX,"%s/%s/max_brightness",ACPI_PATH,dirent->d_name); + if ((fd_max = open(path, O_RDONLY)) > 0) { + int max_val; + + while ((read(fd_max,buf,9) == -1) + && (errno == EINTR || errno == EAGAIN)) {}; + close (fd_max); + + if (sscanf(buf,"%i\n",&max_val) == 1) { + int fd; + + snprintf(path,PATH_MAX,"%s/%s/%s",ACPI_PATH,dirent->d_name, + do_write ? "brightness" : "actual_brightness"); + if ((fd = open(path, do_write ? O_WRONLY : O_RDONLY)) > 0) { + + if (do_write) { + + snprintf(buf,10,"%i\n",(*val * max_val) / RHD_BACKLIGHT_PROPERTY_MAX); + while ((write(fd,buf,strlen(buf)) <= 0) + && (errno == EINTR || errno == EAGAIN)) {}; + + close (fd); + closedir (dir); + RHDDebug(Output->scrnIndex,"%s: Wrote value %i to %s\n", + __func__,*val,path); + + return TRUE; + } else { + memset(buf,0,10); + + while ((read(fd,buf,9) == -1) + && (errno == EINTR || errno == EAGAIN)) {}; + + if (sscanf(buf,"%i\n",val) == 1) { + *val = (*val * RHD_BACKLIGHT_PROPERTY_MAX) / max_val; + + close(fd); + closedir(dir); + RHDDebug(Output->scrnIndex,"%s: Read value %i from %s\n", + __func__,*val,path); + + return TRUE; + } + } + close (fd); + } + } + } + } + closedir(dir); + + return FALSE; +} + +/* + * RhdACPIGetBacklightControl(): return backlight value in range 0..255; + * -1 means no ACPI BL support. + */ +int +RhdACPIGetBacklightControl(struct rhdOutput *Output) +{ +#ifdef __linux__ + int ret; + RHDFUNC(Output); + if (rhdDoBacklight(Output, FALSE, &ret)) + return ret; +#endif + return -1; +} + +/* + * + */ +void +RhdACPISetBacklightControl(struct rhdOutput *Output, int val) +{ + RHDFUNC(Output); +#ifdef __linux__ + rhdDoBacklight(Output, TRUE, &val); +#endif +} diff --git a/driver/xf86-video-radeonhd/src/rhd_acpi.h b/driver/xf86-video-radeonhd/src/rhd_acpi.h new file mode 100644 index 000000000..d76af4136 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_acpi.h @@ -0,0 +1,31 @@ +/* + * Copyright 2009 Luc Verhaegen + * Copyright 2009 Matthias Hopf + * Copyright 2009 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef RHD_ACPI_H +# define RHD_ACPI_H + +int RhdACPIGetBacklightControl(struct rhdOutput *Output); +void RhdACPISetBacklightControl(struct rhdOutput *Output, int val); + +#endif diff --git a/driver/xf86-video-radeonhd/src/rhd_atombios.c b/driver/xf86-video-radeonhd/src/rhd_atombios.c new file mode 100644 index 000000000..26e32fcab --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atombios.c @@ -0,0 +1,5904 @@ +/* + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ +/* #define RHD_DEBUG */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86Pci.h" +/* only for testing now */ +#include "xf86DDC.h" +#include "edid.h" + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +#endif + +#include "rhd.h" +#include "rhd_atombios.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_biosscratch.h" +#include "rhd_monitor.h" +#include "rhd_card.h" +#include "rhd_regs.h" + +#ifdef ATOM_BIOS +# include "rhd_atomwrapper.h" +# include "xf86int10.h" +# ifdef ATOM_BIOS_PARSER +# define INT8 INT8 +# define INT16 INT16 +# define INT32 INT32 +# include "CD_Common_Types.h" +# else +# ifndef ULONG +typedef unsigned int ULONG; +# define ULONG ULONG +# endif +# ifndef UCHAR +typedef unsigned char UCHAR; +# define UCHAR UCHAR +# endif +# ifndef USHORT +typedef unsigned short USHORT; +# define USHORT USHORT +# endif +# endif + +# include "atombios_rev.h" +# include "ObjectID.h" + +typedef AtomBiosResult (*AtomBiosRequestFunc)(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data); +typedef struct rhdConnectorInfo *rhdConnectorInfoPtr; + +static AtomBiosResult rhdAtomInit(atomBiosHandlePtr unused1, + AtomBiosRequestID unused2, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomTearDown(atomBiosHandlePtr handle, + AtomBiosRequestID unused1, AtomBiosArgPtr unused2); +static AtomBiosResult rhdAtomGetDataInCodeTable(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomVramInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomTmdsInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomAllocateFbScratch(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomLvdsGetTimings(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomLvdsInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomGPIOI2CInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomFirmwareInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomConnectorInfo(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data); +static AtomBiosResult rhdAtomOutputDeviceList(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomAnalogTVInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomGetConditionalGoldenSetting(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); + +# ifdef ATOM_BIOS_PARSER +static AtomBiosResult rhdAtomExec(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data); +# endif +static AtomBiosResult +rhdAtomCompassionateDataQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomIntegratedSystemInfoQuery(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +atomSetRegisterListLocation(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +atomRestoreRegisters(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); + +static AtomBiosResult +rhdAtomSetClock(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomGetClock(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomPmSetup(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomChipLimits(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomGetVoltage(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomSetVoltage(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); +static AtomBiosResult +rhdAtomChipConfigs(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data); + + +enum msgDataFormat { + MSG_FORMAT_NONE, + MSG_FORMAT_HEX, + MSG_FORMAT_DEC +}; + +enum atomRegisterType { + atomRegisterMMIO, + atomRegisterMC, + atomRegisterPLL, + atomRegisterPCICFG +}; + +struct atomBIOSRequests { + AtomBiosRequestID id; + AtomBiosRequestFunc request; + char *message; + enum msgDataFormat message_format; +} AtomBiosRequestList [] = { + {ATOM_INIT, rhdAtomInit, + "AtomBIOS Init", MSG_FORMAT_NONE}, + {ATOM_TEARDOWN, rhdAtomTearDown, + "AtomBIOS Teardown", MSG_FORMAT_NONE}, +# ifdef ATOM_BIOS_PARSER + {ATOM_EXEC, rhdAtomExec, + "AtomBIOS Exec", MSG_FORMAT_NONE}, +#endif + {ATOM_ALLOCATE_FB_SCRATCH, rhdAtomAllocateFbScratch, + "AtomBIOS Set FB Space", MSG_FORMAT_NONE}, + {ATOM_GET_CONNECTORS, rhdAtomConnectorInfo, + "AtomBIOS Get Connectors", MSG_FORMAT_NONE}, + {ATOM_GET_OUTPUT_DEVICE_LIST, rhdAtomOutputDeviceList, + "AtomBIOS Get Output Info", MSG_FORMAT_NONE}, + {ATOM_GET_PANEL_MODE, rhdAtomLvdsGetTimings, + "AtomBIOS Get Panel Mode", MSG_FORMAT_NONE}, + {ATOM_GET_PANEL_EDID, rhdAtomLvdsGetTimings, + "AtomBIOS Get Panel EDID", MSG_FORMAT_NONE}, + {ATOM_GET_CODE_DATA_TABLE, rhdAtomGetDataInCodeTable, + "AtomBIOS Get Datatable from Codetable", MSG_FORMAT_NONE}, + {ATOM_GET_DEFAULT_ENGINE_CLOCK, rhdAtomFirmwareInfoQuery, + "Default Engine Clock", MSG_FORMAT_DEC}, + {ATOM_GET_DEFAULT_MEMORY_CLOCK, rhdAtomFirmwareInfoQuery, + "Default Memory Clock", MSG_FORMAT_DEC}, + {ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT, rhdAtomFirmwareInfoQuery, + "Maximum Pixel ClockPLL Frequency Output", MSG_FORMAT_DEC}, + {ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT, rhdAtomFirmwareInfoQuery, + "Minimum Pixel ClockPLL Frequency Output", MSG_FORMAT_DEC}, + {ATOM_GET_MAX_PIXEL_CLOCK_PLL_INPUT, rhdAtomFirmwareInfoQuery, + "Maximum Pixel ClockPLL Frequency Input", MSG_FORMAT_DEC}, + {ATOM_GET_MIN_PIXEL_CLOCK_PLL_INPUT, rhdAtomFirmwareInfoQuery, + "Minimum Pixel ClockPLL Frequency Input", MSG_FORMAT_DEC}, + {ATOM_GET_MAX_PIXEL_CLK, rhdAtomFirmwareInfoQuery, + "Maximum Pixel Clock", MSG_FORMAT_DEC}, + {ATOM_GET_REF_CLOCK, rhdAtomFirmwareInfoQuery, + "Reference Clock", MSG_FORMAT_DEC}, + {ATOM_GET_FW_FB_START, rhdAtomVramInfoQuery, + "Start of VRAM area used by Firmware", MSG_FORMAT_HEX}, + {ATOM_GET_FW_FB_SIZE, rhdAtomVramInfoQuery, + "Framebuffer space used by Firmware (kb)", MSG_FORMAT_DEC}, + {ATOM_TMDS_MAX_FREQUENCY, rhdAtomTmdsInfoQuery, + "TMDS Max Frequency", MSG_FORMAT_DEC}, + {ATOM_TMDS_PLL_CHARGE_PUMP, rhdAtomTmdsInfoQuery, + "TMDS PLL ChargePump", MSG_FORMAT_DEC}, + {ATOM_TMDS_PLL_DUTY_CYCLE, rhdAtomTmdsInfoQuery, + "TMDS PLL DutyCycle", MSG_FORMAT_DEC}, + {ATOM_TMDS_PLL_VCO_GAIN, rhdAtomTmdsInfoQuery, + "TMDS PLL VCO Gain", MSG_FORMAT_DEC}, + {ATOM_TMDS_PLL_VOLTAGE_SWING, rhdAtomTmdsInfoQuery, + "TMDS PLL VoltageSwing", MSG_FORMAT_DEC}, + {ATOM_LVDS_SUPPORTED_REFRESH_RATE, rhdAtomLvdsInfoQuery, + "LVDS Supported Refresh Rate", MSG_FORMAT_DEC}, + {ATOM_LVDS_OFF_DELAY, rhdAtomLvdsInfoQuery, + "LVDS Off Delay", MSG_FORMAT_DEC}, + {ATOM_LVDS_SEQ_DIG_ONTO_DE, rhdAtomLvdsInfoQuery, + "LVDS SEQ Dig onto DE", MSG_FORMAT_DEC}, + {ATOM_LVDS_SEQ_DE_TO_BL, rhdAtomLvdsInfoQuery, + "LVDS SEQ DE to BL", MSG_FORMAT_DEC}, + {ATOM_LVDS_TEMPORAL_DITHER, rhdAtomLvdsInfoQuery, + "LVDS Temporal Dither ", MSG_FORMAT_HEX}, + {ATOM_LVDS_SPATIAL_DITHER, rhdAtomLvdsInfoQuery, + "LVDS Spatial Dither ", MSG_FORMAT_HEX}, + {ATOM_LVDS_DUALLINK, rhdAtomLvdsInfoQuery, + "LVDS Duallink", MSG_FORMAT_HEX}, + {ATOM_LVDS_GREYLVL, rhdAtomLvdsInfoQuery, + "LVDS Grey Level", MSG_FORMAT_HEX}, + {ATOM_LVDS_FPDI, rhdAtomLvdsInfoQuery, + "LVDS FPDI", MSG_FORMAT_HEX}, + {ATOM_LVDS_24BIT, rhdAtomLvdsInfoQuery, + "LVDS 24Bit", MSG_FORMAT_HEX}, + {ATOM_GPIO_I2C_CLK_MASK, rhdAtomGPIOI2CInfoQuery, + "GPIO_I2C_Clk_Mask", MSG_FORMAT_HEX}, + {ATOM_GPIO_I2C_CLK_MASK_SHIFT, rhdAtomGPIOI2CInfoQuery, + "GPIO_I2C_Clk_Mask_Shift", MSG_FORMAT_HEX}, + {ATOM_GPIO_I2C_DATA_MASK, rhdAtomGPIOI2CInfoQuery, + "GPIO_I2C_Data_Mask", MSG_FORMAT_HEX}, + {ATOM_GPIO_I2C_DATA_MASK_SHIFT, rhdAtomGPIOI2CInfoQuery, + "GPIO_I2C_Data_Mask_Shift", MSG_FORMAT_HEX}, + {ATOM_DAC1_BG_ADJ, rhdAtomCompassionateDataQuery, + "DAC1 BG Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC1_DAC_ADJ, rhdAtomCompassionateDataQuery, + "DAC1 DAC Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC1_FORCE, rhdAtomCompassionateDataQuery, + "DAC1 Force Data", MSG_FORMAT_HEX}, + {ATOM_DAC2_CRTC2_BG_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_CRTC2 BG Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_NTSC_BG_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_NTSC BG Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_PAL_BG_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_PAL BG Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_CV_BG_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_CV BG Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_CRTC2_DAC_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_CRTC2 DAC Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_NTSC_DAC_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_NTSC DAC Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_PAL_DAC_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_PAL DAC Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_CV_DAC_ADJ, rhdAtomCompassionateDataQuery, + "DAC2_CV DAC Adjustment", MSG_FORMAT_HEX}, + {ATOM_DAC2_CRTC2_FORCE, rhdAtomCompassionateDataQuery, + "DAC2_CRTC2 Force", MSG_FORMAT_HEX}, + {ATOM_DAC2_CRTC2_MUX_REG_IND,rhdAtomCompassionateDataQuery, + "DAC2_CRTC2 Mux Register Index", MSG_FORMAT_HEX}, + {ATOM_DAC2_CRTC2_MUX_REG_INFO,rhdAtomCompassionateDataQuery, + "DAC2_CRTC2 Mux Register Info", MSG_FORMAT_HEX}, + {ATOM_ANALOG_TV_MODE, rhdAtomAnalogTVInfoQuery, + "Analog TV Mode", MSG_FORMAT_NONE}, + {ATOM_ANALOG_TV_DEFAULT_MODE, rhdAtomAnalogTVInfoQuery, + "Analog TV Default Mode", MSG_FORMAT_DEC}, + {ATOM_ANALOG_TV_SUPPORTED_MODES, rhdAtomAnalogTVInfoQuery, + "Analog TV Supported Modes", MSG_FORMAT_HEX}, + {ATOM_GET_CONDITIONAL_GOLDEN_SETTINGS, rhdAtomGetConditionalGoldenSetting, + "Conditional Golden Setting", MSG_FORMAT_NONE}, + {ATOM_GET_PCIENB_CFG_REG7, rhdAtomIntegratedSystemInfoQuery, + "PCIE NB Cfg7Reg", MSG_FORMAT_HEX}, + {ATOM_GET_CAPABILITY_FLAG, rhdAtomIntegratedSystemInfoQuery, + "CapabilityFlag", MSG_FORMAT_HEX}, + {ATOM_GET_PCIE_LANES, rhdAtomIntegratedSystemInfoQuery, + "PCI Lanes", MSG_FORMAT_NONE}, + {ATOM_SET_REGISTER_LIST_LOCATION, atomSetRegisterListLocation, + "Register List Location", MSG_FORMAT_NONE}, + {ATOM_RESTORE_REGISTERS, atomRestoreRegisters, + "Restore Registers", MSG_FORMAT_NONE}, + {ATOM_GET_ENGINE_CLOCK, rhdAtomGetClock, + "Current Engine Clock", MSG_FORMAT_DEC}, + {ATOM_GET_MEMORY_CLOCK, rhdAtomGetClock, + "Current Memory Clock", MSG_FORMAT_DEC}, + {ATOM_SET_ENGINE_CLOCK, rhdAtomSetClock, + "Set Engine Clock", MSG_FORMAT_NONE}, + {ATOM_SET_MEMORY_CLOCK, rhdAtomSetClock, + "Set Memory Clock", MSG_FORMAT_NONE}, + {ATOM_PM_SETUP, rhdAtomPmSetup, + "Set Power Management", MSG_FORMAT_NONE}, + {ATOM_PM_CLOCKGATING_SETUP, rhdAtomPmSetup, + "Set Dynamic Clock Gating", MSG_FORMAT_NONE}, + {ATOM_GET_CHIP_LIMITS, rhdAtomChipLimits, + "Get Chip Limits", MSG_FORMAT_NONE}, + {ATOM_GET_VOLTAGE, rhdAtomGetVoltage, + "Current Chip Voltage", MSG_FORMAT_DEC}, + {ATOM_SET_VOLTAGE, rhdAtomSetVoltage, + "Set Chip Voltage", MSG_FORMAT_NONE}, + {ATOM_GET_CHIP_CONFIGS, rhdAtomChipConfigs, + "Get Chip Configs", MSG_FORMAT_NONE}, + {ATOM_FUNC_END, NULL, + NULL, MSG_FORMAT_NONE} +}; + +/* + * This works around a bug in atombios.h where + * ATOM_MAX_SUPPORTED_DEVICE_INFO is specified incorrectly. + */ + +#define ATOM_MAX_SUPPORTED_DEVICE_INFO_HD (ATOM_DEVICE_RESERVEDF_INDEX+1) +typedef struct _ATOM_SUPPORTED_DEVICES_INFO_HD +{ + ATOM_COMMON_TABLE_HEADER sHeader; + USHORT usDeviceSupport; + ATOM_CONNECTOR_INFO_I2C asConnInfo[ATOM_MAX_SUPPORTED_DEVICE_INFO_HD]; + ATOM_CONNECTOR_INC_SRC_BITMAP asIntSrcInfo[ATOM_MAX_SUPPORTED_DEVICE_INFO_HD]; +} ATOM_SUPPORTED_DEVICES_INFO_HD; + +typedef struct _atomDataTables +{ + unsigned char *UtilityPipeLine; + ATOM_MULTIMEDIA_CAPABILITY_INFO *MultimediaCapabilityInfo; + ATOM_MULTIMEDIA_CONFIG_INFO *MultimediaConfigInfo; + ATOM_STANDARD_VESA_TIMING *StandardVESA_Timing; + union { + void *base; + ATOM_FIRMWARE_INFO *FirmwareInfo; + ATOM_FIRMWARE_INFO_V1_2 *FirmwareInfo_V_1_2; + ATOM_FIRMWARE_INFO_V1_3 *FirmwareInfo_V_1_3; + ATOM_FIRMWARE_INFO_V1_4 *FirmwareInfo_V_1_4; + } FirmwareInfo; + ATOM_DAC_INFO *DAC_Info; + union { + void *base; + ATOM_LVDS_INFO *LVDS_Info; + ATOM_LVDS_INFO_V12 *LVDS_Info_v12; + } LVDS_Info; + ATOM_TMDS_INFO *TMDS_Info; + ATOM_ANALOG_TV_INFO *AnalogTV_Info; + union { + void *base; + ATOM_SUPPORTED_DEVICES_INFO *SupportedDevicesInfo; + ATOM_SUPPORTED_DEVICES_INFO_2 *SupportedDevicesInfo_2; + ATOM_SUPPORTED_DEVICES_INFO_2d1 *SupportedDevicesInfo_2d1; + ATOM_SUPPORTED_DEVICES_INFO_HD *SupportedDevicesInfo_HD; + } SupportedDevicesInfo; + ATOM_GPIO_I2C_INFO *GPIO_I2C_Info; + ATOM_VRAM_USAGE_BY_FIRMWARE *VRAM_UsageByFirmware; + ATOM_GPIO_PIN_LUT *GPIO_Pin_LUT; + ATOM_VESA_TO_INTENAL_MODE_LUT *VESA_ToInternalModeLUT; + union { + void *base; + ATOM_COMPONENT_VIDEO_INFO *ComponentVideoInfo; + ATOM_COMPONENT_VIDEO_INFO_V21 *ComponentVideoInfo_v21; + } ComponentVideoInfo; + union { + void *base; + ATOM_POWERPLAY_INFO *PowerPlayInfo; + ATOM_POWERPLAY_INFO_V2 *PowerPlayInfo_V_2_1; + ATOM_POWERPLAY_INFO_V3 *PowerPlayInfo_V_3_1; + ATOM_POWERPLAY_INFO_V4 *PowerPlayInfo_V_4_1; + } PowerPlayInfo; + COMPASSIONATE_DATA *CompassionateData; + ATOM_DISPLAY_DEVICE_PRIORITY_INFO *SaveRestoreInfo; +/**/unsigned char *PPLL_SS_Info; + ATOM_OEM_INFO *OemInfo; + ATOM_XTMDS_INFO *XTMDS_Info; + ATOM_ASIC_MVDD_INFO *MclkSS_Info; + ATOM_OBJECT_HEADER *Object_Header; + INDIRECT_IO_ACCESS *IndirectIOAccess; + ATOM_MC_INIT_PARAM_TABLE *MC_InitParameter; +/**/unsigned char *ASIC_VDDC_Info; + ATOM_ASIC_INTERNAL_SS_INFO *ASIC_InternalSS_Info; +/**/unsigned char *TV_VideoMode; + union { + void *base; + ATOM_VRAM_INFO_V2 *VRAM_Info_v2; + ATOM_VRAM_INFO_V3 *VRAM_Info_v3; + } VRAM_Info; + ATOM_MEMORY_TRAINING_INFO *MemoryTrainingInfo; + union { + void *base; + ATOM_INTEGRATED_SYSTEM_INFO *IntegratedSystemInfo; + ATOM_INTEGRATED_SYSTEM_INFO_V2 *IntegratedSystemInfo_v2; + } IntegratedSystemInfo; + ATOM_ASIC_PROFILING_INFO *ASIC_ProfilingInfo; + ATOM_VOLTAGE_OBJECT_INFO *VoltageObjectInfo; + ATOM_POWER_SOURCE_INFO *PowerSourceInfo; +} atomDataTables, *atomDataTablesPtr; + +struct atomSaveListRecord +{ + /* header */ + int Length; + int Last; + struct atomRegisterList{ + enum atomRegisterType Type; + CARD32 Address; + CARD32 Value; + } RegisterList[1]; +}; + +struct atomSaveListObject +{ + struct atomSaveListObject *next; + struct atomSaveListRecord **SaveList; +}; + +typedef struct _atomBiosHandle { + int scrnIndex; + unsigned char *BIOSBase; + atomDataTablesPtr atomDataPtr; + pointer *scratchBase; + CARD32 fbBase; + unsigned int BIOSImageSize; + unsigned char *codeTable; + struct atomSaveListRecord **SaveList; + struct atomSaveListObject *SaveListObjects; +} atomBiosHandleRec; + +enum { + legacyBIOSLocation = 0xC0000, + legacyBIOSMax = 0x10000 +}; + +struct atomConnectorInfoPrivate { + enum atomDevice *Devices; +}; + +# ifdef ATOM_BIOS_PARSER + +# define LOG_CAIL LOG_DEBUG + 1 + +static void +atomDebugPrintPspace(atomBiosHandlePtr handle, AtomBiosArgPtr data, int size) +{ + CARD32 *pspace = (CARD32 *)data->exec.pspace; + int i = 0; + + size >>= 2; + + while (i++,size--) + RHDDebug(handle->scrnIndex, " Pspace[%2.2i]: 0x%8.8x\n", i, *(pspace++)); +} + +static void +CailDebug(int scrnIndex, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + xf86VDrvMsgVerb(scrnIndex, X_INFO, LOG_CAIL, format, ap); + va_end(ap); +} +# define CAILFUNC(ptr) \ + CailDebug(((atomBiosHandlePtr)(ptr))->scrnIndex, "CAIL: %s\n", __func__) + +# endif + +static int +rhdAtomBIOSGetArg(CARD32 *val, char *ptr) +{ + int cnt = 0; + if (isspace(*ptr) || *ptr == '=') { + ptr++; + cnt++; + } + if (!strncasecmp("off",ptr,3)) { + *val = RHD_ATOMBIOS_OFF; + return cnt + 3; + } else if (!strncasecmp("on",ptr,2)) { + *val = RHD_ATOMBIOS_ON; + return cnt + 2; + } else if (!strncasecmp("force_off",ptr,9)) { + *val = RHD_ATOMBIOS_OFF | RHD_ATOMBIOS_FORCE; + return cnt + 9; + } else if (!strncasecmp("force_on",ptr,8)) { + *val = RHD_ATOMBIOS_ON | RHD_ATOMBIOS_FORCE; + return cnt + 8; + } else + return 0; +} + +int +rhdUpdateAtomBIOSUsage(RHDPtr rhdPtr, char *string) +{ + char *ptr = string; + CARD32 val; + + while (*ptr != '\0') { + int c; + while (isspace(*ptr)) + ptr++; + if (*ptr == '\0') + break; + + if (!strncasecmp("crtc",ptr,4)) { + ptr += 4; + if (!(c = rhdAtomBIOSGetArg(&val,ptr))) + return FALSE; + ptr += c; + rhdPtr->UseAtomFlags &= ~((RHD_ATOMBIOS_FORCE | RHD_ATOMBIOS_ON | RHD_ATOMBIOS_OFF) << RHD_ATOMBIOS_CRTC); + rhdPtr->UseAtomFlags |= (val << RHD_ATOMBIOS_CRTC); + } + else if (!strncasecmp("output",ptr,6)) { + ptr += 6; + if (!(c = rhdAtomBIOSGetArg(&val,ptr))) + return FALSE; + ptr += c; + rhdPtr->UseAtomFlags &= ~((RHD_ATOMBIOS_FORCE | RHD_ATOMBIOS_ON | RHD_ATOMBIOS_OFF) << RHD_ATOMBIOS_OUTPUT); + rhdPtr->UseAtomFlags |= (val << RHD_ATOMBIOS_OUTPUT); + } + else if (!strncasecmp("pll",ptr,3)) { + ptr += 3; + if (!(c = rhdAtomBIOSGetArg(&val,ptr))) + return FALSE; + ptr += c; + rhdPtr->UseAtomFlags &= ~((RHD_ATOMBIOS_FORCE | RHD_ATOMBIOS_ON | RHD_ATOMBIOS_OFF) << RHD_ATOMBIOS_PLL); + rhdPtr->UseAtomFlags |= (val << RHD_ATOMBIOS_PLL); + } else + return FALSE; + } + return TRUE; +} + +char * +rhdReturnAtomBIOSUsage(RHDPtr rhdPtr) +{ + char *type[] = { "crtc", "output", "pll", NULL }; + int shift[] = { RHD_ATOMBIOS_CRTC, RHD_ATOMBIOS_OUTPUT, RHD_ATOMBIOS_PLL }; + char *vals[] = { "", "on", "off", "unknown", "unknown", "force_on", "force_off", "unknown" }; + int i; + char buf[40]; + char *p = buf; + + for (i = 0; type[i]; i++) { + int val = (rhdPtr->UseAtomFlags >> shift[i]) & 0x07; + if (val) + p += sprintf (p, "%s=%s ", type[i], vals[val]); + } + if (p != buf) + *--p = 0; + return strdup(buf); +} + +# define DEBUG_VERSION(index, handle, version) \ + xf86DrvMsgVerb(handle->scrnIndex, X_INFO, 3, "%s returned version %i for index 0x%x\n" ,__func__,version.cref,index) +# define DEBUG_VERSION_NAME(index, handle, name, version) \ + xf86DrvMsgVerb(handle->scrnIndex, X_INFO, 3, "%s(%s) returned version %i for index 0x%x\n",\ + __func__,name,version.cref,index) + +static int +rhdAtomAnalyzeCommonHdr(ATOM_COMMON_TABLE_HEADER *hdr) +{ + if (hdr->usStructureSize == 0xaa55) + return FALSE; + + return TRUE; +} + +static int +rhdAtomAnalyzeRomHdr(unsigned char *rombase, + ATOM_ROM_HEADER *hdr, + unsigned int *data_offset, unsigned int *code_table) +{ + if (!rhdAtomAnalyzeCommonHdr(&hdr->sHeader)) { + return FALSE; + } + xf86DrvMsg(-1,X_NONE,"\tSubsystemVendorID: 0x%4.4x SubsystemID: 0x%4.4x\n", + hdr->usSubsystemVendorID,hdr->usSubsystemID); + xf86DrvMsg(-1,X_NONE,"\tIOBaseAddress: 0x%4.4x\n",hdr->usIoBaseAddress); + xf86DrvMsgVerb(-1,X_NONE,3,"\tFilename: %s\n",rombase + hdr->usConfigFilenameOffset); + xf86DrvMsgVerb(-1,X_NONE,3,"\tBIOS Bootup Message: %s\n", + rombase + hdr->usBIOS_BootupMessageOffset); + + *data_offset = hdr->usMasterDataTableOffset; + *code_table = hdr->usMasterCommandTableOffset; + + return TRUE; +} + +static int +rhdAtomAnalyzeRomDataTable(unsigned char *base, int offset, + void *ptr,unsigned short *size) +{ + ATOM_COMMON_TABLE_HEADER *table = (ATOM_COMMON_TABLE_HEADER *) + (base + offset); + + if (!*size || !rhdAtomAnalyzeCommonHdr(table)) { + if (*size) *size -= 2; + *(void **)ptr = NULL; + return FALSE; + } + *size -= 2; + *(void **)ptr = (void *)(table); + return TRUE; +} + +static Bool +rhdAtomGetTableRevisionAndSize(ATOM_COMMON_TABLE_HEADER *hdr, + CARD8 *contentRev, + CARD8 *formatRev, + unsigned short *size) +{ + if (!hdr) + return FALSE; + + if (contentRev) *contentRev = hdr->ucTableContentRevision; + if (formatRev) *formatRev = hdr->ucTableFormatRevision; + if (size) *size = (short)hdr->usStructureSize + - sizeof(ATOM_COMMON_TABLE_HEADER); + + return TRUE; +} + +static Bool +rhdAtomGetCommandTableRevisionSize(atomBiosHandlePtr handle, int index, + CARD8 *contentRev, CARD8 *formatRev, unsigned short *size) +{ + unsigned short offset = ((USHORT *)&(((ATOM_MASTER_COMMAND_TABLE *)handle->codeTable) + ->ListOfCommandTables))[index]; + ATOM_COMMON_ROM_COMMAND_TABLE_HEADER *hdr = (ATOM_COMMON_ROM_COMMAND_TABLE_HEADER *)(handle->BIOSBase + offset); + ATOM_COMMON_TABLE_HEADER hdr1 = hdr->CommonHeader; + + if (!offset) { + *contentRev = *formatRev = 0; + return FALSE; + } + return rhdAtomGetTableRevisionAndSize(&hdr1, contentRev, formatRev, size); +} + +static Bool +rhdAtomAnalyzeMasterDataTable(unsigned char *base, + ATOM_MASTER_DATA_TABLE *table, + atomDataTablesPtr data) +{ + ATOM_MASTER_LIST_OF_DATA_TABLES *data_table = + &table->ListOfDataTables; + unsigned short size; + + if (!rhdAtomAnalyzeCommonHdr(&table->sHeader)) + return FALSE; + if (!rhdAtomGetTableRevisionAndSize(&table->sHeader,NULL,NULL, + &size)) + return FALSE; +# define SET_DATA_TABLE(x) {\ + rhdAtomAnalyzeRomDataTable(base,data_table->x,(void *)(&(data->x)),&size); \ + } + +# define SET_DATA_TABLE_VERS(x) {\ + rhdAtomAnalyzeRomDataTable(base,data_table->x,&(data->x.base),&size); \ + } + + SET_DATA_TABLE(UtilityPipeLine); + SET_DATA_TABLE(MultimediaCapabilityInfo); + SET_DATA_TABLE(MultimediaConfigInfo); + SET_DATA_TABLE(StandardVESA_Timing); + SET_DATA_TABLE_VERS(FirmwareInfo); + SET_DATA_TABLE(DAC_Info); + SET_DATA_TABLE_VERS(LVDS_Info); + SET_DATA_TABLE(TMDS_Info); + SET_DATA_TABLE(AnalogTV_Info); + SET_DATA_TABLE_VERS(SupportedDevicesInfo); + SET_DATA_TABLE(GPIO_I2C_Info); + SET_DATA_TABLE(VRAM_UsageByFirmware); + SET_DATA_TABLE(GPIO_Pin_LUT); + SET_DATA_TABLE(VESA_ToInternalModeLUT); + SET_DATA_TABLE_VERS(ComponentVideoInfo); + SET_DATA_TABLE(PowerPlayInfo); + SET_DATA_TABLE(CompassionateData); + SET_DATA_TABLE(SaveRestoreInfo); + SET_DATA_TABLE(PPLL_SS_Info); + SET_DATA_TABLE(OemInfo); + SET_DATA_TABLE(XTMDS_Info); + SET_DATA_TABLE(MclkSS_Info); + SET_DATA_TABLE(Object_Header); + SET_DATA_TABLE(IndirectIOAccess); + SET_DATA_TABLE(MC_InitParameter); + SET_DATA_TABLE(ASIC_VDDC_Info); + SET_DATA_TABLE(ASIC_InternalSS_Info); + SET_DATA_TABLE(TV_VideoMode); + SET_DATA_TABLE_VERS(VRAM_Info); + SET_DATA_TABLE(MemoryTrainingInfo); + SET_DATA_TABLE_VERS(IntegratedSystemInfo); + SET_DATA_TABLE(ASIC_ProfilingInfo); + SET_DATA_TABLE(VoltageObjectInfo); + SET_DATA_TABLE(PowerSourceInfo); +# undef SET_DATA_TABLE + + return TRUE; +} + +static Bool +rhdAtomGetTables(int scrnIndex, unsigned char *base, + atomDataTables *atomDataPtr, unsigned char **codeTablePtr, + unsigned int BIOSImageSize) +{ + unsigned int data_offset; + unsigned int code_offset; + unsigned int atom_romhdr_off = *(unsigned short*) + (base + OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER); + ATOM_ROM_HEADER *atom_rom_hdr = + (ATOM_ROM_HEADER *)(base + atom_romhdr_off); + + RHDFUNCI(scrnIndex); + + if (atom_romhdr_off + sizeof(ATOM_ROM_HEADER) > BIOSImageSize) { + xf86DrvMsg(scrnIndex,X_ERROR, + "%s: AtomROM header extends beyond BIOS image\n",__func__); + return FALSE; + } + + if (memcmp("ATOM",&atom_rom_hdr->uaFirmWareSignature,4)) { + xf86DrvMsg(scrnIndex,X_ERROR,"%s: No AtomBios signature found\n", + __func__); + return FALSE; + } + xf86DrvMsg(scrnIndex, X_INFO, "ATOM BIOS Rom: \n"); + if (!rhdAtomAnalyzeRomHdr(base, atom_rom_hdr, &data_offset, &code_offset)) { + xf86DrvMsg(scrnIndex, X_ERROR, "RomHeader invalid\n"); + return FALSE; + } + + if (data_offset + sizeof (ATOM_MASTER_DATA_TABLE) > BIOSImageSize) { + xf86DrvMsg(scrnIndex,X_ERROR,"%s: Atom data table outside of BIOS\n", + __func__); + return FALSE; + } + + if (code_offset + sizeof (ATOM_MASTER_COMMAND_TABLE) > BIOSImageSize) { + xf86DrvMsg(scrnIndex, X_ERROR, "%s: Atom command table outside of BIOS\n", + __func__); + (*codeTablePtr) = NULL; + } else + (*codeTablePtr) = base + code_offset; + + if (!rhdAtomAnalyzeMasterDataTable(base, (ATOM_MASTER_DATA_TABLE *) + (base + data_offset), + atomDataPtr)) { + xf86DrvMsg(scrnIndex, X_ERROR, "%s: ROM Master Table invalid\n", + __func__); + return FALSE; + } + + return TRUE; +} + +static Bool +rhdAtomGetFbBaseAndSize(atomBiosHandlePtr handle, unsigned int *base, + unsigned int *size) +{ + AtomBiosArgRec data; + if (RHDAtomBiosFunc(handle->scrnIndex, handle, ATOM_GET_FW_FB_SIZE, &data) + == ATOM_SUCCESS) { + if (data.val == 0) { + xf86DrvMsg(handle->scrnIndex, X_WARNING, "%s: AtomBIOS specified VRAM " + "scratch space size invalid\n", __func__); + return FALSE; + } + if (size) + *size = (int)data.val; + } else + return FALSE; + if (RHDAtomBiosFunc(handle->scrnIndex, handle, ATOM_GET_FW_FB_START, &data) + == ATOM_SUCCESS) { + if (data.val == 0) + return FALSE; + if (base) + *base = (int)data.val; + } + return TRUE; +} + +/* + * Uses videoRam form ScrnInfoRec. + */ +static AtomBiosResult +rhdAtomAllocateFbScratch(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + unsigned int fb_base = 0; + unsigned int fb_size = 0; + unsigned int start = data->fb.start; + unsigned int size = data->fb.size; + handle->scratchBase = NULL; + handle->fbBase = 0; + + if (rhdAtomGetFbBaseAndSize(handle, &fb_base, &fb_size)) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "AtomBIOS requests %ikB" + " of VRAM scratch space\n",fb_size); + fb_size *= 1024; /* convert to bytes */ + xf86DrvMsg(handle->scrnIndex, X_INFO, "AtomBIOS VRAM scratch base: 0x%x\n", + fb_base); + } else { + fb_size = 20 * 1024; + xf86DrvMsg(handle->scrnIndex, X_INFO, " default to: %i\n",fb_size); + } + if (fb_base && fb_size && size) { + /* 4k align */ + fb_size = (fb_size & ~(CARD32)0xfff) + ((fb_size & 0xfff) ? 1 : 0); + if ((fb_base + fb_size) > (start + size)) { + xf86DrvMsg(handle->scrnIndex, X_WARNING, + "%s: FW FB scratch area %i (size: %i)" + " extends beyond available framebuffer size %i\n", + __func__, fb_base, fb_size, size); + } else if ((fb_base + fb_size) < (start + size)) { + xf86DrvMsg(handle->scrnIndex, X_WARNING, + "%s: FW FB scratch area not located " + "at the end of VRAM. Scratch End: " + "0x%x VRAM End: 0x%x\n", __func__, + (unsigned int)(fb_base + fb_size), + size); + } else if (fb_base < start) { + xf86DrvMsg(handle->scrnIndex, X_WARNING, + "%s: FW FB scratch area extends below " + "the base of the free VRAM: 0x%x Base: 0x%x\n", + __func__, (unsigned int)(fb_base), start); + } else { + size -= fb_size; + handle->fbBase = fb_base; + return ATOM_SUCCESS; + } + } + + if (!handle->fbBase) { + xf86DrvMsg(handle->scrnIndex, X_INFO, + "Cannot get VRAM scratch space. " + "Allocating in main memory instead\n"); + handle->scratchBase = xcalloc(fb_size,1); + return ATOM_SUCCESS; + } + return ATOM_FAILED; +} + +# ifdef ATOM_BIOS_PARSER +static Bool +rhdAtomASICInit(atomBiosHandlePtr handle) +{ + ASIC_INIT_PS_ALLOCATION asicInit; + AtomBiosArgRec data; + + RHDFUNC(handle); + + RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_GET_DEFAULT_ENGINE_CLOCK, + &data); + asicInit.sASICInitClocks.ulDefaultEngineClock = data.val / 10;/*in 10 Khz*/ + RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_GET_DEFAULT_MEMORY_CLOCK, + &data); + asicInit.sASICInitClocks.ulDefaultMemoryClock = data.val / 10;/*in 10 Khz*/ + data.exec.dataSpace = NULL; + data.exec.index = GetIndexIntoMasterTable(COMMAND, ASIC_Init); + data.exec.pspace = &asicInit; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling ASIC Init\n"); + atomDebugPrintPspace(handle, &data, sizeof(asicInit)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "ASIC_INIT Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "ASIC_INIT Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomASICInitVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, ASIC_Init); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + return version; +} + +/* + * + */ +Bool +rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scalerID, enum atomScaleMode mode) +{ + ENABLE_SCALER_PARAMETERS scaler; + AtomBiosArgRec data; + + RHDFUNC(handle); + + switch (scalerID) { + case atomScaler1: + scaler.ucScaler = ATOM_SCALER1; + break; + case atomScaler2: + scaler.ucScaler = ATOM_SCALER2; + break; + } + + switch (mode) { + case atomScaleDisable: + scaler.ucEnable = ATOM_SCALER_DISABLE; + break; + case atomScaleCenter: + scaler.ucEnable = ATOM_SCALER_CENTER; + break; + case atomScaleExpand: + scaler.ucEnable = ATOM_SCALER_EXPANSION; + break; + case atomScaleMulttabExpand: + scaler.ucEnable = ATOM_SCALER_MULTI_EX; + break; + } + + data.exec.dataSpace = NULL; + data.exec.index = GetIndexIntoMasterTable(COMMAND, EnableScaler); + data.exec.pspace = &scaler; + atomDebugPrintPspace(handle, &data, sizeof(scaler)); + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling EnableScaler\n"); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "EnableScaler Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "EnableScaler Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomSetScalerVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, EnableScaler); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + return version; +} + +/* + * + */ +Bool +rhdAtomSetTVEncoder(atomBiosHandlePtr handle, Bool enable, int mode) +{ + TV_ENCODER_CONTROL_PS_ALLOCATION tvEncoder; + AtomBiosArgRec data; + + RHDFUNC(handle); + + tvEncoder.sTVEncoder.ucTvStandard = mode; + tvEncoder.sTVEncoder.ucAction = enable ? 1 :0; + + data.exec.dataSpace = NULL; + data.exec.pspace = &tvEncoder; + data.exec.index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl); + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling SetTVEncoder\n"); + atomDebugPrintPspace(handle, &data, sizeof(tvEncoder)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "SetTVEncoder Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "SetTVEncoder Failed\n"); + return FALSE; +} + +/* + * + */ +#if (ATOM_TRANSMITTER_CONFIG_COHERENT != ATOM_TRANSMITTER_CONFIG_V2_COHERENT) +# error +#endif + +Bool +rhdAtomDigTransmitterControl(atomBiosHandlePtr handle, enum atomTransmitter id, + enum atomTransmitterAction action, struct atomTransmitterConfig *config) +{ + DIG_TRANSMITTER_CONTROL_PARAMETERS Transmitter; + AtomBiosArgRec data; + char *name = NULL; + struct atomCodeTableVersion version; + + RHDFUNC(handle); + + switch (action) { + case atomTransDisable: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_DISABLE; + break; + case atomTransEnable: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_ENABLE; + break; + case atomTransEnableOutput: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT; + break; + case atomTransDisableOutput: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_DISABLE_OUTPUT; + break; + case atomTransLcdBlOff: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_LCD_BLOFF; + break; + case atomTransLcdBlOn: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_LCD_BLON; + break; + case atomTransLcdBlBrightness: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_BL_BRIGHTNESS_CONTROL; + break; + case atomTransSetup: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_SETUP; + break; + case atomTransInit: + Transmitter.ucAction = ATOM_TRANSMITTER_ACTION_INIT; + break; + } + + Transmitter.ucConfig = 0; + + /* INIT is only called by ASIC_Init, for our actions this is always the PXLCLK */ + switch (config->LinkCnt) { + case atomSingleLink: + Transmitter.usPixelClock = config->PixelClock * 4 / 10; + break; + + case atomDualLink: + Transmitter.usPixelClock = config->PixelClock * 2/ 10; + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_8LANE_LINK; + break; + } + + if (config->Coherent) + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_COHERENT; + + switch (id) { + case atomTransmitterDIG1: + case atomTransmitterUNIPHY: + case atomTransmitterUNIPHY1: + case atomTransmitterUNIPHY2: + case atomTransmitterPCIEPHY: + data.exec.index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl); + name = "UNIPHYTransmitterControl"; + + rhdAtomGetCommandTableRevisionSize(handle, data.exec.index, &version.cref, &version.fref, NULL); + + if (version.fref > 1 || version.cref > 2) + return FALSE; + + switch (version.cref) { + case 1: + + switch (config->Link) { + case atomTransLinkA: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA; + break; + case atomTransLinkAB: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKA_B; + break; + case atomTransLinkB: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB; + break; + case atomTransLinkBA: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LINKB_A; + break; + } + switch (config->Encoder) { + case atomEncoderDIG1: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG1_ENCODER; + break; + case atomEncoderDIG2: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_DIG2_ENCODER; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s called with invalid encoder %x for DIG transmitter\n", + __func__, config->Encoder); + return FALSE; + } + if (id == atomTransmitterPCIEPHY) { + switch (config->Lanes) { + case atomPCIELaneNONE: + Transmitter.ucConfig |= 0; + break; + case atomPCIELane0_3: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_3; + break; + case atomPCIELane0_7: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_0_7; + break; + case atomPCIELane4_7: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_4_7; + break; + case atomPCIELane8_11: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_11; + break; + case atomPCIELane8_15: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_8_15; + break; + case atomPCIELane12_15: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_LANE_12_15; + break; + } + /* According to ATI this is the only one used so far */ + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_CLKSRC_PPLL; + } + break; + case 2: + if (id == atomTransmitterPCIEPHY) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s PCIPHY not valid for DCE 3.2\n", + __func__); + return FALSE; + } + switch (config->Link) { + case atomTransLinkA: + case atomTransLinkAB: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_V2_LINKA; + break; + case atomTransLinkB: + case atomTransLinkBA: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_V2_LINKB; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s called with invalid transmitter link selection %x for DIG transmitter\n", + __func__, config->Link); + return FALSE; + } + switch (config->Encoder) { + case atomEncoderDIG1: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_V2_DIG1_ENCODER; + break; + case atomEncoderDIG2: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_V2_DIG2_ENCODER; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s called with invalid encoder %x for DIG transmitter\n", + __func__, config->Encoder); + return FALSE; + } + switch (id) { + case atomTransmitterUNIPHY: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_V2_TRANSMITTER1; + break; + case atomTransmitterUNIPHY1: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_V2_TRANSMITTER2; + break; + case atomTransmitterUNIPHY2: + Transmitter.ucConfig |= ATOM_TRANSMITTER_CONFIG_V2_TRANSMITTER3; + break; + default: + break; + } + + if (config->Mode == atomDP) + Transmitter.ucConfig |= ATOM_TRASMITTER_CONFIG_V2_DP_CONNECTOR; + break; + } + + break; + + case atomTransmitterLVTMA: + case atomTransmitterDIG2: + data.exec.index = GetIndexIntoMasterTable(COMMAND, DIG2TransmitterControl); + name = "DIG2TransmitterControl"; + break; + } + + data.exec.dataSpace = NULL; + data.exec.pspace = &Transmitter; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling %s\n",name); + atomDebugPrintPspace(handle, &data, sizeof(Transmitter)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "%s Successful\n",name); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "%s Failed\n",name); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomDigTransmitterControlVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, UNIPHYTransmitterControl); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + DEBUG_VERSION(index, handle, version); + return version; +} + +/* + * + */ +Bool +rhdAtomOutputControl(atomBiosHandlePtr handle, enum atomOutput OutputId, enum atomOutputAction Action) +{ + AtomBiosArgRec data; + CARD8 version; + char *name; + + union + { + DISPLAY_DEVICE_OUTPUT_CONTROL_PARAMETERS op; + DISPLAY_DEVICE_OUTPUT_CONTROL_PS_ALLOCATION opa; + } ps; + + RHDFUNC(handle); + + switch (Action) { + case atomOutputEnable: + ps.op.ucAction = ATOM_ENABLE; + break; + case atomOutputDisable: + ps.op.ucAction = ATOM_DISABLE; + break; + default: /* handle below */ + if (OutputId != atomLCDOutput) + return FALSE; + } + + switch (OutputId) { + case atomDVOOutput: + data.exec.index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); + name = "DVOOutputControl"; + if (!rhdAtomGetCommandTableRevisionSize(handle, data.exec.index, &version, NULL, NULL)) + return FALSE; + switch (version) { + case 1: + case 2: + break; + case 3: /* For now. This needs to be treated like DIGTransmitterControl. @@@ */ + return FALSE; + } + break; + case atomLCDOutput: + data.exec.index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); + name = "LCD1OutputControl"; + switch (Action) { + case atomOutputEnable: + case atomOutputDisable: + break; + case atomOutputLcdOn: + ps.op.ucAction = ATOM_LCD_BLON; + break; + case atomOutputLcdOff: + ps.op.ucAction = ATOM_LCD_BLOFF; + break; + case atomOutputLcdBrightnessControl: + ps.op.ucAction = ATOM_LCD_BL_BRIGHTNESS_CONTROL; + break; + case atomOutputLcdSelftestStart: + ps.op.ucAction = ATOM_LCD_SELFTEST_START; + break; + case atomOutputLcdSelftestStop: + ps.op.ucAction = ATOM_LCD_SELFTEST_STOP; + break; + case atomOutputEncoderInit: + ps.op.ucAction = ATOM_ENCODER_INIT; + break; + default: + return FALSE; + } + break; + case atomCVOutput: + data.exec.index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); + name = "CV1OutputControl"; + break; + case atomTVOutput: + name = "TV1OutputControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); + break; + case atomLVTMAOutput: + name = "LVTMAOutputControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, LVTMAOutputControl); + switch (Action) { + case atomOutputEnable: + case atomOutputDisable: + break; + case atomOutputLcdOn: + ps.op.ucAction = ATOM_LCD_BLON; + break; + case atomOutputLcdOff: + ps.op.ucAction = ATOM_LCD_BLOFF; + break; + case atomOutputLcdBrightnessControl: + ps.op.ucAction = ATOM_LCD_BL_BRIGHTNESS_CONTROL; + break; + case atomOutputLcdSelftestStart: + ps.op.ucAction = ATOM_LCD_SELFTEST_START; + break; + case atomOutputLcdSelftestStop: + ps.op.ucAction = ATOM_LCD_SELFTEST_STOP; + break; + case atomOutputEncoderInit: + ps.op.ucAction = ATOM_ENCODER_INIT; + break; + default: + return FALSE; + } + break; + case atomTMDSAOutput: + name = "TMDSAOutputControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl); + break; + case atomDAC1Output: + name = "DAC1OutputControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); + break; + case atomDAC2Output: + name = "DAC2OutputControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); + break; + default: + return FALSE; + } + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling %s\n",name); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "%s Successful\n",name); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "%s Failed\n",name); + + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomOutputControlVersion(atomBiosHandlePtr handle, enum atomOutput OutputId) +{ + struct atomCodeTableVersion version = {0 , 0}; + int index; + char *name; + + switch (OutputId) { + case atomDVOOutput: + index = GetIndexIntoMasterTable(COMMAND, DVOOutputControl); + name = "DVOOutputControl"; + break; + case atomLCDOutput: + index = GetIndexIntoMasterTable(COMMAND, LCD1OutputControl); + name = "LCD1OutputControl"; + break; + case atomCVOutput: + index = GetIndexIntoMasterTable(COMMAND, CV1OutputControl); + name = "CV1OutputControl"; + break; + case atomTVOutput: + index = GetIndexIntoMasterTable(COMMAND, TV1OutputControl); + name = "TV1OutputControl"; + break; + case atomLVTMAOutput: + index = GetIndexIntoMasterTable(COMMAND, LVTMAOutputControl); + name = "LVTMAOutputControl"; + break; + case atomTMDSAOutput: + index = GetIndexIntoMasterTable(COMMAND, TMDSAOutputControl); + name = "TMDSAOutputControl"; + break; + case atomDAC1Output: + index = GetIndexIntoMasterTable(COMMAND, DAC1OutputControl); + name = "DAC1OutputControl"; + break; + case atomDAC2Output: + index = GetIndexIntoMasterTable(COMMAND, DAC2OutputControl); + name = "DAC2OutputContro"; + break; + default: + return version; + } + + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + DEBUG_VERSION_NAME(index, handle, name, version); + return version; +} + +/* + * + */ +Bool +AtomDACLoadDetection(atomBiosHandlePtr handle, enum atomDevice Device, enum atomDAC dac) +{ + AtomBiosArgRec data; + union + { + DAC_LOAD_DETECTION_PARAMETERS ld; + DAC_LOAD_DETECTION_PS_ALLOCATION lda; + } ps; + + RHDFUNC(handle); + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection); + ps.ld.ucMisc = 0; + + switch (Device) { + case atomCRT1: + ps.ld.usDeviceID = ATOM_DEVICE_CRT1_SUPPORT; + break; + case atomCRT2: + ps.ld.usDeviceID = ATOM_DEVICE_CRT2_SUPPORT; + break; + case atomTV1: + ps.ld.usDeviceID = ATOM_DEVICE_TV1_SUPPORT; + ps.ld.ucMisc = DAC_LOAD_MISC_YPrPb; + break; + case atomTV2: + ps.ld.usDeviceID = ATOM_DEVICE_TV2_SUPPORT; + ps.ld.ucMisc = DAC_LOAD_MISC_YPrPb; + break; + case atomCV: + ps.ld.usDeviceID = ATOM_DEVICE_CV_SUPPORT; + break; + case atomLCD1: + case atomDFP1: + case atomLCD2: + case atomDFP2: + case atomDFP3: + case atomDFP4: + case atomDFP5: + case atomNone: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "Unsupported device for load detection.\n"); + return FALSE; + } + switch (dac) { + case atomDACA: + ps.ld.ucDacType = ATOM_DAC_A; + break; + case atomDACB: + ps.ld.ucDacType = ATOM_DAC_B; + break; + case atomDACExt: + ps.ld.ucDacType = ATOM_EXT_DAC; + break; + } + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling DAC_LoadDetection\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "DAC_LoadDetection Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "DAC_LoadDetection Failed\n"); + + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +AtomDACLoadDetectionVersion(atomBiosHandlePtr handle, enum atomDevice id) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, DAC_LoadDetection); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + + return version; +} + +/* + * + */ +Bool +rhdAtomEncoderControl(atomBiosHandlePtr handle, enum atomEncoder EncoderId, + enum atomEncoderAction Action, struct atomEncoderConfig *Config) +{ + AtomBiosArgRec data; + char *name = NULL; + CARD8 version; + + union + { + DAC_ENCODER_CONTROL_PARAMETERS dac; + DAC_ENCODER_CONTROL_PS_ALLOCATION dac_a; + TV_ENCODER_CONTROL_PARAMETERS tv; + TV_ENCODER_CONTROL_PS_ALLOCATION tv_a; + LVDS_ENCODER_CONTROL_PARAMETERS lvds; + LVDS_ENCODER_CONTROL_PS_ALLOCATION lvds_a; + DIG_ENCODER_CONTROL_PARAMETERS dig; + DIG_ENCODER_CONTROL_PS_ALLOCATION dig_a; + EXTERNAL_ENCODER_CONTROL_PARAMETER ext; + EXTERNAL_ENCODER_CONTROL_PS_ALLOCATION ext_a; + DVO_ENCODER_CONTROL_PARAMETERS dvo; + DVO_ENCODER_CONTROL_PS_ALLOCATION dvo_a; + DVO_ENCODER_CONTROL_PARAMETERS_V3 dvo_v3; + DVO_ENCODER_CONTROL_PS_ALLOCATION_V3 dvo_v3_a; + LVDS_ENCODER_CONTROL_PARAMETERS_V2 lvdsv2; + LVDS_ENCODER_CONTROL_PS_ALLOCATION_V2 lvds2_a; + USHORT usPixelClock; + } ps; + + RHDFUNC(handle); + + ps.usPixelClock = Config->PixelClock / 10; + + switch (EncoderId) { + case atomEncoderDACA: + case atomEncoderDACB: + if (EncoderId == atomEncoderDACA) { + name = "DACAEncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl); + } else { + name = "DACBEncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl); + } + { + DAC_ENCODER_CONTROL_PARAMETERS *dac = &ps.dac; + switch (Config->u.dac.DacStandard) { + case atomDAC_VGA: + dac->ucDacStandard = ATOM_DAC1_PS2; + break; + case atomDAC_CV: + dac->ucDacStandard = ATOM_DAC1_CV; + break; + case atomDAC_NTSC: + dac->ucDacStandard = ATOM_DAC1_NTSC; + break; + case atomDAC_PAL: + dac->ucDacStandard = ATOM_DAC1_PAL; + break; + } + switch (Action) { + case atomEncoderOn: + dac->ucAction = ATOM_ENABLE; + break; + case atomEncoderOff: + dac->ucAction = ATOM_DISABLE; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: DAC unknown action\n",__func__); + return FALSE; + } + } + break; + case atomEncoderTV: + data.exec.index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl); + name = "TVAEncoderControl"; + { + TV_ENCODER_CONTROL_PARAMETERS *tv = &ps.tv; + switch (Config->u.tv.TvStandard) { + case RHD_TV_NTSC: + tv->ucTvStandard = ATOM_TV_NTSC; + break; + case RHD_TV_NTSCJ: + tv->ucTvStandard = ATOM_TV_NTSCJ; + break; + case RHD_TV_PAL: + tv->ucTvStandard = ATOM_TV_PAL; + break; + case RHD_TV_PALM: + tv->ucTvStandard = ATOM_TV_PALM; + break; + case RHD_TV_PALCN: + tv->ucTvStandard = ATOM_TV_PALCN; + break; + case RHD_TV_PALN: + tv->ucTvStandard = ATOM_TV_PALN; + break; + case RHD_TV_PAL60: + tv->ucTvStandard = ATOM_TV_PAL60; + break; + case RHD_TV_SECAM: + tv->ucTvStandard = ATOM_TV_SECAM; + break; + case RHD_TV_CV: + tv->ucTvStandard = ATOM_TV_CV; + break; + case RHD_TV_NONE: + return FALSE; + } + switch (Action) { + case atomEncoderOn: + tv->ucAction = ATOM_ENABLE; + break; + case atomEncoderOff: + tv->ucAction = ATOM_DISABLE; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: TV unknown action\n",__func__); + return FALSE; + } + } + break; + case atomEncoderTMDS1: + case atomEncoderTMDS2: + case atomEncoderLVDS: + if (EncoderId == atomEncoderLVDS) { + name = "LVDSEncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl); + } else if (EncoderId == atomEncoderTMDS1) { + name = "TMDSAEncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, TMDSAEncoderControl); + } else { + name = "LVTMAEncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, LVTMAEncoderControl); + } + if (!rhdAtomGetCommandTableRevisionSize(handle, data.exec.index, &version, NULL, NULL)) + return FALSE; + switch (version) { + case 1: + { + LVDS_ENCODER_CONTROL_PARAMETERS *lvds = &ps.lvds; + lvds->ucMisc = 0; + if (Config->u.lvds.LinkCnt == atomDualLink) + lvds->ucMisc |= 0x1; + if (Config->u.lvds.Is24bit) + lvds->ucMisc |= 0x1 << 1; + + switch (Action) { + case atomEncoderOn: + lvds->ucAction = ATOM_ENABLE; + break; + case atomEncoderOff: + lvds->ucAction = ATOM_DISABLE; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: LVDS unknown action\n",__func__); + return FALSE; + } + break; + } + case 2: + case 3: + { + LVDS_ENCODER_CONTROL_PARAMETERS_V2 *lvds = &ps.lvdsv2; + + lvds->ucMisc = 0; + if (Config->u.lvds2.LinkCnt == atomDualLink) + lvds->ucMisc |= PANEL_ENCODER_MISC_DUAL; + if (Config->u.lvds2.Coherent) + lvds->ucMisc |= PANEL_ENCODER_MISC_COHERENT; + if (Config->u.lvds2.LinkB) + lvds->ucMisc |= PANEL_ENCODER_MISC_TMDS_LINKB; + if (Config->u.lvds2.Hdmi) + lvds->ucMisc |= PANEL_ENCODER_MISC_HDMI_TYPE; + lvds->ucTruncate = 0; + lvds->ucSpatial = 0; + lvds->ucTemporal = 0; + lvds->ucFRC = 0; + + if (EncoderId == atomEncoderLVDS) { + if (Config->u.lvds2.Is24bit) { + lvds->ucTruncate |= PANEL_ENCODER_TRUNCATE_DEPTH; + lvds->ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_DEPTH; + lvds->ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_DEPTH; + } + switch (Config->u.lvds2.TemporalGrey) { + case atomTemporalDither0: + break; + case atomTemporalDither4: + lvds->ucTemporal |= PANEL_ENCODER_TEMPORAL_LEVEL_4; + case atomTemporalDither2: + lvds->ucTemporal |= PANEL_ENCODER_TEMPORAL_DITHER_EN; + break; + } + if (Config->u.lvds2.SpatialDither) + lvds->ucSpatial |= PANEL_ENCODER_SPATIAL_DITHER_EN; + } + + switch (Action) { + case atomEncoderOn: + lvds->ucAction = ATOM_ENABLE; + break; + case atomEncoderOff: + lvds->ucAction = ATOM_DISABLE; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: LVDS2 unknown action\n",__func__); + return FALSE; + } + break; + } + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: LVDS unknown version\n",__func__); + return FALSE; + } + break; + case atomEncoderDIG1: + case atomEncoderDIG2: + case atomEncoderExternal: + { + DIG_ENCODER_CONTROL_PARAMETERS *dig = &ps.dig; + struct atomCodeTableVersion version; + + if (EncoderId == atomEncoderDIG1) { + name = "DIG1EncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); + } else if (EncoderId == atomEncoderDIG2) { + name = "DIG2EncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); + } else { + name = "ExternalEncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl); + } + rhdAtomGetCommandTableRevisionSize(handle, data.exec.index, &version.cref, &version.fref, NULL); + if (version.fref > 1 || version.cref > 2) + return FALSE; + + dig->ucConfig = 0; + switch (version.cref) { + case 1: + switch (Config->u.dig.Link) { + case atomTransLinkA: + dig->ucConfig |= ATOM_ENCODER_CONFIG_LINKA; + break; + case atomTransLinkAB: + dig->ucConfig |= ATOM_ENCODER_CONFIG_LINKA_B; + break; + case atomTransLinkB: + dig->ucConfig |= ATOM_ENCODER_CONFIG_LINKB; + break; + case atomTransLinkBA: + dig->ucConfig |= ATOM_ENCODER_CONFIG_LINKB_A; + break; + } + + if (EncoderId != atomEncoderExternal) { + switch (Config->u.dig.Transmitter) { + case atomTransmitterUNIPHY: + case atomTransmitterPCIEPHY: + case atomTransmitterDIG1: + dig->ucConfig |= ATOM_ENCODER_CONFIG_UNIPHY; + break; + case atomTransmitterLVTMA: + case atomTransmitterDIG2: + dig->ucConfig |= ATOM_ENCODER_CONFIG_LVTMA; + break; + /* + * these are not DCE3.0 but we need them here as DIGxEncoderControl tables for + * DCE3.2 still report cref 1. + */ + case atomTransmitterUNIPHY1: + dig->ucConfig |= ATOM_ENCODER_CONFIG_V2_TRANSMITTER2; + break; + case atomTransmitterUNIPHY2: + dig->ucConfig |= ATOM_ENCODER_CONFIG_V2_TRANSMITTER3; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: Invalid Transmitter for DCE3.0: %x\n", + __func__, Config->u.dig.Transmitter); + return FALSE; + } + } + break; + + case 2: + switch (Config->u.dig.Link) { + case atomTransLinkA: + case atomTransLinkAB: + dig->ucConfig |= ATOM_ENCODER_CONFIG_V2_LINKA; + break; + case atomTransLinkB: + case atomTransLinkBA: + dig->ucConfig |= ATOM_ENCODER_CONFIG_V2_LINKB; + break; + } + switch (Config->u.dig.Transmitter) { + case atomTransmitterUNIPHY: + dig->ucConfig |= ATOM_ENCODER_CONFIG_UNIPHY; + break; + case atomTransmitterUNIPHY1: + dig->ucConfig |= ATOM_ENCODER_CONFIG_V2_TRANSMITTER2; + break; + case atomTransmitterUNIPHY2: + dig->ucConfig |= ATOM_ENCODER_CONFIG_V2_TRANSMITTER3; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: Invalid Encoder for DCE3.2: %x\n", + __func__, Config->u.dig.Transmitter); + return FALSE; + } + break; + + default: + return FALSE; + } + + switch (Config->u.dig.EncoderMode) { + case atomDVI: + dig->ucEncoderMode = ATOM_ENCODER_MODE_DVI; + break; + case atomDP: + dig->ucEncoderMode = ATOM_ENCODER_MODE_DP; + break; + case atomLVDS: + dig->ucEncoderMode = ATOM_ENCODER_MODE_LVDS; + break; + case atomHDMI: + dig->ucEncoderMode = ATOM_ENCODER_MODE_HDMI; + break; + case atomSDVO: + dig->ucEncoderMode = ATOM_ENCODER_MODE_SDVO; + break; + case atomNoEncoder: + case atomTVComposite: + case atomTVSVideo: + case atomTVComponent: + case atomCRT: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s called with invalid DIG encoder mode %i\n", + __func__,Config->u.dig.EncoderMode); + return FALSE; + break; + } + + switch (Action) { + case atomEncoderOn: + dig->ucAction = ATOM_ENABLE; + break; + case atomEncoderOff: + dig->ucAction = ATOM_DISABLE; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: DIG unknown action\n",__func__); + return FALSE; + } + + switch (Config->u.dig.LinkCnt) { + case atomSingleLink: + dig->ucLaneNum = 4; + break; + case atomDualLink: + dig->ucLaneNum = 8; + break; + } + break; + case atomEncoderDVO: + name = "DVOEncoderControl"; + data.exec.index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); + if (!rhdAtomGetCommandTableRevisionSize(handle, data.exec.index, &version.cref, NULL, NULL)) + return FALSE; + switch (version.cref) { + case 1: + case 2: + { + DVO_ENCODER_CONTROL_PARAMETERS *dvo = &ps.dvo; + dvo->usEncoderID = Config->u.dvo.EncoderID; + switch (Config->u.dvo.DvoDeviceType) { + case atomLCD1: + case atomLCD2: + dvo->ucDeviceType = ATOM_DEVICE_LCD1_INDEX; + break; + case atomCRT1: + case atomCRT2: + dvo->ucDeviceType = ATOM_DEVICE_CRT1_INDEX; + break; + case atomDFP1: + case atomDFP2: + case atomDFP3: + case atomDFP4: + case atomDFP5: + dvo->ucDeviceType = ATOM_DEVICE_DFP1_INDEX; + break; + case atomTV1: + case atomTV2: + dvo->ucDeviceType = ATOM_DEVICE_TV1_INDEX; + break; + case atomCV: + dvo->ucDeviceType = ATOM_DEVICE_CV_INDEX; + break; + case atomNone: + return FALSE; + } + if (Config->u.dvo.digital) { + dvo->usDevAttr.sDigAttrib.ucAttribute = 0; /* @@@ What do these attributes mean? */ + } else { + switch (Config->u.dvo.u.TVMode) { + case RHD_TV_NTSC: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_NTSC; + break; + case RHD_TV_NTSCJ: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_NTSCJ; + break; + case RHD_TV_PAL: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_PAL; + break; + case RHD_TV_PALM: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_PALM; + break; + case RHD_TV_PALCN: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_PALCN; + break; + case RHD_TV_PALN: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_PALN; + break; + case RHD_TV_PAL60: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_PAL60; + break; + case RHD_TV_SECAM: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_SECAM; + break; + case RHD_TV_CV: + dvo->usDevAttr.sAlgAttrib.ucTVStandard = ATOM_TV_CV; + break; + case RHD_TV_NONE: + return FALSE; + } + } + switch (Action) { + case atomEncoderOn: + dvo->ucAction = ATOM_ENABLE; + break; + case atomEncoderOff: + dvo->ucAction = ATOM_DISABLE; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: DVO unknown action\n",__func__); + return FALSE; + } + break; + } + case 3: + { + DVO_ENCODER_CONTROL_PARAMETERS_V3 *dvo = &ps.dvo_v3; + dvo->ucDVOConfig = 0; + if (Config->u.dvo3.Rate == atomDVO_RateSDR) + dvo->ucDVOConfig |= DVO_ENCODER_CONFIG_SDR_SPEED; + else + dvo->ucDVOConfig |= DVO_ENCODER_CONFIG_DDR_SPEED; + switch (Config->u.dvo3.DvoOutput) { + case atomDVO_OutputLow12Bit: + dvo->ucDVOConfig = DVO_ENCODER_CONFIG_LOW12BIT; + break; + case atomDVO_OutputHigh12Bit: + dvo->ucDVOConfig = DVO_ENCODER_CONFIG_UPPER12BIT; + break; + case atomDVO_Output24Bit: + dvo->ucDVOConfig = DVO_ENCODER_CONFIG_24BIT; + break; + } + switch (Action) { + case atomEncoderOn: + dvo->ucAction = ATOM_ENABLE; + break; + case atomEncoderOff: + dvo->ucAction = ATOM_DISABLE; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: DVO3 unknown action\n",__func__); + return FALSE; + } + break; + } + } + break; + } + case atomEncoderNone: + return FALSE; + } + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling %s\n",name); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "%s Successful\n",name); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "%s Failed\n",name); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomEncoderControlVersion(atomBiosHandlePtr handle, enum atomEncoder EncoderId) +{ + struct atomCodeTableVersion version = { 0, 0 }; + int index; + char *name; + + switch (EncoderId) { + case atomEncoderDACA: + index = GetIndexIntoMasterTable(COMMAND, DAC1EncoderControl); + name = "DAC1EncoderControl"; + break; + case atomEncoderDACB: + index = GetIndexIntoMasterTable(COMMAND, DAC2EncoderControl); + name = "DAC2EncoderControl"; + break; + case atomEncoderTV: + index = GetIndexIntoMasterTable(COMMAND, TVEncoderControl); + name = "TVEncoderControl"; + break; + case atomEncoderTMDS1: + case atomEncoderTMDS2: + index = GetIndexIntoMasterTable(COMMAND, TMDSAEncoderControl); + name = "TMDSAEncoderControl"; + break; + case atomEncoderLVDS: + index = GetIndexIntoMasterTable(COMMAND, LVDSEncoderControl); + name = " LVDSEncoderControl"; + break; + case atomEncoderDIG1: + index = GetIndexIntoMasterTable(COMMAND, DIG1EncoderControl); + name = "DIG1EncoderControl"; + break; + case atomEncoderDIG2: + index = GetIndexIntoMasterTable(COMMAND, DIG2EncoderControl); + name = "DIG2EncoderControl"; + break; + case atomEncoderExternal: + index = GetIndexIntoMasterTable(COMMAND, ExternalEncoderControl); + name = "ExternalEncoderControl"; + break; + case atomEncoderDVO: + index = GetIndexIntoMasterTable(COMMAND, DVOEncoderControl); + name = "DVOEncoderControl"; + break; + default: + return version; + } + + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION_NAME(index, handle, name, version); + + return version; +} + +/* + * + */ +Bool +rhdAtomUpdateCRTC_DoubleBufferRegisters(atomBiosHandlePtr handle, enum atomCrtc CrtcId, + enum atomCrtcAction Action) +{ + AtomBiosArgRec data; + union + { + ENABLE_CRTC_PARAMETERS crtc; + ENABLE_CRTC_PS_ALLOCATION crtc_a; + } ps; + + RHDFUNC(handle); + + switch (CrtcId) { + case atomCrtc1: + ps.crtc.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.crtc.ucCRTC = ATOM_CRTC2; + break; + } + + switch (Action) { + case atomCrtcEnable: + ps.crtc.ucEnable = ATOM_ENABLE; + break; + case atomCrtcDisable: + ps.crtc.ucEnable = ATOM_DISABLE; + break; + } + + data.exec.index = GetIndexIntoMasterTable(COMMAND, UpdateCRTC_DoubleBufferRegisters); + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling UpdateCRTC_DoubleBufferRegisters\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "UpdateCRTC_DoubleBufferRegisters Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "UpdateCRTC_DoubleBufferRegisters Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomUpdateCRTC_DoubleBufferRegistersVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, UpdateCRTC_DoubleBufferRegisters); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + + return version; +} + +/* + * + */ +Bool +rhdAtomEnableCrtc(atomBiosHandlePtr handle, enum atomCrtc CrtcId, + enum atomCrtcAction Action) +{ + AtomBiosArgRec data; + union + { + ENABLE_CRTC_PARAMETERS crtc; + ENABLE_CRTC_PS_ALLOCATION crtc_a; + } ps; + + RHDFUNC(handle); + + switch (CrtcId) { + case atomCrtc1: + ps.crtc.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.crtc.ucCRTC = ATOM_CRTC2; + break; + } + + switch (Action) { + case atomCrtcEnable: + ps.crtc.ucEnable = ATOM_ENABLE; + break; + case atomCrtcDisable: + ps.crtc.ucEnable = ATOM_DISABLE; + break; + } + + data.exec.index = GetIndexIntoMasterTable(COMMAND, EnableCRTC); + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling EnableCRTC\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "EnableCRTC Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "EnableCRTC Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomEnableCrtcVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, EnableCRTC); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + + return version; +} + +/* + * + */ +Bool +rhdAtomEnableCrtcMemReq(atomBiosHandlePtr handle, enum atomCrtc CrtcId, + enum atomCrtcAction Action) +{ + AtomBiosArgRec data; + union + { + ENABLE_CRTC_PARAMETERS crtc; + ENABLE_CRTC_PS_ALLOCATION crtc_a; + } ps; + + RHDFUNC(handle); + + switch (CrtcId) { + case atomCrtc1: + ps.crtc.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.crtc.ucCRTC = ATOM_CRTC2; + break; + } + + switch (Action) { + case atomCrtcEnable: + ps.crtc.ucEnable = ATOM_ENABLE; + break; + case atomCrtcDisable: + ps.crtc.ucEnable = ATOM_DISABLE; + break; + } + + data.exec.index = GetIndexIntoMasterTable(COMMAND, EnableCRTCMemReq); + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling EnableCRTCMemReq\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "EnableCRTCMemReq Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "EnableCRTCMemReq Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomEnableCrtcMemReqVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, EnableCRTCMemReq); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + + return version; + +} + +/* + * + */ +Bool +rhdAtomSetCRTCTimings(atomBiosHandlePtr handle, enum atomCrtc id, DisplayModePtr mode, int depth) +{ + AtomBiosArgRec data; + union + { + SET_CRTC_TIMING_PARAMETERS crtc; +/* SET_CRTC_TIMING_PS_ALLOCATION crtc_a; */ + } ps; + ATOM_MODE_MISC_INFO_ACCESS* msc = &(ps.crtc.susModeMiscInfo); + + RHDFUNC(handle); + + ps.crtc.usH_Total = mode->CrtcHTotal; + ps.crtc.usH_Disp = mode->CrtcHDisplay; + ps.crtc.usH_SyncStart = mode->CrtcHSyncStart; + ps.crtc.usH_SyncWidth = mode->CrtcHSyncEnd - mode->CrtcHSyncStart; + ps.crtc.usV_Total = mode->CrtcVTotal; + ps.crtc.usV_Disp = mode->CrtcVDisplay; + ps.crtc.usV_SyncStart = mode->CrtcVSyncStart; + ps.crtc.usV_SyncWidth = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; + ps.crtc.ucOverscanRight = mode->CrtcHBlankStart - mode->CrtcHDisplay; + ps.crtc.ucOverscanLeft = mode->CrtcVTotal - mode->CrtcVBlankEnd; + ps.crtc.ucOverscanBottom = mode->CrtcVBlankStart - mode->CrtcVDisplay; + ps.crtc.ucOverscanTop = mode->CrtcVTotal - mode->CrtcVBlankEnd; + switch (id) { + case atomCrtc1: + ps.crtc.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.crtc.ucCRTC = ATOM_CRTC2; + break; + } + + msc->sbfAccess.HorizontalCutOff = 0; + msc->sbfAccess.HSyncPolarity = (mode->Flags & V_NHSYNC) ? 1 : 0; + msc->sbfAccess.VSyncPolarity = (mode->Flags & V_NVSYNC) ? 1 : 0; + msc->sbfAccess.VerticalCutOff = 0; + msc->sbfAccess.H_ReplicationBy2 = 0; + msc->sbfAccess.V_ReplicationBy2 = (mode->Flags & V_DBLSCAN) ? 1 : 0; + msc->sbfAccess.CompositeSync = (mode->Flags & V_CSYNC); + msc->sbfAccess.Interlace = (mode->Flags & V_INTERLACE) ? 1 : 0; + msc->sbfAccess.DoubleClock = (mode->Flags & V_DBLCLK) ? 1 : 0; + msc->sbfAccess.RGB888 = (depth == 24) ? 1 : 0; + + data.exec.index = GetIndexIntoMasterTable(COMMAND, SetCRTC_Timing); + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling SetCRTC_Timing\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "SetCRTC_Timing Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "SetCRTC_Timing Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomSetCRTCTimingsVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, SetCRTC_Timing); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + return version; + +} + +/* + * + */ +Bool +rhdAtomSetCRTCOverscan(atomBiosHandlePtr handle, enum atomCrtc id, struct atomCrtcOverscan *config) +{ + AtomBiosArgRec data; + union + { + SET_CRTC_OVERSCAN_PARAMETERS ovscn; + SET_CRTC_OVERSCAN_PS_ALLOCATION ovscn_a; + } ps; + + RHDFUNC(handle); + + data.exec.index = GetIndexIntoMasterTable(COMMAND, SetCRTC_OverScan); + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + switch(id) { + case atomCrtc1: + ps.ovscn.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.ovscn.ucCRTC = ATOM_CRTC2; + break; + } + ps.ovscn.usOverscanRight = config->ovscnRight; + ps.ovscn.usOverscanLeft = config->ovscnLeft; + ps.ovscn.usOverscanBottom = config->ovscnBottom; + ps.ovscn.usOverscanTop = config->ovscnTop; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "CallingSetCRTC_OverScan\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "Set CRTC_OverScan Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "SetCRTC_OverScan Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomSetCRTCOverscanVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, SetCRTC_OverScan); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + return version; +} + +/* + * + */ +Bool +rhdAtomBlankCRTC(atomBiosHandlePtr handle, enum atomCrtc id, struct atomCrtcBlank *config) +{ + AtomBiosArgRec data; + union + { + BLANK_CRTC_PARAMETERS blank; + BLANK_CRTC_PS_ALLOCATION blank_a; + } ps; + + RHDFUNC(handle); + + data.exec.index = GetIndexIntoMasterTable(COMMAND, BlankCRTC); + data.exec.pspace = &ps; + data.exec.dataSpace = NULL; + + switch(id) { + case atomCrtc1: + ps.blank.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.blank.ucCRTC = ATOM_CRTC2; + break; + } + switch (config->Action) { + case atomBlankOn: + ps.blank.ucBlanking = ATOM_BLANKING; + break; + case atomBlankOff: + ps.blank.ucBlanking = ATOM_BLANKING_OFF; + break; + } + ps.blank.usBlackColorRCr = config->r; + ps.blank.usBlackColorGY = config->g; + ps.blank.usBlackColorBCb = config->b; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling BlankCRTC\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "BlankCRTC Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "BlankCRTC Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomBlankCRTCVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, BlankCRTC); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + return version; +} + +/* + * + */ +static int +atomGetDevice(atomBiosHandlePtr handle, enum atomDevice Device) +{ + switch (Device) { + case atomCRT1: + return ATOM_DEVICE_CRT1_INDEX; + case atomLCD1: + return ATOM_DEVICE_LCD1_INDEX; + case atomTV1: + return ATOM_DEVICE_TV1_INDEX; + case atomDFP1: + return ATOM_DEVICE_DFP1_INDEX; + case atomCRT2: + return ATOM_DEVICE_CRT2_INDEX; + case atomLCD2: + return ATOM_DEVICE_LCD2_INDEX; + case atomTV2: + return ATOM_DEVICE_TV2_INDEX; + case atomDFP2: + return ATOM_DEVICE_DFP2_INDEX; + case atomCV: + return ATOM_DEVICE_CV_INDEX; + case atomDFP3: + return ATOM_DEVICE_DFP3_INDEX; + case atomDFP4: + return ATOM_DEVICE_DFP4_INDEX; + case atomDFP5: + return ATOM_DEVICE_DFP5_INDEX; + case atomNone: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "Invalid Device\n"); + return ATOM_MAX_SUPPORTED_DEVICE; + } + + return ATOM_MAX_SUPPORTED_DEVICE; +} + +/* + * + */ +Bool +rhdAtomSetPixelClock(atomBiosHandlePtr handle, enum atomPxclk PCLKId, struct atomPixelClockConfig *Config) +{ + AtomBiosArgRec data; + CARD8 version; + Bool NeedMode = FALSE; + union { + PIXEL_CLOCK_PARAMETERS pclk; + PIXEL_CLOCK_PARAMETERS_V2 pclk_v2; + PIXEL_CLOCK_PARAMETERS_V3 pclk_v3; + SET_PIXEL_CLOCK_PS_ALLOCATION pclk_a; + } ps; + + data.exec.index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); + + if (!rhdAtomGetCommandTableRevisionSize(handle, data.exec.index, &version, NULL, NULL)) + return FALSE; + switch (version) { + case 1: + if (Config->Enable) + ps.pclk.usPixelClock = Config->PixelClock / 10; + else + ps.pclk.usPixelClock = 0; + ps.pclk.usRefDiv = Config->RefDiv; + ps.pclk.usFbDiv = Config->FbDiv; + ps.pclk.ucPostDiv = Config->PostDiv; + ps.pclk.ucFracFbDiv = Config->FracFbDiv; + ps.pclk.ucRefDivSrc = 0; /* What's this? @@@ */ + switch (PCLKId) { + case atomPclk1: + ps.pclk.ucPpll = ATOM_PPLL1; + break; + case atomPclk2: + ps.pclk.ucPpll = ATOM_PPLL2; + break; + } + switch (Config->Crtc) { + case atomCrtc1: + ps.pclk.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.pclk.ucCRTC = ATOM_CRTC2; + break; + } + break; + case 2: + if (Config->Enable) + ps.pclk_v2.usPixelClock = Config->PixelClock / 10; + else + ps.pclk_v2.usPixelClock = 0; + ps.pclk_v2.usRefDiv = Config->RefDiv; + ps.pclk_v2.usFbDiv = Config->FbDiv; + ps.pclk_v2.ucPostDiv = Config->PostDiv; + ps.pclk_v2.ucFracFbDiv = Config->FracFbDiv; + switch (PCLKId) { + case atomPclk1: + ps.pclk_v2.ucPpll = ATOM_PPLL1; + break; + case atomPclk2: + ps.pclk_v2.ucPpll = ATOM_PPLL2; + break; + } + ps.pclk_v2.ucRefDivSrc = 1; /* See above... @@@ */ + switch (Config->Crtc) { + case atomCrtc1: + ps.pclk_v2.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.pclk_v2.ucCRTC = ATOM_CRTC2; + break; + } + ASSERTF((!Config->Enable || Config->u.v2.Device != atomNone), "Invalid Device Id\n"); + ps.pclk_v2.ucMiscInfo = 0; + ps.pclk_v2.ucMiscInfo |= (Config->u.v2.Force ? MISC_FORCE_REPROG_PIXEL_CLOCK : 0); + if (Config->u.v2.Device != atomNone) + ps.pclk_v2.ucMiscInfo |= (atomGetDevice(handle, Config->u.v2.Device) + << MISC_DEVICE_INDEX_SHIFT); + RHDDebug(handle->scrnIndex,"%s Device: %i PixelClock: %i RefDiv: 0x%x FbDiv: 0x%x PostDiv: 0x%x " + "FracFbDiv: %i PLL: %i Crtc: %i MiscInfo: 0x%x\n", + __func__, + Config->u.v2.Device, + ps.pclk_v2.usPixelClock, + ps.pclk_v2.usRefDiv, + ps.pclk_v2.usFbDiv, + ps.pclk_v2.ucPostDiv, + ps.pclk_v2.ucFracFbDiv, + ps.pclk_v2.ucPpll, + ps.pclk_v2.ucCRTC, + ps.pclk_v2.ucMiscInfo + ); + break; + case 3: + if (Config->Enable) + ps.pclk_v3.usPixelClock = Config->PixelClock / 10; + else + ps.pclk.usPixelClock = 0; + ps.pclk_v3.usRefDiv = Config->RefDiv; + ps.pclk_v3.usFbDiv = Config->FbDiv; + ps.pclk_v3.ucPostDiv = Config->PostDiv; + ps.pclk_v3.ucFracFbDiv = Config->FracFbDiv; + switch (PCLKId) { + case atomPclk1: + ps.pclk_v3.ucPpll = ATOM_PPLL1; + break; + case atomPclk2: + ps.pclk_v3.ucPpll = ATOM_PPLL2; + break; + } + switch (Config->u.v3.OutputType) { + case atomOutputKldskpLvtma: + ps.pclk_v3.ucTransmitterId = ENCODER_OBJECT_ID_INTERNAL_KLDSCP_LVTMA; + NeedMode = TRUE; + break; + case atomOutputUniphyA: + case atomOutputUniphyB: + ps.pclk_v3.ucTransmitterId = ENCODER_OBJECT_ID_INTERNAL_UNIPHY; + NeedMode = TRUE; + break; + case atomOutputUniphyC: + case atomOutputUniphyD: + ps.pclk_v3.ucTransmitterId = ENCODER_OBJECT_ID_INTERNAL_UNIPHY1; + NeedMode = TRUE; + break; + case atomOutputUniphyE: + case atomOutputUniphyF: + ps.pclk_v3.ucTransmitterId = ENCODER_OBJECT_ID_INTERNAL_UNIPHY2; + NeedMode = TRUE; + break; + + case atomOutputDacA: + ps.pclk_v3.ucTransmitterId = ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC1; + break; + case atomOutputDacB: + ps.pclk_v3.ucTransmitterId = ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DAC2; + break; + case atomOutputDvo: + ps.pclk_v3.ucTransmitterId = ENCODER_OBJECT_ID_INTERNAL_KLDSCP_DVO1; + NeedMode = TRUE; + break; + case atomOutputTmdsa: + case atomOutputLvtma: + case atomOutputNone: + return FALSE; + } + if (NeedMode) { + switch (Config->u.v3.EncoderMode) { + case atomNoEncoder: + ps.pclk_v3.ucEncoderMode = 0; + case atomDVI: + ps.pclk_v3.ucEncoderMode = ATOM_ENCODER_MODE_DVI; + break; + case atomDP: + ps.pclk_v3.ucEncoderMode = ATOM_ENCODER_MODE_DP; + break; + case atomLVDS: + ps.pclk_v3.ucEncoderMode = ATOM_ENCODER_MODE_LVDS; + break; + case atomHDMI: + ps.pclk_v3.ucEncoderMode = ATOM_ENCODER_MODE_HDMI; + break; + case atomSDVO: + ps.pclk_v3.ucEncoderMode = ATOM_ENCODER_MODE_SDVO; + break; + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR,"%s: invalid encoder type.\n",__func__); + return FALSE; + } + } + ps.pclk_v3.ucMiscInfo = (Config->u.v3.Force ? PIXEL_CLOCK_MISC_FORCE_PROG_PPLL : 0x0) + | (Config->u.v3.UsePpll ? PIXEL_CLOCK_MISC_USE_ENGINE_FOR_DISPCLK : 0x0) + | ((Config->Crtc == atomCrtc2) ? PIXEL_CLOCK_MISC_CRTC_SEL_CRTC2 : PIXEL_CLOCK_MISC_CRTC_SEL_CRTC1); + + RHDDebug(handle->scrnIndex,"%s PixelClock: %i RefDiv: 0x%x FbDiv: 0x%x PostDiv: 0x%x FracFbDiv: %i PLL: %i " + "OutputType: %x EncoderMode: %x MiscInfo: 0x%x\n", + __func__, + ps.pclk_v3.usPixelClock, + ps.pclk_v3.usRefDiv, + ps.pclk_v3.usFbDiv, + ps.pclk_v3.ucPostDiv, + ps.pclk_v3.ucFracFbDiv, + ps.pclk_v3.ucPpll, + ps.pclk_v3.ucTransmitterId, + ps.pclk_v3.ucEncoderMode, + ps.pclk_v3.ucMiscInfo + ); + break; + default: + return FALSE; + } + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling SetPixelClock\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "SetPixelClock Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "SetPixelClock Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomSetPixelClockVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, SetPixelClock); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + + return version; + +} + +/* + * + */ +Bool +rhdAtomSelectCrtcSource(atomBiosHandlePtr handle, enum atomCrtc CrtcId, + struct atomCrtcSourceConfig *config) +{ + AtomBiosArgRec data; + CARD8 version; + Bool NeedMode = FALSE; + + union + { + SELECT_CRTC_SOURCE_PARAMETERS crtc; + SELECT_CRTC_SOURCE_PS_ALLOCATION crtc_a; + SELECT_CRTC_SOURCE_PARAMETERS_V2 crtc2; +/* SELECT_CRTC_SOURCE_PS_ALLOCATION_V2 crtc2_a; */ + } ps; + + RHDFUNC(handle); + + data.exec.index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source); + + if (!rhdAtomGetCommandTableRevisionSize(handle, data.exec.index, &version, NULL, NULL)) + return FALSE; + + switch (version) { + case 1: + switch (CrtcId) { + case atomCrtc1: + ps.crtc.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.crtc.ucCRTC = ATOM_CRTC2; + break; + } + switch (config->u.Device) { + case atomCRT1: + ps.crtc.ucDevice = ATOM_DEVICE_CRT1_INDEX; + break; + case atomLCD1: + ps.crtc.ucDevice = ATOM_DEVICE_LCD1_INDEX; + break; + case atomTV1: + ps.crtc.ucDevice = ATOM_DEVICE_TV1_INDEX; + break; + case atomDFP1: + ps.crtc.ucDevice = ATOM_DEVICE_DFP1_INDEX; + break; + case atomCRT2: + ps.crtc.ucDevice = ATOM_DEVICE_CRT2_INDEX; + break; + case atomLCD2: + ps.crtc.ucDevice = ATOM_DEVICE_LCD2_INDEX; + break; + case atomTV2: + ps.crtc.ucDevice = ATOM_DEVICE_TV2_INDEX; + break; + case atomDFP2: + ps.crtc.ucDevice = ATOM_DEVICE_DFP2_INDEX; + break; + case atomCV: + ps.crtc.ucDevice = ATOM_DEVICE_CV_INDEX; + break; + case atomDFP3: + ps.crtc.ucDevice = ATOM_DEVICE_DFP3_INDEX; + break; + case atomDFP4: + ps.crtc.ucDevice = ATOM_DEVICE_DFP4_INDEX; + break; + case atomDFP5: + ps.crtc.ucDevice = ATOM_DEVICE_DFP5_INDEX; + break; + case atomNone: + return FALSE; + } + break; + case 2: + switch (CrtcId) { + case atomCrtc1: + ps.crtc2.ucCRTC = ATOM_CRTC1; + break; + case atomCrtc2: + ps.crtc2.ucCRTC = ATOM_CRTC2; + break; + } + switch (config->u.crtc2.Encoder) { + case atomEncoderDACA: + ps.crtc2.ucEncoderID = ASIC_INT_DAC1_ENCODER_ID; + break; + case atomEncoderDACB: + ps.crtc2.ucEncoderID = ASIC_INT_DAC2_ENCODER_ID; + break; + case atomEncoderTV: + ps.crtc2.ucEncoderID = ASIC_INT_TV_ENCODER_ID; + break; + case atomEncoderDVO: + ps.crtc2.ucEncoderID = ASIC_INT_DVO_ENCODER_ID; + NeedMode = TRUE; + break; + case atomEncoderDIG1: + ps.crtc2.ucEncoderID = ASIC_INT_DIG1_ENCODER_ID; + NeedMode = TRUE; + break; + case atomEncoderDIG2: + ps.crtc2.ucEncoderID = ASIC_INT_DIG2_ENCODER_ID; + break; + case atomEncoderExternal: + ps.crtc2.ucEncoderID = ASIC_EXT_DIG_ENCODER_ID; + break; + case atomEncoderTMDS1: + case atomEncoderTMDS2: + case atomEncoderLVDS: + case atomEncoderNone: + return FALSE; + } + if (NeedMode) { + switch (config->u.crtc2.Mode) { + case atomDVI: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_DVI; + break; + case atomDP: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_DP; + break; + case atomLVDS: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_LVDS; + break; + case atomHDMI: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_HDMI; + break; + case atomSDVO: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_SDVO; + break; + case atomTVComposite: + case atomTVSVideo: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_TV; + break; + case atomTVComponent: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_CV; + break; + case atomCRT: + ps.crtc2.ucEncodeMode = ATOM_ENCODER_MODE_CRT; + break; + case atomNoEncoder: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: invalid encoder type.\n",__func__); + return FALSE; + } + } + break; + } + + data.exec.dataSpace = NULL; + data.exec.pspace = &ps; + + xf86DrvMsg(handle->scrnIndex, X_INFO, "Calling SelectCRTCSource\n"); + atomDebugPrintPspace(handle, &data, sizeof(ps)); + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &data) == ATOM_SUCCESS) { + xf86DrvMsg(handle->scrnIndex, X_INFO, "SelectCRTCSource Successful\n"); + return TRUE; + } + xf86DrvMsg(handle->scrnIndex, X_INFO, "SelectCRTCSource Failed\n"); + return FALSE; +} + +/* + * + */ +struct atomCodeTableVersion +rhdAtomSelectCrtcSourceVersion(atomBiosHandlePtr handle) +{ + struct atomCodeTableVersion version; + int index = GetIndexIntoMasterTable(COMMAND, SelectCRTC_Source); + rhdAtomGetCommandTableRevisionSize(handle, index, &version.cref, &version.fref, NULL); + + DEBUG_VERSION(index, handle, version); + + return version; +} + + +# endif /* ATOM_BIOS_PARSER */ + + +static AtomBiosResult +rhdAtomInit(atomBiosHandlePtr unused1, AtomBiosRequestID unused2, + AtomBiosArgPtr data) +{ + int scrnIndex = data->val; + RHDPtr rhdPtr = RHDPTR(xf86Screens[scrnIndex]); + unsigned char *ptr; + atomDataTablesPtr atomDataPtr; + atomBiosHandlePtr handle = NULL; + unsigned int BIOSImageSize = 0; + Bool unposted = FALSE; + unsigned char* codeTable; + + data->atomhandle = NULL; + + RHDFUNCI(scrnIndex); + + if (rhdPtr->BIOSCopy) { + xf86DrvMsg(scrnIndex,X_INFO,"Getting BIOS copy from INT10\n"); + ptr = rhdPtr->BIOSCopy; + rhdPtr->BIOSCopy = NULL; + + BIOSImageSize = ptr[2] * 512; + if (BIOSImageSize > legacyBIOSMax) { + xf86DrvMsg(scrnIndex,X_ERROR,"Invalid BIOS length field\n"); + return ATOM_FAILED; + } + } else { + if (xf86IsEntityPrimary(rhdPtr->entityIndex)) { + int read_len; + unsigned char tmp[32]; + xf86DrvMsg(scrnIndex,X_INFO,"Getting BIOS copy from legacy VBIOS location\n"); + if (xf86ReadBIOS(legacyBIOSLocation, 0, tmp, 32) < 0) { + xf86DrvMsg(scrnIndex,X_ERROR, + "Cannot obtain POSTed BIOS header\n"); + } else { + BIOSImageSize = tmp[2] * 512; + if (BIOSImageSize > legacyBIOSMax) { + xf86DrvMsg(scrnIndex,X_ERROR,"Invalid BIOS length field\n"); + BIOSImageSize = 0; + } else { + if (!(ptr = xcalloc(1,BIOSImageSize))) { + xf86DrvMsg(scrnIndex,X_ERROR, + "Cannot allocate %i bytes of memory " + "for BIOS image\n",BIOSImageSize); + BIOSImageSize = 0; + } else { + if ((read_len = xf86ReadBIOS(legacyBIOSLocation, 0, ptr, BIOSImageSize) + < 0)) { + xf86DrvMsg(scrnIndex,X_ERROR,"Cannot read POSTed BIOS\n"); + BIOSImageSize = 0; + xfree(ptr); + } + } + } + } + } + /* as last resort always try to read BIOS from PCI config space */ + if (BIOSImageSize == 0) { + if (!(BIOSImageSize = RHDReadPCIBios(rhdPtr, &ptr))) + return ATOM_FAILED; + unposted = TRUE; + } + } + + if (!(atomDataPtr = xcalloc(1, sizeof(atomDataTables)))) { + xf86DrvMsg(scrnIndex,X_ERROR,"Cannot allocate memory for " + "ATOM BIOS data tabes\n"); + goto error; + } + if (!rhdAtomGetTables(scrnIndex, ptr, atomDataPtr, &codeTable, BIOSImageSize)) + goto error1; + if (!(handle = xcalloc(1, sizeof(atomBiosHandleRec)))) { + xf86DrvMsg(scrnIndex,X_ERROR,"Cannot allocate memory\n"); + goto error1; + } + handle->BIOSBase = ptr; + handle->atomDataPtr = atomDataPtr; + handle->scrnIndex = scrnIndex; + handle->BIOSImageSize = BIOSImageSize; + handle->codeTable = codeTable; + handle->SaveListObjects = NULL; + +# ifdef ATOM_BIOS_PARSER + /* Try to find out if BIOS has been posted (either by system or int10 */ + if (unposted) { + /* run AsicInit */ + if (!rhdAtomASICInit(handle)) + xf86DrvMsg(scrnIndex, X_WARNING, + "%s: AsicInit failed. Won't be able to obtain in VRAM " + "FB scratch space\n",__func__); + } +# endif + + data->atomhandle = handle; + return ATOM_SUCCESS; + + error1: + xfree(atomDataPtr); + error: + xfree(ptr); + return ATOM_FAILED; +} + +static AtomBiosResult +rhdAtomTearDown(atomBiosHandlePtr handle, + AtomBiosRequestID unused1, AtomBiosArgPtr unused2) +{ + RHDFUNC(handle); + + xfree(handle->BIOSBase); + xfree(handle->atomDataPtr); + if (handle->scratchBase) xfree(handle->scratchBase); + xfree(handle); + return ATOM_SUCCESS; +} + +static AtomBiosResult +rhdAtomVramInfoQuery(atomBiosHandlePtr handle, AtomBiosRequestID func, + AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD32 *val = &data->val; + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + switch (func) { + case ATOM_GET_FW_FB_START: + *val = atomDataPtr->VRAM_UsageByFirmware + ->asFirmwareVramReserveInfo[0].ulStartAddrUsedByFirmware; + break; + case ATOM_GET_FW_FB_SIZE: + *val = atomDataPtr->VRAM_UsageByFirmware + ->asFirmwareVramReserveInfo[0].usFirmwareUseInKb; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + return ATOM_SUCCESS; +} + +static AtomBiosResult +rhdAtomTmdsInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD32 *val = &data->val; + int i = 0, clock = *val; + + atomDataPtr = handle->atomDataPtr; + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->TMDS_Info), + NULL,NULL,NULL)) { + return ATOM_FAILED; + } + + RHDFUNC(handle); + + if (func == ATOM_TMDS_MAX_FREQUENCY) + *val = atomDataPtr->TMDS_Info->usMaxFrequency * 10; + else { + if (clock > atomDataPtr->TMDS_Info->usMaxFrequency * 10) + return ATOM_FAILED; + + for (;i < ATOM_MAX_MISC_INFO; i++) { + if (clock < atomDataPtr->TMDS_Info->asMiscInfo[i].usFrequency * 10) { + switch (func) { + case ATOM_TMDS_PLL_CHARGE_PUMP: + *val = atomDataPtr->TMDS_Info->asMiscInfo[i].ucPLL_ChargePump; + break; + case ATOM_TMDS_PLL_DUTY_CYCLE: + *val = atomDataPtr->TMDS_Info->asMiscInfo[i].ucPLL_DutyCycle; + break; + case ATOM_TMDS_PLL_VCO_GAIN: + *val = atomDataPtr->TMDS_Info->asMiscInfo[i].ucPLL_VCO_Gain; + break; + case ATOM_TMDS_PLL_VOLTAGE_SWING: + *val = atomDataPtr->TMDS_Info->asMiscInfo[i].ucPLL_VoltageSwing; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + break; + } + } + } + + if (i > ATOM_MAX_MISC_INFO) + return ATOM_FAILED; + + return ATOM_SUCCESS; +} + +static DisplayModePtr +rhdAtomLvdsTimings(atomBiosHandlePtr handle, ATOM_DTD_FORMAT *dtd) +{ + DisplayModePtr mode; +#define NAME_LEN 16 + char name[NAME_LEN]; + + RHDFUNC(handle); + + if (!(mode = (DisplayModePtr)xcalloc(1,sizeof(DisplayModeRec)))) + return NULL; + + mode->CrtcHDisplay = mode->HDisplay = dtd->usHActive; + mode->CrtcVDisplay = mode->VDisplay = dtd->usVActive; + mode->CrtcHBlankStart = dtd->usHActive + dtd->ucHBorder; + mode->CrtcHBlankEnd = mode->CrtcHBlankStart + dtd->usHBlanking_Time; + mode->CrtcHTotal = mode->HTotal = mode->CrtcHBlankEnd + dtd->ucHBorder; + mode->CrtcVBlankStart = dtd->usVActive + dtd->ucVBorder; + mode->CrtcVBlankEnd = mode->CrtcVBlankStart + dtd->usVBlanking_Time; + mode->CrtcVTotal = mode->VTotal = mode->CrtcVBlankEnd + dtd->ucVBorder; + mode->CrtcHSyncStart = mode->HSyncStart = dtd->usHActive + dtd->usHSyncOffset; + mode->CrtcHSyncEnd = mode->HSyncEnd = mode->HSyncStart + dtd->usHSyncWidth; + mode->CrtcVSyncStart = mode->VSyncStart = dtd->usVActive + dtd->usVSyncOffset; + mode->CrtcVSyncEnd = mode->VSyncEnd = mode->VSyncStart + dtd->usVSyncWidth; + + mode->SynthClock = mode->Clock = dtd->usPixClk * 10; + + mode->HSync = ((float) mode->Clock) / ((float)mode->HTotal); + mode->VRefresh = (1000.0 * ((float) mode->Clock)) + / ((float)(((float)mode->HTotal) * ((float)mode->VTotal))); + + snprintf(name, NAME_LEN, "%dx%d", + mode->HDisplay, mode->VDisplay); + mode->name = xstrdup(name); + + RHDDebug(handle->scrnIndex,"%s: LVDS Modeline: %s " + "%2.d %i (%i) %i %i (%i) %i %i (%i) %i %i (%i) %i\n", + __func__, mode->name, mode->Clock, + mode->HDisplay, mode->CrtcHBlankStart, mode->HSyncStart, mode->CrtcHSyncEnd, + mode->CrtcHBlankEnd, mode->HTotal, + mode->VDisplay, mode->CrtcVBlankStart, mode->VSyncStart, mode->VSyncEnd, + mode->CrtcVBlankEnd, mode->VTotal); +#undef NAME_LEN + return mode; +} + +static unsigned char* +rhdAtomLvdsDDC(atomBiosHandlePtr handle, CARD32 offset, unsigned char *record) +{ + unsigned char *EDIDBlock; + + RHDFUNC(handle); + + while (*record != ATOM_RECORD_END_TYPE) { + + switch (*record) { + case LCD_MODE_PATCH_RECORD_MODE_TYPE: + offset += sizeof(ATOM_PATCH_RECORD_MODE); + if (offset > handle->BIOSImageSize) break; + record += sizeof(ATOM_PATCH_RECORD_MODE); + break; + + case LCD_RTS_RECORD_TYPE: + offset += sizeof(ATOM_LCD_RTS_RECORD); + if (offset > handle->BIOSImageSize) break; + record += sizeof(ATOM_LCD_RTS_RECORD); + break; + + case LCD_CAP_RECORD_TYPE: + offset += sizeof(ATOM_LCD_MODE_CONTROL_CAP); + if (offset > handle->BIOSImageSize) break; + record += sizeof(ATOM_LCD_MODE_CONTROL_CAP); + break; + + case LCD_FAKE_EDID_PATCH_RECORD_TYPE: + offset += sizeof(ATOM_FAKE_EDID_PATCH_RECORD); + /* check if the structure still fully lives in the BIOS image */ + if (offset > handle->BIOSImageSize) break; + offset += ((ATOM_FAKE_EDID_PATCH_RECORD*)record)->ucFakeEDIDLength + - sizeof(UCHAR); + if (offset > handle->BIOSImageSize) break; + /* dup string as we free it later */ + if (!(EDIDBlock = (unsigned char *)xalloc( + ((ATOM_FAKE_EDID_PATCH_RECORD*)record)->ucFakeEDIDLength))) + return NULL; + memcpy(EDIDBlock,&((ATOM_FAKE_EDID_PATCH_RECORD*)record)->ucFakeEDIDString, + ((ATOM_FAKE_EDID_PATCH_RECORD*)record)->ucFakeEDIDLength); + + /* for testing */ + { + xf86MonPtr mon = xf86InterpretEDID(handle->scrnIndex,EDIDBlock); + xf86PrintEDID(mon); + xfree(mon); + } + return EDIDBlock; + + case LCD_PANEL_RESOLUTION_RECORD_TYPE: + offset += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD); + if (offset > handle->BIOSImageSize) break; + record += sizeof(ATOM_PANEL_RESOLUTION_PATCH_RECORD); + break; + + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s: unknown record type: %x\n",__func__,*record); + return NULL; + } + } + + return NULL; +} + +static AtomBiosResult +rhdAtomLvdsGetTimings(atomBiosHandlePtr handle, AtomBiosRequestID func, + AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + unsigned long offset; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->LVDS_Info.base), + &crev,&frev,NULL)) { + return ATOM_FAILED; + } + + switch (crev) { + + case 1: + switch (func) { + case ATOM_GET_PANEL_MODE: + data->mode = rhdAtomLvdsTimings(handle, + &atomDataPtr->LVDS_Info + .LVDS_Info->sLCDTiming); + if (data->mode) + return ATOM_SUCCESS; + default: + return ATOM_FAILED; + } + case 2: + switch (func) { + case ATOM_GET_PANEL_MODE: + data->mode = rhdAtomLvdsTimings(handle, + &atomDataPtr->LVDS_Info + .LVDS_Info_v12->sLCDTiming); + if (data->mode) + return ATOM_SUCCESS; + return ATOM_FAILED; + + case ATOM_GET_PANEL_EDID: + offset = (unsigned long)&atomDataPtr->LVDS_Info.base + - (unsigned long)handle->BIOSBase + + atomDataPtr->LVDS_Info + .LVDS_Info_v12->usExtInfoTableOffset; + + data->EDIDBlock + = rhdAtomLvdsDDC(handle, offset, + (unsigned char *) + &atomDataPtr->LVDS_Info.base + + atomDataPtr->LVDS_Info + .LVDS_Info_v12->usExtInfoTableOffset); + if (data->EDIDBlock) + return ATOM_SUCCESS; + default: + return ATOM_FAILED; + } + default: + return ATOM_NOT_IMPLEMENTED; + } +/*NOTREACHED*/ +} + +static AtomBiosResult +rhdAtomLvdsInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + CARD32 *val = &data->val; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->LVDS_Info.base), + &crev,&frev,NULL)) { + return ATOM_FAILED; + } + + switch (crev) { + case 1: + switch (func) { + case ATOM_LVDS_SUPPORTED_REFRESH_RATE: + *val = atomDataPtr->LVDS_Info + .LVDS_Info->usSupportedRefreshRate; + break; + case ATOM_LVDS_OFF_DELAY: + *val = atomDataPtr->LVDS_Info + .LVDS_Info->usOffDelayInMs; + break; + case ATOM_LVDS_SEQ_DIG_ONTO_DE: + *val = atomDataPtr->LVDS_Info + .LVDS_Info->ucPowerSequenceDigOntoDEin10Ms * 10; + break; + case ATOM_LVDS_SEQ_DE_TO_BL: + *val = atomDataPtr->LVDS_Info + .LVDS_Info->ucPowerSequenceDEtoBLOnin10Ms * 10; + break; + case ATOM_LVDS_TEMPORAL_DITHER: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info->ucLVDS_Misc & 0x40) != 0; + break; + case ATOM_LVDS_SPATIAL_DITHER: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info->ucLVDS_Misc & 0x20) != 0; + break; + case ATOM_LVDS_FPDI: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info->ucLVDS_Misc & 0x10) != 0; + break; + case ATOM_LVDS_DUALLINK: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info->ucLVDS_Misc & 0x01) != 0; + break; + case ATOM_LVDS_24BIT: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info->ucLVDS_Misc & 0x02) != 0; + break; + case ATOM_LVDS_GREYLVL: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info->ucLVDS_Misc & ATOM_PANEL_MISC_GREY_LEVEL) + >> ATOM_PANEL_MISC_GREY_LEVEL_SHIFT ; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + break; + case 2: + switch (func) { + case ATOM_LVDS_SUPPORTED_REFRESH_RATE: + *val = atomDataPtr->LVDS_Info + .LVDS_Info_v12->usSupportedRefreshRate; + break; + case ATOM_LVDS_OFF_DELAY: + *val = atomDataPtr->LVDS_Info + .LVDS_Info_v12->usOffDelayInMs; + break; + case ATOM_LVDS_SEQ_DIG_ONTO_DE: + *val = atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucPowerSequenceDigOntoDEin10Ms * 10; + break; + case ATOM_LVDS_SEQ_DE_TO_BL: + *val = atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucPowerSequenceDEtoBLOnin10Ms * 10; + break; + case ATOM_LVDS_FPDI: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucLVDS_Misc * 0x10) != 0; + break; + case ATOM_LVDS_SPATIAL_DITHER: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucLVDS_Misc & 0x20) != 0; + break; + case ATOM_LVDS_TEMPORAL_DITHER: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucLVDS_Misc & 0x40) != 0; + break; + case ATOM_LVDS_DUALLINK: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucLVDS_Misc & 0x01) != 0; + break; + case ATOM_LVDS_24BIT: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucLVDS_Misc & 0x02) != 0; + break; + case ATOM_LVDS_GREYLVL: + *val = (atomDataPtr->LVDS_Info + .LVDS_Info_v12->ucLVDS_Misc & 0x0C) >> 2; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + + return ATOM_SUCCESS; +} + +static AtomBiosResult +rhdAtomCompassionateDataQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + CARD32 *val = &data->val; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->CompassionateData), + &crev,&frev,NULL)) { + return ATOM_FAILED; + } + + switch (func) { + case ATOM_DAC1_BG_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC1_BG_Adjustment; + break; + case ATOM_DAC1_DAC_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC1_DAC_Adjustment; + break; + case ATOM_DAC1_FORCE: + *val = atomDataPtr->CompassionateData-> + usDAC1_FORCE_Data; + break; + case ATOM_DAC2_CRTC2_BG_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_CRT2_BG_Adjustment; + break; + case ATOM_DAC2_NTSC_BG_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_NTSC_BG_Adjustment; + break; + case ATOM_DAC2_PAL_BG_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_PAL_BG_Adjustment; + break; + case ATOM_DAC2_CV_BG_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_CV_BG_Adjustment; + break; + case ATOM_DAC2_CRTC2_DAC_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_CRT2_DAC_Adjustment; + break; + case ATOM_DAC2_NTSC_DAC_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_NTSC_DAC_Adjustment; + break; + case ATOM_DAC2_PAL_DAC_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_PAL_DAC_Adjustment; + break; + case ATOM_DAC2_CV_DAC_ADJ: + *val = atomDataPtr->CompassionateData-> + ucDAC2_CV_DAC_Adjustment; + break; + case ATOM_DAC2_CRTC2_FORCE: + *val = atomDataPtr->CompassionateData-> + usDAC2_CRT2_FORCE_Data; + break; + case ATOM_DAC2_CRTC2_MUX_REG_IND: + *val = atomDataPtr->CompassionateData-> + usDAC2_CRT2_MUX_RegisterIndex; + break; + case ATOM_DAC2_CRTC2_MUX_REG_INFO: + *val = atomDataPtr->CompassionateData-> + ucDAC2_CRT2_MUX_RegisterInfo; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + return ATOM_SUCCESS; +} + +/* + * + */ +enum atomPCIELanes atomPCIELanesMap[] = { + atomPCIELaneNONE, + atomPCIELane0_3, + atomPCIELane4_7, + atomPCIELane0_7, + atomPCIELane8_11, + atomPCIELaneNONE, + atomPCIELaneNONE, + atomPCIELaneNONE, + atomPCIELane12_15, + atomPCIELaneNONE, + atomPCIELaneNONE, + atomPCIELaneNONE, + atomPCIELane8_15, + atomPCIELaneNONE, + atomPCIELaneNONE, + atomPCIELaneNONE, + atomPCIELaneNONE +}; + +static AtomBiosResult +rhdAtomIntegratedSystemInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + CARD32 *val = &data->val; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->IntegratedSystemInfo.base), + &crev,&frev,NULL)) { + return ATOM_FAILED; + } + + switch (crev) { + case 1: + switch (func) { + case ATOM_GET_PCIENB_CFG_REG7: + *val = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo->usPCIENBCfgReg7; + break; + case ATOM_GET_CAPABILITY_FLAG: + *val = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo->usCapabilityFlag; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + break; + case 2: + switch (func) { + case ATOM_GET_PCIE_LANES: + { + CARD32 n; + switch (*val) { + case 1: + n = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->ulDDISlot1Config; + break; + case 2: + n = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->ulDDISlot2Config; + break; + default: + return ATOM_FAILED; + } + data->pcieLanes.Chassis = atomPCIELanesMap[n & 0xf]; + data->pcieLanes.Docking = atomPCIELanesMap[(n >> 4) & 0xf]; + RHDDebug(handle->scrnIndex, "AtomBIOS IntegratedSystemInfo PCIELanes: Chassis=%x Docking=%x\n", + data->pcieLanes.Chassis, data->pcieLanes.Docking); + return ATOM_SUCCESS; + } + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + return ATOM_NOT_IMPLEMENTED; + } + + return ATOM_SUCCESS; +} + +static DisplayModePtr +rhdAtomAnalogTVTimings(atomBiosHandlePtr handle, + ATOM_ANALOG_TV_INFO *tv_info, + enum RHD_TV_MODE tvMode) +{ + atomDataTablesPtr atomDataPtr; + DisplayModePtr mode; + int mode_n; + char *name; + ATOM_MODE_TIMING *amt; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + switch (tvMode) { + case NTSC_SUPPORT: + case NTSCJ_SUPPORT: + mode_n = 0; + name = "TV_NTSC"; + break; + case PAL_SUPPORT: + case PALM_SUPPORT: + case PALCN_SUPPORT: + case PALN_SUPPORT: + case PAL60_SUPPORT: + case SECAM_SUPPORT: + mode_n = 1; + name = "TV_PAL/SECAM"; + break; + default: + return NULL; + } + + + if (!(tv_info->ucTV_SupportedStandard & (tvMode))) + return NULL; + + if (!(mode = (DisplayModePtr)xcalloc(1,sizeof(DisplayModeRec)))) + return NULL; + + amt = &tv_info->aModeTimings[mode_n]; + + mode->CrtcHDisplay = mode->HDisplay = amt->usCRTC_H_Disp; + mode->CrtcHSyncStart = mode->HSyncStart = amt->usCRTC_H_SyncStart; + mode->CrtcHSyncEnd = mode->HSyncEnd = mode->HSyncStart + amt->usCRTC_H_SyncWidth; + mode->CrtcHTotal = mode->HTotal = amt->usCRTC_H_Total; + mode->CrtcHBlankStart = mode->HDisplay + amt->usCRTC_OverscanRight; + mode->CrtcHBlankEnd = mode->HTotal - amt->usCRTC_OverscanLeft; + + mode->CrtcVDisplay = mode->VDisplay = amt->usCRTC_V_Disp; + mode->CrtcVSyncStart = mode->VSyncStart = amt->usCRTC_V_SyncStart; + mode->CrtcVSyncEnd = mode->VSyncEnd = mode->VSyncStart + amt->usCRTC_V_SyncWidth; + mode->CrtcVTotal = mode->VTotal = amt->usCRTC_V_Total; + mode->CrtcVBlankStart = mode->VDisplay + amt->usCRTC_OverscanBottom; + mode->CrtcVBlankEnd = mode->CrtcVTotal - amt->usCRTC_OverscanTop; + + mode->SynthClock = mode->Clock = amt->usPixelClock * 10; + if (amt->susModeMiscInfo.usAccess & ATOM_HSYNC_POLARITY) + mode->Flags |= V_NHSYNC; + else + mode->Flags |= V_PHSYNC; + if (amt->susModeMiscInfo.usAccess & ATOM_VSYNC_POLARITY) + mode->Flags |= V_NVSYNC; + else + mode->Flags |= V_PVSYNC; + if (amt->susModeMiscInfo.usAccess & ATOM_INTERLACE) + mode->Flags |= V_INTERLACE; + if (amt->susModeMiscInfo.usAccess & ATOM_COMPOSITESYNC) + mode->Flags |= V_CSYNC; + if (amt->susModeMiscInfo.usAccess & ATOM_DOUBLE_CLOCK_MODE) + mode->Flags |= V_DBLCLK; + + mode->HSync = ((float) mode->Clock) / ((float)mode->HTotal); + mode->VRefresh = (1000.0 * ((float) mode->Clock)) + / ((float)(((float)mode->HTotal) * ((float)mode->VTotal))); + + mode->name = xstrdup(name); + + RHDDebug(handle->scrnIndex,"%s: TV Modeline: %s " + "%2.d %i (%i) %i %i (%i) %i %i (%i) %i %i (%i) %i\n", + __func__, mode->name, mode->Clock, + mode->HDisplay, mode->CrtcHBlankStart, mode->HSyncStart, mode->CrtcHSyncEnd, + mode->CrtcHBlankEnd, mode->HTotal, + mode->VDisplay, mode->CrtcVBlankStart, mode->VSyncStart, mode->VSyncEnd, + mode->CrtcVBlankEnd, mode->VTotal); + + + return mode; +} + +static AtomBiosResult +rhdAtomAnalogTVInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + CARD8 crev, frev; + atomDataTablesPtr atomDataPtr = handle->atomDataPtr; + int mode = 0, i; + struct { enum RHD_TV_MODE rhd_mode; int atomMode; } + tv_modes[] = { + { RHD_TV_NTSC, NTSC_SUPPORT }, + { RHD_TV_NTSCJ, NTSCJ_SUPPORT}, + { RHD_TV_PAL, PAL_SUPPORT }, + { RHD_TV_PALM, PALM_SUPPORT }, + { RHD_TV_PALCN, PALCN_SUPPORT}, + { RHD_TV_PALN, PALN_SUPPORT }, + { RHD_TV_PAL60, PAL60_SUPPORT}, + { RHD_TV_SECAM, SECAM_SUPPORT}, + { RHD_TV_NONE, 0 } + }; + + + RHDFUNC(handle); + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->AnalogTV_Info), + &crev,&frev,NULL)) { + return ATOM_FAILED; + } + switch (func) { + case ATOM_ANALOG_TV_MODE: + for (i = 0; tv_modes[i].atomMode; i++) { + if (data->tvMode == tv_modes[i].rhd_mode) { + mode = tv_modes[i].atomMode; + break; + } + } + data->mode = rhdAtomAnalogTVTimings(handle, + atomDataPtr->AnalogTV_Info, + mode); + if (!data->mode) + return ATOM_FAILED; + return ATOM_SUCCESS; + case ATOM_ANALOG_TV_DEFAULT_MODE: + data->tvMode = tv_modes[atomDataPtr->AnalogTV_Info->ucTV_BootUpDefaultStandard - 1].rhd_mode; + break; + case ATOM_ANALOG_TV_SUPPORTED_MODES: + mode = (CARD32)atomDataPtr->AnalogTV_Info->ucTV_SupportedStandard; + data->val = 0; + for (i = 0; tv_modes[i].atomMode; i++) { + if (tv_modes[i].atomMode & mode) { + data->val |= tv_modes[i].rhd_mode; + } + } + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + + return ATOM_SUCCESS; +} + +static AtomBiosResult +rhdAtomGPIOI2CInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + CARD32 *val = &data->val; + unsigned short size; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->GPIO_I2C_Info), + &crev,&frev,&size)) { + return ATOM_FAILED; + } + + if ((sizeof(ATOM_COMMON_TABLE_HEADER) + + (*val * sizeof(ATOM_GPIO_I2C_ASSIGMENT))) > size) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: GPIO_I2C Device " + "num %lu exeeds table size %u\n",__func__, + (unsigned long)val, + size); + return ATOM_FAILED; + } + + switch (func) { + case ATOM_GPIO_I2C_DATA_MASK: + *val = atomDataPtr->GPIO_I2C_Info->asGPIO_Info[*val] + .usDataMaskRegisterIndex; + break; + + case ATOM_GPIO_I2C_DATA_MASK_SHIFT: + *val = atomDataPtr->GPIO_I2C_Info->asGPIO_Info[*val] + .ucDataMaskShift; + break; + + case ATOM_GPIO_I2C_CLK_MASK: + *val = atomDataPtr->GPIO_I2C_Info->asGPIO_Info[*val] + .usClkMaskRegisterIndex; + break; + + case ATOM_GPIO_I2C_CLK_MASK_SHIFT: + *val = atomDataPtr->GPIO_I2C_Info->asGPIO_Info[*val] + .ucClkMaskShift; + break; + + default: + return ATOM_NOT_IMPLEMENTED; + } + return ATOM_SUCCESS; +} + +static AtomBiosResult +rhdAtomFirmwareInfoQuery(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + CARD32 *val = &data->val; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->FirmwareInfo.base), + &crev,&frev,NULL)) { + return ATOM_FAILED; + } + + switch (crev) { + case 1: + switch (func) { + case ATOM_GET_DEFAULT_ENGINE_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->ulDefaultEngineClock * 10; + break; + case ATOM_GET_DEFAULT_MEMORY_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->ulDefaultMemoryClock * 10; + break; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->ulMaxPixelClockPLL_Output * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->usMinPixelClockPLL_Output * 10; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->usMaxPixelClockPLL_Input * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->usMinPixelClockPLL_Input * 10; + break; + case ATOM_GET_MAX_PIXEL_CLK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->usMaxPixelClock * 10; + break; + case ATOM_GET_REF_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo->usReferenceClock * 10; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + case 2: + switch (func) { + case ATOM_GET_DEFAULT_ENGINE_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->ulDefaultEngineClock * 10; + break; + case ATOM_GET_DEFAULT_MEMORY_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->ulDefaultMemoryClock * 10; + break; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->ulMaxPixelClockPLL_Output * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->usMinPixelClockPLL_Output * 10; + break; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->usMaxPixelClockPLL_Input * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->usMinPixelClockPLL_Input * 10; + break; + case ATOM_GET_MAX_PIXEL_CLK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->usMaxPixelClock * 10; + break; + case ATOM_GET_REF_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_2->usReferenceClock * 10; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + break; + case 3: + switch (func) { + case ATOM_GET_DEFAULT_ENGINE_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->ulDefaultEngineClock * 10; + break; + case ATOM_GET_DEFAULT_MEMORY_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->ulDefaultMemoryClock * 10; + break; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->ulMaxPixelClockPLL_Output * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->usMinPixelClockPLL_Output * 10; + break; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->usMaxPixelClockPLL_Input * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->usMinPixelClockPLL_Input * 10; + break; + case ATOM_GET_MAX_PIXEL_CLK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->usMaxPixelClock * 10; + break; + case ATOM_GET_REF_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_3->usReferenceClock * 10; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + break; + case 4: + switch (func) { + case ATOM_GET_DEFAULT_ENGINE_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->ulDefaultEngineClock * 10; + break; + case ATOM_GET_DEFAULT_MEMORY_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->ulDefaultMemoryClock * 10; + break; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->usMaxPixelClockPLL_Input * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_INPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->usMinPixelClockPLL_Input * 10; + break; + case ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->ulMaxPixelClockPLL_Output * 10; + break; + case ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->usMinPixelClockPLL_Output * 10; + break; + case ATOM_GET_MAX_PIXEL_CLK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->usMaxPixelClock * 10; + break; + case ATOM_GET_REF_CLOCK: + *val = atomDataPtr->FirmwareInfo + .FirmwareInfo_V_1_4->usReferenceClock * 10; + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + break; + default: + return ATOM_NOT_IMPLEMENTED; + } + return ATOM_SUCCESS; +} + +/* + * + */ +static AtomBiosResult +rhdAtomGetConditionalGoldenSetting(atomBiosHandlePtr handle, + AtomBiosRequestID func, AtomBiosArgPtr data) +{ + unsigned short *table = (unsigned short *)data->GoldenSettings.BIOSPtr; + unsigned short entry_size = *(table++); + + RHDFUNC(handle); + + RHDDebug(handle->scrnIndex, "%s: testing 0x%4.4x\n",__func__, + data->GoldenSettings.value); + +/* @@@ endian! */ + while (table < (unsigned short *)data->GoldenSettings.End) { + RHDDebugCont("\t\t against: 0x%8.8x\n", table[1] << 16 | table[0]); + if ((data->GoldenSettings.value >> 16) == table[1]) { + if ((data->GoldenSettings.value & 0xffff) <= table[0]) { + data->GoldenSettings.BIOSPtr = (unsigned char *)(table + 2); + return ATOM_SUCCESS; + } + } + table = (unsigned short *)(((unsigned char *)table) + entry_size); + } + return ATOM_FAILED; +} + +#define Limit(n,max,name) ((n >= max) ? ( \ + xf86DrvMsg(handle->scrnIndex,X_ERROR,"%s: %s %i exceeds maximum %i\n", \ + __func__,name,n,max), TRUE) : FALSE) + +static const struct _rhd_connector_objs +{ + char *name; + rhdConnectorType con; +} rhd_connector_objs[] = { + { "NONE", RHD_CONNECTOR_NONE }, + { "SINGLE_LINK_DVI_I", RHD_CONNECTOR_DVI_SINGLE }, + { "DUAL_LINK_DVI_I", RHD_CONNECTOR_DVI }, + { "SINGLE_LINK_DVI_D", RHD_CONNECTOR_DVI_SINGLE }, + { "DUAL_LINK_DVI_D", RHD_CONNECTOR_DVI }, + { "VGA", RHD_CONNECTOR_VGA }, + { "COMPOSITE", RHD_CONNECTOR_TV }, + { "SVIDEO", RHD_CONNECTOR_TV, }, + { "YPrPb", RHD_CONNECTOR_TV, }, + { "D_CONNECTOR", RHD_CONNECTOR_NONE, }, + { "9PIN_DIN", RHD_CONNECTOR_NONE }, + { "SCART", RHD_CONNECTOR_TV }, + { "HDMI_TYPE_A", RHD_CONNECTOR_DVI_SINGLE }, + { "HDMI_TYPE_B", RHD_CONNECTOR_DVI }, + { "LVDS", RHD_CONNECTOR_PANEL }, + { "7PIN_DIN", RHD_CONNECTOR_TV }, + { "PCIE_CONNECTOR", RHD_CONNECTOR_PCIE }, + { "CROSSFIRE", RHD_CONNECTOR_NONE }, + { "HARDCODE_DVI", RHD_CONNECTOR_NONE }, + { "DISPLAYPORT", RHD_CONNECTOR_NONE} +}; +static const int n_rhd_connector_objs = sizeof (rhd_connector_objs) / sizeof(struct _rhd_connector_objs); + +static const struct _rhd_encoders +{ + char *name; + rhdOutputType ot[2]; +} rhd_encoders[] = { + { "NONE", {RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "INTERNAL_LVDS", { RHD_OUTPUT_LVDS, RHD_OUTPUT_NONE }}, + { "INTERNAL_TMDS1", { RHD_OUTPUT_TMDSA, RHD_OUTPUT_NONE }}, + { "INTERNAL_TMDS2", { RHD_OUTPUT_TMDSB, RHD_OUTPUT_NONE }}, + { "INTERNAL_DAC1", { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE }}, + { "INTERNAL_DAC2", { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, + { "INTERNAL_SDVOA", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "INTERNAL_SDVOB", { RHD_OUTPUT_NONE , RHD_OUTPUT_NONE }}, + { "SI170B", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "CH7303", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "CH7301", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "INTERNAL_DVO1", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "EXTERNAL_SDVOA", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "EXTERNAL_SDVOB", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "TITFP513", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "INTERNAL_LVTM1", { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE }}, + { "VT1623", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "HDMI_SI1930", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "HDMI_INTERNAL", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "INTERNAL_KLDSCP_TMDS1", { RHD_OUTPUT_TMDSA, RHD_OUTPUT_NONE }}, + { "INTERNAL_KLDSCP_DVO1", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "INTERNAL_KLDSCP_DAC1", { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE }}, + { "INTERNAL_KLDSCP_DAC2", { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, + { "SI178", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "MVPU_FPGA", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "INTERNAL_DDI", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "VT1625", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "HDMI_SI1932", {RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "AN9801", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "DP501", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }}, + { "UNIPHY", { RHD_OUTPUT_UNIPHYA, RHD_OUTPUT_UNIPHYB }}, + { "KLDSCP_LVTMA", { RHD_OUTPUT_KLDSKP_LVTMA, RHD_OUTPUT_NONE }}, + { "UNIPHY1", { RHD_OUTPUT_UNIPHYC, RHD_OUTPUT_UNIPHYD }}, + { "UNIPHY2", { RHD_OUTPUT_UNIPHYE, RHD_OUTPUT_UNIPHYF }} +}; +static const int n_rhd_encoders = sizeof (rhd_encoders) / sizeof(struct _rhd_encoders); + +static const struct _rhd_connectors +{ + char *name; + rhdConnectorType con; + Bool dual; +} rhd_connectors[] = { + {"NONE", RHD_CONNECTOR_NONE, FALSE }, + {"VGA", RHD_CONNECTOR_VGA, FALSE }, + {"DVI-I", RHD_CONNECTOR_DVI, TRUE }, + {"DVI-D", RHD_CONNECTOR_DVI, FALSE }, + {"DVI-A", RHD_CONNECTOR_DVI, FALSE }, + {"SVIDEO", RHD_CONNECTOR_TV, FALSE }, + {"COMPOSITE", RHD_CONNECTOR_TV, FALSE }, + {"PANEL", RHD_CONNECTOR_PANEL, FALSE }, + {"DIGITAL_LINK", RHD_CONNECTOR_NONE, FALSE }, + {"SCART", RHD_CONNECTOR_TV, FALSE }, + {"HDMI Type A", RHD_CONNECTOR_DVI_SINGLE, FALSE }, + {"HDMI Type B", RHD_CONNECTOR_DVI, FALSE }, + {"UNKNOWN", RHD_CONNECTOR_NONE, FALSE }, + {"UNKNOWN", RHD_CONNECTOR_NONE, FALSE }, + {"DVI+DIN", RHD_CONNECTOR_NONE, FALSE } +}; +static const int n_rhd_connectors = sizeof(rhd_connectors) / sizeof(struct _rhd_connectors); + +static const struct _rhd_devices +{ + char *name; + rhdOutputType ot[2]; + enum atomDevice atomDevID; +} rhd_devices[] = { /* { RHD_CHIP_EXTERNAL, RHD_CHIP_IGP } */ + {" CRT1", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }, atomCRT1 }, + {" LCD1", { RHD_OUTPUT_LVTMA, RHD_OUTPUT_LVTMA }, atomLCD1 }, + {" TV1", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }, atomTV1 }, + {" DFP1", { RHD_OUTPUT_TMDSA, RHD_OUTPUT_NONE }, atomDFP1 }, + {" CRT2", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }, atomCRT2 }, + {" LCD2", { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE }, atomLCD2 }, + {" TV2", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }, atomTV2 }, + {" DFP2", { RHD_OUTPUT_LVTMA, RHD_OUTPUT_DVO }, atomDFP2 }, + {" CV", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }, atomCV }, + {" DFP3", { RHD_OUTPUT_LVTMA, RHD_OUTPUT_LVTMA }, atomDFP3 }, + {" DFP4", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }, atomDFP4 }, + {" DFP5", { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE }, atomDFP5 } +}; +static const int n_rhd_devices = sizeof(rhd_devices) / sizeof(struct _rhd_devices); + +static const rhdDDC hwddc[] = { RHD_DDC_0, RHD_DDC_1, RHD_DDC_2, RHD_DDC_3, RHD_DDC_4 }; +static const int n_hwddc = sizeof(hwddc) / sizeof(rhdDDC); + +static const rhdOutputType acc_dac[] = { RHD_OUTPUT_NONE, RHD_OUTPUT_DACA, + RHD_OUTPUT_DACB, RHD_OUTPUT_DAC_EXTERNAL }; +static const int n_acc_dac = sizeof(acc_dac) / sizeof (rhdOutputType); + +/* + * + */ +static Bool +rhdAtomInterpretObjectID(atomBiosHandlePtr handle, + CARD16 id, CARD8 *obj_type, CARD8 *obj_id, + CARD8 *num, char **name) +{ + *obj_id = (id & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; + *num = (id & ENUM_ID_MASK) >> ENUM_ID_SHIFT; + *obj_type = (id & OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT; + + *name = NULL; + + switch (*obj_type) { + case GRAPH_OBJECT_TYPE_CONNECTOR: + if (!Limit(*obj_id, n_rhd_connector_objs, "connector_obj")) + *name = rhd_connector_objs[*obj_id].name; + break; + case GRAPH_OBJECT_TYPE_ENCODER: + if (!Limit(*obj_id, n_rhd_encoders, "encoder_obj")) + *name = rhd_encoders[*obj_id].name; + break; + default: + break; + } + return TRUE; +} + +/* + * + */ +static AtomBiosResult +rhdAtomGetDDCIndex(atomBiosHandlePtr handle, + rhdDDC *DDC, unsigned char i2c) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + int i; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + &(atomDataPtr->GPIO_I2C_Info->sHeader), &crev,&frev,NULL)) { + return ATOM_NOT_IMPLEMENTED; + } + for (i = 0; i < ATOM_MAX_SUPPORTED_DEVICE; i++) { + if (atomDataPtr->GPIO_I2C_Info->asGPIO_Info[i].sucI2cId.ucAccess == i2c) { + RHDDebug(handle->scrnIndex, " Found DDC GPIO Index: %i\n",i); + if (Limit(i, n_hwddc, "GPIO_DDC Index")) + return ATOM_FAILED; + *DDC = hwddc[i]; + return ATOM_SUCCESS; + } + } + return ATOM_FAILED; +} + +/* + * + */ +static void +rhdAtomDDCFromI2CRecord(atomBiosHandlePtr handle, + ATOM_I2C_RECORD *Record, rhdDDC *DDC) +{ + RHDDebug(handle->scrnIndex, + " %s: I2C Record: %s[%x] EngineID: %x I2CAddr: %x\n", + __func__, + Record->sucI2cId.bfHW_Capable ? "HW_Line" : "GPIO_ID", + Record->sucI2cId.bfI2C_LineMux, + Record->sucI2cId.bfHW_EngineID, + Record->ucI2CAddr); + + if (!*(unsigned char *)&(Record->sucI2cId)) + *DDC = RHD_DDC_NONE; + else { + union { + ATOM_I2C_ID_CONFIG i2cId; + unsigned char i2cChar; + } u; + if (Record->ucI2CAddr != 0) + return; + u.i2cId = Record->sucI2cId; + if (!u.i2cChar + || rhdAtomGetDDCIndex(handle, DDC, u.i2cChar) != ATOM_SUCCESS) + *DDC = RHD_DDC_NONE; + } +} + +/* + * + */ +static void +rhdAtomParseGPIOLutForHPD(atomBiosHandlePtr handle, + CARD8 pinID, rhdHPD *HPD) +{ + atomDataTablesPtr atomDataPtr; + ATOM_GPIO_PIN_LUT *gpio_pin_lut; + unsigned short size; + int i = 0; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + *HPD = RHD_HPD_NONE; + + if (!rhdAtomGetTableRevisionAndSize( + &atomDataPtr->GPIO_Pin_LUT->sHeader, NULL, NULL, &size)) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s: No valid GPIO pin LUT in AtomBIOS\n",__func__); + return; + } + gpio_pin_lut = atomDataPtr->GPIO_Pin_LUT; + + while (1) { + if (gpio_pin_lut->asGPIO_Pin[i].ucGPIO_ID == pinID) { + + if ((sizeof(ATOM_COMMON_TABLE_HEADER) + + (i * sizeof(ATOM_GPIO_PIN_ASSIGNMENT))) > size) + return; + + RHDDebug(handle->scrnIndex, + " %s: GPIO PinID: %i Index: %x Shift: %i\n", + __func__, + pinID, + gpio_pin_lut->asGPIO_Pin[i].usGpioPin_AIndex, + gpio_pin_lut->asGPIO_Pin[i].ucGpioPinBitShift); + + /* grr... map backwards: register indices -> line numbers */ + if (gpio_pin_lut->asGPIO_Pin[i].usGpioPin_AIndex + == (DC_GPIO_HPD_A >> 2)) { + switch (gpio_pin_lut->asGPIO_Pin[i].ucGpioPinBitShift) { + case 0: + *HPD = RHD_HPD_0; + return; + case 8: + *HPD = RHD_HPD_1; + return; + case 16: + *HPD = RHD_HPD_2; + return; + case 24: + *HPD = RHD_HPD_3; + return; + } + } + } + i++; + } +} + +/* + * + */ +static void +rhdAtomHPDFromRecord(atomBiosHandlePtr handle, + ATOM_HPD_INT_RECORD *Record, rhdHPD *HPD) +{ + RHDDebug(handle->scrnIndex, + " %s: HPD Record: GPIO ID: %x Plugged_PinState: %x\n", + __func__, + Record->ucHPDIntGPIOID, + Record->ucPluggged_PinState); + rhdAtomParseGPIOLutForHPD(handle, Record->ucHPDIntGPIOID, HPD); +} + +/* + * + */ +static char * +rhdAtomDeviceTagsFromRecord(atomBiosHandlePtr handle, + ATOM_CONNECTOR_DEVICE_TAG_RECORD *Record) +{ + int i, j, k; + char *devices; + + RHDFUNC(handle); + + RHDDebug(handle->scrnIndex," NumberOfDevice: %i\n", + Record->ucNumberOfDevice); + + if (!Record->ucNumberOfDevice) return NULL; + + devices = (char *)xcalloc(Record->ucNumberOfDevice * 4 + 1,1); + + for (i = 0; i < Record->ucNumberOfDevice; i++) { + k = 0; + j = Record->asDeviceTag[i].usDeviceID; + + if (!j) continue; + + while (!(j & 0x1)) { j >>= 1; k++; }; + + if (!Limit(k,n_rhd_devices,"usDeviceID")) + strcat(devices, rhd_devices[k].name); + } + + RHDDebug(handle->scrnIndex," Devices:%s\n",devices); + + return devices; +} + +/* + * + */ +static rhdConnectorType +rhdAtomGetConnectorID(atomBiosHandlePtr handle, rhdConnectorType connector, int num) +{ + RHDFUNC(handle); + + switch (connector) { + case RHD_CONNECTOR_PCIE: + { + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + CARD32 val; + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->IntegratedSystemInfo.base), + &crev,&frev,NULL) || crev != 2) { + return RHD_CONNECTOR_NONE; /* sorry, we can't do any better */ + } + RHDDebug(handle->scrnIndex,"PCIE[%i]", num); + switch (num) { + case 1: + val = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->ulDDISlot1Config; + break; + case 2: + val = atomDataPtr->IntegratedSystemInfo.IntegratedSystemInfo_v2->ulDDISlot2Config; + break; + default: + RHDDebugCont("\n"); + return RHD_CONNECTOR_NONE; + } + val >>= 16; + val &= 0xff; + RHDDebugCont(" ObjectID: %i",val); + if (Limit((int)val, n_rhd_connector_objs, "obj_id")) { + RHDDebugCont("\n"); + return RHD_CONNECTOR_NONE; + } + + RHDDebugCont(" ConnectorName: %s\n",rhd_connector_objs[val].name); + return rhd_connector_objs[val].con; + } + default: + return connector; + } +} + +/* + * + */ +static AtomBiosResult +rhdAtomOutputDeviceListFromObjectHeader(atomBiosHandlePtr handle, + struct rhdAtomOutputDeviceList **ptr) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + ATOM_DISPLAY_OBJECT_PATH_TABLE *disObjPathTable; + ATOM_DISPLAY_OBJECT_PATH *disObjPath; + rhdConnectorInfoPtr cp; + unsigned long object_header_end; + unsigned int i,j; + unsigned short object_header_size; + struct rhdAtomOutputDeviceList *DeviceList = NULL; + int cnt = 0; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + &atomDataPtr->Object_Header->sHeader, + &crev,&frev,&object_header_size)) { + return ATOM_NOT_IMPLEMENTED; + } + + if (crev < 2) /* don't bother with anything below rev 2 */ + return ATOM_NOT_IMPLEMENTED; + + if (!(cp = (rhdConnectorInfoPtr)xcalloc(sizeof(struct rhdConnectorInfo), + RHD_CONNECTORS_MAX))) + return ATOM_FAILED; + + object_header_end = + atomDataPtr->Object_Header->usConnectorObjectTableOffset + + object_header_size; + + RHDDebug(handle->scrnIndex,"ObjectTable - size: %u, BIOS - size: %u " + "TableOffset: %u object_header_end: %u\n", + object_header_size, handle->BIOSImageSize, + atomDataPtr->Object_Header->usConnectorObjectTableOffset, + object_header_end); + + if ((object_header_size > handle->BIOSImageSize) + || (atomDataPtr->Object_Header->usConnectorObjectTableOffset + > handle->BIOSImageSize) + || object_header_end > handle->BIOSImageSize) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s: Object table information is bogus\n",__func__); + return ATOM_FAILED; + } + + if (((unsigned long)&atomDataPtr->Object_Header->sHeader + + object_header_end) > ((unsigned long)handle->BIOSBase + + handle->BIOSImageSize)) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s: Object table extends beyond BIOS Image\n",__func__); + return ATOM_FAILED; + } + disObjPathTable = (ATOM_DISPLAY_OBJECT_PATH_TABLE *) + ((char *)&atomDataPtr->Object_Header->sHeader + + atomDataPtr->Object_Header->usDisplayPathTableOffset); + RHDDebug(handle->scrnIndex, "DisplayPathObjectTable: entries: %i version: %i\n", + disObjPathTable->ucNumOfDispPath, disObjPathTable->ucVersion); + + disObjPath = &disObjPathTable->asDispPath[0]; + for (i = 0; i < disObjPathTable->ucNumOfDispPath; i++) { + CARD8 objNum, cObjNum; + CARD8 objId; + CARD8 objType; + rhdConnectorType ct; + char *name; + + rhdAtomInterpretObjectID(handle, disObjPath->usConnObjectId, &objType, &objId, &objNum, &name); + RHDDebug(handle->scrnIndex, " DisplaPathTable[%i]: size: %i DeviceTag: 0x%x ConnObjId: 0x%x NAME: %s GPUObjId: 0x%x\n", + i, disObjPath->usSize, disObjPath->usDeviceTag, disObjPath->usConnObjectId, name, disObjPath->usGPUObjectId); + + if (objType != GRAPH_OBJECT_TYPE_CONNECTOR) + continue; + + ct = rhd_connector_objs[objId].con; + cObjNum = objNum; + + for (j = 0; j < disObjPath->usSize / sizeof(USHORT) - 4; j++) { + int k = 0,l; + + rhdAtomInterpretObjectID(handle, disObjPath->usGraphicObjIds[j], &objType, &objId, &objNum, &name); + RHDDebug(handle->scrnIndex, " GraphicsObj[%i] ID: 0x%x Type: 0x%x ObjID: 0x%x ENUM: 0x%x NAME: %s\n", + j, disObjPath->usGraphicObjIds[j], objType, objId, objNum, name); + + if (objType != GRAPH_OBJECT_TYPE_ENCODER) + continue; + + Limit(objId, n_rhd_encoders, "usGraphicsObjId"); + + l = disObjPath->usDeviceTag; + if (!l) continue; + + while (!(l & 0x1)) { l >>= 1; k++; }; + if (!Limit(k,n_rhd_devices,"usDeviceID")) { + if (!(DeviceList = (struct rhdAtomOutputDeviceList *)xrealloc(DeviceList, sizeof (struct rhdAtomOutputDeviceList) * (cnt + 1)))) + return ATOM_FAILED; + + DeviceList[cnt].DeviceId = rhd_devices[k].atomDevID; + DeviceList[cnt].ConnectorType = rhdAtomGetConnectorID(handle, ct, cObjNum); + DeviceList[cnt].OutputType = rhd_encoders[objId].ot[objNum - 1]; + cnt++; + RHDDebug(handle->scrnIndex, " DeviceIndex: 0x%x\n",k); + } + } + disObjPath = (ATOM_DISPLAY_OBJECT_PATH*)(((char *)disObjPath) + disObjPath->usSize); + if ((((unsigned long)&atomDataPtr->Object_Header->sHeader + object_header_end) + < (((unsigned long) disObjPath) + sizeof(ATOM_DISPLAY_OBJECT_PATH))) + || (((unsigned long)&atomDataPtr->Object_Header->sHeader + object_header_end) + < (((unsigned long) disObjPath) + disObjPath->usSize))) + break; + } + DeviceList = xrealloc(DeviceList, sizeof(struct rhdAtomOutputDeviceList) * (cnt + 1)); + DeviceList[cnt].DeviceId = atomNone; + + *ptr = DeviceList; + + return ATOM_SUCCESS; +} + +/* + * + */ +static AtomBiosResult +rhdAtomConnectorInfoFromObjectHeader(atomBiosHandlePtr handle, + rhdConnectorInfoPtr *ptr) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + ATOM_CONNECTOR_OBJECT_TABLE *con_obj; + rhdConnectorInfoPtr cp; + unsigned long object_header_end; + int ncon = 0; + int i,j; + unsigned short object_header_size; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + &atomDataPtr->Object_Header->sHeader, + &crev,&frev,&object_header_size)) { + return ATOM_NOT_IMPLEMENTED; + } + + if (crev < 2) /* don't bother with anything below rev 2 */ + return ATOM_NOT_IMPLEMENTED; + + if (!(cp = (rhdConnectorInfoPtr)xcalloc(sizeof(struct rhdConnectorInfo), + RHD_CONNECTORS_MAX))) + return ATOM_FAILED; + + object_header_end = + atomDataPtr->Object_Header->usConnectorObjectTableOffset + + object_header_size; + + RHDDebug(handle->scrnIndex,"ObjectTable - size: %u, BIOS - size: %u " + "TableOffset: %u object_header_end: %u\n", + object_header_size, handle->BIOSImageSize, + atomDataPtr->Object_Header->usConnectorObjectTableOffset, + object_header_end); + + if ((object_header_size > handle->BIOSImageSize) + || (atomDataPtr->Object_Header->usConnectorObjectTableOffset + > handle->BIOSImageSize) + || object_header_end > handle->BIOSImageSize) { + xfree(cp); + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s: Object table information is bogus\n",__func__); + return ATOM_FAILED; + } + + if (((unsigned long)&atomDataPtr->Object_Header->sHeader + + object_header_end) > ((unsigned long)handle->BIOSBase + + handle->BIOSImageSize)) { + xfree(cp); + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s: Object table extends beyond BIOS Image\n",__func__); + return ATOM_FAILED; + } + + con_obj = (ATOM_CONNECTOR_OBJECT_TABLE *) + ((char *)&atomDataPtr->Object_Header->sHeader + + atomDataPtr->Object_Header->usConnectorObjectTableOffset); + + for (i = 0; i < con_obj->ucNumberOfObjects; i++) { + ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *SrcDstTable; + ATOM_COMMON_RECORD_HEADER *Record; + int record_base; + CARD8 obj_type, obj_id, num; + char *name; + + rhdAtomInterpretObjectID(handle, con_obj->asObjects[i].usObjectID, + &obj_type, &obj_id, &num, &name); + + RHDDebug(handle->scrnIndex, "Object: ID: %x name: %s type: %x id: %x\n", + con_obj->asObjects[i].usObjectID, name ? name : "", + obj_type, obj_id); + + + if (obj_type != GRAPH_OBJECT_TYPE_CONNECTOR) + continue; + + SrcDstTable = (ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT *) + ((char *)&atomDataPtr->Object_Header->sHeader + + con_obj->asObjects[i].usSrcDstTableOffset); + + if (con_obj->asObjects[i].usSrcDstTableOffset + + (SrcDstTable->ucNumberOfSrc + * sizeof(ATOM_SRC_DST_TABLE_FOR_ONE_OBJECT)) + > handle->BIOSImageSize) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: SrcDstTable[%i] extends " + "beyond Object_Header table\n",__func__,i); + continue; + } + cp[ncon].Type = rhdAtomGetConnectorID(handle, rhd_connector_objs[obj_id].con, num); + cp[ncon].Name = RhdAppendString(cp[ncon].Name,name); + cp[ncon].DDC = RHD_DDC_NONE; + + for (j = 0; ((j < SrcDstTable->ucNumberOfSrc) && + (j < MAX_OUTPUTS_PER_CONNECTOR)); j++) { + CARD8 stype, sobj_id, snum; + char *sname; + + rhdAtomInterpretObjectID(handle, SrcDstTable->usSrcObjectID[j], + &stype, &sobj_id, &snum, &sname); + + RHDDebug(handle->scrnIndex, " * SrcObject: ID: %x name: %s enum: %i\n", + SrcDstTable->usSrcObjectID[j], sname, snum); + + if (snum <= 2) + cp[ncon].Output[j] = rhd_encoders[sobj_id].ot[snum - 1]; + } + + Record = (ATOM_COMMON_RECORD_HEADER *) + ((char *)&atomDataPtr->Object_Header->sHeader + + con_obj->asObjects[i].usRecordOffset); + + record_base = con_obj->asObjects[i].usRecordOffset; + + while (Record->ucRecordType > 0 + && Record->ucRecordType <= ATOM_MAX_OBJECT_RECORD_NUMBER ) { + char *taglist; + + if ((record_base += Record->ucRecordSize) + > object_header_size) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "%s: Object Records extend beyond Object Table\n", + __func__); + break; + } + + RHDDebug(handle->scrnIndex, " - Record Type: %x\n", + Record->ucRecordType); + + switch (Record->ucRecordType) { + + case ATOM_I2C_RECORD_TYPE: + rhdAtomDDCFromI2CRecord(handle, + (ATOM_I2C_RECORD *)Record, + &cp[ncon].DDC); + break; + + case ATOM_HPD_INT_RECORD_TYPE: + rhdAtomHPDFromRecord(handle, + (ATOM_HPD_INT_RECORD *)Record, + &cp[ncon].HPD); + break; + + case ATOM_CONNECTOR_DEVICE_TAG_RECORD_TYPE: + taglist = rhdAtomDeviceTagsFromRecord(handle, + (ATOM_CONNECTOR_DEVICE_TAG_RECORD *)Record); + if (taglist) { + cp[ncon].Name = RhdAppendString(cp[ncon].Name,taglist); + + xfree(taglist); + + } + break; + + default: + break; + } + + Record = (ATOM_COMMON_RECORD_HEADER*) + ((char *)Record + Record->ucRecordSize); + + } + + if ((++ncon) == RHD_CONNECTORS_MAX) + break; + } + *ptr = cp; + + RhdPrintConnectorInfo(handle->scrnIndex, cp); + + return ATOM_SUCCESS; +} + +/* + * + */ +static AtomBiosResult +rhdAtomOutputDeviceListFromSupportedDevices(atomBiosHandlePtr handle, + Bool igp, + struct rhdAtomOutputDeviceList **Ptr) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + int n; + int cnt = 0; + struct rhdAtomOutputDeviceList *DeviceList = NULL; + struct rhdConnectorInfo *cp; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + &(atomDataPtr->SupportedDevicesInfo.SupportedDevicesInfo->sHeader), + &crev,&frev,NULL)) { + return ATOM_NOT_IMPLEMENTED; + } + + if (!(cp = (rhdConnectorInfoPtr)xcalloc(RHD_CONNECTORS_MAX, + sizeof(struct rhdConnectorInfo)))) + return ATOM_FAILED; + + for (n = 0; n < ATOM_MAX_SUPPORTED_DEVICE; n++) { + ATOM_CONNECTOR_INFO_I2C ci + = atomDataPtr->SupportedDevicesInfo.SupportedDevicesInfo->asConnInfo[n]; + + if (!(atomDataPtr->SupportedDevicesInfo + .SupportedDevicesInfo->usDeviceSupport & (1 << n))) + continue; + + if (Limit(ci.sucConnectorInfo.sbfAccess.bfConnectorType, + n_rhd_connectors, "bfConnectorType")) + continue; + + if (!(DeviceList = (struct rhdAtomOutputDeviceList *)xrealloc(DeviceList, sizeof(struct rhdAtomOutputDeviceList) * (cnt + 1)))) + return ATOM_FAILED; + + DeviceList[cnt].ConnectorType = rhd_connectors[ci.sucConnectorInfo.sbfAccess.bfConnectorType].con; + DeviceList[cnt].DeviceId = rhd_devices[n].atomDevID; + + if (!Limit(ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC, + n_acc_dac, "bfAssociatedDAC")) { + if ((DeviceList[cnt].OutputType + = acc_dac[ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC]) + == RHD_OUTPUT_NONE) { + DeviceList[cnt].OutputType = rhd_devices[n].ot[igp ? 1 : 0]; + } + cnt++; + } + } + DeviceList = (struct rhdAtomOutputDeviceList *)xrealloc(DeviceList, sizeof(struct rhdAtomOutputDeviceList) * (cnt + 1)); + DeviceList[cnt].DeviceId = atomNone; + + *Ptr = DeviceList; + + return ATOM_SUCCESS; +} + +/* + * + */ +static AtomBiosResult +rhdAtomConnectorInfoFromSupportedDevices(atomBiosHandlePtr handle, + Bool igp, + rhdConnectorInfoPtr *ptr) +{ + atomDataTablesPtr atomDataPtr; + CARD8 crev, frev; + rhdConnectorInfoPtr cp; + struct { + rhdOutputType ot; + rhdConnectorType con; + rhdDDC ddc; + rhdHPD hpd; + Bool dual; + char *name; + char *outputName; + } devices[ATOM_MAX_SUPPORTED_DEVICE]; + int ncon = 0; + int n; + + RHDFUNC(handle); + + atomDataPtr = handle->atomDataPtr; + + if (!rhdAtomGetTableRevisionAndSize( + &(atomDataPtr->SupportedDevicesInfo.SupportedDevicesInfo->sHeader), + &crev,&frev,NULL)) { + return ATOM_NOT_IMPLEMENTED; + } + + if (!(cp = (rhdConnectorInfoPtr)xcalloc(RHD_CONNECTORS_MAX, + sizeof(struct rhdConnectorInfo)))) + return ATOM_FAILED; + + for (n = 0; n < ATOM_MAX_SUPPORTED_DEVICE; n++) { + ATOM_CONNECTOR_INFO_I2C ci + = atomDataPtr->SupportedDevicesInfo.SupportedDevicesInfo->asConnInfo[n]; + + devices[n].ot = RHD_OUTPUT_NONE; + + if (!(atomDataPtr->SupportedDevicesInfo + .SupportedDevicesInfo->usDeviceSupport & (1 << n))) + continue; + + if (Limit(ci.sucConnectorInfo.sbfAccess.bfConnectorType, + n_rhd_connectors, "bfConnectorType")) + continue; + + devices[n].con + = rhd_connectors[ci.sucConnectorInfo.sbfAccess.bfConnectorType].con; + if (devices[n].con == RHD_CONNECTOR_NONE) + continue; + + devices[n].dual + = rhd_connectors[ci.sucConnectorInfo.sbfAccess.bfConnectorType].dual; + devices[n].name + = rhd_connectors[ci.sucConnectorInfo.sbfAccess.bfConnectorType].name; + + RHDDebug(handle->scrnIndex,"AtomBIOS Connector[%i]: %s Device:%s ",n, + rhd_connectors[ci.sucConnectorInfo + .sbfAccess.bfConnectorType].name, + rhd_devices[n].name); + + devices[n].outputName = rhd_devices[n].name; + + if (!Limit(ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC, + n_acc_dac, "bfAssociatedDAC")) { + if ((devices[n].ot + = acc_dac[ci.sucConnectorInfo.sbfAccess.bfAssociatedDAC]) + == RHD_OUTPUT_NONE) { + devices[n].ot = rhd_devices[n].ot[igp ? 1 : 0]; + } + } else + devices[n].ot = RHD_OUTPUT_NONE; + + RHDDebugCont("Output: %x ",devices[n].ot); + + if (!ci.sucI2cId.ucAccess + || rhdAtomGetDDCIndex(handle, &devices[n].ddc, ci.sucI2cId.ucAccess) != ATOM_SUCCESS) { + RHDDebugCont("NO DDC "); + devices[n].ddc = RHD_DDC_NONE; + } else + RHDDebugCont("HW DDC %i ", + ci.sucI2cId.sbfAccess.bfI2C_LineMux); + + if (crev > 1) { + ATOM_CONNECTOR_INC_SRC_BITMAP isb + = atomDataPtr->SupportedDevicesInfo + .SupportedDevicesInfo_HD->asIntSrcInfo[n]; + + switch (isb.ucIntSrcBitmap) { + case 0x4: + RHDDebugCont("HPD 0\n"); + devices[n].hpd = RHD_HPD_0; + break; + case 0xa: + RHDDebugCont("HPD 1\n"); + devices[n].hpd = RHD_HPD_1; + break; + default: + RHDDebugCont("NO HPD\n"); + devices[n].hpd = RHD_HPD_NONE; + break; + } + } else { + RHDDebugCont("NO HPD\n"); + devices[n].hpd = RHD_HPD_NONE; + } + } + + /* sort devices for connectors */ + for (n = 0; n < ATOM_MAX_SUPPORTED_DEVICE; n++) { + int i; + + if (devices[n].ot == RHD_OUTPUT_NONE) + continue; + if (devices[n].con == RHD_CONNECTOR_NONE) + continue; + cp[ncon].DDC = devices[n].ddc; + cp[ncon].HPD = devices[n].hpd; + cp[ncon].Output[0] = devices[n].ot; + cp[ncon].Output[1] = RHD_OUTPUT_NONE; + cp[ncon].Type = devices[n].con; + cp[ncon].Name = xstrdup(devices[n].name); + cp[ncon].Name = RhdAppendString(cp[ncon].Name, devices[n].outputName); + + if (devices[n].ddc == RHD_DDC_NONE) { + if (devices[n].dual) + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "No DDC channel for device %s found." + " Cannot find matching device.\n",devices[n].name); + } else { + for (i = n + 1; i < ATOM_MAX_SUPPORTED_DEVICE; i++) { + + if (!devices[n].dual && !devices[i].dual) + continue; + + if (devices[n].ddc != devices[i].ddc) + continue; + + if ((devices[n].ot == RHD_OUTPUT_DACA + || devices[n].ot == RHD_OUTPUT_DACB) + && (devices[i].ot == RHD_OUTPUT_LVTMA + || devices[i].ot == RHD_OUTPUT_TMDSA)) { + + /* If VGA is listed before DVI, swap */ + cp[ncon].Output[0] = devices[i].ot; + cp[ncon].Output[1] = devices[n].ot; + cp[ncon].Type = devices[i].con; + + if (cp[ncon].HPD == RHD_HPD_NONE) + cp[ncon].HPD = devices[i].hpd; + + xfree (cp[ncon].Name); + cp[ncon].Name = xstrdup(devices[i].name); + cp[ncon].Name = RhdAppendString(cp[ncon].Name, + devices[i].outputName); + cp[ncon].Name = RhdAppendString(cp[ncon].Name, + devices[n].outputName); + devices[i].ot = RHD_OUTPUT_NONE; /* zero the device */ + } else if ((devices[i].ot == RHD_OUTPUT_DACA + || devices[i].ot == RHD_OUTPUT_DACB) + && (devices[n].ot == RHD_OUTPUT_LVTMA + || devices[n].ot == RHD_OUTPUT_TMDSA)) { + + cp[ncon].Output[1] = devices[i].ot; + + if (cp[ncon].HPD == RHD_HPD_NONE) + cp[ncon].HPD = devices[i].hpd; + + cp[ncon].Name = RhdAppendString(cp[ncon].Name, + devices[i].outputName); + devices[i].ot = RHD_OUTPUT_NONE; /* zero the device */ + } + } + } + /* Some connector table mark a VGA as DVI-X. This heuristic fixes it */ + if (cp[ncon].Type == RHD_CONNECTOR_DVI) { + if ( ((cp[ncon].Output[0] == RHD_OUTPUT_NONE + && (cp[ncon].Output[1] == RHD_OUTPUT_DACA + || cp[ncon].Output[1] == RHD_OUTPUT_DACB)) + || (cp[ncon].Output[1] == RHD_OUTPUT_NONE + && (cp[ncon].Output[0] == RHD_OUTPUT_DACA + || cp[ncon].Output[0] == RHD_OUTPUT_DACB))) + && cp[ncon].HPD == RHD_HPD_NONE) + cp[ncon].Type = RHD_CONNECTOR_VGA; + } + + if ((++ncon) == RHD_CONNECTORS_MAX) + break; + } + *ptr = cp; + + RhdPrintConnectorInfo(handle->scrnIndex, cp); + + return ATOM_SUCCESS; +} + +/* + * + */ +static AtomBiosResult +rhdAtomConnectorInfo(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data) +{ + int chipset = data->chipset; + + RHDFUNC(handle); + + if (rhdAtomConnectorInfoFromObjectHeader(handle,&data->ConnectorInfo) + == ATOM_SUCCESS) + return ATOM_SUCCESS; + else { + Bool igp = RHDIsIGP(chipset); + return rhdAtomConnectorInfoFromSupportedDevices(handle, igp, + &data->ConnectorInfo); + } +} + +/* + * + */ +static AtomBiosResult +rhdAtomOutputDeviceList(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data) +{ + int chipset = data->chipset; + + RHDFUNC(handle); + + if (rhdAtomOutputDeviceListFromObjectHeader(handle, &data->OutputDeviceList) + == ATOM_SUCCESS) { + return ATOM_SUCCESS; + } else { + Bool igp = RHDIsIGP(chipset); + return rhdAtomOutputDeviceListFromSupportedDevices(handle, igp, &data->OutputDeviceList); + } +} + +/* + * + */ +struct atomCodeDataTableHeader +{ + unsigned char signature; + unsigned short size; +}; + +#define CODE_DATA_TABLE_SIGNATURE 0x7a +#define ATOM_EOT_COMMAND 0x5b + +static AtomBiosResult +rhdAtomGetDataInCodeTable(atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data) +{ + unsigned char *command_table; + unsigned short size; + unsigned short offset; + + int i; + + RHDFUNC(handle); + + if (data->val > sizeof (struct _ATOM_MASTER_LIST_OF_COMMAND_TABLES) / sizeof (USHORT)) + return ATOM_FAILED; + + if ((offset = ((USHORT *)&(((ATOM_MASTER_COMMAND_TABLE *)handle->codeTable) + ->ListOfCommandTables))[data->val])) + command_table = handle->BIOSBase + offset; + else + return ATOM_FAILED; + + if (!rhdAtomGetTableRevisionAndSize(&(((ATOM_COMMON_ROM_COMMAND_TABLE_HEADER *) + command_table)->CommonHeader), + NULL, NULL, &size)) + return ATOM_FAILED; + + for (i = sizeof(ATOM_COMMON_ROM_COMMAND_TABLE_HEADER); i < size - 1; i++) { + + if (command_table[i] == ATOM_EOT_COMMAND + && command_table[i+1] == CODE_DATA_TABLE_SIGNATURE) { + unsigned short *dt_size = (unsigned short*)(command_table + i + 2); + + int diff; + + diff = size - (i + 1) + sizeof(struct atomCodeDataTableHeader) + *dt_size; + + DEBUGP(ErrorF("Table[0x%2.2x] = 0x%4.4x -> data_size: 0x%x\n",data->val, size, *dt_size)); + + if (diff < 0) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, + "Data table in command table %li extends %i bytes " + "beyond command table size\n", + (unsigned long) data->val, -diff); + + return ATOM_FAILED; + } + data->CommandDataTable.loc = + command_table + i + 2 + sizeof(unsigned short); + + data->CommandDataTable.size = *dt_size; + DEBUGP(RhdDebugDump(handle->scrnIndex, data->CommandDataTable.loc, *dt_size)); + + return ATOM_SUCCESS; + } + } + + return ATOM_FAILED; +} + +# ifdef ATOM_BIOS_PARSER +static AtomBiosResult +rhdAtomExec (atomBiosHandlePtr handle, + AtomBiosRequestID unused, AtomBiosArgPtr data) +{ + RHDPtr rhdPtr = RHDPTRI(handle); + Bool ret = FALSE; + char *msg; + int idx = data->exec.index; + void *pspace = data->exec.pspace; + pointer *dataSpace = data->exec.dataSpace; + unsigned short offset; + + RHDFUNCI(handle->scrnIndex); + + if (dataSpace) { + if (!handle->fbBase && !handle->scratchBase) + return ATOM_FAILED; + if (handle->fbBase) { + if (!rhdPtr->FbBase) { + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s: " + "Cannot exec AtomBIOS: framebuffer not mapped\n", + __func__); + return ATOM_FAILED; + } + *dataSpace = (CARD8*)rhdPtr->FbBase + handle->fbBase; + } else + *dataSpace = (CARD8*)handle->scratchBase; + } + + /* OMFG - ParseTable returns CD_SUCCESS if the command table does not exist */ + offset = ((USHORT *)&(((ATOM_MASTER_COMMAND_TABLE *)handle->codeTable) + ->ListOfCommandTables))[idx]; + if (! offset) { + xf86DrvMsg(handle->scrnIndex, X_WARNING, "AtomBIOS command table %d does not exist\n", idx); + return ATOM_NOT_IMPLEMENTED; + } + + ret = ParseTableWrapper(pspace, idx, handle, + handle->BIOSBase, + &msg); + if (!ret) + xf86DrvMsg(handle->scrnIndex, X_ERROR, "%s\n",msg); + else + xf86DrvMsgVerb(handle->scrnIndex, X_INFO, 5, "%s\n",msg); + + return (ret) ? ATOM_SUCCESS : ATOM_FAILED; +} +# endif + +AtomBiosResult +RHDAtomBiosFunc(int scrnIndex, atomBiosHandlePtr handle, + AtomBiosRequestID id, AtomBiosArgPtr data) +{ + AtomBiosResult ret = ATOM_FAILED; + int i; + char *msg = NULL; + enum msgDataFormat msg_f = MSG_FORMAT_NONE; + AtomBiosRequestFunc req_func = NULL; + + RHDFUNCI(scrnIndex); + + for (i = 0; AtomBiosRequestList[i].id != ATOM_FUNC_END; i++) { + if (id == AtomBiosRequestList[i].id) { + req_func = AtomBiosRequestList[i].request; + msg = AtomBiosRequestList[i].message; + msg_f = AtomBiosRequestList[i].message_format; + break; + } + } + + if (req_func == NULL) { + xf86DrvMsg(scrnIndex, X_ERROR, "Unknown AtomBIOS request: %i\n",id); + return ATOM_NOT_IMPLEMENTED; + } + /* Hack for now */ + if (id == ATOM_INIT) + data->val = scrnIndex; + + if (id == ATOM_INIT || handle) + ret = req_func(handle, id, data); + + if (ret == ATOM_SUCCESS) { + + switch (msg_f) { + case MSG_FORMAT_DEC: + xf86DrvMsg(scrnIndex,X_INFO,"%s: %li\n", msg, + (unsigned long) data->val); + break; + case MSG_FORMAT_HEX: + xf86DrvMsg(scrnIndex,X_INFO,"%s: 0x%lx\n",msg , + (unsigned long) data->val); + break; + case MSG_FORMAT_NONE: + xf86DrvMsgVerb(scrnIndex, 7, X_INFO, + "Call to %s succeeded\n", msg); + break; + } + + } else { + + char *result = (ret == ATOM_FAILED) ? "failed" + : "not implemented"; + switch (msg_f) { + case MSG_FORMAT_DEC: + case MSG_FORMAT_HEX: + xf86DrvMsgVerb(scrnIndex, 1, X_WARNING, + "Call to %s %s\n", msg, result); + break; + case MSG_FORMAT_NONE: + xf86DrvMsg(scrnIndex,X_INFO,"Query for %s: %s\n", msg, result); + break; + } + } + return ret; +} + +/* + * + */ +static void +atomRegisterSaveList(atomBiosHandlePtr handle, struct atomSaveListRecord **SaveList) +{ + struct atomSaveListObject *ListObject = handle->SaveListObjects; + RHDFUNC(handle); + + while (ListObject) { + if (ListObject->SaveList == SaveList) + return; + ListObject = ListObject->next; + } + if (!(ListObject = (struct atomSaveListObject *)xcalloc(1,sizeof (struct atomSaveListObject)))) + return; + ListObject->next = handle->SaveListObjects; + ListObject->SaveList = SaveList; + handle->SaveListObjects = ListObject; +} + +/* + * + */ +static void +atomUnregisterSaveList(atomBiosHandlePtr handle, struct atomSaveListRecord **SaveList) +{ + struct atomSaveListObject **ListObject; + RHDFUNC(handle); + + if (!handle->SaveListObjects) + return; + ListObject = &handle->SaveListObjects; + + while (1) { + if ((*ListObject)->SaveList == SaveList) { + struct atomSaveListObject *tmp = *ListObject; + *ListObject = ((*ListObject)->next); + xfree(tmp); + } + if (!(*ListObject) || !(*ListObject)->next) + return; + ListObject = &((*ListObject)->next); + } +} + +/* + * + */ +static AtomBiosResult +atomSetRegisterListLocation(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + RHDFUNC(handle); + + handle->SaveList = (struct atomSaveListRecord **)data->Address; + if (handle->SaveList) + atomRegisterSaveList(handle, handle->SaveList); + + return ATOM_SUCCESS; +} + +/* + * + */ +static AtomBiosResult +atomRestoreRegisters(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + struct atomSaveListRecord *List = *(data->Address); + int i; + + RHDFUNC(handle); + + if (!List) + return ATOM_FAILED; + + for (i = 0; i < List->Last; i++) { + switch ( List->RegisterList[i].Type) { + case atomRegisterMMIO: + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: MMIO(0x%4.4x) = 0x%4.4x\n",__func__, List->Last, + List->RegisterList[i].Address, List->RegisterList[i].Value); + RHDRegWrite(handle, List->RegisterList[i].Address, List->RegisterList[i].Value); + break; + case atomRegisterMC: + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: MC(0x%4.4x) = 0x%4.4x\n",__func__, List->Last, + List->RegisterList[i].Address, List->RegisterList[i].Value); + RHDWriteMC(handle, List->RegisterList[i].Address | MC_IND_ALL | MC_IND_WR_EN, + List->RegisterList[i].Value); + break; + case atomRegisterPLL: + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: PLL(0x%4.4x) = 0x%4.4x\n",__func__, List->Last, + List->RegisterList[i].Address, List->RegisterList[i].Value); + _RHDWritePLL(handle->scrnIndex, List->RegisterList[i].Address, List->RegisterList[i].Value); + break; + case atomRegisterPCICFG: + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: PCICFG(0x%4.4x) = 0x%4.4x\n",__func__,List->Last, + List->RegisterList[i].Address, List->RegisterList[i].Value); +#ifdef XSERVER_LIBPCIACCESS + pci_device_cfg_write(RHDPTRI(handle)->PciInfo, + &List->RegisterList[i].Value, + List->RegisterList[i].Address, 4, NULL); +#else + { + PCITAG tag = RHDPTRI(handle)->PciTag; + pciWriteLong(tag, List->RegisterList[i].Address, + List->RegisterList[i].Value); + } +#endif + break; + } + } + + /* deallocate list */ + atomUnregisterSaveList(handle, (struct atomSaveListRecord **)data->Address); + xfree(List); + *(data->Address) = NULL; + + return ATOM_SUCCESS; +} + +static AtomBiosResult +rhdAtomGetClock(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + AtomBiosArgRec idx; + GET_ENGINE_CLOCK_PARAMETERS eng_p; + GET_MEMORY_CLOCK_PARAMETERS mem_p; + + RHDFUNC(handle); + + idx.exec.dataSpace = NULL; + + if (func == ATOM_GET_ENGINE_CLOCK) { + idx.exec.index = GetIndexIntoMasterTable(COMMAND, GetEngineClock); + idx.exec.pspace = &eng_p; + } else if (func == ATOM_GET_MEMORY_CLOCK) { + idx.exec.index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock); + idx.exec.pspace = &mem_p; + } else + return ATOM_NOT_IMPLEMENTED; + + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &idx) == ATOM_SUCCESS) { + data->val = (func == ATOM_GET_ENGINE_CLOCK) ? + eng_p.ulReturnEngineClock : + mem_p.ulReturnMemoryClock; + data->val *= 10; + return ATOM_SUCCESS; + } + + return ATOM_FAILED; +} + +static AtomBiosResult +rhdAtomSetClock(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + AtomBiosArgRec execData; + SET_ENGINE_CLOCK_PS_ALLOCATION eng_clock_ps; + SET_MEMORY_CLOCK_PS_ALLOCATION mem_clock_ps; + + RHDFUNC(handle); + execData.exec.dataSpace = NULL; + + if (func == ATOM_SET_ENGINE_CLOCK) { + eng_clock_ps.ulTargetEngineClock = data->clockValue / 10; + execData.exec.index = GetIndexIntoMasterTable(COMMAND, SetEngineClock); + execData.exec.pspace = &eng_clock_ps; + xf86DrvMsg(handle->scrnIndex, X_INFO, "Attempting to set Engine Clock to %lu\n", data->clockValue); + } else if (func == ATOM_SET_MEMORY_CLOCK) { + mem_clock_ps.ulTargetMemoryClock = data->clockValue / 10; + execData.exec.index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock); + execData.exec.pspace = &mem_clock_ps; + xf86DrvMsg(handle->scrnIndex, X_INFO, "Attempting to set Memory Clock to %lu\n", data->clockValue); + } else + return ATOM_NOT_IMPLEMENTED; + + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &execData) == ATOM_SUCCESS) { + return ATOM_SUCCESS; + } + + xf86DrvMsg(handle->scrnIndex, X_WARNING, "Failed to set %s Clock\n", + (func == ATOM_SET_ENGINE_CLOCK) ? "Engine" : "Memory"); + return ATOM_FAILED; +} + +static AtomBiosResult +rhdAtomPmSetup(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + AtomBiosArgRec execData; + ENABLE_ASIC_STATIC_PWR_MGT_PS_ALLOCATION pwrmgt_ps; + DYNAMIC_CLOCK_GATING_PS_ALLOCATION dynclk_ps; + + RHDFUNC(handle); + execData.exec.dataSpace = NULL; + + if (func == ATOM_PM_SETUP) { + pwrmgt_ps.ucEnable = data->val; + execData.exec.index = GetIndexIntoMasterTable(COMMAND, EnableASIC_StaticPwrMgt); + execData.exec.pspace = &pwrmgt_ps; + xf86DrvMsg(handle->scrnIndex, X_INFO, "Attempting to %sable power management\n", data->val ? "en":"dis"); + } else if (func == ATOM_PM_CLOCKGATING_SETUP) { + dynclk_ps.ucEnable = data->val; + execData.exec.index = GetIndexIntoMasterTable(COMMAND, DynamicClockGating); + execData.exec.pspace = &dynclk_ps; + xf86DrvMsg(handle->scrnIndex, X_INFO, "Attempting to %sable clock gating\n", data->val ? "en":"dis"); + } else + return ATOM_NOT_IMPLEMENTED; + + if (RHDAtomBiosFunc(handle->scrnIndex, handle, + ATOM_EXEC, &execData) == ATOM_SUCCESS) { + return ATOM_SUCCESS; + } + + xf86DrvMsg(handle->scrnIndex, X_WARNING, "Failed to set %s\n", + (func == ATOM_PM_SETUP) ? "power management" : "dynamic clock gating"); + return ATOM_FAILED; +} + +static AtomBiosResult +rhdAtomChipLimits(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr = handle->atomDataPtr; + AtomBiosArgRec execData; + ATOM_VOLTAGE_OBJECT_INFO *voltage; + AtomChipLimits *lim = &data->chipLimits; + CARD8 crev, frev; + uint16_t FirmwareInfoRev = 0; + + RHDFUNC(handle); + memset (lim, 0, sizeof (*lim)); + + if (rhdAtomGetTableRevisionAndSize ( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->FirmwareInfo.base), + &crev,&frev,NULL)) + FirmwareInfoRev = (frev << 8) | crev; + + xf86DrvMsg (handle->scrnIndex, X_INFO, "FirmwareInfo Revision %04x\n", FirmwareInfoRev); + switch (FirmwareInfoRev) { + case 0x104: + { + ATOM_FIRMWARE_INFO_V1_4 *fw = atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_4; + lim->Default.VDDCVoltage = fw->usBootUpVDDCVoltage; + } + case 0x103: /* fall through */ + { + ATOM_FIRMWARE_INFO_V1_3 *fw = atomDataPtr->FirmwareInfo.FirmwareInfo_V_1_3; + xf86DrvMsg (handle->scrnIndex, X_INFO, "Unused attribute: ul3DAccelerationEngineClock %lu\n", + (unsigned long) fw->ul3DAccelerationEngineClock * 10); + } + case 0x102: /* fall through */ + case 0x101: /* fall through */ + { + ATOM_FIRMWARE_INFO *fw = atomDataPtr->FirmwareInfo.FirmwareInfo; + lim->Maximum.EngineClock = fw->ulASICMaxEngineClock * 10; + lim->Maximum.MemoryClock = fw->ulASICMaxMemoryClock * 10; + /* Scary bits: PLL post divider is 2 ?!? Minimum for pixel PLL, so probably here as well */ + lim->Minimum.EngineClock = fw->usMinEngineClockPLL_Output * 5; + lim->Minimum.MemoryClock = fw->usMinMemoryClockPLL_Output * 5; + xf86DrvMsg (handle->scrnIndex, X_INFO, "Unused attribute: ulDriverTargetEngineClock %lu\n", + (unsigned long) fw->ulDriverTargetEngineClock * 10); + xf86DrvMsg (handle->scrnIndex, X_INFO, "Unused attribute: ulDriverTargetMemoryClock %lu\n", + (unsigned long) fw->ulDriverTargetMemoryClock * 10); + xf86DrvMsg (handle->scrnIndex, X_INFO, "Unused attribute: ucASICMaxTemperature %d\n", + (int) fw->ucASICMaxTemperature); + xf86DrvMsg (handle->scrnIndex, X_INFO, "Scary bits: Estimated MinEngineClock %d kHz\n", + (int) fw->usMinEngineClockPLL_Output * 5); + xf86DrvMsg (handle->scrnIndex, X_INFO, "Scary bits: Estimated MinMemoryClock %d kHz\n", + (int) fw->usMinMemoryClockPLL_Output * 5); + break; + } + default: + xf86DrvMsg(handle->scrnIndex, X_ERROR, "Unusupported FirmwareInfo Revision\n"); + return ATOM_NOT_IMPLEMENTED; + } + + if ( (voltage = atomDataPtr->VoltageObjectInfo) ) { + char *last = ((char *) voltage) + voltage->sHeader.usStructureSize; + while ((char *) &voltage->asVoltageObj[0].ucVoltageType < last) { + if (voltage->asVoltageObj[0].ucVoltageType == SET_VOLTAGE_TYPE_ASIC_VDDC) { + lim->Minimum.VDDCVoltage = voltage->asVoltageObj[0].asFormula.usVoltageBaseLevel; + lim->Maximum.VDDCVoltage = lim->Minimum.VDDCVoltage + + voltage->asVoltageObj[0].asFormula.usVoltageStep * + (voltage->asVoltageObj[0].asFormula.ucNumOfVoltageEntries - 1) / + (voltage->asVoltageObj[0].asFormula.ucFlag & 0x01 ? 2 : 1); + break; + } + voltage = (ATOM_VOLTAGE_OBJECT_INFO *) (((char *) voltage) + voltage->asVoltageObj[0].ucSize); + } + } else + xf86DrvMsg (handle->scrnIndex, X_INFO, "No VoltageObjectInfo table\n"); + + if (RHDAtomBiosFunc (handle->scrnIndex, handle, ATOM_GET_DEFAULT_ENGINE_CLOCK, + &execData) == ATOM_SUCCESS) + lim->Default.EngineClock = execData.val; + if (RHDAtomBiosFunc (handle->scrnIndex, handle, ATOM_GET_DEFAULT_MEMORY_CLOCK, + &execData) == ATOM_SUCCESS) + lim->Default.MemoryClock = execData.val; + + return ATOM_SUCCESS; +} + + +static AtomBiosResult +rhdAtomChipConfigs(atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + atomDataTablesPtr atomDataPtr = handle->atomDataPtr; + AtomChipConfigs *conf = &data->chipConfigs; + CARD8 crev, frev; + uint16_t PowerPlayInfoRev = 0; + + RHDFUNC(handle); + memset (conf, 0, sizeof (*conf)); + + if (rhdAtomGetTableRevisionAndSize ( + (ATOM_COMMON_TABLE_HEADER *)(atomDataPtr->PowerPlayInfo.base), + &crev,&frev,NULL)) + PowerPlayInfoRev = (frev << 8) | crev; + xf86DrvMsg (handle->scrnIndex, X_INFO, "PowerPlayInfo Revision %04x\n", PowerPlayInfoRev); + + switch (PowerPlayInfoRev) { + case 0x101: + case 0x201: + case 0x301: + xf86DrvMsg (handle->scrnIndex, X_WARNING, "PowerPlayInfo Revision not yet implemented\n"); + return ATOM_NOT_IMPLEMENTED; + + case 0x401: + { + ATOM_POWERPLAY_INFO_V4 *pp = atomDataPtr->PowerPlayInfo.PowerPlayInfo_V_4_1; + unsigned char *uc = ((unsigned char *)pp) + _U16 (pp->OffsetPowerIndexEntries); /* ATOM_POWERINDEX_INFO_V4 */ + ATOM_POWERMODE_INFO_V4 *pm = (ATOM_POWERMODE_INFO_V4 *) (((unsigned char *)pp) + _U16 (pp->OffsetPowerModeEntries)); + ATOM_POWERUNKNOWN_INFO_V4 *pu = (ATOM_POWERUNKNOWN_INFO_V4 *) (((unsigned char *)pp) + _U16 (pp->OffsetPowerUnknownEntries)); + int i, j, num = 0; + + for (i = 0; i < pp->NumPowerIndexEntries && uc < (unsigned char *) pm; i++) { + uc++; /* First entry is index */ + for (j = 1; j < pp->SizeOfPowerIndexEntry; j++) { + if (*uc > num) + num = *uc; + uc++; + } + } + conf->num = num; + if (i < pp->NumPowerIndexEntries) + xf86DrvMsg (handle->scrnIndex, X_ERROR, + "Expected %d ATOM_POWERINDEX_INFO_V4 entries, got only %d\n", num, i); + + conf->Settings = xnfcalloc (num, sizeof (struct rhdPowerState)); + for (i = 0; i < num && pm < (ATOM_POWERMODE_INFO_V4 *) pu; i++) { + conf->Settings[i].EngineClock = _U24 (pm->engineClock) * 10; + conf->Settings[i].MemoryClock = _U24 (pm->memoryClock) * 10; + conf->Settings[i].VDDCVoltage = _U16 (pm->voltage); + pm++; + } + if (i < num) + xf86DrvMsg (handle->scrnIndex, X_ERROR, + "Expected %d ATOM_POWERMODE_INFO_V4 entries, got only %d\n", num, i); + + return ATOM_SUCCESS; + } + + default: + xf86DrvMsg (handle->scrnIndex, X_ERROR, "Unusupported PowerPlayInfo Revision\n"); + return ATOM_NOT_IMPLEMENTED; + } +} + +#define SET_VOLTAGE_GET_MAX_VOLTAGE 6 +static AtomBiosResult +rhdAtomGetVoltage (atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + AtomBiosArgRec execData; + CARD8 crev, frev; + uint16_t SetVoltageRev = 0; + int SetVoltageIdx; + + RHDFUNC(handle); + + SetVoltageIdx = GetIndexIntoMasterTable (COMMAND, SetVoltage); + if (rhdAtomGetCommandTableRevisionSize (handle, SetVoltageIdx, &crev, &frev, NULL)) + SetVoltageRev = (frev << 8) | crev; + + execData.exec.dataSpace = NULL; + + switch (SetVoltageRev) { + case 0x0101: + { + SET_VOLTAGE_PARAMETERS setVolt; + xf86DrvMsg (handle->scrnIndex, X_WARNING, "Not supporting SetVoltage V1 yet\n"); + setVolt.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE; + setVolt.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; + setVolt.ucVoltageIndex = 0; + execData.exec.index = SetVoltageIdx; + execData.exec.pspace = &setVolt; + if (RHDAtomBiosFunc (handle->scrnIndex, handle, ATOM_EXEC, &execData) == ATOM_SUCCESS) { + xf86DrvMsg (handle->scrnIndex, X_INFO, + "Unused attribute: SET_VOLTAGE_GET_MAX_VOLTAGE: type %d mode %d index %d\n", + setVolt.ucVoltageType, setVolt.ucVoltageMode, setVolt.ucVoltageIndex); + /* TODO: Map index into voltage */ + } + return ATOM_NOT_IMPLEMENTED; + } + case 0x0102: + { + SET_VOLTAGE_PARAMETERS_V2 setVolt2; + setVolt2.ucVoltageType = SET_VOLTAGE_GET_MAX_VOLTAGE; + setVolt2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_GET_GPIOVAL; + setVolt2.usVoltageLevel = 0; + execData.exec.index = SetVoltageIdx; + execData.exec.pspace = &setVolt2; + if (RHDAtomBiosFunc (handle->scrnIndex, handle, ATOM_EXEC, &execData) == ATOM_SUCCESS) { + data->val = setVolt2.usVoltageLevel; + return ATOM_SUCCESS; + } + return ATOM_FAILED; + } + default: + xf86DrvMsg(handle->scrnIndex, X_WARNING, "Unusupported SetVoltage Revision\n"); + return ATOM_NOT_IMPLEMENTED; + } +} + +static AtomBiosResult +rhdAtomSetVoltage (atomBiosHandlePtr handle, AtomBiosRequestID func, AtomBiosArgPtr data) +{ + AtomBiosArgRec execData; + CARD8 crev, frev; + uint16_t SetVoltageRev = 0; + int SetVoltageIdx; + + RHDFUNC(handle); + + SetVoltageIdx = GetIndexIntoMasterTable (COMMAND, SetVoltage); + if (rhdAtomGetCommandTableRevisionSize (handle, SetVoltageIdx, &crev, &frev, NULL)) + SetVoltageRev = (frev << 8) | crev; + + execData.exec.dataSpace = NULL; + + switch (SetVoltageRev) { + case 0x0101: + { +#if 0 + SET_VOLTAGE_PARAMETERS setVolt; + setVolt.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; + setVolt.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; + setVolt.ucVoltageIndex = ###INDEX###; + execData.exec.index = SetVoltageIdx; + execData.exec.pspace = &setVolt; + return RHDAtomBiosFunc (handle->scrnIndex, handle, ATOM_EXEC, &execData); +#endif + xf86DrvMsg (handle->scrnIndex, X_WARNING, "Not supporting SetVoltage V1 yet\n"); + return ATOM_NOT_IMPLEMENTED; + } + case 0x0102: + { + SET_VOLTAGE_PARAMETERS_V2 setVolt2; + setVolt2.ucVoltageType = SET_VOLTAGE_TYPE_ASIC_VDDC; + setVolt2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; + setVolt2.usVoltageLevel = data->val; + execData.exec.index = SetVoltageIdx; + execData.exec.pspace = &setVolt2; + return RHDAtomBiosFunc (handle->scrnIndex, handle, ATOM_EXEC, &execData); + } + default: + xf86DrvMsg(handle->scrnIndex, X_WARNING, "Unusupported SetVoltage Revision\n"); + return ATOM_NOT_IMPLEMENTED; + } +} + + +# ifdef ATOM_BIOS_PARSER + +#define ALLOC_CNT 25 + +/* + * + */ +static void +atomSaveRegisters(atomBiosHandlePtr handle, enum atomRegisterType Type, CARD32 address) +{ + struct atomSaveListRecord *List; + CARD32 val = 0; + int i; + struct atomSaveListObject *SaveListObj = handle->SaveListObjects; + + RHDFUNC(handle); + + if (!handle->SaveList) + return; + + if (!(*(handle->SaveList))) { + if (!(*handle->SaveList = (struct atomSaveListRecord *)xalloc(sizeof(struct atomSaveListRecord) + + sizeof(struct atomRegisterList) * (ALLOC_CNT - 1)))) + return; + (*(handle->SaveList))->Length = ALLOC_CNT; + (*(handle->SaveList))->Last = 0; + } else if ((*(handle->SaveList))->Length == (*(handle->SaveList))->Last) { + if (!(List = (struct atomSaveListRecord *)xrealloc(*handle->SaveList, + sizeof(struct atomSaveListRecord) + + (sizeof(struct atomRegisterList) + * ((*(handle->SaveList))->Length + ALLOC_CNT - 1))))) + return; + *handle->SaveList = List; + List->Length = (*(handle->SaveList))->Length + ALLOC_CNT; + } + List = *handle->SaveList; + + while (SaveListObj) { + struct atomSaveListRecord *ListFromObj = *(SaveListObj->SaveList); + + if (ListFromObj) { + for (i = 0; i < ListFromObj->Last; i++) + if (ListFromObj->RegisterList[i].Address == address + && ListFromObj->RegisterList[i].Type == Type) + return; + } + SaveListObj = SaveListObj->next; + } + + switch (Type) { + case atomRegisterMMIO: + val = RHDRegRead(handle, address); + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: MMIO(0x%4.4x) = 0x%4.4x\n",__func__,List->Last,address,val); + break; + case atomRegisterMC: + val = RHDReadMC(handle, address | MC_IND_ALL); + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: MC(0x%4.4x) = 0x%4.4x\n",__func__,List->Last,address,val); + break; + case atomRegisterPLL: + val = _RHDReadPLL(handle->scrnIndex, address); + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: PLL(0x%4.4x) = 0x%4.4x\n",__func__,List->Last,address,val); + break; + case atomRegisterPCICFG: +#ifdef XSERVER_LIBPCIACCESS + val = pci_device_cfg_write(RHDPTRI(handle)->PciInfo, + &val, address, 4, NULL); +#else + { + PCITAG tag = RHDPTRI(handle)->PciTag; + val = pciReadLong(tag, address); + } +#endif + RHDDebugVerb(handle->scrnIndex,1, "%s[%i]: PCICFG(0x%4.4x) = 0x%4.4x\n",__func__,List->Last,address,val); + break; + } + List->RegisterList[List->Last].Address = address; + List->RegisterList[List->Last].Value = val; + List->RegisterList[List->Last].Type = Type; + List->Last++; +} + +/* + * + */ +VOID* +CailAllocateMemory(VOID *CAIL,UINT16 size) +{ + CAILFUNC(CAIL); + + return malloc(size); +} + +VOID +CailReleaseMemory(VOID *CAIL, VOID *addr) +{ + CAILFUNC(CAIL); + + free(addr); +} + +VOID +CailDelayMicroSeconds(VOID *CAIL, UINT32 delay) +{ + CAILFUNC(CAIL); + + usleep(delay); + + DEBUGP(xf86DrvMsg(((atomBiosHandlePtr)CAIL)->scrnIndex,X_INFO,"Delay %i usec\n",delay)); +} + +UINT32 +CailReadATIRegister(VOID* CAIL, UINT32 idx) +{ + UINT32 ret; + CAILFUNC(CAIL); + + ret = RHDRegRead(((atomBiosHandlePtr)CAIL), idx << 2); + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x) = %x\n",__func__,idx << 2,ret); + return ret; +} + +VOID +CailWriteATIRegister(VOID *CAIL, UINT32 idx, UINT32 data) +{ + CAILFUNC(CAIL); + + atomSaveRegisters((atomBiosHandlePtr)CAIL, atomRegisterMMIO, idx << 2); + + RHDRegWrite(((atomBiosHandlePtr)CAIL),idx << 2,data); + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x,%x)\n",__func__,idx << 2,data); +} + +UINT32 +CailReadFBData(VOID* CAIL, UINT32 idx) +{ + UINT32 ret; + + CAILFUNC(CAIL); + + if (((atomBiosHandlePtr)CAIL)->fbBase) { + CARD8 *FBBase = (CARD8*) + RHDPTRI((atomBiosHandlePtr)CAIL)->FbBase; + ret = *((CARD32*)(FBBase + (((atomBiosHandlePtr)CAIL)->fbBase) + idx)); + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x) = %x\n",__func__,idx,ret); + } else if (((atomBiosHandlePtr)CAIL)->scratchBase) { + ret = *(CARD32*)((CARD8*)(((atomBiosHandlePtr)CAIL)->scratchBase) + idx); + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x) = %x\n",__func__,idx,ret); + } else { + xf86DrvMsg(((atomBiosHandlePtr)CAIL)->scrnIndex,X_ERROR, + "%s: no fbbase set\n",__func__); + return 0; + } + return ret; +} + +VOID +CailWriteFBData(VOID *CAIL, UINT32 idx, UINT32 data) +{ + CAILFUNC(CAIL); + + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x,%x)\n",__func__,idx,data); + if (((atomBiosHandlePtr)CAIL)->fbBase) { + CARD8 *FBBase = (CARD8*) + RHDPTRI((atomBiosHandlePtr)CAIL)->FbBase; + *((CARD32*)(FBBase + (((atomBiosHandlePtr)CAIL)->fbBase) + idx)) = data; + } else if (((atomBiosHandlePtr)CAIL)->scratchBase) { + *(CARD32*)((CARD8*)(((atomBiosHandlePtr)CAIL)->scratchBase) + idx) = data; + } else + xf86DrvMsg(((atomBiosHandlePtr)CAIL)->scrnIndex,X_ERROR, + "%s: no fbbase set\n",__func__); +} + +ULONG +CailReadMC(VOID *CAIL, ULONG Address) +{ + ULONG ret; + + CAILFUNC(CAIL); + + ret = RHDReadMC(((atomBiosHandlePtr)CAIL), Address | MC_IND_ALL); + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x) = %x\n",__func__,Address,ret); + return ret; +} + +VOID +CailWriteMC(VOID *CAIL, ULONG Address, ULONG data) +{ + CAILFUNC(CAIL); + + + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x,%x)\n",__func__,Address,data); + + atomSaveRegisters((atomBiosHandlePtr)CAIL, atomRegisterMC, Address); + + RHDWriteMC(((atomBiosHandlePtr)CAIL), Address | MC_IND_ALL | MC_IND_WR_EN, data); +} + +#ifdef XSERVER_LIBPCIACCESS + +VOID +CailReadPCIConfigData(VOID*CAIL, VOID* ret, UINT32 idx,UINT16 size) +{ + pci_device_cfg_read(RHDPTRI((atomBiosHandlePtr)CAIL)->PciInfo, + ret,idx << 2 , size >> 3, NULL); +} + +VOID +CailWritePCIConfigData(VOID*CAIL,VOID*src,UINT32 idx,UINT16 size) +{ + atomSaveRegisters((atomBiosHandlePtr)CAIL, atomRegisterPCICFG, idx << 2); + pci_device_cfg_write(RHDPTRI((atomBiosHandlePtr)CAIL)->PciInfo, + src, idx << 2, size >> 3, NULL); +} + +#else + +VOID +CailReadPCIConfigData(VOID*CAIL, VOID* ret, UINT32 idx,UINT16 size) +{ + PCITAG tag = RHDPTRI((atomBiosHandlePtr)CAIL)->PciTag; + + CAILFUNC(CAIL); + + switch (size) { + case 8: + *(CARD8*)ret = pciReadByte(tag,idx << 2); + break; + case 16: + *(CARD16*)ret = pciReadWord(tag,idx << 2); + break; + case 32: + *(CARD32*)ret = pciReadLong(tag,idx << 2); + break; + default: + xf86DrvMsg(((atomBiosHandlePtr)CAIL)->scrnIndex, + X_ERROR,"%s: Unsupported size: %i\n", + __func__,(int)size); + return; + break; + } + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x) = %x\n",__func__,idx,*(unsigned int*)ret); + +} + +VOID +CailWritePCIConfigData(VOID*CAIL,VOID*src,UINT32 idx,UINT16 size) +{ + PCITAG tag = RHDPTRI((atomBiosHandlePtr)CAIL)->PciTag; + + CAILFUNC(CAIL); + + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x,%x)\n",__func__,idx,(*(unsigned int*)src)); + + atomSaveRegisters((atomBiosHandlePtr)CAIL, atomRegisterPCICFG, idx << 2); + + switch (size) { + case 8: + pciWriteByte(tag,idx << 2,*(CARD8*)src); + break; + case 16: + pciWriteWord(tag,idx << 2,*(CARD16*)src); + break; + case 32: + pciWriteLong(tag,idx << 2,*(CARD32*)src); + break; + default: + xf86DrvMsg(((atomBiosHandlePtr)CAIL)->scrnIndex,X_ERROR, + "%s: Unsupported size: %i\n",__func__,(int)size); + break; + } +} +#endif + +ULONG +CailReadPLL(VOID *CAIL, ULONG Address) +{ + ULONG ret; + + CAILFUNC(CAIL); + + ret = _RHDReadPLL(((atomBiosHandlePtr)CAIL)->scrnIndex, Address); + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x) = %x\n",__func__,Address,ret); + return ret; +} + +VOID +CailWritePLL(VOID *CAIL, ULONG Address,ULONG Data) +{ + CAILFUNC(CAIL); + + RHDDebugVerb(((atomBiosHandlePtr)CAIL)->scrnIndex,1,"%s(%x,%x)\n",__func__,Address,Data); + atomSaveRegisters((atomBiosHandlePtr)CAIL, atomRegisterPLL, Address); + _RHDWritePLL(((atomBiosHandlePtr)CAIL)->scrnIndex, Address, Data); +} + +# endif + +#endif /* ATOM_BIOS */ diff --git a/driver/xf86-video-radeonhd/src/rhd_atombios.h b/driver/xf86-video-radeonhd/src/rhd_atombios.h new file mode 100644 index 000000000..16c24f592 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atombios.h @@ -0,0 +1,573 @@ +/* + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + + +#ifndef RHD_ATOMBIOS_H_ +# define RHD_ATOMBIOS_H_ + +# ifdef ATOM_BIOS + +#define RHD_ATOMBIOS_ON 1 +#define RHD_ATOMBIOS_OFF 2 +#define RHD_ATOMBIOS_FORCE 4 +#define RHD_ATOMBIOS_CRTC 0 +#define RHD_ATOMBIOS_PLL 4 +#define RHD_ATOMBIOS_OUTPUT 8 + +typedef enum _AtomBiosRequestID { + ATOM_INIT, + ATOM_TEARDOWN, +# ifdef ATOM_BIOS_PARSER + ATOM_EXEC, +# endif + ATOM_ALLOCATE_FB_SCRATCH, + ATOM_GET_CONNECTORS, + ATOM_GET_OUTPUT_DEVICE_LIST, + ATOM_GET_PANEL_MODE, + ATOM_GET_PANEL_EDID, + ATOM_GET_CODE_DATA_TABLE, + ATOM_GET_DEFAULT_ENGINE_CLOCK, + ATOM_GET_DEFAULT_MEMORY_CLOCK, + ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT, + ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT, + ATOM_GET_MAX_PIXEL_CLOCK_PLL_INPUT, + ATOM_GET_MIN_PIXEL_CLOCK_PLL_INPUT, + ATOM_GET_MAX_PIXEL_CLK, + ATOM_GET_REF_CLOCK, + ATOM_GET_FW_FB_START, + ATOM_GET_FW_FB_SIZE, + ATOM_TMDS_MAX_FREQUENCY, + ATOM_TMDS_PLL_CHARGE_PUMP, + ATOM_TMDS_PLL_DUTY_CYCLE, + ATOM_TMDS_PLL_VCO_GAIN, + ATOM_TMDS_PLL_VOLTAGE_SWING, + ATOM_LVDS_SUPPORTED_REFRESH_RATE, + ATOM_LVDS_OFF_DELAY, + ATOM_LVDS_SEQ_DIG_ONTO_DE, + ATOM_LVDS_SEQ_DE_TO_BL, + ATOM_LVDS_SPATIAL_DITHER, + ATOM_LVDS_TEMPORAL_DITHER, + ATOM_LVDS_DUALLINK, + ATOM_LVDS_24BIT, + ATOM_LVDS_GREYLVL, + ATOM_LVDS_FPDI, + ATOM_GPIO_QUERIES, + ATOM_GPIO_I2C_CLK_MASK, + ATOM_GPIO_I2C_CLK_MASK_SHIFT, + ATOM_GPIO_I2C_DATA_MASK, + ATOM_GPIO_I2C_DATA_MASK_SHIFT, + ATOM_DAC1_BG_ADJ, + ATOM_DAC1_DAC_ADJ, + ATOM_DAC1_FORCE, + ATOM_DAC2_CRTC2_BG_ADJ, + ATOM_DAC2_NTSC_BG_ADJ, + ATOM_DAC2_PAL_BG_ADJ, + ATOM_DAC2_CV_BG_ADJ, + ATOM_DAC2_CRTC2_DAC_ADJ, + ATOM_DAC2_NTSC_DAC_ADJ, + ATOM_DAC2_PAL_DAC_ADJ, + ATOM_DAC2_CV_DAC_ADJ, + ATOM_DAC2_CRTC2_FORCE, + ATOM_DAC2_CRTC2_MUX_REG_IND, + ATOM_DAC2_CRTC2_MUX_REG_INFO, + ATOM_ANALOG_TV_MODE, + ATOM_ANALOG_TV_DEFAULT_MODE, + ATOM_ANALOG_TV_SUPPORTED_MODES, + ATOM_GET_CONDITIONAL_GOLDEN_SETTINGS, + ATOM_GET_PCIENB_CFG_REG7, + ATOM_GET_CAPABILITY_FLAG, + ATOM_GET_PCIE_LANES, + ATOM_SET_REGISTER_LIST_LOCATION, + ATOM_RESTORE_REGISTERS, + ATOM_GET_ENGINE_CLOCK, + ATOM_GET_MEMORY_CLOCK, + ATOM_SET_ENGINE_CLOCK, + ATOM_SET_MEMORY_CLOCK, + ATOM_PM_SETUP, + ATOM_PM_CLOCKGATING_SETUP, + ATOM_GET_CHIP_LIMITS, + ATOM_GET_VOLTAGE, + ATOM_SET_VOLTAGE, + ATOM_GET_CHIP_CONFIGS, + ATOM_FUNC_END +} AtomBiosRequestID; + +typedef enum _AtomBiosResult { + ATOM_SUCCESS, + ATOM_FAILED, + ATOM_NOT_IMPLEMENTED +} AtomBiosResult; + +typedef struct AtomExec { + int index; + pointer pspace; + pointer *dataSpace; +} AtomExecRec, *AtomExecPtr; + +typedef struct AtomFb { + unsigned int start; + unsigned int size; +} AtomFbRec, *AtomFbPtr; + +struct AtomDacCodeTableData +{ + CARD8 DAC1PALWhiteFine; + CARD8 DAC1PALBandGap; + CARD8 DAC1NTSCWhiteFine; + CARD8 DAC1NTSCBandGap; + CARD8 DAC1VGAWhiteFine; + CARD8 DAC1VGABandGap; + CARD8 DAC1CVWhiteFine; + CARD8 DAC1CVBandGap; + CARD8 DAC2PALWhiteFine; + CARD8 DAC2PALBandGap; + CARD8 DAC2NTSCWhiteFine; + CARD8 DAC2NTSCBandGap; + CARD8 DAC2VGAWhiteFine; + CARD8 DAC2VGABandGap; + CARD8 DAC2CVWhiteFine; + CARD8 DAC2CVBandGap; +}; + +typedef enum AtomTVMode { + ATOM_TVMODE_NTSC = 1 << 0, + ATOM_TVMODE_NTSCJ = 1 << 1, + ATOM_TVMODE_PAL = 1 << 2, + ATOM_TVMODE_PALM = 1 << 3, + ATOM_TVMODE_PALCN = 1 << 4, + ATOM_TVMODE_PALN = 1 << 5, + ATOM_TVMODE_PAL60 = 1 << 6, + ATOM_TVMODE_SECAM = 1 << 7, + ATOM_TVMODE_CV = 1 << 8 +} AtomTVMode; + +enum atomPCIELanes { + atomPCIELaneNONE, + atomPCIELane0_3, + atomPCIELane0_7, + atomPCIELane4_7, + atomPCIELane8_11, + atomPCIELane8_15, + atomPCIELane12_15 +}; + +enum atomDevice { + atomNone, /* 0 */ + atomCRT1, /* 1 */ + atomLCD1, /* 2 */ + atomTV1, /* 3 */ + atomDFP1, /* 4 */ + atomCRT2, /* 5 */ + atomLCD2, /* 6 */ + atomTV2, /* 7 */ + atomDFP2, /* 8 */ + atomCV, /* 9 */ + atomDFP3, /* a */ + atomDFP4, /* b */ + atomDFP5 /* c */ +}; + +typedef struct AtomGoldenSettings +{ + unsigned char *BIOSPtr; + unsigned char *End; + unsigned int value; + +} AtomGoldenSettings; + +typedef struct AtomChipLimits +{ + struct rhdPowerState Minimum; + struct rhdPowerState Maximum; + struct rhdPowerState Default; +} AtomChipLimits; + +typedef struct AtomChipConfigs +{ + int num; + struct rhdPowerState *Settings; +} AtomChipConfigs; + + +typedef union AtomBiosArg +{ + CARD32 val; + struct rhdConnectorInfo *ConnectorInfo; + struct rhdAtomOutputDeviceList *OutputDeviceList; + enum RHD_CHIPSETS chipset; + struct AtomGoldenSettings GoldenSettings; + unsigned char* EDIDBlock; + void **Address; + struct { + unsigned char *loc; + unsigned short size; + } CommandDataTable; + struct { + enum atomPCIELanes Chassis; + enum atomPCIELanes Docking; + } pcieLanes; + atomBiosHandlePtr atomhandle; + DisplayModePtr mode; + AtomExecRec exec; + AtomFbRec fb; + enum RHD_TV_MODE tvMode; + unsigned long clockValue; + AtomChipLimits chipLimits; + AtomChipConfigs chipConfigs; +} AtomBiosArgRec, *AtomBiosArgPtr; + +enum atomCrtc { + atomCrtc1, + atomCrtc2 +}; + +enum atomCrtcAction { + atomCrtcEnable, + atomCrtcDisable +}; + +enum atomOutputLinks { + atomSingleLink, + atomDualLink +}; + +enum atomTransmitter { + atomTransmitterLVTMA, + atomTransmitterUNIPHY, + atomTransmitterUNIPHY1, + atomTransmitterUNIPHY2, + atomTransmitterPCIEPHY, + atomTransmitterDIG1, + atomTransmitterDIG2 +}; + +enum atomTransmitterAction { + atomTransDisable, + atomTransEnable, + atomTransEnableOutput, + atomTransDisableOutput, + atomTransInit, + atomTransLcdBlOff, + atomTransLcdBlOn, + atomTransLcdBlBrightness, + atomTransSetup +}; + +enum atomEncoder { + atomEncoderNone, + atomEncoderDACA, + atomEncoderDACB, + atomEncoderTV, + atomEncoderTMDS1, /* TMDSA */ + atomEncoderTMDS2, /* LVTMA */ + atomEncoderLVDS, /* LVTMA (Panel) */ + atomEncoderDVO, + atomEncoderDIG1, + atomEncoderDIG2, + atomEncoderExternal +}; + +enum atomEncoderMode { + atomNoEncoder, + atomDVI, + atomDP, + atomLVDS, + atomHDMI, + atomSDVO, + atomTVComposite, + atomTVSVideo, + atomTVComponent, + atomCRT +}; + +enum atomEncoderAction { + atomEncoderOff, + atomEncoderOn +}; + +enum atomOutput { + atomDVOOutput, + atomLCDOutput, + atomCVOutput, + atomTVOutput, + atomLVTMAOutput, + atomTMDSAOutput, + atomDAC1Output, + atomDAC2Output +}; + +enum atomOutputType { + atomOutputNone, + atomOutputDacA, + atomOutputDacB, + atomOutputTmdsa, + atomOutputLvtma, + atomOutputDvo, + atomOutputKldskpLvtma, + atomOutputUniphyA, + atomOutputUniphyB, + atomOutputUniphyC, + atomOutputUniphyD, + atomOutputUniphyE, + atomOutputUniphyF +}; + +enum atomOutputAction { + atomOutputEnable, + atomOutputDisable, + atomOutputLcdOn, + atomOutputLcdOff, + atomOutputLcdBrightnessControl, + atomOutputLcdSelftestStart, + atomOutputLcdSelftestStop, + atomOutputEncoderInit +}; + +enum atomDAC { + atomDACA, + atomDACB, + atomDACExt +}; + +enum atomTransmitterLink { + atomTransLinkA, + atomTransLinkAB, + atomTransLinkB, + atomTransLinkBA +}; + +enum atomDACStandard { + atomDAC_VGA, + atomDAC_CV, + atomDAC_NTSC, + atomDAC_PAL +}; + +enum atomDVORate { + atomDVO_RateSDR, + atomDVO_RateDDR +}; + +enum atomDVOOutput { + atomDVO_OutputLow12Bit, + atomDVO_OutputHigh12Bit, + atomDVO_Output24Bit +}; + +enum atomScaler { + atomScaler1, + atomScaler2 +}; + +enum atomScaleMode { + atomScaleDisable, + atomScaleCenter, + atomScaleExpand, + atomScaleMulttabExpand +}; + +enum atomPxclk { + atomPclk1, + atomPclk2 +}; + +struct atomCodeTableVersion +{ + CARD8 cref; + CARD8 fref; +}; + +enum atomTemporalGreyLevels { + atomTemporalDither0, + atomTemporalDither4, + atomTemporalDither2 +}; + +struct atomTransmitterConfig +{ + int PixelClock; + enum atomEncoder Encoder; + enum atomPCIELanes Lanes; + enum atomEncoderMode Mode; + enum atomTransmitterLink Link; + enum atomOutputLinks LinkCnt; + Bool Coherent; +}; + +struct atomEncoderConfig +{ + int PixelClock; + union { + struct { + enum atomDACStandard DacStandard; + } dac; + struct { + enum RHD_TV_MODE TvStandard; + } tv; + struct { + enum atomOutputLinks LinkCnt; + Bool Is24bit; + } lvds; + struct { + enum atomOutputLinks LinkCnt; + Bool Is24bit; + Bool Coherent; + Bool LinkB; + Bool Hdmi; + Bool SpatialDither; + enum atomTemporalGreyLevels TemporalGrey; + } lvds2; + struct { + enum atomTransmitterLink Link; + enum atomOutputLinks LinkCnt; + enum atomTransmitter Transmitter; + enum atomEncoderMode EncoderMode; + } dig; + struct { + enum atomDevice DvoDeviceType; + int EncoderID; + Bool digital; + union + { + enum RHD_TV_MODE TVMode; + char dummy; /* @@@ placeholder for digital attributes */ + } u; + } dvo; + struct{ + enum atomDVORate Rate; + enum atomDVOOutput DvoOutput; + } dvo3; + } u; +}; + +struct atomCrtcSourceConfig +{ + union { + enum atomDevice Device; + struct { + enum atomEncoder Encoder; + enum atomEncoderMode Mode; + } crtc2; + } u; +}; + +struct atomPixelClockConfig { + Bool Enable; + int PixelClock; + int RefDiv; + int FbDiv; + int PostDiv; + int FracFbDiv; + enum atomCrtc Crtc; + union { + struct { + Bool Force; + enum atomDevice Device; + } v2; + struct { + Bool Force; + enum atomOutputType OutputType; + enum atomEncoderMode EncoderMode; + Bool UsePpll; + } v3; + } u; +}; + +struct atomCrtcOverscan { + unsigned short ovscnLeft; + unsigned short ovscnRight; + unsigned short ovscnTop; + unsigned short ovscnBottom; +}; + +enum atomBlankAction { + atomBlankOn, + atomBlankOff +}; + +struct atomCrtcBlank { + enum atomBlankAction Action; + unsigned short r, g, b; +}; + +extern int rhdUpdateAtomBIOSUsage(RHDPtr rhdPtr, char *string); +extern char *rhdReturnAtomBIOSUsage(RHDPtr rhdPtr); + +extern AtomBiosResult RHDAtomBiosFunc(int scrnIndex, atomBiosHandlePtr handle, + AtomBiosRequestID id, AtomBiosArgPtr data); + +# ifdef ATOM_BIOS_PARSER +extern Bool rhdAtomSetTVEncoder(atomBiosHandlePtr handle, Bool enable, int mode); + +# if 0 +extern Bool rhdAtomASICInit(atomBiosHandlePtr handle); +extern struct atomCodeTableVersion rhdAtomASICInitVersion(atomBiosHandlePtr handle); +# endif +extern Bool rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scaler, + enum atomScaleMode mode); +extern struct atomCodeTableVersion rhdAtomSetScalerVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomDigTransmitterControl(atomBiosHandlePtr handle, enum atomTransmitter id, + enum atomTransmitterAction action, + struct atomTransmitterConfig *config); +extern struct atomCodeTableVersion rhdAtomDigTransmitterControlVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomOutputControl(atomBiosHandlePtr handle, enum atomOutput id, + enum atomOutputAction action); +extern struct atomCodeTableVersion rhdAtomOutputControlVersion(atomBiosHandlePtr handle, + enum atomOutput id); +extern Bool AtomDACLoadDetection(atomBiosHandlePtr handle, enum atomDevice id, enum atomDAC dac); +extern struct atomCodeTableVersion AtomDACLoadDetectionVersion(atomBiosHandlePtr handle, enum atomDevice id); +extern Bool rhdAtomEncoderControl(atomBiosHandlePtr handle, enum atomEncoder id, + enum atomEncoderAction action, struct atomEncoderConfig *config); +struct atomCodeTableVersion rhdAtomEncoderControlVersion(atomBiosHandlePtr handle, +enum atomEncoder id); +extern Bool rhdAtomUpdateCRTC_DoubleBufferRegisters(atomBiosHandlePtr handle, enum atomCrtc id, + enum atomCrtcAction action); +extern struct atomCodeTableVersion rhdAtomUpdateCRTC_DoubleBufferRegistersVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomEnableCrtc(atomBiosHandlePtr handle, enum atomCrtc id, + enum atomCrtcAction action); +extern struct atomCodeTableVersion rhdAtomEnableCrtcVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomEnableCrtcMemReq(atomBiosHandlePtr handle, enum atomCrtc id, + enum atomCrtcAction action); +extern struct atomCodeTableVersion rhdAtomEnableCrtcMemReqVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomSetCRTCTimings(atomBiosHandlePtr handle, enum atomCrtc id, DisplayModePtr mode, + int depth); +extern struct atomCodeTableVersion rhdAtomSetCRTCTimingsVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomSetPixelClock(atomBiosHandlePtr handle, enum atomPxclk id, + struct atomPixelClockConfig *config); +extern struct atomCodeTableVersion rhdAtomSetPixelClockVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomSelectCrtcSource(atomBiosHandlePtr handle, enum atomCrtc id, + struct atomCrtcSourceConfig *config); +extern struct atomCodeTableVersion rhdAtomSelectCrtcSourceVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomSetCRTCOverscan(atomBiosHandlePtr handle, enum atomCrtc id, + struct atomCrtcOverscan *config); +struct atomCodeTableVersion rhdAtomSetCRTCOverscanVersion(atomBiosHandlePtr handle); +extern Bool rhdAtomBlankCRTC(atomBiosHandlePtr handle, enum atomCrtc id, struct atomCrtcBlank *config); +extern struct atomCodeTableVersion rhdAtomBlankCRTCVersion(atomBiosHandlePtr handle); + +# endif /* ATOM_BIOS_PASER */ + +# endif /* ATOM_BIOS */ + +#endif /* RHD_ATOMBIOS_H_ */ diff --git a/driver/xf86-video-radeonhd/src/rhd_atomcrtc.c b/driver/xf86-video-radeonhd/src/rhd_atomcrtc.c new file mode 100644 index 000000000..72b3d8de7 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atomcrtc.c @@ -0,0 +1,461 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_pll.h" +#include "rhd_lut.h" +#include "rhd_regs.h" +#include "rhd_modes.h" +#include "rhd_mc.h" +#if defined (ATOM_BIOS) && defined (ATOM_BIOS_PARSER) +# include "rhd_atombios.h" + +# define D1_REG_OFFSET 0x0000 +# define D2_REG_OFFSET 0x0800 + +struct rhdCrtcScalePrivate { + void *RegList; + CARD32 StoreViewportSize; + CARD32 StoreViewportStart; +}; + +/* + * + */ +static void +rhdAtomCrtcRestore(struct rhdCrtc *Crtc, void *Store) +{ + ScrnInfoPtr pScrn = xf86Screens[Crtc->scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + union AtomBiosArg data; + + RHDFUNC(rhdPtr); + + data.Address = Store; + RHDAtomBiosFunc(Crtc->scrnIndex, rhdPtr->atomBIOS, ATOM_RESTORE_REGISTERS, &data); +} + +/* + * + */ +static void +rhdAtomScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, + DisplayModePtr Mode, DisplayModePtr ScaledToMode) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + struct rhdScalerOverscan Overscan; + struct atomCrtcOverscan AtomOverscan; + enum atomCrtc AtomCrtc = RHD_CRTC_1; + enum atomScaler Scaler = 0; + enum atomScaleMode ScaleMode = 0; + union AtomBiosArg data; + CARD32 RegOff = 0; + + RHDDebug(Crtc->scrnIndex, "FUNCTION: %s: %s viewport: %ix%i\n", __func__, Crtc->Name, + Mode->CrtcHDisplay, Mode->CrtcVDisplay); + + /* D1Mode registers */ + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_SIZE, + Mode->CrtcVDisplay | (Mode->CrtcHDisplay << 16)); + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_START, 0); + + Overscan = rhdCalculateOverscan(Mode, ScaledToMode, Type); + Type = Overscan.Type; + + ASSERT(Crtc->ScalePriv); + data.Address = &((Crtc->ScalePriv)->RegList); + RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + AtomOverscan.ovscnLeft = Overscan.OverscanLeft; + AtomOverscan.ovscnRight = Overscan.OverscanRight; + AtomOverscan.ovscnTop = Overscan.OverscanTop; + AtomOverscan.ovscnBottom = Overscan.OverscanBottom; + + switch (Crtc->Id) { + case RHD_CRTC_1: + Scaler = atomScaler1; + AtomCrtc = atomCrtc1; + break; + case RHD_CRTC_2: + Scaler = atomScaler2; + AtomCrtc = atomCrtc2; + break; + } + + rhdAtomSetCRTCOverscan(rhdPtr->atomBIOS, AtomCrtc, &AtomOverscan); + + switch (Type) { + case RHD_CRTC_SCALE_TYPE_NONE: + ScaleMode = atomScaleDisable; + break; + case RHD_CRTC_SCALE_TYPE_CENTER: + ScaleMode = atomScaleCenter; + break; + case RHD_CRTC_SCALE_TYPE_SCALE: + case RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO: /* scaled to fullscreen */ + ScaleMode = atomScaleExpand; + break; + } + rhdAtomSetScaler(rhdPtr->atomBIOS, Scaler, ScaleMode); + + data.Address = NULL; + RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + RHDMCTuneAccessForDisplay(rhdPtr, Crtc->Id, Mode, + ScaledToMode ? ScaledToMode : Mode); +} + +/* + * + */ +static void +rhdAtomScaleSave(struct rhdCrtc *Crtc) +{ + struct rhdCrtcScalePrivate* ScalePriv; + CARD32 RegOff = 0; + + RHDFUNC(Crtc); + + if (!Crtc->ScalePriv) { + if(!(ScalePriv = (struct rhdCrtcScalePrivate*)xnfcalloc(1, sizeof(struct rhdCrtcScalePrivate)))) + return; + Crtc->ScalePriv = ScalePriv; + } else + ScalePriv = Crtc->ScalePriv; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + ScalePriv->StoreViewportSize = RHDRegRead(Crtc, RegOff + D1MODE_VIEWPORT_SIZE); + ScalePriv->StoreViewportStart = RHDRegRead(Crtc, RegOff + D1MODE_VIEWPORT_START); + ScalePriv->RegList = NULL; +} + +/* + * + */ +static void +rhdAtomCrtcScaleRestore(struct rhdCrtc *Crtc) +{ + struct rhdCrtcScalePrivate* ScalePriv; + CARD32 RegOff = 0; + + RHDFUNC(Crtc); + + rhdAtomCrtcRestore(Crtc, &(((struct rhdCrtcScalePrivate*)Crtc->ScalePriv)->RegList)); + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + ScalePriv = (struct rhdCrtcScalePrivate*)Crtc->ScalePriv; + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_SIZE, ScalePriv->StoreViewportSize); + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_START, ScalePriv->StoreViewportStart); +} + +/* + * + */ +static void +rhdAtomCrtcScaleDestroy(struct rhdCrtc *Crtc) +{ + RHDFUNC(Crtc); + + if (Crtc->ScalePriv) { + xfree(Crtc->ScalePriv->RegList); + xfree(Crtc->ScalePriv); + Crtc->ScalePriv = NULL; + } +} + +/* + * + */ +struct rhdCrtcModePrivate { + void *RegList; + CARD32 StoreModeDataFormat; +}; + +static void +rhdAtomModeSet(struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + ScrnInfoPtr pScrn = xf86Screens[Crtc->scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + union AtomBiosArg data; + CARD32 RegOff = 0; + + RHDFUNC(rhdPtr); + + ASSERT(Crtc->ModePriv); + data.Address = &((Crtc->ModePriv)->RegList); + RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + if (!rhdAtomSetCRTCTimings(rhdPtr->atomBIOS, + Crtc->Id == RHD_CRTC_1 ? atomCrtc1 : atomCrtc2, + Mode, pScrn->depth)) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: failed to set mode.\n",__func__); + + /* set interlaced - AtomBIOS never sets the data format - never tested? */ + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + if (Mode->Flags & V_INTERLACE) + RHDRegWrite(Crtc, RegOff + D1MODE_DATA_FORMAT, 0x1); + else + RHDRegWrite(Crtc, RegOff + D1MODE_DATA_FORMAT, 0x0); + + data.Address = NULL; + RHDAtomBiosFunc(Crtc->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); +} + +/* + * + */ +static Bool +rhdAtomCrtcPower(struct rhdCrtc *Crtc, int Power) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + enum atomCrtc AtomCrtc = atomCrtc1; + union AtomBiosArg data; + + RHDFUNC(Crtc); + + switch (Crtc->Id) { + case RHD_CRTC_1: + AtomCrtc = atomCrtc1; + break; + case RHD_CRTC_2: + AtomCrtc = atomCrtc2; + break; + } + data.Address = &((Crtc->ModePriv)->RegList); + RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + /* + * We call rhdAtomEnableCrtcMemReq blindly as this table seemed to have existed in all + * versions of AtomBIOS on the hardware we support + */ + switch (Power) { + case RHD_POWER_ON: + rhdAtomEnableCrtcMemReq(rhdPtr->atomBIOS, AtomCrtc, atomCrtcEnable); + rhdAtomEnableCrtc(rhdPtr->atomBIOS, AtomCrtc, atomCrtcEnable); + break; + case RHD_POWER_RESET: + case RHD_POWER_SHUTDOWN: + default: + rhdAtomEnableCrtc(rhdPtr->atomBIOS, AtomCrtc, atomCrtcDisable); + rhdAtomEnableCrtcMemReq(rhdPtr->atomBIOS, AtomCrtc, atomCrtcDisable); + break; + } + data.Address = NULL; + RHDAtomBiosFunc(Crtc->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + /* + * we always claim we succeeded here, after all, we know, AtomBIOS knows + * how to do things, right? + * Err, no, when we use AtomBIOS we should not have a clue how to find out. + */ + return TRUE; +} + +/* + * + */ +static void +rhdAtomCrtcBlank(struct rhdCrtc *Crtc, Bool Blank) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + enum atomCrtc AtomCrtc = atomCrtc1; + struct atomCrtcBlank Config; + union AtomBiosArg data; + + RHDFUNC(Crtc); + + switch (Crtc->Id) { + case RHD_CRTC_1: + AtomCrtc = atomCrtc1; + break; + case RHD_CRTC_2: + AtomCrtc = atomCrtc2; + break; + } + if (Blank) + Config.Action = atomBlankOn; + else + Config.Action = atomBlankOff; + + Config.r = Config.g = Config.b = 0; + + data.Address = &((Crtc->ModePriv)->RegList); + RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + rhdAtomBlankCRTC(rhdPtr->atomBIOS, AtomCrtc , &Config); + + data.Address = NULL; + RHDAtomBiosFunc(Crtc->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); +} + +/* + * + */ +static void +rhdAtomModeSave(struct rhdCrtc *Crtc) +{ + struct rhdCrtcModePrivate* ModePriv; + CARD32 RegOff = 0; + + if (!Crtc->ModePriv) { + if(!(ModePriv = (struct rhdCrtcModePrivate*)xnfcalloc(1, sizeof(struct rhdCrtcModePrivate)))) + return; + Crtc->ModePriv = ModePriv; + } else + ModePriv = Crtc->ModePriv; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + ModePriv->StoreModeDataFormat = RHDRegRead(Crtc, RegOff + D1MODE_DATA_FORMAT); + ModePriv->RegList = NULL; +} + +/* + * + */ +static void +rhdAtomModeRestore(struct rhdCrtc *Crtc) +{ + struct rhdCrtcModePrivate* ModePriv; + CARD32 RegOff = 0; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + ModePriv = Crtc->ModePriv; + + rhdAtomCrtcRestore(Crtc, &ModePriv->RegList); + + RHDRegWrite(Crtc, RegOff + D1MODE_DATA_FORMAT, ModePriv->StoreModeDataFormat); +} + +/* + * + */ +static void +rhdAtomModeDestroy(struct rhdCrtc *Crtc) +{ + RHDFUNC(Crtc); + + if (Crtc->ModePriv) { + xfree(Crtc->ModePriv->RegList); + xfree(Crtc->ModePriv); + Crtc->ModePriv = NULL; + } +} + +/* + * + */ +void +RHDAtomCrtcsInit(RHDPtr rhdPtr) +{ + struct rhdCrtc *Crtc; + int i; + + RHDFUNC(rhdPtr); + + if (rhdPtr->Crtc[0] == NULL || rhdPtr->Crtc[1] == NULL) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: CRTCs not initialized\n",__func__); + return; + } + + for (i = 0; i < 2; i++) { + + Crtc = rhdPtr->Crtc[i]; + + if (i == 0) { + Crtc->Name = "ATOM CRTC 1"; + Crtc->Id = RHD_CRTC_1; + } else { + Crtc->Name = "ATOM CRTC 2"; + Crtc->Id = RHD_CRTC_2; + } + + /* EnableGraphSurfaces is only a BIOS internal table. So use the hardcoded path. + Crtc->FBValid = atomFBValid; + Crtc->FBSet = atomFBSet; + Crtc->FBSave = atomSave; + Crtc->FBRestore = atomRestore; + */ + + /* There is no separate function to set up the LUT thru AtomBIOS */ + + /* Crtc->ScaleValid: From rhd_crtc.c */ + Crtc->ScaleSet = rhdAtomScaleSet; + Crtc->ScaleSave = rhdAtomScaleSave; + Crtc->ScaleRestore = rhdAtomCrtcScaleRestore; + Crtc->ScaleDestroy = rhdAtomCrtcScaleDestroy; + + /* No such AtomBIOS table */ + /* Crtc->FrameSet = atomViewPortStart; */ + + /* Crtc->ModeValid: From rhd_crtc.c */ + Crtc->ModeSet = rhdAtomModeSet; + Crtc->ModeSave = rhdAtomModeSave; + Crtc->ModeRestore = rhdAtomModeRestore; + Crtc->ModeDestroy = rhdAtomModeDestroy; + + Crtc->Power = rhdAtomCrtcPower; + Crtc->Blank = rhdAtomCrtcBlank; + } +} + +#endif /* ATOM_BIOS && ATOM_BIOS_PARSER */ diff --git a/driver/xf86-video-radeonhd/src/rhd_atomout.c b/driver/xf86-video-radeonhd/src/rhd_atomout.c new file mode 100644 index 000000000..9d50ade9f --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atomout.c @@ -0,0 +1,1299 @@ +/* + * Copyright 2007 - 2009 Luc Verhaegen + * Copyright 2007 - 2009 Matthias Hopf + * Copyright 2007 - 2009 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +#endif + +#include "rhd.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_crtc.h" +#include "rhd_atombios.h" +#include "rhd_atomout.h" +#include "rhd_biosscratch.h" +#include "rhd_hdmi.h" +#include "rhd_acpi.h" + +#if defined (ATOM_BIOS) && defined (ATOM_BIOS_PARSER) +struct rhdAtomOutputPrivate { + Bool Stored; + + struct atomCodeTableVersion EncoderVersion; + struct atomCodeTableVersion CrtcSourceVersion; + struct atomEncoderConfig EncoderConfig; + enum atomEncoder EncoderId; + + struct atomTransmitterConfig TransmitterConfig; + enum atomTransmitter TransmitterId; + + enum atomOutput OutputControlId; + + Bool RunDualLink; + int PixelClock; + + void *Save; + + CARD16 PowerDigToDE; + CARD16 PowerDEToBL; + CARD16 OffDelay; + Bool TemporalDither; + Bool SpatialDither; + int GreyLevel; + Bool DualLink; + Bool LVDS24Bit; + Bool FPDI; + + Bool Coherent; + DisplayModePtr Mode; + struct rhdHdmi *Hdmi; + + int BlLevel; + void (*SetBacklight)(struct rhdOutput *Output, int val); + int (*GetBacklight)(struct rhdOutput *Output); +}; + +#define ERROR_MSG(x) xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: %s failed.\n", __func__, x) + +/* + * + */ +static inline void +rhdSetEncoderTransmitterConfig(struct rhdOutput *Output, int PixelClock) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + struct atomEncoderConfig *EncoderConfig = &Private->EncoderConfig; + struct atomTransmitterConfig *TransmitterConfig = &Private->TransmitterConfig; + + RHDFUNC(Output); + + EncoderConfig->PixelClock = TransmitterConfig->PixelClock = PixelClock; + + switch (Output->Id) { + case RHD_OUTPUT_NONE: + break; + case RHD_OUTPUT_DVO: + + EncoderConfig->u.dvo.DvoDeviceType = Output->OutputDriverPrivate->Device; + switch (EncoderConfig->u.dvo.DvoDeviceType) { + case atomCRT1: + case atomCRT2: + EncoderConfig->u.dvo.digital = FALSE; + break; + case atomTV1: + case atomTV2: + case atomCV: + EncoderConfig->u.dvo.digital = FALSE; + EncoderConfig->u.dvo.u.TVMode = rhdPtr->tvMode; + break; + case atomLCD1: + case atomDFP1: + case atomDFP2: + case atomLCD2: + case atomDFP3: + case atomDFP4: + case atomDFP5: + EncoderConfig->u.dvo.digital = TRUE; + /* @@@ no digital attributes, yet */ + break; + case atomNone: + break; + } + break; + case RHD_OUTPUT_DACA: + case RHD_OUTPUT_DACB: + switch (Output->SensedType) { + case RHD_SENSED_VGA: + EncoderConfig->u.dac.DacStandard = atomDAC_VGA; + break; + case RHD_SENSED_TV_COMPONENT: + EncoderConfig->u.dac.DacStandard = atomDAC_CV; + break; + case RHD_SENSED_TV_SVIDEO: + case RHD_SENSED_TV_COMPOSITE: + switch (rhdPtr->tvMode) { + case RHD_TV_NTSC: + case RHD_TV_NTSCJ: + EncoderConfig->u.dac.DacStandard = atomDAC_NTSC; + /* NTSC */ + break; + case RHD_TV_PAL: + case RHD_TV_PALN: + case RHD_TV_PALCN: + case RHD_TV_PAL60: + default: + EncoderConfig->u.dac.DacStandard = atomDAC_PAL; + /* PAL */ + break; + } + break; + case RHD_SENSED_NONE: + EncoderConfig->u.dac.DacStandard = atomDAC_VGA; + break; + default: + xf86DrvMsg(Output->scrnIndex, X_ERROR, "Sensed incompatible output for DAC\n"); + EncoderConfig->u.dac.DacStandard = atomDAC_VGA; + break; + } + break; + + case RHD_OUTPUT_TMDSA: + case RHD_OUTPUT_LVTMA: + if (Output->Connector && PixelClock > 0) { + if (Output->Connector->Type == RHD_CONNECTOR_DVI +#if 0 + || Output->Connector->Type == RHD_CONNECTOR_HDMI_B +#endif + ) + Private->RunDualLink = (PixelClock > 165000) ? TRUE : FALSE; + else + Private->RunDualLink = FALSE; + } else + /* only get here for power down: thus power down both channels to be save */ + Private->RunDualLink = TRUE; + + switch (Private->EncoderVersion.cref) { + case 1: + if (Private->RunDualLink) + EncoderConfig->u.lvds.LinkCnt = atomDualLink; + else + EncoderConfig->u.lvds.LinkCnt = atomSingleLink; + break; + case 2: + case 3: + if (Private->RunDualLink) + EncoderConfig->u.lvds2.LinkCnt = atomDualLink; + else + EncoderConfig->u.lvds2.LinkCnt = atomSingleLink; + if (Private->Coherent) + EncoderConfig->u.lvds2.Coherent = TRUE; + else + EncoderConfig->u.lvds2.Coherent = FALSE; + break; + } + break; + + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + if (Output->Connector && PixelClock > 0) { + if (Output->Connector->Type == RHD_CONNECTOR_DVI +#if 0 + || Output->Connector->Type == RHD_CONNECTOR_DP_DUAL + || Output->Connector->Type == RHD_CONNECTOR_HDMI_B +#endif + ) + Private->RunDualLink = (PixelClock > 165000) ? TRUE : FALSE; + else + Private->RunDualLink = FALSE; + } else + /* only get here for power down: thus power down both channels to be save */ + Private->RunDualLink = TRUE; + + if (Private->RunDualLink) { + TransmitterConfig->LinkCnt = EncoderConfig->u.dig.LinkCnt = atomDualLink; + if (TransmitterConfig->Link == atomTransLinkA) + TransmitterConfig->Link = atomTransLinkAB; + else if (TransmitterConfig->Link == atomTransLinkB) + TransmitterConfig->Link = atomTransLinkBA; + } else { + TransmitterConfig->LinkCnt = EncoderConfig->u.dig.LinkCnt = atomSingleLink; + if (TransmitterConfig->Link == atomTransLinkAB) + TransmitterConfig->Link = atomTransLinkA; + else if (TransmitterConfig->Link == atomTransLinkBA) + TransmitterConfig->Link = atomTransLinkB; + } + TransmitterConfig->Coherent = Private->Coherent; + break; + } +} + +/* + * + */ +static void +atomSetBacklightFromBIOSScratch(struct rhdOutput *Output) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + + RHDFUNC(Output); + + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + rhdSetEncoderTransmitterConfig(Output, Private->PixelClock); + if (!rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, + atomTransLcdBlBrightness, &Private->TransmitterConfig)) + ERROR_MSG("rhdAtomDigTransmitterControl(atomTransEnable)"); + break; + default: + if (!rhdAtomOutputControl(rhdPtr->atomBIOS, Private->OutputControlId, atomOutputLcdBrightnessControl)) + ERROR_MSG("rhdAtomOutputControl(atomOutputLcdBrightnessControl)"); + break; + } +} + +/* + * + */ +static void +atomSetBacklight(struct rhdOutput *Output, int val) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + RHDFUNC(Output); + + RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlSet, &val); + + atomSetBacklightFromBIOSScratch(Output); +} + +/* + * + */ +static inline void +rhdAtomOutputSet(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + struct atomEncoderConfig *EncoderConfig = &Private->EncoderConfig; + struct atomCrtcSourceConfig CrtcSourceConfig; + union AtomBiosArg data; + + RHDFUNC(Output); + + Private->Mode = Mode; + + data.Address = &Private->Save; + RHDAtomBiosFunc(Output->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + Private->PixelClock = Mode->SynthClock; + rhdSetEncoderTransmitterConfig(Output, Private->PixelClock); + + switch ( Private->CrtcSourceVersion.cref){ + case 1: + CrtcSourceConfig.u.Device = Output->OutputDriverPrivate->Device; + break; + case 2: + CrtcSourceConfig.u.crtc2.Encoder = Private->EncoderId; + CrtcSourceConfig.u.crtc2.Mode = EncoderConfig->u.dig.EncoderMode; + break; + default: + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "Unknown version of SelectCrtcSource code table: %i\n",Private->CrtcSourceVersion.cref); + return; + } + switch (Output->Id) { + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: +#if 1 + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, atomTransInit, + &Private->TransmitterConfig); +#endif + case RHD_OUTPUT_KLDSKP_LVTMA: + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, atomTransSetup, + &Private->TransmitterConfig); + break; + default: + break; + } + + rhdAtomSelectCrtcSource(rhdPtr->atomBIOS, Output->Crtc->Id ? atomCrtc2 : atomCrtc1, &CrtcSourceConfig); + data.Address = NULL; + RHDAtomBiosFunc(Output->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + RHDHdmiSetMode(Private->Hdmi, Mode); +} + +/* + * + */ +static Bool +atomIsHdmiEnabled(struct rhdOutput *Output) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + switch(Output->Id) { + case RHD_OUTPUT_TMDSA: + case RHD_OUTPUT_LVTMA: + return Private->EncoderConfig.u.lvds2.Hdmi; + + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + case RHD_OUTPUT_KLDSKP_LVTMA: + return Private->TransmitterConfig.Mode == atomHDMI && + Private->EncoderConfig.u.dig.EncoderMode == atomHDMI; + + default: + return FALSE; + } +} + +/* + * + */ +static void +atomSetHdmiEnabled(struct rhdOutput *Output, Bool value) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + switch(Output->Id) { + case RHD_OUTPUT_TMDSA: + case RHD_OUTPUT_LVTMA: + Private->EncoderConfig.u.lvds2.Hdmi = value; + break; + + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + case RHD_OUTPUT_KLDSKP_LVTMA: + Private->TransmitterConfig.Mode = + Private->EncoderConfig.u.dig.EncoderMode = + value ? atomHDMI : atomDVI; + break; + + default: + break; + } +} + +/* + * + */ +static inline void +rhdAtomOutputPower(struct rhdOutput *Output, int Power) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + struct atomEncoderConfig *EncoderConfig = &Private->EncoderConfig; + union AtomBiosArg data; + + RHDFUNC(Output); + + data.Address = &Private->Save; + RHDAtomBiosFunc(Output->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); + + rhdSetEncoderTransmitterConfig(Output, Private->PixelClock); + + switch (Power) { + case RHD_POWER_ON: + RHDDebug(Output->scrnIndex, "RHD_POWER_ON\n"); + rhdAtomEncoderControl(rhdPtr->atomBIOS, Private->EncoderId, atomEncoderOn, EncoderConfig); + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + if (!rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, + atomTransEnable, &Private->TransmitterConfig)) { + ERROR_MSG("rhdAtomDigTransmitterControl(atomTransEnable)"); + break; + } + if (!rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, + atomTransEnableOutput, &Private->TransmitterConfig)) + ERROR_MSG("rhdAtomDigTransmitterControl(atomTransEnableOutput)"); + break; + default: + if (!rhdAtomOutputControl(rhdPtr->atomBIOS, Private->OutputControlId, atomOutputEnable)) + ERROR_MSG("rhdAtomOutputControl(atomOutputEnable)"); + break; + } + RHDHdmiEnable(Private->Hdmi, atomIsHdmiEnabled(Output)); + break; + case RHD_POWER_RESET: + RHDDebug(Output->scrnIndex, "RHD_POWER_RESET\n"); + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + if (!rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, + atomTransDisableOutput, &Private->TransmitterConfig)) + ERROR_MSG("rhdAtomDigTransmitterControl(atomTransDisableOutput)"); + break; + default: + if (!rhdAtomOutputControl(rhdPtr->atomBIOS, Private->OutputControlId, atomOutputDisable)) + ERROR_MSG("rhdAtomOutputControl(atomOutputDisable)"); + break; + } + break; + case RHD_POWER_SHUTDOWN: + RHDDebug(Output->scrnIndex, "RHD_POWER_SHUTDOWN\n"); + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + if (Private->EncoderId == atomEncoderNone) + break; + if (!rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, + atomTransDisableOutput, &Private->TransmitterConfig)) { + ERROR_MSG("rhdAtomDigTransmitterControl(atomTransDisableOutput)"); + break; + } + if (!rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, Private->TransmitterId, + atomTransDisable, &Private->TransmitterConfig)) + ERROR_MSG("rhdAtomDigTransmitterControl(atomTransDisable)"); + break; + default: + if (!rhdAtomOutputControl(rhdPtr->atomBIOS, Private->OutputControlId, atomOutputDisable)) + ERROR_MSG("rhdAtomOutputControl(atomOutputDisable)"); + break; + } + if (Private->EncoderId != atomEncoderNone) + if (!rhdAtomEncoderControl(rhdPtr->atomBIOS, Private->EncoderId, atomEncoderOff, &Private->EncoderConfig)) + ERROR_MSG("rhdAtomEncoderControl(atomEncoderOff)"); + RHDHdmiEnable(Private->Hdmi, FALSE); + break; + } + + data.Address = NULL; + RHDAtomBiosFunc(Output->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); +} + +/* + * + */ +static inline void +rhdAtomOutputSave(struct rhdOutput *Output) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + RHDHdmiSave(Private->Hdmi); +} + +/* + * + */ +static void +rhdAtomOutputRestore(struct rhdOutput *Output) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + union AtomBiosArg data; + + data.Address = &Private->Save; + RHDAtomBiosFunc(Output->scrnIndex, rhdPtr->atomBIOS, ATOM_RESTORE_REGISTERS, &data); + /* ??? */ + if (Output->Connector && Output->Connector->Type == RHD_CONNECTOR_PANEL) + atomSetBacklightFromBIOSScratch(Output); + RHDHdmiRestore(Private->Hdmi); +} + +/* + * + */ +static ModeStatus +rhdAtomOutputModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + + RHDFUNC(Output); + + if (Mode->Clock < 25000) + return MODE_CLOCK_LOW; + + if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE +#if 0 + || Output->Connector->Type == RHD_CONNECTOR_DP_DUAL + || Output->Connector->Type == RHD_CONNECTOR_HDMI_B +#endif + ) { + if (Mode->Clock > 165000) + return MODE_CLOCK_HIGH; + } + else if (Output->Connector->Type == RHD_CONNECTOR_DVI) { + if (Mode->Clock > 330000) /* could go higher still */ + return MODE_CLOCK_HIGH; + } + + return MODE_OK; +} + +/* + * + */ +static int +atomGetBacklight(struct rhdOutput *Output) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + int level; + + RHDFUNC(Output); + + if (Private->BlLevel == -1) return -1; + + RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlSet, &level); + + return level; +} + + +/* + * + */ +static Bool +LVDSInfoRetrieve(struct rhdOutput *Output, struct rhdAtomOutputPrivate *Private) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + AtomBiosArgRec data; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SEQ_DIG_ONTO_DE, &data) != ATOM_SUCCESS) + return FALSE; + Private->PowerDigToDE = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SEQ_DE_TO_BL, &data) != ATOM_SUCCESS) + return FALSE; + Private->PowerDEToBL = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_OFF_DELAY, &data) != ATOM_SUCCESS) + return FALSE; + Private->OffDelay = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_DUALLINK, &data) != ATOM_SUCCESS) + return FALSE; + Private->DualLink = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_24BIT, &data) != ATOM_SUCCESS) + return FALSE; + Private->LVDS24Bit = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_FPDI, &data) != ATOM_SUCCESS) + return FALSE; + Private->FPDI = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_TEMPORAL_DITHER, &data) != ATOM_SUCCESS) + return FALSE; + Private->TemporalDither = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SPATIAL_DITHER, &data) != ATOM_SUCCESS) + return FALSE; + Private->SpatialDither = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_GREYLVL, &data) != ATOM_SUCCESS) + return FALSE; + { + Private->GreyLevel = data.val; + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "AtomBIOS returned %i Grey Levels\n", + Private->GreyLevel); + } + Private->Coherent = FALSE; + + if ((Private->BlLevel = RhdACPIGetBacklightControl(Output)) >= 0) { + Private->SetBacklight = RhdACPISetBacklightControl; + Private->GetBacklight = RhdACPIGetBacklightControl; + } else { + RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlGet, &Private->BlLevel); + Private->SetBacklight = atomSetBacklight; + Private->GetBacklight = atomGetBacklight; + } + + return TRUE; +} + +/* + * TMDSInfoRetrieve() - interface to set TMDS (DVI) parameters. + */ +static Bool +TMDSInfoRetrieve(RHDPtr rhdPtr, struct rhdAtomOutputPrivate *Private) +{ + Private->FPDI = FALSE; + Private->TemporalDither = FALSE; + Private->SpatialDither = FALSE; + Private->GreyLevel = 0; + Private->BlLevel = -1; + + return TRUE; +} + +/* + * + */ +static Bool +atomLVDSPropertyControl(struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + + RHDFUNC(Output); + switch (Action) { + case rhdPropertyCheck: + if (Private->BlLevel < 0) + return FALSE; + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + return TRUE; + default: + return FALSE; + } + case rhdPropertyGet: + Private->BlLevel = Private->GetBacklight(Output); + if (Private->BlLevel < 0) + return FALSE; + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + val->integer = Private->BlLevel; + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertySet: + if (Private->BlLevel < 0) + return FALSE; + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + Private->BlLevel = val->integer; + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertyCommit: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + Private->SetBacklight(Output,Private->BlLevel); + return TRUE; + default: + return FALSE; + } + break; + } + return TRUE; +} + +/* + * + */ +static Bool +atomTMDSPropertyControl(struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + + RHDFUNC(Output); + switch (Action) { + case rhdPropertyCheck: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + case RHD_OUTPUT_AUDIO_WORKAROUND: + return TRUE; + default: + return FALSE; + } + case rhdPropertyGet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + val->Bool = Private->Coherent; + return TRUE; + case RHD_OUTPUT_HDMI: + val->Bool = atomIsHdmiEnabled(Output); + return TRUE; + case RHD_OUTPUT_AUDIO_WORKAROUND: + val->Bool = RHDHdmiGetAudioWorkaround(Private->Hdmi); + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertySet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + Private->Coherent = val->Bool; + break; + case RHD_OUTPUT_HDMI: + atomSetHdmiEnabled(Output, val->Bool); + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiSetAudioWorkaround(Private->Hdmi, val->Bool); + break; + default: + return FALSE; + } + break; + case rhdPropertyCommit: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + Output->Mode(Output, Private->Mode); + Output->Power(Output, RHD_POWER_ON); + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiCommitAudioWorkaround(Private->Hdmi); + break; + default: + return FALSE; + } + break; + } + return TRUE; +} + +/* + * + */ +static void +rhdAtomOutputDestroy(struct rhdOutput *Output) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + RHDFUNC(Output); + if (Private->Save) + xfree(Private->Save); + RHDHdmiDestroy(Private->Hdmi); + + if (Private) + xfree(Private); + Output->Private = NULL; + xfree(Output->Name); +} + +/* + * + */ +static Bool +RHDAtomOutputAllocFree(struct rhdOutput *Output, enum rhdOutputAllocation Alloc) +{ + struct rhdAtomOutputPrivate *Private = (struct rhdAtomOutputPrivate *) Output->Private; + struct atomTransmitterConfig *TransmitterConfig = &Private->TransmitterConfig; + RHDPtr rhdPtr = RHDPTRI(Output); + char *TransmitterName; + + RHDFUNC(rhdPtr); + + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + TransmitterName = "KLDSKP_LVTMA"; + break; + case RHD_OUTPUT_UNIPHYA: + TransmitterName = "KLDSKP_UNIPHYA"; + break; + case RHD_OUTPUT_UNIPHYB: + TransmitterName = "KLDSKP_UNIPHYB"; + break; + case RHD_OUTPUT_UNIPHYC: + TransmitterName = "KLDSKP_UNIPHYC"; + break; + case RHD_OUTPUT_UNIPHYD: + TransmitterName = "KLDSKP_UNIPHYD"; + break; + case RHD_OUTPUT_UNIPHYE: + TransmitterName = "KLDSKP_UNIPHYE"; + break; + case RHD_OUTPUT_UNIPHYF: + TransmitterName = "KLDSKP_UNIPHYF"; + break; + default: + return TRUE; + } + + switch (Alloc) { + case RHD_OUTPUT_ALLOC: + /* + * LVTMA can only use DIG2. Thus exclude + * DIG1 for LVTMA and prefer it for the + * UNIPHYs. + */ + if (Private->EncoderId != atomEncoderNone) + return TRUE; + if (Output->Id != RHD_OUTPUT_KLDSKP_LVTMA + && !rhdPtr->DigEncoderOutput[0]) { + rhdPtr->DigEncoderOutput[0] = Output; + TransmitterConfig->Encoder = Private->EncoderId = atomEncoderDIG1; + xf86DrvMsg(Output->scrnIndex, X_INFO, "Mapping DIG1 encoder to %s\n",TransmitterName); + return TRUE; + } else if (!rhdPtr->DigEncoderOutput[1]) { + rhdPtr->DigEncoderOutput[1] = Output; + TransmitterConfig->Encoder = Private->EncoderId = atomEncoderDIG2; + xf86DrvMsg(Output->scrnIndex, X_INFO, "Mapping DIG2 encoder to %s\n",TransmitterName); + return TRUE; + } else + return FALSE; + case RHD_OUTPUT_FREE: + TransmitterConfig->Encoder = Private->EncoderId = atomEncoderNone; + if (rhdPtr->DigEncoderOutput[0] == Output) { + rhdPtr->DigEncoderOutput[0] = NULL; + return TRUE; + } else if (rhdPtr->DigEncoderOutput[1] == Output) { + rhdPtr->DigEncoderOutput[1] = NULL; + return TRUE; + } else + return FALSE; + break; + default: + return FALSE; + } +} + +/* + * + */ +struct rhdOutput * +RHDAtomOutputInit(RHDPtr rhdPtr, rhdConnectorType ConnectorType, + rhdOutputType OutputType) +{ + struct rhdOutput *Output; + struct rhdAtomOutputPrivate *Private; + struct atomEncoderConfig *EncoderConfig; + struct atomTransmitterConfig *TransmitterConfig; + char *OutputName = NULL; + + RHDFUNC(rhdPtr); + + switch (OutputType) { + case RHD_OUTPUT_NONE: + return NULL; + case RHD_OUTPUT_DACA: + OutputName = "DACA"; + break; + case RHD_OUTPUT_DACB: + OutputName = "DACB"; + break; + case RHD_OUTPUT_TMDSA: + OutputName = "TMDSA"; + break; + case RHD_OUTPUT_LVTMA: + OutputName = "LVTMA"; + break; + case RHD_OUTPUT_DVO: + OutputName = "DVO"; + break; + case RHD_OUTPUT_KLDSKP_LVTMA: + OutputName = "KldskpLvtma"; + break; + case RHD_OUTPUT_UNIPHYA: + OutputName = "UniphyA"; + break; + case RHD_OUTPUT_UNIPHYB: + OutputName = "UniphyB"; + break; + case RHD_OUTPUT_UNIPHYC: + OutputName = "UniphyC"; + break; + case RHD_OUTPUT_UNIPHYD: + OutputName = "UniphyD"; + break; + case RHD_OUTPUT_UNIPHYE: + OutputName = "UniphyE"; + break; + case RHD_OUTPUT_UNIPHYF: + OutputName = "UniphyF"; + break; + } + + Output = xnfcalloc(sizeof(struct rhdOutput), 1); + Output->scrnIndex = rhdPtr->scrnIndex; + + Output->Name = RhdAppendString(NULL, "AtomOutput"); + Output->Name = RhdAppendString(Output->Name, OutputName); + + Output->Id = OutputType; + Output->Sense = NULL; + Private = xnfcalloc(sizeof(struct rhdAtomOutputPrivate), 1); + Output->Private = Private; + Output->OutputDriverPrivate = NULL; + + EncoderConfig = &Private->EncoderConfig; + Private->PixelClock = 0; + + switch (OutputType) { + case RHD_OUTPUT_NONE: + xfree(Output); + xfree(Private); + return NULL; + case RHD_OUTPUT_DACA: + Output->Sense = RHDBIOSScratchDACSense; + Private->EncoderId = atomEncoderDACA; + Private->OutputControlId = atomDAC1Output; + Private->Hdmi = NULL; + break; + case RHD_OUTPUT_DACB: + Output->Sense = RHDBIOSScratchDACSense; + Private->EncoderId = atomEncoderDACB; + Private->OutputControlId = atomDAC2Output; + Private->Hdmi = NULL; + break; + case RHD_OUTPUT_TMDSA: + case RHD_OUTPUT_LVTMA: + if (OutputType == RHD_OUTPUT_LVTMA) { + if (ConnectorType == RHD_CONNECTOR_PANEL) { + Private->OutputControlId = atomLCDOutput; + LVDSInfoRetrieve(Output, Private); + Private->RunDualLink = Private->DualLink; + Private->EncoderId = atomEncoderLVDS; + } else { + TMDSInfoRetrieve(rhdPtr, Private); + Private->OutputControlId = atomLVTMAOutput; + Private->EncoderId = atomEncoderTMDS2; + } + } else { + TMDSInfoRetrieve(rhdPtr, Private); + Private->OutputControlId = atomTMDSAOutput; + Private->EncoderId = atomEncoderTMDS1; + } + + if (OutputType == RHD_CONNECTOR_DVI) + Private->DualLink = TRUE; + else + Private->DualLink = FALSE; + + if (ConnectorType != RHD_CONNECTOR_PANEL) + Private->Hdmi = RHDHdmiInit(rhdPtr, Output); + else + Private->Hdmi = NULL; + + Private->EncoderVersion = rhdAtomEncoderControlVersion(rhdPtr->atomBIOS, Private->EncoderId); + switch (Private->EncoderVersion.cref) { + case 1: + EncoderConfig->u.lvds.Is24bit = Private->LVDS24Bit; + break; + case 2: + case 3: + EncoderConfig->u.lvds2.Is24bit = Private->LVDS24Bit; + EncoderConfig->u.lvds2.SpatialDither = Private->SpatialDither; + EncoderConfig->u.lvds2.LinkB = 0; /* @@@ */ + EncoderConfig->u.lvds2.Hdmi = FALSE; +#if 0 + if (ConnectorType == RHD_CONNECTOR_HDMI_B + || ConnectorType == RHD_CONNECTOR_HDMI_A) + EncoderConfig->u.lvds2.hdmi = TRUE; +#endif + switch (Private->GreyLevel) { + case 2: + EncoderConfig->u.lvds2.TemporalGrey = atomTemporalDither2; + break; + case 4: + EncoderConfig->u.lvds2.TemporalGrey = atomTemporalDither4; + break; + case 0: + default: + EncoderConfig->u.lvds2.TemporalGrey = atomTemporalDither0; + } + if (Private->SpatialDither) + EncoderConfig->u.lvds2.SpatialDither = TRUE; + else + EncoderConfig->u.lvds2.SpatialDither = FALSE; + EncoderConfig->u.lvds2.Coherent = Private->Coherent; + break; + } + break; + case RHD_OUTPUT_DVO: + Private->EncoderId = atomEncoderDVO; + Private->EncoderVersion = rhdAtomEncoderControlVersion(rhdPtr->atomBIOS, + Private->EncoderId); + switch (Private->EncoderVersion.cref) { + case 1: + case 2: + /* Output->OutputDriverPrivate->Device not set yet. */ + break; + case 3: /* @@@ still to be handled */ + xfree(Output); + xfree(Private); + return NULL; + } + { + struct atomCodeTableVersion version = rhdAtomOutputControlVersion(rhdPtr->atomBIOS, atomDVOOutput); + switch (version.cref) { + case 1: + case 2: + Private->OutputControlId = atomDVOOutput; + break; + case 3: +#if 0 + Private->TransmitterId = atomTransmitterDVO; /* @@@ check how to handle this one */ + break; +#else + xfree(Output); + xfree(Private); + return NULL; +#endif + } + } + break; + case RHD_OUTPUT_KLDSKP_LVTMA: + Private->EncoderVersion = rhdAtomEncoderControlVersion(rhdPtr->atomBIOS, + Private->EncoderId); + Output->AllocFree = RHDAtomOutputAllocFree; + EncoderConfig->u.dig.Link = atomTransLinkA; + EncoderConfig->u.dig.Transmitter = Private->TransmitterId = atomTransmitterLVTMA; + + TransmitterConfig = &Private->TransmitterConfig; + TransmitterConfig->Link = atomTransLinkA; + TransmitterConfig->Encoder = Private->TransmitterId; + + if (ConnectorType == RHD_CONNECTOR_PANEL) { + TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomLVDS; + LVDSInfoRetrieve(Output, Private); + Private->Hdmi = NULL; + } else { + TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomDVI; + TMDSInfoRetrieve(rhdPtr, Private); + Private->Coherent = FALSE; + Private->Hdmi = RHDHdmiInit(rhdPtr, Output); + } + break; + + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + Output->AllocFree = RHDAtomOutputAllocFree; + if (RHDIsIGP(rhdPtr->ChipSet)) + EncoderConfig->u.dig.Transmitter = Private->TransmitterId = atomTransmitterPCIEPHY; + else { + switch (OutputType) { + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + EncoderConfig->u.dig.Transmitter = Private->TransmitterId = atomTransmitterUNIPHY; + break; + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + EncoderConfig->u.dig.Transmitter = Private->TransmitterId = atomTransmitterUNIPHY1; + break; + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + EncoderConfig->u.dig.Transmitter = Private->TransmitterId = atomTransmitterUNIPHY2; + break; + default: + xfree(Private); + xfree(Output); + return NULL; + } + } + + TransmitterConfig = &Private->TransmitterConfig; + TransmitterConfig->Encoder = Private->EncoderId = atomEncoderNone; + switch (OutputType) { + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYE: + TransmitterConfig->Link = EncoderConfig->u.dig.Link = atomTransLinkA; + break; + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYF: + TransmitterConfig->Link = EncoderConfig->u.dig.Link = atomTransLinkB; + break; + default: + xfree(Private); + xfree(Output); + return NULL; + } + + if (RHDIsIGP(rhdPtr->ChipSet)) { + AtomBiosArgRec data; + data.val = 1; + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_GET_PCIE_LANES, + &data) == ATOM_SUCCESS) + TransmitterConfig->Lanes = data.pcieLanes.Chassis; + /* only do 'chassis' for now */ + else { + xfree(Private); + xfree(Output); + return NULL; + } + } + + if (ConnectorType == RHD_CONNECTOR_PANEL) + LVDSInfoRetrieve(Output, Private); + else + TMDSInfoRetrieve(rhdPtr, Private); + + switch (ConnectorType) { + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomDVI; + Private->Hdmi = RHDHdmiInit(rhdPtr, Output); + break; + case RHD_CONNECTOR_PANEL: + TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomLVDS; + break; +#if 0 + case RHD_CONNECTOR_DP: + case RHD_CONNECTOR_DP_DUAL: + TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomDP; + break; + case RHD_CONNECTOR_HDMI_A: + case RHD_CONNECTOR_HDMI_B: + TransmitterConfig->Mode = EncoderConfig->u.dig.EncoderMode = atomHDMI; + break; +#endif + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Unknown connector type\n",__func__); + xfree(Output); + xfree(Private); + return NULL; + } + break; + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Unknown output type\n"); + xfree(Output); + xfree(Private); + return NULL; + } + if (ConnectorType == RHD_CONNECTOR_PANEL) { + Output->Property = atomLVDSPropertyControl; + LVDSInfoRetrieve(Output, Private); + } else { + Output->Property = atomTMDSPropertyControl; + TMDSInfoRetrieve(rhdPtr, Private); + } + + + Output->Mode = rhdAtomOutputSet; + Output->Power = rhdAtomOutputPower; + Output->Save = rhdAtomOutputSave; + Output->Restore = rhdAtomOutputRestore; + Output->ModeValid = rhdAtomOutputModeValid; + Output->Destroy = rhdAtomOutputDestroy; + Private->CrtcSourceVersion = rhdAtomSelectCrtcSourceVersion(rhdPtr->atomBIOS); + + return Output; +} + +/* + * This sets up AtomBIOS based BL control if we need to use a non-standard method to control BL. + */ + +int +RhdAtomSetupBacklightControlProperty(struct rhdOutput *Output, + Bool (**PropertyFunc)(struct rhdOutput *Output, + enum rhdPropertyAction Action, + enum rhdOutputProperty Property, + union rhdPropertyData *val), void **PrivatePtr) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + int BlLevel; + struct rhdAtomOutputPrivate *Private; + struct atomTransmitterConfig *TransmitterConfig; + + RHDFUNC(Output); + + Private = xnfcalloc(sizeof(struct rhdAtomOutputPrivate), 1); + TransmitterConfig = &Private->TransmitterConfig; + + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + /* We set up a those parameters although they may never be needed for BL control */ + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + Private->TransmitterId = atomTransmitterLVTMA; + break; + case RHD_OUTPUT_UNIPHYE: + Private->TransmitterId = atomTransmitterUNIPHY2; + TransmitterConfig->Link = atomTransLinkA; + break; + case RHD_OUTPUT_UNIPHYF: + Private->TransmitterId = atomTransmitterUNIPHY2; + TransmitterConfig->Link = atomTransLinkB; + break; + default: + return 0; /* never get here */ + } + TransmitterConfig->Mode = atomLVDS; + if (rhdPtr->DigEncoderOutput[0] == Output) + TransmitterConfig->Encoder = Private->EncoderId = atomEncoderDIG1; + else if (rhdPtr->DigEncoderOutput[1] == Output) + TransmitterConfig->Encoder = Private->EncoderId = atomEncoderDIG2; + else + TransmitterConfig->Encoder = Private->EncoderId = atomEncoderNone; + LVDSInfoRetrieve(Output, Private); + Private->PixelClock = 0; + Private->Hdmi = NULL; + break; + case RHD_OUTPUT_LVTMA: + Private->OutputControlId = atomLCDOutput; + break; + default: + xfree(Private); + return 0; + } + *PropertyFunc = atomLVDSPropertyControl; + *PrivatePtr = Private; + RHDAtomBIOSScratchBlLevel(rhdPtr, rhdBIOSScratchBlGet, &BlLevel); + Private->SetBacklight = atomSetBacklight; + Private->GetBacklight = atomGetBacklight; + + return BlLevel; +} + +void +RhdAtomDestroyBacklightControlProperty(struct rhdOutput *Output, void *PrivatePtr) +{ + if (PrivatePtr) + xfree(PrivatePtr); +} + +#endif /* ATOM_BIOS && ATOM_BIOS_PARSER */ diff --git a/driver/xf86-video-radeonhd/src/rhd_atomout.h b/driver/xf86-video-radeonhd/src/rhd_atomout.h new file mode 100644 index 000000000..e84e1e4ca --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atomout.h @@ -0,0 +1,37 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_ATOMOUT_H +# define _RHD_ATOMOUT_H + +extern int RhdAtomSetupBacklightControlProperty(struct rhdOutput *Output, + Bool (**PropertyFunc)(struct rhdOutput *Output, + enum rhdPropertyAction Action, + enum rhdOutputProperty Property, + union rhdPropertyData *val), + void **PrivatePtr); +extern void RhdAtomDestroyBacklightControlProperty(struct rhdOutput *Output, void *PrivatePtr); + +#endif diff --git a/driver/xf86-video-radeonhd/src/rhd_atompll.c b/driver/xf86-video-radeonhd/src/rhd_atompll.c new file mode 100644 index 000000000..9caedb273 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atompll.c @@ -0,0 +1,436 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_pll.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_crtc.h" +#include "rhd_regs.h" +#if defined (ATOM_BIOS) && defined (ATOM_BIOS_PARSER) +# include "rhd_atombios.h" +# include "rhd_biosscratch.h" + +struct atomPLLPrivate { + enum atomPxclk Pxclk; + struct atomPixelClockConfig Config; + struct atomCodeTableVersion Version; + + CARD32 StoreFBDivFrac; + enum atomDevice StoreDevice; + enum rhdConnectorType StoreConnectorType; + enum rhdOutputType StoreOutputType; + int StoreCrtc; +}; + +/* + * + */ +static void +getSetPixelClockParameters(struct rhdPLL *PLL, struct atomPixelClockConfig *Config, + enum rhdConnectorType ct, enum rhdOutputType ot, enum atomDevice device) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + struct atomPLLPrivate *Private = (struct atomPLLPrivate *)PLL->Private; + + switch (Private->Version.cref) { + case 1: + break; + case 2: + Config->u.v2.Device = device; + Config->u.v2.Force = TRUE; + break; + case 3: + switch (ct) { + case RHD_CONNECTOR_VGA: + Config->u.v3.EncoderMode = atomNoEncoder; + break; + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + Config->u.v3.EncoderMode = atomDVI; + break; + case RHD_CONNECTOR_PANEL: + Config->u.v3.EncoderMode = atomLVDS; + break; +#if 0 + case RHD_CONNECTOR_DP: + case RHD_CONNECTOR_DP_DUAL: + Config->u.v3.EncoderMode = atomDP; + break; + case RHD_CONNECTOR_HDMI_A: + case RHD_CONNECTOR_HDMI_B: + Config->u.v3.EncoderMode = atomHDMI; + break; +#endif + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Unknown connector type: 0x%x\n",__func__,ct); + } + switch (ot) { + case RHD_OUTPUT_DACA: + Config->u.v3.OutputType = atomOutputDacA; + break; + case RHD_OUTPUT_DACB: + Config->u.v3.OutputType = atomOutputDacB; + break; + case RHD_OUTPUT_KLDSKP_LVTMA: + Config->u.v3.OutputType = atomOutputKldskpLvtma; + break; + case RHD_OUTPUT_UNIPHYA: + Config->u.v3.OutputType = atomOutputUniphyA; + break; + case RHD_OUTPUT_UNIPHYB: + Config->u.v3.OutputType = atomOutputUniphyB; + break; + case RHD_OUTPUT_UNIPHYC: + Config->u.v3.OutputType = atomOutputUniphyC; + break; + case RHD_OUTPUT_UNIPHYD: + Config->u.v3.OutputType = atomOutputUniphyD; + break; + case RHD_OUTPUT_UNIPHYE: + Config->u.v3.OutputType = atomOutputUniphyE; + break; + case RHD_OUTPUT_UNIPHYF: + Config->u.v3.OutputType = atomOutputUniphyF; + break; + case RHD_OUTPUT_DVO: + Config->u.v3.OutputType = atomOutputDvo; + break; + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Unhandled ouptut type\n",__func__); + break; + } + Config->u.v3.Force = TRUE; + Config->u.v3.UsePpll = FALSE; + break; + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Unsupported SelectPixelClock version: %i\n",Private->Version.cref); + break; + } +} + +/* + * + */ +static void +rhdAtomPLLSave(struct rhdPLL *PLL, CARD32 PllCntl, CARD32 OwnerVal) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + struct atomPLLPrivate *Private = (struct atomPLLPrivate *)PLL->Private; + CARD32 Crtc1Cntl, Crtc2Cntl; + enum atomCrtc owner; + + RHDFUNC(PLL); + + Crtc1Cntl = RHDRegRead(PLL, PCLK_CRTC1_CNTL); + Crtc2Cntl = RHDRegRead(PLL, PCLK_CRTC2_CNTL); + + if (PllCntl & 0x2) + PLL->StoreActive = FALSE; + else + PLL->StoreActive = TRUE; + + if ((Crtc1Cntl & 0x00010000) == OwnerVal) + owner = atomCrtc1; + else if ((Crtc2Cntl & 0x00010000) == OwnerVal) + owner = atomCrtc2; + else { + owner = atomCrtc1; /* whatever... */ + PLL->StoreActive = FALSE; + } + + Private->StoreCrtc = owner; + Private->StoreDevice = RHDGetDeviceOnCrtc(rhdPtr, owner); + + if (Private->StoreDevice != atomNone) + RHDFindConnectorAndOutputTypesForDevice(rhdPtr, Private->StoreDevice, + &Private->StoreOutputType, &Private->StoreConnectorType); + else + PLL->StoreActive = FALSE; + + RHDDebug(PLL->scrnIndex, "Saving PLL %i on CRTC: %i %s active - device: 0x%x\n", + (PLL->Id == PLL_ID_PLL1) ? 1 : 2, + (owner == atomCrtc1) ? 1 : 2, + (PLL->StoreActive) ? "" : "not", + Private->StoreDevice); + + PLL->Stored = TRUE; + + /* Set parameters found at startup for shutdownInactive(). This is somewhat ugly... */ + Private->Config.Crtc = Private->StoreCrtc; + Private->Config.Enable = PLL->StoreActive; + if (Private->StoreDevice != atomNone) + getSetPixelClockParameters(PLL, &Private->Config, Private->StoreConnectorType, + Private->StoreOutputType, Private->StoreDevice); +} + +/* + * + */ +static void +rhdAtomPLL1Save(struct rhdPLL *PLL) +{ + struct atomPLLPrivate *Private = (struct atomPLLPrivate *)PLL->Private; + CARD32 PllCntl; + + RHDFUNC(PLL); + + PLL->StoreSpreadSpectrum = RHDRegRead(PLL, P1PLL_INT_SS_CNTL); + PLL->StoreRefDiv = RHDRegRead(PLL, EXT1_PPLL_REF_DIV) & 0x1FF; + PLL->StoreFBDiv = (RHDRegRead(PLL, EXT1_PPLL_FB_DIV) >> 16) & 0x7FF; + Private->StoreFBDivFrac = RHDRegRead(PLL, EXT1_PPLL_FB_DIV) & 0x7; + PLL->StorePostDiv = RHDRegRead(PLL, EXT1_PPLL_POST_DIV) & 0x3F; + PllCntl = RHDRegRead(PLL, P1PLL_CNTL); + RHDDebug(PLL->scrnIndex, "Saving %i kHz clock on PLL1\n", + ((PLL->StoreFBDiv * PLL->RefClock * 10) + / (PLL->StorePostDiv * PLL->StoreRefDiv))); + + rhdAtomPLLSave(PLL, PllCntl, 0x00000000); +} + + +/* + * + */ +static void +rhdAtomPLL2Save(struct rhdPLL *PLL) +{ + struct atomPLLPrivate *Private = (struct atomPLLPrivate *)PLL->Private; + CARD32 PllCntl; + + RHDFUNC(PLL); + + PLL->StoreSpreadSpectrum = RHDRegRead(PLL, P2PLL_INT_SS_CNTL); + PLL->StoreRefDiv = RHDRegRead(PLL, EXT2_PPLL_REF_DIV) & 0x1FF; + PLL->StoreFBDiv = (RHDRegRead(PLL, EXT2_PPLL_FB_DIV) >> 16) & 0x7FF; + Private->StoreFBDivFrac = RHDRegRead(PLL, EXT2_PPLL_FB_DIV) & 0x7; + PLL->StorePostDiv = RHDRegRead(PLL, EXT2_PPLL_POST_DIV) & 0x3F; + PllCntl = RHDRegRead(PLL, P2PLL_CNTL); + RHDDebug(PLL->scrnIndex, "Saving %i kHz clock on PLL2\n", + ((PLL->StoreFBDiv * PLL->RefClock * 10) + / (PLL->StorePostDiv * PLL->StoreRefDiv))); + + rhdAtomPLLSave(PLL, PllCntl, 0x00010000); +} + +/* + * + */ +static void +rhdAtomPLLRestore(struct rhdPLL *PLL) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + struct atomPixelClockConfig Config; + struct atomPLLPrivate *Private = (struct atomPLLPrivate *)PLL->Private; + + RHDFUNC(PLL); + + if (!PLL->Stored) { + xf86DrvMsg(PLL->scrnIndex, X_ERROR, "%s: %s: trying to restore " + "uninitialized values.\n", __func__, PLL->Name); + return; + } + Config.PixelClock = PLL->StoreActive + ? ((PLL->StoreFBDiv * PLL->RefClock * 10) / (PLL->StorePostDiv * PLL->StoreRefDiv)) + : 0; + + Config.Enable = PLL->StoreActive; + Config.RefDiv = PLL->StoreRefDiv; + Config.FbDiv = PLL->StoreFBDiv; + Config.PostDiv = PLL->StorePostDiv; + Config.FracFbDiv = Private->StoreFBDivFrac; + Config.Crtc = Private->StoreCrtc; + + if (Private->StoreDevice != atomNone) + getSetPixelClockParameters(PLL, &Config, Private->StoreConnectorType, + Private->StoreOutputType, Private->StoreDevice); + RHDDebug(PLL->scrnIndex, "Restoring PixelClock %i with %i kHz, (%i * %i) / ( %i * %i )" + " on CRTC %i device: %x\n", + Private->Pxclk, Config.PixelClock, PLL->RefClock, PLL->StoreFBDiv, PLL->StorePostDiv, + PLL->StoreRefDiv, (Config.Crtc == atomCrtc1) ? 1 : 2, Config.u.v2.Device); + + /* Restore spread spectrum: AtomBIOS doesn't handle this for us */ + RHDRegWrite(PLL, (PLL->Id == PLL_ID_PLL1) ? P1PLL_INT_SS_CNTL : P2PLL_INT_SS_CNTL, PLL->StoreSpreadSpectrum); + + rhdAtomSetPixelClock(rhdPtr->atomBIOS, Private->Pxclk, &Config); +} + +/* + * + */ +static void +rhdAtomPLLPower(struct rhdPLL *PLL, int Power) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + struct atomPLLPrivate *Private = (struct atomPLLPrivate *)PLL->Private; + struct atomPixelClockConfig *config = &Private->Config; + + RHDFUNC(PLL); + + switch (Power) { + case RHD_POWER_ON: + if (config->PixelClock > 0) + config->Enable = TRUE; + else { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: cannot enable pixel clock without frequency set\n",__func__); + config->Enable = FALSE; + } + break; + case RHD_POWER_RESET: + case RHD_POWER_SHUTDOWN: + return; + config->Enable = FALSE; + default: + break; + } + rhdAtomSetPixelClock(rhdPtr->atomBIOS, Private->Pxclk, config); +} + +/* + * + */ +static void +rhdAtomPLLSet(struct rhdPLL *PLL, int PixelClock, CARD16 ReferenceDivider, + CARD16 FeedbackDivider, CARD8 PostDivider) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + struct atomPLLPrivate *Private = (struct atomPLLPrivate *)PLL->Private; + struct rhdCrtc *Crtc = NULL; + + RHDFUNC(PLL); + RHDDebug(rhdPtr->scrnIndex, "%s: %i kHz RefDiv: %x FeedbackDiv: %x PostDiv: %x\n", + __func__, PixelClock, ReferenceDivider, FeedbackDivider, PostDivider); + + Private->Config.PixelClock = PixelClock; + Private->Config.RefDiv = ReferenceDivider; + Private->Config.FbDiv = FeedbackDivider; + Private->Config.PostDiv = PostDivider; + Private->Config.FracFbDiv = 0; + if (rhdPtr->Crtc[0]->PLL == PLL) { + Private->Config.Crtc = atomCrtc1; + Crtc = rhdPtr->Crtc[0]; + } else if (rhdPtr->Crtc[1]->PLL == PLL) { + Private->Config.Crtc = atomCrtc2; + Crtc = rhdPtr->Crtc[1]; + } else + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Trying to set an unassigned PLL\n"); + + if (Crtc && Private->Version.cref > 1) { + struct rhdOutput *Output; + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) { + if (Output->Crtc == Crtc) + break; + } + if (Output) + getSetPixelClockParameters(PLL, &Private->Config, + Output->Connector->Type, Output->Id, + Output->OutputDriverPrivate->Device); + } + + /* Disable spread spectrum. AtomBIOS doesn't do this for us */ + RHDRegMask(PLL, (PLL->Id == PLL_ID_PLL1) ? P1PLL_INT_SS_CNTL : P2PLL_INT_SS_CNTL, 0, 0x00000001); + + Private->Config.Enable = TRUE; + rhdAtomSetPixelClock(rhdPtr->atomBIOS, Private->Pxclk, &Private->Config); +} + +/* + * + */ +Bool +RHDAtomPLLsInit(RHDPtr rhdPtr) +{ + struct rhdPLL *PLL; + struct atomPLLPrivate *Private; + CARD32 RefClock, IntMin, IntMax, PixMin, PixMax; + int i; + + RHDFUNC(rhdPtr); + + RHDSetupLimits(rhdPtr, &RefClock, &IntMin, &IntMax, &PixMin, &PixMax); + + for (i = 0; i < 2; i++) { + + PLL = (struct rhdPLL *) xnfcalloc(sizeof(struct rhdPLL), 1); + Private = (struct atomPLLPrivate *) xnfcalloc(sizeof(struct atomPLLPrivate),1); + PLL->Private = Private; + + Private->Version = rhdAtomSetPixelClockVersion(rhdPtr->atomBIOS); + if (Private->Version.cref > 3) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Unsupported SelectPixelClock version; %i\n", + Private->Version.cref); + xfree(PLL->Private); + xfree(PLL); + return FALSE; + } + + PLL->scrnIndex = rhdPtr->scrnIndex; + if (i == 0) { + PLL->Name = PLL_NAME_PLL1; + PLL->Id = PLL_ID_PLL1; + PLL->Save = rhdAtomPLL1Save; + Private->Pxclk = atomPclk1; + } else { + PLL->Name = PLL_NAME_PLL2; + PLL->Id = PLL_ID_PLL2; + PLL->Save = rhdAtomPLL2Save; + Private->Pxclk = atomPclk2; + } + + PLL->RefClock = RefClock; + PLL->IntMin = IntMin; + PLL->IntMax = IntMax; + PLL->PixMin = PixMin; + PLL->PixMax = PixMax; + + PLL->Valid = NULL; + + PLL->Set = rhdAtomPLLSet; + PLL->Power = rhdAtomPLLPower; + PLL->Restore = rhdAtomPLLRestore; + + rhdPtr->PLLs[i] = PLL; + } + + + return TRUE; +} + +#endif /* ATOM_BIOS && ATOM_BIOS_PARSER */ diff --git a/driver/xf86-video-radeonhd/src/rhd_atomwrapper.c b/driver/xf86-video-radeonhd/src/rhd_atomwrapper.c new file mode 100644 index 000000000..643b7b1a7 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atomwrapper.c @@ -0,0 +1,101 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "rhd_atomwrapper.h" + +#define INT32 INT32 +#include "CD_Common_Types.h" +#include "CD_Definitions.h" + + +int +ParseTableWrapper(void *pspace, int index, void *handle, void *BIOSBase, + char **msg_return) +{ + DEVICE_DATA deviceData; + int ret = 0; + + /* FILL OUT PARAMETER SPACE */ + deviceData.pParameterSpace = (UINT32*) pspace; + deviceData.CAIL = handle; + deviceData.pBIOS_Image = BIOSBase; + deviceData.format = TABLE_FORMAT_BIOS; + + switch (ParseTable(&deviceData, index)) { /* IndexInMasterTable */ + case CD_SUCCESS: + ret = 1; + *msg_return = "ParseTable said: CD_SUCCESS"; + break; + case CD_CALL_TABLE: + ret = 1; + *msg_return = "ParseTable said: CD_CALL_TABLE"; + break; + case CD_COMPLETED: + ret = 1; + *msg_return = "ParseTable said: CD_COMPLETED"; + break; + case CD_GENERAL_ERROR: + ret = 0; + *msg_return = " ParseTable said: CD_GENERAL_ERROR"; + break; + case CD_INVALID_OPCODE: + ret = 0; + *msg_return = " ParseTable said: CD_INVALID_OPCODE"; + break; + case CD_NOT_IMPLEMENTED: + ret = 0; + *msg_return = " ParseTable said: CD_NOT_IMPLEMENTED"; + break; + case CD_EXEC_TABLE_NOT_FOUND: + ret = 0; + *msg_return = " ParseTable said: CD_EXEC_TABLE_NOT_FOUND"; + break; + case CD_EXEC_PARAMETER_ERROR: + ret = 0; + *msg_return = " ParseTable said: CD_EXEC_PARAMETER_ERROR"; + break; + case CD_EXEC_PARSER_ERROR: + ret = 0; + *msg_return = " ParseTable said: CD_EXEC_PARSER_ERROR"; + break; + case CD_INVALID_DESTINATION_TYPE: + ret = 0; + *msg_return = " ParseTable said: CD_INVALID_DESTINATION_TYPE"; + break; + case CD_UNEXPECTED_BEHAVIOR: + ret = 0; + *msg_return = " ParseTable said: CD_UNEXPECTED_BEHAVIOR"; + break; + case CD_INVALID_SWITCH_OPERAND_SIZE: + ret = 0; + *msg_return = " ParseTable said: CD_INVALID_SWITCH_OPERAND_SIZE\n"; + break; + } + return ret; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_atomwrapper.h b/driver/xf86-video-radeonhd/src/rhd_atomwrapper.h new file mode 100644 index 000000000..53ea529c6 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_atomwrapper.h @@ -0,0 +1,31 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ +#ifndef RHD_ATOMWRAPPER_H_ +# define RHD_ATOMWRAPPER_H_ + +extern int ParseTableWrapper(void *pspace, int index, void *CAIL, + void *BIOSBase, char **msg_return); + +#endif /* RHD_ATOMWRAPPER_H_ */ diff --git a/driver/xf86-video-radeonhd/src/rhd_audio.c b/driver/xf86-video-radeonhd/src/rhd_audio.c new file mode 100644 index 000000000..5e3c4e240 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_audio.c @@ -0,0 +1,409 @@ +/* + * Copyright 2008 Christian König + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_audio.h" +#include "rhd_hdmi.h" +#include "rhd_regs.h" + +#define AUDIO_TIMER_INTERVALL 100 /* 1/10 sekund should be enough */ + +/* + * current number of channels + */ +static int +AudioChannels(struct rhdAudio* Audio) +{ + return (RHDRegRead(Audio, AUDIO_RATE_BPS_CHANNEL) & 0x7) + 1; +} + +/* + * current bits per sample + */ +static int +AudioBitsPerSample(struct rhdAudio* Audio) +{ + CARD32 value = (RHDRegRead(Audio, AUDIO_RATE_BPS_CHANNEL) & 0xF0) >> 4; + switch(value) + { + case 0x0: return 8; + case 0x1: return 16; + case 0x2: return 20; + case 0x3: return 24; + case 0x4: return 32; + } + + xf86DrvMsg(Audio->scrnIndex, X_WARNING, "%s: unknown bits per sample 0x%x " + "using 16 instead.\n", __func__, (int) value); + + return 16; +} + +/* + * current sampling rate in HZ + */ +static int +AudioRate(struct rhdAudio* Audio) +{ + CARD32 value = RHDRegRead(Audio, AUDIO_RATE_BPS_CHANNEL); + CARD32 result; + + if(value & 0x4000) + result = 44100; + else + result = 48000; + + result *= ((value >> 11) & 0x7) + 1; + result /= ((value >> 8) & 0x7) + 1; + + return result; +} + +#if 0 +/* + * something playing ? (not used anymore) + */ +static Bool +AudioPlaying(struct rhdAudio* Audio) +{ + return (RHDRegRead(Audio, AUDIO_PLAYING) >> 4) & 1; +} +#endif + +/* + * iec 60958 status bits + */ +static CARD8 +AudioStatusBits(struct rhdAudio* Audio) +{ + return RHDRegRead(Audio, AUDIO_STATUS_BITS) & 0xff; +} + +/* + * iec 60958 category code + */ +static CARD8 +AudioCategoryCode(struct rhdAudio* Audio) +{ + return (RHDRegRead(Audio, AUDIO_STATUS_BITS) >> 8) & 0xff; +} + +/* + * update all registered hdmi interfaces with current audio parameters + */ +static CARD32 +AudioUpdateHdmi(OsTimerPtr timer, CARD32 time, pointer ptr) +{ + struct rhdAudio *Audio = (struct rhdAudio*)ptr; + int channels = AudioChannels(Audio); + int rate = AudioRate(Audio); + int bps = AudioBitsPerSample(Audio); + CARD8 status_bits = AudioStatusBits(Audio); + CARD8 category_code = AudioCategoryCode(Audio); + + Bool changes = FALSE; + + struct rhdHdmi* hdmi; + + changes |= channels != Audio->SavedChannels; + changes |= rate != Audio->SavedRate; + changes |= bps != Audio->SavedBitsPerSample; + changes |= status_bits != Audio->SavedStatusBits; + changes |= category_code != Audio->SavedCategoryCode; + + if(changes) { + Audio->SavedChannels = channels; + Audio->SavedRate = rate; + Audio->SavedBitsPerSample = bps; + Audio->SavedStatusBits = status_bits; + Audio->SavedCategoryCode = category_code; + } + + for(hdmi=Audio->Registered; hdmi != NULL; hdmi=hdmi->Next) + if(changes || RHDHdmiBufferStatusChanged(hdmi)) + RHDHdmiUpdateAudioSettings( + hdmi, channels, + rate, bps, status_bits, + category_code); + + return AUDIO_TIMER_INTERVALL; +} + +/* + * allocate and init the audio structure + */ +void +RHDAudioInit(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet >= RHD_RS600) { + struct rhdAudio *Audio = (struct rhdAudio *) xnfcalloc(sizeof(struct rhdAudio), 1); + + Audio->scrnIndex = rhdPtr->scrnIndex; + Audio->Registered = NULL; + Audio->Stored = FALSE; + + rhdPtr->Audio = Audio; + } else + rhdPtr->Audio = NULL; +} + +/* + * enable or disable the complete audio engine + */ +void +RHDAudioSetEnable(RHDPtr rhdPtr, Bool Enable) +{ + struct rhdAudio *Audio = rhdPtr->Audio; + + if (!Audio) return; + RHDFUNC(Audio); + + RHDRegMask(Audio, AUDIO_ENABLE, Enable ? 0x81000000 : 0x0, 0x81000000); + if(Enable) { + /* the hardware generates an interrupt if audio starts/stops playing, + * but since drm doesn't support this interrupt, we check + * every AUDIO_TIMER_INTERVALL ms if something has changed + */ + Audio->SavedChannels = -1; + Audio->SavedRate = -1; + Audio->SavedBitsPerSample = -1; + Audio->SavedStatusBits = 0; + Audio->SavedCategoryCode = 0; + Audio->Timer = TimerSet(NULL, 0, AUDIO_TIMER_INTERVALL, AudioUpdateHdmi, Audio); + + /* 48kHz and 16/20 bits per sample are always supported */ + RHDAudioSetSupported(rhdPtr, TRUE, + AUDIO_RATE_48000_HZ| + AUDIO_BPS_16|AUDIO_BPS_20, + AUDIO_CODEC_PCM + ); + } else { + TimerFree(Audio->Timer); + Audio->Timer = NULL; + } +} + +/* + * programm the audio clock and timing registers + */ +void +RHDAudioSetClock(RHDPtr rhdPtr, struct rhdOutput* Output, CARD32 Clock) +{ + struct rhdAudio *Audio = rhdPtr->Audio; + int Rate = 48000; + + if (!Audio) return; + RHDFUNC(Audio); + + xf86DrvMsg(Audio->scrnIndex, X_INFO, "%s: using %s as clock source with %d khz\n", + __func__, Output->Name, (int)Clock); + + switch(Output->Id) { + case RHD_OUTPUT_TMDSA: + case RHD_OUTPUT_LVTMA: + RHDRegMask(Audio, AUDIO_TIMING, 0, 0x301); + break; + + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_KLDSKP_LVTMA: + RHDRegMask(Audio, AUDIO_TIMING, 0x100, 0x301); + break; + + default: + xf86DrvMsg(Audio->scrnIndex, X_ERROR, "%s: unsupported output type\n", __func__); + break; + } + + switch(RHDOutputTmdsIndex(Output)) { + case 0: + RHDRegWrite(Audio, AUDIO_PLL1_MUL, Rate*50); + RHDRegWrite(Audio, AUDIO_PLL1_DIV, Clock*100); + RHDRegWrite(Audio, AUDIO_CLK_SRCSEL, 0); + break; + + case 1: + RHDRegWrite(Audio, AUDIO_PLL2_MUL, Rate*50); + RHDRegWrite(Audio, AUDIO_PLL2_DIV, Clock*100); + RHDRegWrite(Audio, AUDIO_CLK_SRCSEL, 1); + break; + } +} + +/* + * set the supported audio rates, bits per sample and codecs + */ +void +RHDAudioSetSupported(RHDPtr rhdPtr, Bool clear, CARD32 config, CARD32 codec) +{ + struct rhdAudio *Audio = rhdPtr->Audio; + if (!Audio) return; + + RHDFUNC(Audio); + xf86DrvMsg(Audio->scrnIndex, X_INFO, "%s: config 0x%x codec 0x%x\n", + __func__, (int) config, (int) codec); + + if(config & 0xFFE0F000) + xf86DrvMsg(Audio->scrnIndex, X_WARNING, "%s: reserved config bits set 0x%x\n", + __func__, (int) config); + + if(codec & 0xFFFFFFF8) + xf86DrvMsg(Audio->scrnIndex, X_WARNING, "%s: reserved codec bits set 0x%x\n", + __func__, (int) codec); + + if(clear) { + RHDRegWrite(Audio, AUDIO_SUPPORTED_SIZE_RATE, config); + RHDRegWrite(Audio, AUDIO_SUPPORTED_CODEC, codec); + } else { + RHDRegMask(Audio, AUDIO_SUPPORTED_SIZE_RATE, config, config); + RHDRegMask(Audio, AUDIO_SUPPORTED_CODEC, codec, codec); + } +} + +/* + * register and hdmi interface for getting updates when audio parameters change + */ +void +RHDAudioRegisterHdmi(RHDPtr rhdPtr, struct rhdHdmi* rhdHdmi) +{ + struct rhdAudio *Audio = rhdPtr->Audio; + if (!Audio) return; + RHDFUNC(Audio); + + if(!rhdHdmi) + return; + + /* make shure the HDMI interface is not registered */ + RHDAudioUnregisterHdmi(rhdPtr, rhdHdmi); + + rhdHdmi->Next = Audio->Registered; + Audio->Registered = rhdHdmi; +} + + +/* + * unregister the hdmi interface + */ +void RHDAudioUnregisterHdmi(RHDPtr rhdPtr, struct rhdHdmi* rhdHdmi) +{ + struct rhdAudio *Audio = rhdPtr->Audio; + struct rhdHdmi** hdmiPtr; + if (!Audio) return; + RHDFUNC(Audio); + + for(hdmiPtr=&Audio->Registered; *hdmiPtr!=NULL;hdmiPtr=&(*hdmiPtr)->Next) + if(*hdmiPtr == rhdHdmi) { + *hdmiPtr = rhdHdmi->Next; + rhdHdmi->Next = NULL; + return; + } +} + +/* + * save the current config of audio engine + */ +void +RHDAudioSave(RHDPtr rhdPtr) +{ + struct rhdAudio *Audio = rhdPtr->Audio; + if (!Audio) return; + + RHDFUNC(Audio); + + Audio->StoreEnabled = RHDRegRead(Audio, AUDIO_ENABLE); + Audio->StoreTiming = RHDRegRead(Audio, AUDIO_TIMING); + + Audio->StoreSupportedSizeRate = RHDRegRead(Audio, AUDIO_SUPPORTED_SIZE_RATE); + Audio->StoreSupportedCodec = RHDRegRead(Audio, AUDIO_SUPPORTED_CODEC); + + Audio->StorePll1Mul = RHDRegRead(Audio, AUDIO_PLL1_MUL); + Audio->StorePll1Div = RHDRegRead(Audio, AUDIO_PLL1_DIV); + Audio->StorePll2Mul = RHDRegRead(Audio, AUDIO_PLL2_MUL); + Audio->StorePll2Div = RHDRegRead(Audio, AUDIO_PLL2_DIV); + Audio->StoreClockSrcSel = RHDRegRead(Audio, AUDIO_CLK_SRCSEL); + + Audio->Stored = TRUE; +} + +/* + * restore the saved config of audio engine + */ +void +RHDAudioRestore(RHDPtr rhdPtr) +{ + struct rhdAudio *Audio = rhdPtr->Audio; + if (!Audio) return; + + RHDFUNC(Audio); + + if (!Audio->Stored) { + xf86DrvMsg(Audio->scrnIndex, X_ERROR, "%s: trying to restore " + "uninitialized values.\n", __func__); + return; + } + + /* + * Shutdown the audio engine before doing anything else. + */ + RHDAudioSetEnable(rhdPtr, FALSE); + + RHDRegWrite(Audio, AUDIO_TIMING, Audio->StoreTiming); + RHDRegWrite(Audio, AUDIO_SUPPORTED_SIZE_RATE, Audio->StoreSupportedSizeRate); + RHDRegWrite(Audio, AUDIO_SUPPORTED_CODEC, Audio->StoreSupportedCodec); + + RHDRegWrite(Audio, AUDIO_PLL1_MUL, Audio->StorePll1Mul); + RHDRegWrite(Audio, AUDIO_PLL1_DIV, Audio->StorePll1Div); + RHDRegWrite(Audio, AUDIO_PLL2_MUL, Audio->StorePll2Mul); + RHDRegWrite(Audio, AUDIO_PLL2_DIV, Audio->StorePll2Div); + RHDRegWrite(Audio, AUDIO_CLK_SRCSEL, Audio->StoreClockSrcSel); + RHDRegWrite(Audio, AUDIO_ENABLE, Audio->StoreEnabled); +} + +/* + * release the allocated memory + */ +void +RHDAudioDestroy(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + if (!rhdPtr->Audio) return; + + if(rhdPtr->Audio->Timer) + TimerFree(rhdPtr->Audio->Timer); + + xfree(rhdPtr->Audio); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_audio.h b/driver/xf86-video-radeonhd/src/rhd_audio.h new file mode 100644 index 000000000..82932e981 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_audio.h @@ -0,0 +1,118 @@ +/* + * Copyright 2008 Christian König + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_AUDIO_H +#define _RHD_AUDIO_H + +struct rhdAudio { + + int scrnIndex; + + struct rhdHdmi* Registered; + OsTimerPtr Timer; + + int SavedChannels; + int SavedRate; + int SavedBitsPerSample; + CARD8 SavedStatusBits; + CARD8 SavedCategoryCode; + + Bool Stored; + + CARD32 StoreEnabled; + CARD32 StoreTiming; + CARD32 StoreSupportedSizeRate; + CARD32 StoreSupportedCodec; + + CARD32 StorePll1Mul; + CARD32 StorePll1Div; + CARD32 StorePll2Mul; + CARD32 StorePll2Div; + CARD32 StoreClockSrcSel; +}; + +/* + * used for config value of RHDAudioSetSupported + */ +enum { + AUDIO_RATE_8000_HZ = 0x00000001, + AUDIO_RATE_11025_HZ = 0x00000002, + AUDIO_RATE_16000_HZ = 0x00000004, + AUDIO_RATE_22050_HZ = 0x00000008, + AUDIO_RATE_32000_HZ = 0x00000010, + AUDIO_RATE_44100_HZ = 0x00000020, + AUDIO_RATE_48000_HZ = 0x00000040, + AUDIO_RATE_88200_HZ = 0x00000080, + AUDIO_RATE_96000_HZ = 0x00000100, + AUDIO_RATE_176400_HZ = 0x00000200, + AUDIO_RATE_192000_HZ = 0x00000400, + AUDIO_RATE_384000_HZ = 0x00000800, + + AUDIO_BPS_8 = 0x00010000, + AUDIO_BPS_16 = 0x00020000, + AUDIO_BPS_20 = 0x00040000, + AUDIO_BPS_24 = 0x00080000, + AUDIO_BPS_32 = 0x00100000 +}; + +/* + * used for codec value of RHDAudioSetSupported + */ +enum { + AUDIO_CODEC_PCM = 0x00000001, + AUDIO_CODEC_FLOAT32 = 0x00000002, + AUDIO_CODEC_AC3 = 0x00000004 +}; + +/* + * used for status bist value in RHDAudioUpdateHdmi + */ +enum { + AUDIO_STATUS_DIG_ENABLE = 0x01, + AUDIO_STATUS_V = 0x02, + AUDIO_STATUS_VCFG = 0x04, + AUDIO_STATUS_EMPHASIS = 0x08, + AUDIO_STATUS_COPYRIGHT = 0x10, + AUDIO_STATUS_NONAUDIO = 0x20, + AUDIO_STATUS_PROFESSIONAL = 0x40, + AUDIO_STATUS_LEVEL = 0x80 +}; + +void RHDAudioInit(RHDPtr rhdPtr); + +void RHDAudioSetSupported(RHDPtr rhdPtr, Bool clear, CARD32 config, CARD32 codec); +void RHDAudioSetEnable(RHDPtr rhdPtr, Bool Enable); +void RHDAudioSetClock(RHDPtr rhdPtr, struct rhdOutput* Output, CARD32 Clock); + +void RHDAudioRegisterHdmi(RHDPtr rhdPtr, struct rhdHdmi* rhdHdmi); +void RHDAudioUnregisterHdmi(RHDPtr rhdPtr, struct rhdHdmi* rhdHdmi); + +void RHDAudioSave(RHDPtr rhdPtr); +void RHDAudioRestore(RHDPtr rhdPtr); + +void RHDAudioDestroy(RHDPtr rhdPtr); + +#endif /* _RHD_AUDIO_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_biosscratch.c b/driver/xf86-video-radeonhd/src/rhd_biosscratch.c new file mode 100644 index 000000000..d075e47ca --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_biosscratch.c @@ -0,0 +1,968 @@ +/* + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef ATOM_BIOS +# include "xf86.h" +# include "xf86_OSproc.h" +# include "xf86Pci.h" +/* only for testing now */ +# include "xf86DDC.h" +# include "edid.h" + +# if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +# else +# include +# include +# include +# endif + +#ifdef HAVE_XEXTPROTO_71 +# include "X11/extensions/dpmsconst.h" +#else +# define DPMS_SERVER +# include "X11/extensions/dpms.h" +#endif + + +# include "rhd.h" + +# include "rhd_atombios.h" + +# include "rhd_connector.h" +# include "rhd_output.h" +# include "rhd_biosscratch.h" +# include "rhd_crtc.h" +# include "rhd_card.h" + +# ifdef ATOM_BIOS_PARSER +# define INT8 INT8 +# define INT16 INT16 +# define INT32 INT32 +# include "CD_Common_Types.h" +# else +# ifndef ULONG +typedef unsigned int ULONG; +# define ULONG ULONG +# endif +# ifndef UCHAR +typedef unsigned char UCHAR; +# define UCHAR UCHAR +# endif +# ifndef USHORT +typedef unsigned short USHORT; +# define USHORT USHORT +# endif +# endif + +# include "atombios.h" + +struct rhdOutputDevices { + enum atomDevice DeviceId; + enum rhdConnectorType ConnectorType; +}; + +#if defined (ATOM_BIOS_PARSER) +/* + * + */ +static enum rhdSensedOutput +rhdAtomBIOSScratchDACSenseResults(struct rhdOutput *Output, enum atomDAC DAC, enum atomDevice Device) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 BIOS_0; + Bool TV = FALSE; + + RHDFUNC(Output); + + if (rhdPtr->ChipSet < RHD_R600) + BIOS_0 = RHDRegRead(Output, 0x10); + else + BIOS_0 = RHDRegRead(Output, 0x1724); + + switch (Device) { + case atomNone: + case atomCRT2: + case atomCRT1: + case atomLCD1: + case atomLCD2: + case atomDFP1: + case atomDFP2: + case atomDFP3: + case atomDFP4: + case atomDFP5: + TV = FALSE; + break; + case atomTV1: + case atomTV2: + case atomCV: + TV = TRUE; + break; + } + + RHDDebug(Output->scrnIndex, "BIOSScratch_0: 0x%4.4x\n",BIOS_0); + + switch (DAC) { + case atomDACA: + break; + case atomDACB: + BIOS_0 >>= 8; + break; + case atomDACExt: + return RHD_SENSED_NONE; + } + + if (!TV) { + if (BIOS_0 & ATOM_S0_CRT1_MASK) { + RHDDebug(Output->scrnIndex, "%s sensed RHD_SENSED_VGA\n",__func__); + return RHD_SENSED_VGA; + } + } else { + if (BIOS_0 & ATOM_S0_TV1_COMPOSITE_A) { + RHDDebug(Output->scrnIndex, "%s: RHD_SENSED_TV_COMPOSITE\n",__func__); + return RHD_SENSED_TV_COMPOSITE; + } else if (BIOS_0 & ATOM_S0_TV1_SVIDEO_A) { + RHDDebug(Output->scrnIndex, "%s: RHD_SENSED_TV_SVIDE\n",__func__); + return RHD_SENSED_TV_SVIDEO; + } else if (BIOS_0 & ATOM_S0_CV_MASK_A) { + RHDDebug(Output->scrnIndex, "%s: RHD_SENSED_TV_COMPONENT\n",__func__); + return RHD_SENSED_TV_COMPONENT; + } + } + + RHDDebug(Output->scrnIndex, "%s: RHD_SENSED_NONE\n",__func__); + return RHD_SENSED_NONE; +} + +/* + * + */ +enum rhdSensedOutput +RHDBIOSScratchDACSense(struct rhdOutput *Output, struct rhdConnector *Connector) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + enum atomDAC DAC; + Bool ret; + Bool TV; + enum atomDevice Device; + enum rhdSensedOutput retVal; + int i = 0; + + RHDFUNC(Output); + + if (!Output->OutputDriverPrivate) + return RHD_SENSED_NONE; + + switch (Output->Id) { + case RHD_OUTPUT_DACA: + RHDDebug(Output->scrnIndex, "Sensing DACA on Output %s\n",Output->Name); + DAC = atomDACA; + break; + case RHD_OUTPUT_DACB: + RHDDebug(Output->scrnIndex, "Sensing DACB on Output %s\n",Output->Name); + DAC = atomDACB; + break; + default: + return FALSE; + } + + switch (Connector->Type) { + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + case RHD_CONNECTOR_VGA: + TV = FALSE; + break; + default: + TV = TRUE; + } + + while ((Device = Output->OutputDriverPrivate->OutputDevices[i++].DeviceId) != atomNone) { + switch (Device) { + case atomCRT1: + case atomCRT2: + if (TV) + continue; + break; + case atomTV1: + case atomTV2: + case atomCV: + if (!TV) + continue; + break; + default: /* should not get here */ + return RHD_SENSED_NONE; + } + + ret = AtomDACLoadDetection(rhdPtr->atomBIOS, Device, DAC); + + if (!ret) + continue; + + if ((retVal = rhdAtomBIOSScratchDACSenseResults(Output, DAC, Device)) != RHD_SENSED_NONE) + return retVal; + } + return RHD_SENSED_NONE; +} +# endif /* ATOM_BIOS_PARSER */ +/* + * + */ +static void +rhdAtomBIOSScratchUpdateAttachedState(RHDPtr rhdPtr, enum atomDevice dev, Bool attached) +{ + CARD32 BIOS_0; + CARD32 Addr; + CARD32 Mask; + + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x10; + else + Addr = 0x1724; + + BIOS_0 = RHDRegRead(rhdPtr, Addr); + + switch (dev) { + case atomDFP1: + Mask = ATOM_S0_DFP1; + break; + case atomDFP2: + Mask = ATOM_S0_DFP2; + break; + case atomLCD1: + Mask = ATOM_S0_LCD1; + break; + case atomLCD2: + Mask = ATOM_S0_LCD2; + break; + case atomTV2: + Mask = ATOM_S0_TV2; + break; + case atomDFP3: + Mask = ATOM_S0_DFP3; + break; + case atomDFP4: + Mask = ATOM_S0_DFP4; + break; + case atomDFP5: + Mask = ATOM_S0_DFP5; + break; + default: + return; + } + if (attached) + BIOS_0 |= Mask; + else + BIOS_0 &= ~Mask; + + RHDRegWrite(rhdPtr, Addr, BIOS_0); +} + +/* + * + */ +static void +rhdAtomBIOSScratchUpdateOnState(RHDPtr rhdPtr, enum atomDevice dev, Bool on) +{ + CARD32 BIOS_3; + CARD32 Addr; + CARD32 Mask = 0; + + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x1C; + else + Addr = 0x1730; + + BIOS_3 = RHDRegRead(rhdPtr, Addr); + + switch (dev) { + case atomCRT1: + Mask = ATOM_S3_CRT1_ACTIVE; + break; + case atomLCD1: + Mask = ATOM_S3_LCD1_ACTIVE; + break; + case atomTV1: + Mask = ATOM_S3_TV1_ACTIVE; + break; + case atomDFP1: + Mask = ATOM_S3_DFP1_ACTIVE; + break; + case atomCRT2: + Mask = ATOM_S3_CRT2_ACTIVE; + break; + case atomLCD2: + Mask = ATOM_S3_LCD2_ACTIVE; + break; + case atomTV2: + Mask = ATOM_S3_TV2_ACTIVE; + break; + case atomDFP2: + Mask = ATOM_S3_DFP2_ACTIVE; + break; + case atomCV: + Mask = ATOM_S3_CV_ACTIVE; + break; + case atomDFP3: + Mask = ATOM_S3_DFP3_ACTIVE; + break; + case atomDFP4: + Mask = ATOM_S3_DFP4_ACTIVE; + break; + case atomDFP5: + Mask = ATOM_S3_DFP5_ACTIVE; + break; + case atomNone: + return; + } + if (on) + BIOS_3 |= Mask; + else + BIOS_3 &= ~Mask; + + RHDRegWrite(rhdPtr, Addr, BIOS_3); +} + +/* + * + */ +void +RHDAtomBIOSScratchSetAccelratorMode(RHDPtr rhdPtr, Bool on) +{ + CARD32 Addr; + CARD32 Mask = ATOM_S6_ACC_MODE | ATOM_S6_ACC_BLOCK_DISPLAY_SWITCH; + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x10 + (6 << 2); + else + Addr = 0x1724 + (6 << 2); + + RHDRegMask(rhdPtr, Addr, on ? Mask : 0, Mask); +} + +/* + * + */ +static void +rhdAtomBIOSScratchSetAcceleratorModeForDevice(RHDPtr rhdPtr, + enum atomDevice Device, Bool on) +{ + CARD32 Addr; + CARD32 Mask = 0; + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x10 + (6 << 2); + else + Addr = 0x1724 + (6 << 2); + + switch (Device) { + case atomCRT1: + Mask = ATOM_S6_ACC_REQ_CRT1; + break; + case atomLCD1: + Mask = ATOM_S6_ACC_REQ_LCD1; + break; + case atomTV1: + Mask = ATOM_S6_ACC_REQ_TV1; + break; + case atomDFP1: + Mask = ATOM_S6_ACC_REQ_DFP1; + break; + case atomCRT2: + Mask = ATOM_S6_ACC_REQ_CRT2; + break; + case atomLCD2: + Mask = ATOM_S6_ACC_REQ_LCD2; + break; + case atomTV2: + Mask = ATOM_S6_ACC_REQ_TV2; + break; + case atomDFP2: + Mask = ATOM_S6_ACC_REQ_DFP2; + break; + case atomCV: + Mask = ATOM_S6_ACC_REQ_CV; + break; + case atomDFP3: + Mask = ATOM_S6_ACC_REQ_DFP3; + break; + case atomDFP4: + Mask = ATOM_S6_ACC_REQ_DFP4; + break; + case atomDFP5: + Mask = ATOM_S6_ACC_REQ_DFP5; + break; + case atomNone: + return; + } + RHDRegMask(rhdPtr, Addr, on ? Mask : 0, Mask); +} + +/* + * + */ +static void +rhdAtomBIOSScratchSetCrtcState(RHDPtr rhdPtr, enum atomDevice dev, enum atomCrtc Crtc) +{ + CARD32 BIOS_3; + CARD32 Addr; + CARD32 Mask = 0; + + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x1C; + else + Addr = 0x1730; + + BIOS_3 = RHDRegRead(rhdPtr, Addr); + + switch (dev) { + case atomCRT1: + Mask = ATOM_S3_CRT1_CRTC_ACTIVE; + break; + case atomLCD1: + Mask = ATOM_S3_LCD1_CRTC_ACTIVE; + break; + case atomTV1: + Mask = ATOM_S3_TV1_CRTC_ACTIVE; + break; + case atomDFP1: + Mask = ATOM_S3_DFP1_CRTC_ACTIVE; + break; + case atomCRT2: + Mask = ATOM_S3_CRT2_CRTC_ACTIVE; + break; + case atomLCD2: + Mask = ATOM_S3_LCD2_CRTC_ACTIVE; + break; + case atomTV2: + Mask = ATOM_S3_TV2_CRTC_ACTIVE; + break; + case atomDFP2: + Mask = ATOM_S3_DFP2_CRTC_ACTIVE; + break; + case atomCV: + Mask = ATOM_S3_CV_CRTC_ACTIVE; + break; + case atomDFP3: + Mask = ATOM_S3_DFP3_CRTC_ACTIVE; + break; + case atomDFP4: + Mask = ATOM_S3_DFP4_CRTC_ACTIVE; + break; + case atomDFP5: + Mask = ATOM_S3_DFP5_CRTC_ACTIVE; + break; + case atomNone: + return; + } + if (Crtc == atomCrtc2) + BIOS_3 |= Mask; + else + BIOS_3 &= ~Mask; + + RHDRegWrite(rhdPtr, Addr, BIOS_3); +} + +/* + * + */ +void +RHDAtomBIOSScratchPMState(RHDPtr rhdPtr, struct rhdOutput *Output, int PowerManagementMode) +{ + CARD32 Addr; + CARD32 Mask = 0, Mask1; + enum atomDevice Device = Output->OutputDriverPrivate->Device; + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x10 + (2 << 2); + else + Addr = 0x1724 + (2 << 2); + + switch (Device) { + case atomCRT1: + Mask = ATOM_S2_CRT1_DPMS_STATE; + break; + case atomLCD1: + Mask = ATOM_S2_LCD1_DPMS_STATE; + break; + case atomTV1: + Mask = ATOM_S2_TV1_DPMS_STATE; + break; + case atomDFP1: + Mask = ATOM_S2_DFP1_DPMS_STATE; + break; + case atomCRT2: + Mask = ATOM_S2_CRT2_DPMS_STATE; + break; + case atomLCD2: + Mask = ATOM_S2_LCD2_DPMS_STATE; + break; + case atomTV2: + Mask = ATOM_S2_TV2_DPMS_STATE; + break; + case atomDFP2: + Mask = ATOM_S2_DFP2_DPMS_STATE; + break; + case atomCV: + Mask = ATOM_S2_CV_DPMS_STATE; + break; + case atomDFP3: + Mask = ATOM_S2_DFP3_DPMS_STATE; + break; + case atomDFP4: + Mask = ATOM_S2_DFP4_DPMS_STATE; + break; + case atomDFP5: + Mask = ATOM_S2_DFP5_DPMS_STATE; + break; + case atomNone: + return; + } + switch (PowerManagementMode) { + case DPMSModeOn: + Mask1 = 0; + break; + case DPMSModeStandby: + case DPMSModeSuspend: + case DPMSModeOff: + default: + Mask1 = Mask; + break; + } + + RHDRegMask(rhdPtr, Addr, Mask1, Mask); +} + +/* + * + */ +void +RHDAtomBIOSScratchBlLevel(RHDPtr rhdPtr, enum rhdBIOSScratchBlAction action, int *val) +{ + CARD32 Addr; + + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x18; + else + Addr = 0x172C; + + switch (action) { + case rhdBIOSScratchBlGet: + *val = (RHDRegRead(rhdPtr, Addr) >> 8) & 0xFF; + RHDDebug(rhdPtr->scrnIndex, "Get BL level: 0x%x\n",*val); + break; + case rhdBIOSScratchBlSet: + RHDDebug(rhdPtr->scrnIndex, "Set BL level: 0x%x\n",*val); + RHDRegMask(rhdPtr, Addr, (*val) << 8, 0xFF00); + break; + } +} + +/* + * This function finds the AtomBIOS device ID of the device that we currently + * want to drive with a specific output. It contains a logic to deal with CRTC vs. TV + * on DACs. + * This function preferrably gets called from within the function that also updates + * the BIOS scratch registers. + */ +static enum atomDevice +rhdBIOSScratchSetDeviceForOutput(struct rhdOutput *Output) +{ + int i = 0; + + RHDFUNC(Output); + + if (!Output->Connector) { + RHDDebug(Output->scrnIndex,"%s: No connector assigned to output %s\n",__func__,Output->Name); + return atomNone; + } + + if (!Output->OutputDriverPrivate) { + RHDDebug(Output->scrnIndex,"%s: Output %s has no DriverPrivate\n",__func__,Output->Name); + return atomNone; + } + + while (Output->OutputDriverPrivate->OutputDevices[i].DeviceId != atomNone) { + if (Output->OutputDriverPrivate->OutputDevices[i].ConnectorType == Output->Connector->Type){ + + switch (Output->OutputDriverPrivate->OutputDevices[i].DeviceId) { + case atomCrtc1: + case atomCrtc2: + if (Output->SensedType == RHD_SENSED_VGA + || Output->SensedType == RHD_SENSED_NONE) /* if nothing was sensed default to VGA */ + break; + i++; + continue; + case atomTV1: + case atomTV2: + if (Output->SensedType == RHD_SENSED_TV_SVIDEO + || Output->SensedType == RHD_SENSED_TV_COMPOSITE) + break; + i++; + continue; + case atomCV: + if (Output->SensedType == RHD_SENSED_TV_COMPONENT) + break; + i++; + continue; + default: + break; + } + Output->OutputDriverPrivate->Device = Output->OutputDriverPrivate->OutputDevices[i].DeviceId; + + return Output->OutputDriverPrivate->Device; + } + i++; + } + RHDDebugVerb(Output->scrnIndex,1,"%s: No device found: ConnectorType: %2.2x SensedType: %2.2x\n", + __func__, Output->Connector->Type, Output->SensedType); + return atomNone; +} + +/* + * This function is public as it is used from within other outputs, too. + */ +static enum atomDevice +rhdBIOSScratchUpdateBIOSScratchForOutput(struct rhdOutput *Output) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdOutputDevices *devList; + enum atomDevice Device; + int i = 0; + + RHDFUNC(Output); + + if (!Output->OutputDriverPrivate) { + RHDDebug(Output->scrnIndex,"%s: no output driver private present\n",__func__); + return atomNone; + } + devList = Output->OutputDriverPrivate->OutputDevices; + + if (Output->Connector) { + /* connected - enable */ + Device = rhdBIOSScratchSetDeviceForOutput(Output); + + if (Device == atomNone && (!rhdPtr->Card || rhdPtr->Card->ConnectorInfo[0].Type != RHD_CONNECTOR_NONE)) { + xf86DrvMsg(Output->scrnIndex, X_WARNING, "%s: AtomBIOS DeviceID unknown\n",__func__); + return Device; + } + + ASSERT(Device != atomNone); + + if (Output->Crtc) + rhdAtomBIOSScratchSetCrtcState(rhdPtr, Device, + Output->Crtc->Id == 1 ? atomCrtc2 : atomCrtc1); + rhdAtomBIOSScratchUpdateOnState(rhdPtr, Device, Output->Active); + rhdAtomBIOSScratchSetAcceleratorModeForDevice(rhdPtr, Device, Output->Active); + rhdAtomBIOSScratchUpdateAttachedState(rhdPtr, Device, TRUE); + + while (devList[i].DeviceId != atomNone) { + if (devList[i].DeviceId != Device) + rhdAtomBIOSScratchUpdateOnState(rhdPtr, devList[i].DeviceId, FALSE); + i++; + } + + } else { + /* not connected - just disable everything */ + Device = atomNone; + Output->OutputDriverPrivate->Device = Device; + + while (devList[i].DeviceId != atomNone) { + rhdAtomBIOSScratchUpdateOnState(rhdPtr, devList[i].DeviceId, FALSE); + rhdAtomBIOSScratchSetAcceleratorModeForDevice(rhdPtr, + devList[i].DeviceId, FALSE); + rhdAtomBIOSScratchUpdateAttachedState(rhdPtr, devList[i].DeviceId, FALSE); + i++; + } + } + + return Device; +} + +/* + * + */ +static void +rhdBIOSScratchPower(struct rhdOutput *Output, int Power) +{ + rhdBIOSScratchUpdateBIOSScratchForOutput(Output); + Output->OutputDriverPrivate->Power(Output, Power); +} + +/* + * + */ +static void +rhdBIOSScratchMode(struct rhdOutput *Output, DisplayModePtr Mode) +{ + rhdBIOSScratchUpdateBIOSScratchForOutput(Output); + Output->OutputDriverPrivate->Mode(Output, Mode); +} + +/* + * This destroys the privates again. It is implemented as an output destroy wrapper. + */ +static void +rhdBIOSScratchDestroyOutputDriverPrivate(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + if (Output->OutputDriverPrivate) { + void (*Destroy) (struct rhdOutput *Output) = Output->OutputDriverPrivate->Destroy; + + xfree(Output->OutputDriverPrivate->OutputDevices); + xfree(Output->OutputDriverPrivate); + Output->OutputDriverPrivate = NULL; + if (Destroy) + Destroy(Output); + } +} + +/* + * This sets up the AtomBIOS driver output private. + * It allocates the data structure and sets up the list of devices + * including the connector they are associated with. + */ +Bool +RHDAtomSetupOutputDriverPrivate(struct rhdAtomOutputDeviceList *Devices, struct rhdOutput *Output) +{ + struct rhdOutputDevices *od = NULL; + struct BIOSScratchOutputPrivate *OutputDriverPrivate; + int i = 0, cnt = 0; + + RHDFUNC(Output); + + if (!Devices) { + RHDDebug(Output->scrnIndex, "%s: Device list doesn't exist.\n"); + return FALSE; + } + + RHDDebugVerb(Output->scrnIndex, 1, " Output: %s[0x%2.2x] - adding devices:\n", Output->Name, Output->Id); + + while (Devices[i].DeviceId != atomNone) { + RHDDebugVerb(Output->scrnIndex,1," Looking at DeviceID: 0x%2.2x OutputType: 0x%2.2x ConnectorType: 0x%2.2x\n", + Devices[i].DeviceId,Devices[i].OutputType,Devices[i].ConnectorType); + if (Devices[i].OutputType == Output->Id) { + if (!(od = (struct rhdOutputDevices *)xrealloc(od, sizeof(struct rhdOutputDevices) * (cnt + 1)))) + return FALSE; + RHDDebugVerb(Output->scrnIndex,1," >> 0x%2.2x\n", Devices[i].DeviceId); + od[cnt].DeviceId = Devices[i].DeviceId; + od[cnt].ConnectorType = Devices[i].ConnectorType; + cnt++; + } + i++; + } + if (!(od = (struct rhdOutputDevices *)xrealloc(od, sizeof(struct rhdOutputDevices) * (cnt + 1)))) + return FALSE; + od[cnt].DeviceId = atomNone; + + if (!(OutputDriverPrivate = (struct BIOSScratchOutputPrivate *)xalloc(sizeof(struct BIOSScratchOutputPrivate)))) { + xfree(od); + return FALSE; + } + OutputDriverPrivate->OutputDevices = od; + OutputDriverPrivate->Destroy = Output->Destroy; + Output->Destroy = rhdBIOSScratchDestroyOutputDriverPrivate; + OutputDriverPrivate->Power = Output->Power; + Output->Power = rhdBIOSScratchPower; + OutputDriverPrivate->Mode = Output->Mode; + Output->Mode = rhdBIOSScratchMode; + Output->OutputDriverPrivate = OutputDriverPrivate; + + return TRUE; +} + +/* + * Find the connector and output type for a specific atom device. + * This information is kept in the output lists. + */ +Bool +RHDFindConnectorAndOutputTypesForDevice(RHDPtr rhdPtr, enum atomDevice Device, enum rhdOutputType *ot, enum rhdConnectorType *ct) +{ + struct rhdOutput *Output; + + *ot = RHD_OUTPUT_NONE; + *ct = RHD_CONNECTOR_NONE; + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) { + struct rhdOutputDevices *DeviceList; + int i = 0; + + if (!Output->OutputDriverPrivate) + continue; + + DeviceList = Output->OutputDriverPrivate->OutputDevices; + while (DeviceList[i].DeviceId != atomNone) { + if (DeviceList[i].DeviceId == Device) { + *ot = Output->Id; + *ct = DeviceList[i].ConnectorType; + return TRUE; + } + i++; + } + } + + return FALSE; +} + +/* + * + */ +enum atomDevice +RHDGetDeviceOnCrtc(RHDPtr rhdPtr, enum atomCrtc Crtc) +{ + CARD32 BIOS_3; + CARD32 Addr; + CARD32 Mask = 0; + + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) + Addr = 0x1C; + else + Addr = 0x1730; + + if (Crtc == atomCrtc1) + Mask = ~Mask; + + BIOS_3 = RHDRegRead(rhdPtr, Addr); + RHDDebug(rhdPtr->scrnIndex, "%s: BIOS_3 = 0x%x\n",__func__,BIOS_3); + + if (BIOS_3 & ATOM_S3_CRT1_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_CRT1_CRTC_ACTIVE)) + return atomCRT1; + else if (BIOS_3 & ATOM_S3_LCD1_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_LCD1_CRTC_ACTIVE)) + return atomLCD1; + else if (BIOS_3 & ATOM_S3_DFP1_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_DFP1_CRTC_ACTIVE)) + return atomDFP1; + else if (BIOS_3 & ATOM_S3_CRT2_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_CRT2_CRTC_ACTIVE)) + return atomCRT2; + else if (BIOS_3 & ATOM_S3_LCD2_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_LCD2_CRTC_ACTIVE)) + return atomLCD2; + else if (BIOS_3 & ATOM_S3_TV2_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_TV2_CRTC_ACTIVE)) + return atomTV2; + else if (BIOS_3 & ATOM_S3_DFP2_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_DFP2_CRTC_ACTIVE)) + return atomDFP2; + else if (BIOS_3 & ATOM_S3_CV_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_CV_CRTC_ACTIVE)) + return atomCV; + else if (BIOS_3 & ATOM_S3_DFP3_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_DFP3_CRTC_ACTIVE)) + return atomDFP3; + else if (BIOS_3 & ATOM_S3_DFP4_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_DFP4_CRTC_ACTIVE)) + return atomDFP4; + else if (BIOS_3 & ATOM_S3_DFP5_ACTIVE + && ((BIOS_3 ^ Mask) & ATOM_S3_DFP5_CRTC_ACTIVE)) + return atomDFP5; + else + return atomNone; +} + +struct rhdBiosScratchRegisters { + CARD32 Scratch0; + CARD32 Scratch2; + CARD32 Scratch3; + CARD32 Scratch6; +}; + +struct rhdBiosScratchRegisters * +RHDSaveBiosScratchRegisters(RHDPtr rhdPtr) +{ + struct rhdBiosScratchRegisters *regs; + CARD32 S0Addr, S2Addr, S3Addr, S6Addr; + + RHDFUNC(rhdPtr); + + if (!(regs = (struct rhdBiosScratchRegisters *)xalloc(sizeof(struct rhdBiosScratchRegisters)))) + return NULL; + + if (rhdPtr->ChipSet < RHD_R600) { + S0Addr = 0x10; + S2Addr = 0x18; + S3Addr = 0x1C; + S6Addr = 0x10 + (6 << 2); + } else { + S0Addr = 0x1724; + S2Addr = 0x172C; + S3Addr = 0x1730; + S6Addr = 0x1724 + (6 << 2); + } + regs->Scratch0 = RHDRegRead(rhdPtr, S0Addr); + regs->Scratch2 = RHDRegRead(rhdPtr, S2Addr); + regs->Scratch3 = RHDRegRead(rhdPtr, S3Addr); + regs->Scratch6 = RHDRegRead(rhdPtr, S6Addr); + + return regs; +} + +void +RHDRestoreBiosScratchRegisters(RHDPtr rhdPtr, struct rhdBiosScratchRegisters *regs) +{ + CARD32 S0Addr, S2Addr, S3Addr, S6Addr; + + RHDFUNC(rhdPtr); + + if (!regs) + return; + + if (rhdPtr->ChipSet < RHD_R600) { + S0Addr = 0x10; + S2Addr = 0x18; + S3Addr = 0x1C; + S6Addr = 0x10 + (6 << 2); + } else { + S0Addr = 0x1724; + S2Addr = 0x172C; + S3Addr = 0x1730; + S6Addr = 0x1724 + (6 << 2); + } + RHDRegWrite(rhdPtr, S0Addr, regs->Scratch0); + RHDRegWrite(rhdPtr, S2Addr, regs->Scratch2); + RHDRegWrite(rhdPtr, S3Addr, regs->Scratch3); + RHDRegWrite(rhdPtr, S6Addr, regs->Scratch6); + + xfree(regs); +} + +#endif /* ATOM_BIOS */ + diff --git a/driver/xf86-video-radeonhd/src/rhd_biosscratch.h b/driver/xf86-video-radeonhd/src/rhd_biosscratch.h new file mode 100644 index 000000000..17d452e3b --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_biosscratch.h @@ -0,0 +1,73 @@ +/* + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef RHD_BIOSSCRATCH_H_ +# define RHD_BIOSSCRATCH_H_ + +# ifdef ATOM_BIOS + +struct BIOSScratchOutputPrivate { + void (*Mode) (struct rhdOutput *Output, DisplayModePtr Mode); + void (*Power) (struct rhdOutput *Output, int Power); + void (*Destroy) (struct rhdOutput *Output); + struct rhdOutputDevices *OutputDevices; + enum atomDevice Device; +}; + +struct rhdAtomOutputDeviceList { + enum atomDevice DeviceId; + enum rhdOutputType OutputType; + enum rhdConnectorType ConnectorType; +}; + +enum rhdBIOSScratchBlAction { + rhdBIOSScratchBlGet, + rhdBIOSScratchBlSet +}; + + +extern struct rhdBiosScratchRegisters *RHDSaveBiosScratchRegisters(RHDPtr rhdPtr); +extern void RHDRestoreBiosScratchRegisters(RHDPtr rhdPtr, + struct rhdBiosScratchRegisters * regs); + +# if defined (ATOM_BIOS_PARSER) +extern enum rhdSensedOutput RHDBIOSScratchDACSense(struct rhdOutput *Output, + struct rhdConnector *Connector); +# endif +extern Bool RHDAtomSetupOutputDriverPrivate(struct rhdAtomOutputDeviceList *Devices, + struct rhdOutput *Output); +extern Bool RHDFindConnectorAndOutputTypesForDevice(RHDPtr rhdPtr, enum atomDevice Device, + enum rhdOutputType *ot, + enum rhdConnectorType *ct); +extern enum atomDevice RHDGetDeviceOnCrtc(RHDPtr rhdPtr, enum atomCrtc Crtc); + +extern void RHDAtomBIOSScratchBlLevel(RHDPtr rhdPtr, enum rhdBIOSScratchBlAction action, + int *val); + +extern void RHDAtomBIOSScratchSetAccelratorMode(RHDPtr rhdPtr, Bool on); +extern void RHDAtomBIOSScratchPMState(RHDPtr rhdPtr, struct rhdOutput *Output, + int PowerManagementMode); +# endif /* ATOM_BIOS */ +#endif /* RHD_BIOSSCRATCH_H_ */ diff --git a/driver/xf86-video-radeonhd/src/rhd_card.h b/driver/xf86-video-radeonhd/src/rhd_card.h new file mode 100644 index 000000000..d85493190 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_card.h @@ -0,0 +1,61 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_CARD_H +#define _RHD_CARD_H + +/* Four bytes in TYPE/DDC layout: see rhd_connector.h */ +struct rhdConnectorInfo { + rhdConnectorType Type; + char *Name; + rhdDDC DDC; + rhdHPD HPD; + rhdOutputType Output[MAX_OUTPUTS_PER_CONNECTOR]; +}; + +/* Some card specific flags, where and when needed */ +enum rhdCardFlag { + RHD_CARD_FLAG_NONE = 0, + RHD_CARD_FLAG_DMS59 = 1, /* DMS59 connector is only reported as two DVI-I */ + RHD_CARD_FLAG_HPDSWAP = 2, /* some cards have broken connector tables */ + RHD_CARD_FLAG_HPDOFF = 4 /* some have *very* broken connector tables */ +}; + +struct rhdCard { + CARD16 device; + CARD16 card_vendor; + CARD16 card_device; + char *name; + enum rhdCardFlag flags; + + struct rhdConnectorInfo ConnectorInfo[RHD_CONNECTORS_MAX]; +#ifdef ATOM_BIOS + enum atomDevice DeviceInfo[RHD_CONNECTORS_MAX][MAX_OUTPUTS_PER_CONNECTOR]; +#endif +}; + +void RhdPrintConnectorInfo(int scrnIndex, struct rhdConnectorInfo *cp); + +#endif /* _RHD_CARD_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_connector.c b/driver/xf86-video-radeonhd/src/rhd_connector.c new file mode 100644 index 000000000..45f1fe654 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_connector.c @@ -0,0 +1,513 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "xf86i2c.h" +#include "edid.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +#endif + +#include "rhd.h" +#ifdef ATOM_BIOS +# include "rhd_atombios.h" +#endif +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_regs.h" +#include "rhd_monitor.h" +#include "rhd_card.h" +#include "rhd_i2c.h" + +/* + * + */ +struct rhdHPD { + Bool Stored; + CARD32 StoreMask; + CARD32 StoreEnable; +}; + +/* + * + */ +void +RHDHPDSave(RHDPtr rhdPtr) +{ + struct rhdHPD *hpd = rhdPtr->HPD; + + RHDFUNC(rhdPtr); + + hpd->StoreMask = RHDRegRead(rhdPtr, DC_GPIO_HPD_MASK); + hpd->StoreEnable = RHDRegRead(rhdPtr, DC_GPIO_HPD_EN); + + hpd->Stored = TRUE; +} + +/* + * + */ +void +RHDHPDRestore(RHDPtr rhdPtr) +{ + struct rhdHPD *hpd = rhdPtr->HPD; + + RHDFUNC(rhdPtr); + + if (hpd->Stored) { + RHDRegWrite(rhdPtr, DC_GPIO_HPD_MASK, hpd->StoreMask); + RHDRegWrite(rhdPtr, DC_GPIO_HPD_EN, hpd->StoreEnable); + } else + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: no registers stored.\n", __func__); +} + +/* + * + */ +static void +RHDHPDSet(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + /* give the hw full control */ + RHDRegWrite(rhdPtr, DC_GPIO_HPD_MASK, 0); + RHDRegWrite(rhdPtr, DC_GPIO_HPD_EN, 0); + + usleep(1); +} + +/* + * + */ +static Bool +RHDHPDCheck(struct rhdConnector *Connector) +{ + Bool ret; + + RHDFUNC(Connector); + + ret = RHDRegRead(Connector, DC_GPIO_HPD_Y); + RHDDebug(Connector->scrnIndex, "%s returned: %x mask: %x\n", + __func__,ret, Connector->HPDMask); + + return (ret & Connector->HPDMask); +} + +struct rhdCsState { + int vga_cnt; + int dvi_cnt; +}; + +/* + * + */ +static char * +rhdConnectorSynthName(struct rhdConnectorInfo *ConnectorInfo, + struct rhdCsState **state) +{ + char *str = NULL; + char *TypeName; + char *str1, *str2; + int cnt; + + ASSERT(state != NULL); + + if (!*state) { + if (!(*state = xcalloc(sizeof(struct rhdCsState), 1))) + return NULL; + } + switch (ConnectorInfo->Type) { + case RHD_CONNECTOR_NONE: + return NULL; + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + if (ConnectorInfo->Output[0] && ConnectorInfo->Output[1]) { + TypeName = "DVI-I"; + cnt = ++(*state)->dvi_cnt; + } else if (ConnectorInfo->Output[0] == RHD_OUTPUT_DACA + || ConnectorInfo->Output[0] == RHD_OUTPUT_DACB + || ConnectorInfo->Output[1] == RHD_OUTPUT_DACA + || ConnectorInfo->Output[1] == RHD_OUTPUT_DACB + ) { + if (ConnectorInfo->HPD == RHD_HPD_NONE) { + TypeName = "VGA"; + cnt = ++(*state)->vga_cnt; + } else { + TypeName = "DVI-A"; + cnt = ++(*state)->dvi_cnt; + } + } else { + TypeName = "DVI-D"; + cnt = ++(*state)->dvi_cnt; + } + str = xalloc(12); + snprintf(str, 11, "%s %i",TypeName, cnt); + return str; + + case RHD_CONNECTOR_VGA: + str = xalloc(10); + snprintf(str, 9, "VGA %i",++(*state)->vga_cnt); + return str; + + case RHD_CONNECTOR_PANEL: + str = xalloc(10); + snprintf(str, 9, "PANEL"); + return str; + + case RHD_CONNECTOR_TV: + str1 = xstrdup(ConnectorInfo->Name); + str = xalloc(20); + str2 = strchr(str1, ' '); + if (str2) *(str2) = '\0'; + snprintf(str, 20, "TV %s",str1); + xfree(str1); + return str; + + case RHD_CONNECTOR_PCIE: /* should never get here */ + return NULL; + } + return NULL; +} + +/* + * + */ +Bool +RHDConnectorsInit(RHDPtr rhdPtr, struct rhdCard *Card) +{ + struct rhdConnectorInfo *ConnectorInfo; + struct rhdConnector *Connector; + struct rhdOutput *Output; + struct rhdCsState *csstate = NULL; + int i, j, k, l, hpd; + Bool InfoAllocated = FALSE; + + RHDFUNC(rhdPtr); + + /* Card->ConnectorInfo is there to work around quirks, so check it first */ + if (Card && (Card->ConnectorInfo[0].Type != RHD_CONNECTOR_NONE)) { + ConnectorInfo = Card->ConnectorInfo; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "ConnectorInfo from quirk table:\n"); + RhdPrintConnectorInfo (rhdPtr->scrnIndex, ConnectorInfo); + } else { +#ifdef ATOM_BIOS + /* common case */ + AtomBiosArgRec data; + AtomBiosResult result; + + data.chipset = rhdPtr->ChipSet; + result = RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CONNECTORS, &data); + if (result == ATOM_SUCCESS) { + ConnectorInfo = data.ConnectorInfo; + InfoAllocated = TRUE; + } else +#endif + { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Failed to retrieve " + "Connector information.\n", __func__); + return FALSE; + } + } + /* Init HPD */ + rhdPtr->HPD = xnfcalloc(sizeof(struct rhdHPD), 1); + RHDHPDSave(rhdPtr); + RHDHPDSet(rhdPtr); + + for (i = 0, j = 0; i < RHD_CONNECTORS_MAX; i++) { + if (ConnectorInfo[i].Type == RHD_CONNECTOR_NONE) + continue; + + RHDDebug(rhdPtr->scrnIndex, "%s: %d (%s) type %d, ddc %d, hpd %d\n", + __func__, i, ConnectorInfo[i].Name, ConnectorInfo[i].Type, + ConnectorInfo[i].DDC, ConnectorInfo[i].HPD); + + Connector = xnfcalloc(sizeof(struct rhdConnector), 1); + + Connector->scrnIndex = rhdPtr->scrnIndex; + + Connector->Type = ConnectorInfo[i].Type; + Connector->Name = rhdConnectorSynthName(&ConnectorInfo[i], &csstate); + + /* Get the DDC bus of this connector */ + if (ConnectorInfo[i].DDC != RHD_DDC_NONE) { + RHDI2CDataArg data; + int ret; + + data.i = ConnectorInfo[i].DDC; + ret = RHDI2CFunc(rhdPtr->scrnIndex, + rhdPtr->I2C, RHD_I2C_GETBUS, &data); + if (ret == RHD_I2C_SUCCESS) + Connector->DDC = data.i2cBusPtr; + } + + /* attach HPD */ + hpd = ConnectorInfo[i].HPD; + switch (rhdPtr->hpdUsage) { + case RHD_HPD_USAGE_OFF: + case RHD_HPD_USAGE_AUTO_OFF: + hpd = RHD_HPD_NONE; + break; + case RHD_HPD_USAGE_SWAP: + case RHD_HPD_USAGE_AUTO_SWAP: + switch (hpd) { + case RHD_HPD_0: + hpd = RHD_HPD_1; + break; + case RHD_HPD_1: + hpd = RHD_HPD_0; + break; + } + break; + default: + break; + } + switch(hpd) { + case RHD_HPD_0: + Connector->HPDMask = 0x00000001; + Connector->HPDCheck = RHDHPDCheck; + break; + case RHD_HPD_1: + Connector->HPDMask = 0x00000100; + Connector->HPDCheck = RHDHPDCheck; + break; + case RHD_HPD_2: + Connector->HPDMask = 0x00010000; + Connector->HPDCheck = RHDHPDCheck; + break; + case RHD_HPD_3: + Connector->HPDMask = 0x01000000; + Connector->HPDCheck = RHDHPDCheck; + break; + default: + Connector->HPDCheck = NULL; + break; + } + + /* create Outputs */ + for (k = 0; k < 2; k++) { + if (ConnectorInfo[i].Output[k] == RHD_OUTPUT_NONE) + continue; + + /* Check whether the output exists already */ + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Id == ConnectorInfo[i].Output[k]) + break; + + if (!Output) { + if (!RHDUseAtom(rhdPtr, NULL, atomUsageOutput)) { + switch (ConnectorInfo[i].Output[k]) { + case RHD_OUTPUT_DACA: + Output = RHDDACAInit(rhdPtr); + RHDOutputAdd(rhdPtr, Output); + break; + case RHD_OUTPUT_DACB: + Output = RHDDACBInit(rhdPtr); + RHDOutputAdd(rhdPtr, Output); + break; + case RHD_OUTPUT_TMDSA: + Output = RHDTMDSAInit(rhdPtr); + RHDOutputAdd(rhdPtr, Output); + break; + case RHD_OUTPUT_LVTMA: + Output = RHDLVTMAInit(rhdPtr, ConnectorInfo[i].Type); + RHDOutputAdd(rhdPtr, Output); + break; + case RHD_OUTPUT_DVO: + Output = RHDDDIAInit(rhdPtr); + if (Output) + RHDOutputAdd(rhdPtr, Output); + break; + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + Output = RHDDIGInit(rhdPtr, ConnectorInfo[i].Output[k], ConnectorInfo[i].Type); + RHDOutputAdd(rhdPtr, Output); + break; + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: unhandled output id: %d. Trying fallback to AtomBIOS\n", __func__, + ConnectorInfo[i].Output[k]); + break; + } + } +#ifdef ATOM_BIOS + if (!Output) { + Output = RHDAtomOutputInit(rhdPtr, ConnectorInfo[i].Type, + ConnectorInfo[i].Output[k]); + if (Output) + RHDOutputAdd(rhdPtr, Output); + } +#endif + } + + if (Output) { + xf86DrvMsg(rhdPtr->scrnIndex, X_PROBED, + "Attaching Output %s to Connector %s\n", + Output->Name, Connector->Name); + for (l = 0; l < 2; l++) + if (!Connector->Output[l]) { + Connector->Output[l] = Output; + break; + } + } + } + + rhdPtr->Connector[j] = Connector; + j++; + } + if (csstate) + xfree(csstate); + + /* Deallocate what atombios code allocated */ + if (ConnectorInfo && InfoAllocated) { + for (i = 0; i < RHD_CONNECTORS_MAX; i++) + if (ConnectorInfo[i].Type != RHD_CONNECTOR_NONE) + xfree(ConnectorInfo[i].Name); + /* Don't free the Privates as they are hooked into the rhdConnector structures !!! */ + xfree(ConnectorInfo); + } + + RHDHPDRestore(rhdPtr); + + return (j && 1); +} + +/* + * + */ +void +RHDConnectorsDestroy(RHDPtr rhdPtr) +{ + struct rhdConnector *Connector; + int i; + + RHDFUNC(rhdPtr); + + for (i = 0; i < RHD_CONNECTORS_MAX; i++) { + Connector = rhdPtr->Connector[i]; + if (Connector) { + if (Connector->Monitor) + RHDMonitorDestroy(Connector->Monitor); + xfree(Connector->Name); + xfree(Connector); + } + } +} + +/* + * + */ +void +RhdPrintConnectorInfo(int scrnIndex, struct rhdConnectorInfo *cp) +{ + int n; + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + const char *c_name[] = + { "RHD_CONNECTOR_NONE", "RHD_CONNECTOR_VGA", "RHD_CONNECTOR_DVI", + "RHD_CONNECTOR_DVI_SINGLE", "RHD_CONNECTOR_PANEL", + "RHD_CONNECTOR_TV", "RHD_CONNECTOR_PCIE" }; + + const char *ddc_name[] = + { "RHD_DDC_0", "RHD_DDC_1", "RHD_DDC_2", "RHD_DDC_3", "RHD_DDC_4" }; + + const char *hpd_name_normal[] = + { "RHD_HPD_NONE", "RHD_HPD_0", "RHD_HPD_1", "RHD_HPD_2", "RHD_HPD_3" }; + const char *hpd_name_off[] = + { "RHD_HPD_NONE", "RHD_HPD_NONE /*0*/", "RHD_HPD_NONE /*1*/", "RHD_HPD_NONE /*2*/", "RHD_HPD_NONE /*3*/" }; + const char *hpd_name_swapped[] = + { "RHD_HPD_NONE", "RHD_HPD_1 /*swapped*/", "RHD_HPD_0 /*swapped*/", "RHD_HPD_2", "RHD_HPD_3" }; + + const char *output_name[] = + { "RHD_OUTPUT_NONE", "RHD_OUTPUT_DACA", "RHD_OUTPUT_DACB", "RHD_OUTPUT_TMDSA", + "RHD_OUTPUT_LVTMA", "RHD_OUTPUT_DVO", "RHD_OUTPUT_KLDSKP_LVTMA", + "RHD_OUTPUT_UNIPHYA", "RHD_OUTPUT_UNIPHYB", "RHD_OUTPUT_UNIPHYC", "RHD_OUTPUT_UNIPHYD", + "RHD_OUTPUT_UNIPHYE", "RHD_OUTPUT_UNIPHYF" }; + const char **hpd_name; + + switch (rhdPtr->hpdUsage) { + case RHD_HPD_USAGE_OFF: + case RHD_HPD_USAGE_AUTO_OFF: + hpd_name = hpd_name_off; + break; + case RHD_HPD_USAGE_SWAP: + case RHD_HPD_USAGE_AUTO_SWAP: + hpd_name = hpd_name_swapped; + break; + default: + hpd_name = hpd_name_normal; + break; + } + + for (n = 0; n < RHD_CONNECTORS_MAX; n++) { + if (cp[n].Type == RHD_CONNECTOR_NONE) + break; + xf86DrvMsg(scrnIndex, X_INFO, "Connector[%i] {%s, \"%s\", %s, %s, { %s, %s } }\n", + n, c_name[cp[n].Type], cp[n].Name, + cp[n].DDC == RHD_DDC_NONE ? "RHD_DDC_NONE" : ddc_name[cp[n].DDC], + hpd_name[cp[n].HPD], output_name[cp[n].Output[0]], + output_name[cp[n].Output[1]]); + } +} + +/* + * Should we enable HDMI on this connector? + */ +Bool RHDConnectorEnableHDMI(struct rhdConnector *Connector) +{ + RHDPtr rhdPtr = RHDPTRI(Connector); + RHDFUNC(rhdPtr); + + /* check if user forced HDMI on this connector */ + switch(RhdParseBooleanOption(&rhdPtr->hdmi, Connector->Name)) { + case RHD_OPTION_ON: + case RHD_OPTION_DEFAULT: + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Enabling HDMI on %s because of config option\n", Connector->Name); + return TRUE; + case RHD_OPTION_OFF: + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Disabling HDMI on %s because of config option\n", Connector->Name); + return FALSE; + case RHD_OPTION_NOT_SET: + /* ask connected monitor if it supports HDMI */ + /* TODO: Not implemented yet! */ + return FALSE; + } + + return FALSE; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_connector.h b/driver/xf86-video-radeonhd/src/rhd_connector.h new file mode 100644 index 000000000..07a8564f3 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_connector.h @@ -0,0 +1,91 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_CONNECTOR_H +#define _RHD_CONNECTOR_H + +/* so that we can map which is which */ +typedef enum rhdConnectorType { + RHD_CONNECTOR_NONE = 0, + RHD_CONNECTOR_VGA, + RHD_CONNECTOR_DVI, + RHD_CONNECTOR_DVI_SINGLE, + RHD_CONNECTOR_PANEL, + RHD_CONNECTOR_TV, + RHD_CONNECTOR_PCIE +} rhdConnectorType; +/* add whatever */ + +/* map which DDC bus is where */ +typedef enum _rhdDDC { + RHD_DDC_0 = 0, + RHD_DDC_1, + RHD_DDC_2, + RHD_DDC_3, + RHD_DDC_4, + RHD_DDC_MAX, + RHD_DDC_NONE = 0xFF, + RHD_DDC_GPIO = RHD_DDC_NONE +} rhdDDC; + +/* map which HPD plug is used where */ +typedef enum _rhdHPD { + RHD_HPD_NONE = 0, + RHD_HPD_0, + RHD_HPD_1, + RHD_HPD_2, + RHD_HPD_3 +} rhdHPD; + +#define MAX_OUTPUTS_PER_CONNECTOR 2 + +struct rhdConnector { + int scrnIndex; + + CARD8 Type; + char *Name; + + struct _I2CBusRec *DDC; + + /* HPD handling here */ + int HPDMask; + Bool HPDAttached; + Bool (*HPDCheck) (struct rhdConnector *Connector); + + /* Add rhdMonitor pointer here. */ + /* This is created either from default, config or from EDID */ + struct rhdMonitor *Monitor; + + /* Point back to our Outputs, so we can handle sensing better */ + struct rhdOutput *Output[MAX_OUTPUTS_PER_CONNECTOR]; +}; + +Bool RHDConnectorsInit(RHDPtr rhdPtr, struct rhdCard *Card); +void RHDHPDSave(RHDPtr rhdPtr); +void RHDHPDRestore(RHDPtr rhdPtr); +void RHDConnectorsDestroy(RHDPtr rhdPtr); +Bool RHDConnectorEnableHDMI(struct rhdConnector *Connector); + +#endif /* _RHD_CONNECTOR_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_crtc.c b/driver/xf86-video-radeonhd/src/rhd_crtc.c new file mode 100644 index 000000000..ea0728cff --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_crtc.c @@ -0,0 +1,1499 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_pll.h" +#include "rhd_lut.h" +#include "rhd_regs.h" +#include "rhd_modes.h" +#include "rhd_mc.h" +#ifdef ATOM_BIOS +# include "rhd_atombios.h" +#endif +#define D1_REG_OFFSET 0x0000 +#define D2_REG_OFFSET 0x0800 +#define FMT1_REG_OFFSET 0x0000 +#define FMT2_REG_OFFSET 0x800 + +struct rhdCrtcFMTPrivate { + CARD32 StoreControl; + CARD32 StoreBitDepthControl; + CARD32 StoreClampCntl; +}; + +struct rhdCrtcFBPrivate { + CARD32 StoreGrphEnable; + CARD32 StoreGrphControl; + CARD32 StoreGrphXStart; + CARD32 StoreGrphYStart; + CARD32 StoreGrphXEnd; + CARD32 StoreGrphYEnd; + CARD32 StoreGrphSwap; + CARD32 StoreGrphPrimarySurfaceAddress; + CARD32 StoreGrphSurfaceOffsetX; + CARD32 StoreGrphSurfaceOffsetY; + CARD32 StoreGrphPitch; + CARD32 StoreModeDesktopHeight; +}; + +struct rhdCrtcLUTPrivate { + CARD32 StoreGrphLutSel; +}; + +struct rhdCrtcScalePrivate { + CARD32 StoreModeViewPortSize; + + CARD32 StoreModeOverScanH; + CARD32 StoreModeOverScanV; + + CARD32 StoreModeViewPortStart; + CARD32 StoreScaleEnable; + CARD32 StoreScaleTapControl; + CARD32 StoreModeCenter; + CARD32 StoreScaleHV; + CARD32 StoreScaleHFilter; + CARD32 StoreScaleVFilter; + CARD32 StoreScaleDither; +}; + +struct rhdCrtcModePrivate { + CARD32 StoreCrtcControl; + + CARD32 StoreCrtcHTotal; + CARD32 StoreCrtcHBlankStartEnd; + CARD32 StoreCrtcHSyncA; + CARD32 StoreCrtcHSyncACntl; + CARD32 StoreCrtcHSyncB; + CARD32 StoreCrtcHSyncBCntl; + + CARD32 StoreCrtcVTotal; + CARD32 StoreCrtcVBlankStartEnd; + CARD32 StoreCrtcVSyncA; + CARD32 StoreCrtcVSyncACntl; + CARD32 StoreCrtcVSyncB; + CARD32 StoreCrtcVSyncBCntl; + CARD32 StoreCrtcCountControl; + + CARD32 StoreModeDataFormat; + CARD32 StoreCrtcInterlaceControl; + + CARD32 StoreCrtcBlackColor; + CARD32 StoreCrtcBlankControl; +}; + +/* + * Checks whether Width, Height are within boundaries. + * If MODE_OK is returned and pPitch is not NULL, it is set. + */ +static ModeStatus +DxFBValid(struct rhdCrtc *Crtc, CARD16 Width, CARD16 Height, int bpp, + CARD32 Offset, CARD32 Size, CARD32 *pPitch) +{ + ScrnInfoPtr pScrn = xf86Screens[Crtc->scrnIndex]; + CARD16 Pitch; + unsigned int BytesPerPixel; + CARD8 PitchMask = 0xFF; + + RHDDebug(Crtc->scrnIndex, "FUNCTION: %s: %s\n", __func__, Crtc->Name); + + /* If we hit this, then the memory claimed so far is not properly aligned */ + if (Offset & 0xFFF) { + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, "%s: Offset (0x%08X) is invalid!\n", + __func__, (int) Offset); + return MODE_ERROR; + } + + switch (pScrn->bitsPerPixel) { + case 8: + BytesPerPixel = 1; + break; + case 15: + case 16: + BytesPerPixel = 2; + PitchMask /= BytesPerPixel; + break; + case 24: + case 32: + BytesPerPixel = 4; + PitchMask /= BytesPerPixel; + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: %dbpp is not implemented!\n", + __func__, pScrn->bitsPerPixel); + return MODE_BAD; + } + + /* Be reasonable */ + if (Width < 0x100) + return MODE_H_ILLEGAL; + if (Height < 0x100) + return MODE_V_ILLEGAL; + + /* D1GRPH_X_START is 14bits while D1_MODE_VIEWPORT_X_START is only 13 bits. + * Since it is reasonable to assume that modes will be at least 1x1 + * limit at 13bits + 1 */ + if (Width > 0x2000) + return MODE_VIRTUAL_X; + + /* D1GRPH_Y_START is 14bits while D1_MODE_VIEWPORT_Y_START is only 13 bits. + * Since it is reasonable to assume that modes will be at least 1x1 + * limit at 13bits + 1 */ + if (Height > 0x2000) + return MODE_VIRTUAL_Y; + + Pitch = (Width + PitchMask) & ~PitchMask; + /* D1_PITCH limit: should never happen after clamping Width to 0x2000 */ + if (Pitch >= 0x4000) + return MODE_VIRTUAL_X; + + if ((Pitch * BytesPerPixel * Height) > Size) + return MODE_MEM_VIRT; + + if (pPitch) + *pPitch = Pitch; + return MODE_OK; +} + +/* + * + */ +static void +DxFBSet(struct rhdCrtc *Crtc, CARD16 Pitch, CARD16 Width, CARD16 Height, + int bpp, CARD32 Offset) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + CARD16 RegOff; + + RHDDebug(Crtc->scrnIndex, "FUNCTION: %s: %s (%i[%i]x%i@%ibpp) +0x%x )\n", + __func__, Crtc->Name, Width, Pitch, Height, bpp, Offset); + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + RHDRegMask(Crtc, RegOff + D1GRPH_ENABLE, 1, 0x00000001); + + /* disable R/B swap, disable tiling, disable 16bit alpha, etc. */ + RHDRegWrite(Crtc, RegOff + D1GRPH_CONTROL, 0); + + switch (bpp) { + case 8: + RHDRegMask(Crtc, RegOff + D1GRPH_CONTROL, 0, 0x00000703); + break; + case 15: + RHDRegMask(Crtc, RegOff + D1GRPH_CONTROL, 0x000001, 0x00000703); + break; + case 16: + RHDRegMask(Crtc, RegOff + D1GRPH_CONTROL, 0x000101, 0x00000703); + break; + case 24: + case 32: + default: + RHDRegMask(Crtc, RegOff + D1GRPH_CONTROL, 0x000002, 0x00000703); + break; + /* TODO: 64bpp ;p */ + } + + /* Make sure that we are not swapping colours around */ + if (rhdPtr->ChipSet > RHD_R600) + RHDRegWrite(Crtc, RegOff + D1GRPH_SWAP_CNTL, 0); + /* R5xx - RS690 case is GRPH_CONTROL bit 16 */ + + RHDRegWrite(Crtc, RegOff + D1GRPH_PRIMARY_SURFACE_ADDRESS, + rhdPtr->FbIntAddress + Offset); + RHDRegWrite(Crtc, RegOff + D1GRPH_PITCH, Pitch); + RHDRegWrite(Crtc, RegOff + D1GRPH_SURFACE_OFFSET_X, 0); + RHDRegWrite(Crtc, RegOff + D1GRPH_SURFACE_OFFSET_Y, 0); + RHDRegWrite(Crtc, RegOff + D1GRPH_X_START, 0); + RHDRegWrite(Crtc, RegOff + D1GRPH_Y_START, 0); + RHDRegWrite(Crtc, RegOff + D1GRPH_X_END, Width); + RHDRegWrite(Crtc, RegOff + D1GRPH_Y_END, Height); + + /* D1Mode registers */ + RHDRegWrite(Crtc, RegOff + D1MODE_DESKTOP_HEIGHT, Height); + + Crtc->Pitch = Pitch; + Crtc->Width = Width; + Crtc->Height = Height; + Crtc->bpp = bpp; + Crtc->Offset = Offset; +} + +/* + * + */ +static void +DxFBSave(struct rhdCrtc *Crtc) +{ + struct rhdCrtcFBPrivate *FBPriv; + CARD32 RegOff; + + if (!Crtc->FBPriv) + FBPriv = xnfcalloc(1, sizeof(struct rhdCrtcFBPrivate)); + else + FBPriv = Crtc->FBPriv; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + FBPriv->StoreGrphEnable = RHDRegRead(Crtc, RegOff + D1GRPH_ENABLE); + FBPriv->StoreGrphControl = RHDRegRead(Crtc, RegOff + D1GRPH_CONTROL); + FBPriv->StoreGrphXStart = RHDRegRead(Crtc, RegOff + D1GRPH_X_START); + FBPriv->StoreGrphYStart = RHDRegRead(Crtc, RegOff + D1GRPH_Y_START); + FBPriv->StoreGrphXEnd = RHDRegRead(Crtc, RegOff + D1GRPH_X_END); + FBPriv->StoreGrphYEnd = RHDRegRead(Crtc, RegOff + D1GRPH_Y_END); + if (RHDPTRI(Crtc)->ChipSet >= RHD_R600) + FBPriv->StoreGrphSwap = RHDRegRead(Crtc, RegOff + D1GRPH_SWAP_CNTL); + FBPriv->StoreGrphPrimarySurfaceAddress = + RHDRegRead(Crtc, RegOff + D1GRPH_PRIMARY_SURFACE_ADDRESS); + FBPriv->StoreGrphSurfaceOffsetX = + RHDRegRead(Crtc, RegOff + D1GRPH_SURFACE_OFFSET_X); + FBPriv->StoreGrphSurfaceOffsetY = + RHDRegRead(Crtc, RegOff + D1GRPH_SURFACE_OFFSET_Y); + FBPriv->StoreGrphPitch = RHDRegRead(Crtc, RegOff + D1GRPH_PITCH); + FBPriv->StoreModeDesktopHeight = RHDRegRead(Crtc, RegOff + D1MODE_DESKTOP_HEIGHT); + + Crtc->FBPriv = FBPriv; +} + +/* + * + */ +static void +DxFBRestore(struct rhdCrtc *Crtc) +{ + struct rhdCrtcFBPrivate *FBPriv = Crtc->FBPriv; + CARD32 RegOff; + + if (!FBPriv) { + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, "%s: no registers stored!\n", + __func__); + return; + } + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + /* FBSet */ + RHDRegWrite(Crtc, RegOff + D1GRPH_CONTROL, FBPriv->StoreGrphControl); + RHDRegWrite(Crtc, RegOff + D1GRPH_X_START, FBPriv->StoreGrphXStart); + RHDRegWrite(Crtc, RegOff + D1GRPH_Y_START, FBPriv->StoreGrphYStart); + RHDRegWrite(Crtc, RegOff + D1GRPH_X_END, FBPriv->StoreGrphXEnd); + RHDRegWrite(Crtc, RegOff + D1GRPH_Y_END, FBPriv->StoreGrphYEnd); + if (RHDPTRI(Crtc)->ChipSet >= RHD_R600) + RHDRegWrite(Crtc, RegOff + D1GRPH_SWAP_CNTL, FBPriv->StoreGrphSwap); + + /* disable read requests */ + RHDRegMask(Crtc, RegOff + D1CRTC_CONTROL, 0x01000000, 0x01000000); + RHDRegMask(Crtc, RegOff + D1GRPH_ENABLE, 0, 0x00000001); + usleep (10); + + RHDRegWrite(Crtc, RegOff + D1GRPH_PRIMARY_SURFACE_ADDRESS, + FBPriv->StoreGrphPrimarySurfaceAddress); + usleep(10); + + RHDRegWrite(Crtc, RegOff + D1GRPH_ENABLE, FBPriv->StoreGrphEnable); + + RHDRegWrite(Crtc, RegOff + D1GRPH_SURFACE_OFFSET_X, + FBPriv->StoreGrphSurfaceOffsetX); + RHDRegWrite(Crtc, RegOff + D1GRPH_SURFACE_OFFSET_Y, + FBPriv->StoreGrphSurfaceOffsetY); + + RHDRegWrite(Crtc, RegOff + D1GRPH_PITCH, FBPriv->StoreGrphPitch); + RHDRegWrite(Crtc, RegOff + D1MODE_DESKTOP_HEIGHT, FBPriv->StoreModeDesktopHeight); +} + +/* + * + */ +static void +DxFBDestroy(struct rhdCrtc *Crtc) +{ + if (Crtc->FBPriv) + xfree(Crtc->FBPriv); + Crtc->FBPriv = NULL; +} + +/* + * + */ +static ModeStatus +DxModeValid(struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + CARD32 tmp; + + RHDDebug(Crtc->scrnIndex, "%s: %s\n", __func__, Crtc->Name); + + /* Work around HW bug: need at least 2 lines of front porch + for interlaced mode */ + if ((Mode->Flags & V_INTERLACE) + && (Mode->CrtcVSyncStart < (Mode->CrtcVDisplay + 2))) { + Mode->CrtcVSyncStart = Mode->CrtcVDisplay + 2; + Mode->CrtcVAdjusted = TRUE; + } + + /* D1CRTC_H_TOTAL - 1 : 13bits */ + if (Mode->CrtcHTotal > 0x2000) + return MODE_BAD_HVALUE; + + tmp = Mode->CrtcHTotal + Mode->CrtcHBlankStart - Mode->CrtcHSyncStart; + /* D1CRTC_H_BLANK_START: 13bits */ + if (tmp >= 0x2000) + return MODE_BAD_HVALUE; + + tmp = Mode->CrtcHBlankEnd - Mode->CrtcHSyncStart; + /* D1CRTC_H_BLANK_END: 13bits */ + if (tmp >= 0x2000) + return MODE_BAD_HVALUE; + + tmp = Mode->CrtcHSyncEnd - Mode->CrtcHSyncStart; + /* D1CRTC_H_SYNC_A_END: 13bits */ + if (tmp >= 0x2000) + return MODE_HSYNC_WIDE; + + /* D1CRTC_V_TOTAL - 1 : 13bits */ + if (Mode->CrtcVTotal > 0x2000) + return MODE_BAD_VVALUE; + + tmp = Mode->CrtcVTotal + Mode->CrtcVBlankStart - Mode->CrtcVSyncStart; + /* D1CRTC_V_BLANK_START: 13bits */ + if (tmp >= 0x2000) + return MODE_BAD_VVALUE; + + tmp = Mode->CrtcVBlankEnd - Mode->CrtcVSyncStart; + /* D1CRTC_V_BLANK_END: 13bits */ + if (tmp >= 0x2000) + return MODE_BAD_VVALUE; + + tmp = Mode->CrtcVSyncEnd - Mode->CrtcVSyncStart; + /* D1CRTC_V_SYNC_A_END: 13bits */ + if (tmp >= 0x2000) + return MODE_VSYNC_WIDE; + + return MODE_OK; +} + +/* + * + */ +static void +DxModeSet(struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + CARD16 BlankStart, BlankEnd; + CARD16 RegOff; + + RHDDebug(Crtc->scrnIndex, "FUNCTION: %s: %s\n", __func__, Crtc->Name); + + if (rhdPtr->verbosity > 6) { + xf86DrvMsg(Crtc->scrnIndex, X_INFO, "%s: Setting ",__func__); + RHDPrintModeline(Mode); + } + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + /* enable read requests */ + RHDRegMask(Crtc, RegOff + D1CRTC_CONTROL, 0, 0x01000000); + + /* Horizontal */ + RHDRegWrite(Crtc, RegOff + D1CRTC_H_TOTAL, Mode->CrtcHTotal - 1); + + BlankStart = Mode->CrtcHTotal + Mode->CrtcHBlankStart - Mode->CrtcHSyncStart; + BlankEnd = Mode->CrtcHBlankEnd - Mode->CrtcHSyncStart; + RHDRegWrite(Crtc, RegOff + D1CRTC_H_BLANK_START_END, + BlankStart | (BlankEnd << 16)); + + RHDRegWrite(Crtc, RegOff + D1CRTC_H_SYNC_A, + (Mode->CrtcHSyncEnd - Mode->CrtcHSyncStart) << 16); + RHDRegWrite(Crtc, RegOff + D1CRTC_H_SYNC_A_CNTL, Mode->Flags & V_NHSYNC); + + /* Vertical */ + RHDRegWrite(Crtc, RegOff + D1CRTC_V_TOTAL, Mode->CrtcVTotal - 1); + + BlankStart = Mode->CrtcVTotal + Mode->CrtcVBlankStart - Mode->CrtcVSyncStart; + BlankEnd = Mode->CrtcVBlankEnd - Mode->CrtcVSyncStart; + RHDRegWrite(Crtc, RegOff + D1CRTC_V_BLANK_START_END, + BlankStart | (BlankEnd << 16)); + + /* set interlaced */ + if (Mode->Flags & V_INTERLACE) { + RHDRegWrite(Crtc, RegOff + D1CRTC_INTERLACE_CONTROL, 0x1); + RHDRegWrite(Crtc, RegOff + D1MODE_DATA_FORMAT, 0x1); + } else { + RHDRegWrite(Crtc, RegOff + D1CRTC_INTERLACE_CONTROL, 0x0); + RHDRegWrite(Crtc, RegOff + D1MODE_DATA_FORMAT, 0x0); + } + + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_A, + (Mode->CrtcVSyncEnd - Mode->CrtcVSyncStart) << 16); + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_A_CNTL, Mode->Flags & V_NVSYNC); + + /* set D1CRTC_HORZ_COUNT_BY2_EN to 0; should only be set to 1 on 30bpp DVI modes */ + RHDRegMask(Crtc, RegOff + D1CRTC_COUNT_CONTROL, 0x0, 0x1); + + Crtc->CurrentMode = Mode; +} + +/* + * + */ +static void +DxModeSave(struct rhdCrtc *Crtc) +{ + struct rhdCrtcModePrivate *ModePriv; + CARD32 RegOff; + + if (!Crtc->ModePriv) + ModePriv = xnfcalloc(1, sizeof(struct rhdCrtcModePrivate)); + else + ModePriv = Crtc->ModePriv; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + ModePriv->StoreCrtcControl = RHDRegRead(Crtc, RegOff + D1CRTC_CONTROL); + + ModePriv->StoreCrtcHTotal = RHDRegRead(Crtc, RegOff + D1CRTC_H_TOTAL); + ModePriv->StoreCrtcHBlankStartEnd = + RHDRegRead(Crtc, RegOff + D1CRTC_H_BLANK_START_END); + ModePriv->StoreCrtcHSyncA = RHDRegRead(Crtc, RegOff + D1CRTC_H_SYNC_A); + ModePriv->StoreCrtcHSyncACntl = RHDRegRead(Crtc, RegOff + D1CRTC_H_SYNC_A_CNTL); + ModePriv->StoreCrtcHSyncB = RHDRegRead(Crtc, RegOff + D1CRTC_H_SYNC_B); + ModePriv->StoreCrtcHSyncBCntl = RHDRegRead(Crtc, RegOff + D1CRTC_H_SYNC_B_CNTL); + + ModePriv->StoreModeDataFormat = RHDRegRead(Crtc, RegOff + D1MODE_DATA_FORMAT); + ModePriv->StoreCrtcInterlaceControl = RHDRegRead(Crtc, RegOff + D1CRTC_INTERLACE_CONTROL); + + ModePriv->StoreCrtcVTotal = RHDRegRead(Crtc, RegOff + D1CRTC_V_TOTAL); + ModePriv->StoreCrtcVBlankStartEnd = + RHDRegRead(Crtc, RegOff + D1CRTC_V_BLANK_START_END); + ModePriv->StoreCrtcVSyncA = RHDRegRead(Crtc, RegOff + D1CRTC_V_SYNC_A); + ModePriv->StoreCrtcVSyncACntl = RHDRegRead(Crtc, RegOff + D1CRTC_V_SYNC_A_CNTL); + ModePriv->StoreCrtcVSyncB = RHDRegRead(Crtc, RegOff + D1CRTC_V_SYNC_B); + ModePriv->StoreCrtcVSyncBCntl = RHDRegRead(Crtc, RegOff + D1CRTC_V_SYNC_B_CNTL); + + ModePriv->StoreCrtcBlackColor = RHDRegRead(Crtc, RegOff + D1CRTC_BLACK_COLOR); + ModePriv->StoreCrtcBlankControl = RHDRegRead(Crtc, RegOff + D1CRTC_BLANK_CONTROL); + + ModePriv->StoreCrtcCountControl = RHDRegRead(Crtc, RegOff + D1CRTC_COUNT_CONTROL); + RHDDebug(Crtc->scrnIndex, "Saved CrtcCountControl[%i] = 0x%8.8x\n", + Crtc->Id,ModePriv->StoreCrtcCountControl); + + Crtc->ModePriv = ModePriv; +} + +/* + * + */ +static void +DxModeRestore(struct rhdCrtc *Crtc) +{ + struct rhdCrtcModePrivate *ModePriv = Crtc->ModePriv; + CARD32 RegOff; + RHDPtr rhdPtr = RHDPTRI(Crtc); + + if (!ModePriv) { + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, "%s: no registers stored!\n", + __func__); + return; + } + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + /* ModeSet */ + RHDRegWrite(Crtc, RegOff + D1CRTC_CONTROL, ModePriv->StoreCrtcControl); + + RHDRegWrite(Crtc, RegOff + D1CRTC_H_TOTAL, ModePriv->StoreCrtcHTotal); + RHDRegWrite(Crtc, RegOff + D1CRTC_H_BLANK_START_END, + ModePriv->StoreCrtcHBlankStartEnd); + RHDRegWrite(Crtc, RegOff + D1CRTC_H_SYNC_A, ModePriv->StoreCrtcHSyncA); + RHDRegWrite(Crtc, RegOff + D1CRTC_H_SYNC_A_CNTL, ModePriv->StoreCrtcHSyncACntl); + RHDRegWrite(Crtc, RegOff + D1CRTC_H_SYNC_B, ModePriv->StoreCrtcHSyncB); + RHDRegWrite(Crtc, RegOff + D1CRTC_H_SYNC_B_CNTL, ModePriv->StoreCrtcHSyncBCntl); + + RHDRegWrite(Crtc, RegOff + D1MODE_DATA_FORMAT, ModePriv->StoreModeDataFormat); + RHDRegWrite(Crtc, RegOff + D1CRTC_INTERLACE_CONTROL, ModePriv->StoreCrtcInterlaceControl); + + RHDRegWrite(Crtc, RegOff + D1CRTC_V_TOTAL, ModePriv->StoreCrtcVTotal); + RHDRegWrite(Crtc, RegOff + D1CRTC_V_BLANK_START_END, + ModePriv->StoreCrtcVBlankStartEnd); + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_A, ModePriv->StoreCrtcVSyncA); + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_A_CNTL, ModePriv->StoreCrtcVSyncACntl); + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_B, ModePriv->StoreCrtcVSyncB); + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_B_CNTL, ModePriv->StoreCrtcVSyncBCntl); + + RHDRegWrite(Crtc, RegOff + D1CRTC_COUNT_CONTROL, ModePriv->StoreCrtcCountControl); + + /* Blank */ + RHDRegWrite(Crtc, RegOff + D1CRTC_BLACK_COLOR, ModePriv->StoreCrtcBlackColor); + RHDRegWrite(Crtc, RegOff + D1CRTC_BLANK_CONTROL, ModePriv->StoreCrtcBlankControl); + + /* When VGA is enabled, it imposes its timing on us, so our CRTC SYNC + * timing can be set to 0. This doesn't always restore properly... + * Workaround is to set a valid sync length for a bit so VGA can + * latch in. */ + + /* Make sure VGA is restored already */ + ASSERT(!RHD_CHECKDEBUGFLAG(rhdPtr, VGA_SETUP)); + + if (!ModePriv->StoreCrtcVSyncA && (ModePriv->StoreCrtcControl & 0x00000001)) { + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_A, 0x00040000); + usleep(300000); /* seems a reliable timeout here */ + RHDRegWrite(Crtc, RegOff + D1CRTC_V_SYNC_A, ModePriv->StoreCrtcVSyncA); + } +} + +/* + * + */ +static void +DxModeDestroy(struct rhdCrtc *Crtc) +{ + RHDFUNC(Crtc); + + if (Crtc->ModePriv) + xfree(Crtc->ModePriv); + Crtc->ModePriv = NULL; +} + +/* + * + */ +struct rhdScalerOverscan +rhdCalculateOverscan(DisplayModePtr Mode, DisplayModePtr ScaledToMode, enum rhdCrtcScaleType Type) +{ + struct rhdScalerOverscan Overscan; + int tmp; + + Overscan.OverscanTop = Overscan.OverscanBottom = Overscan.OverscanLeft = Overscan.OverscanRight = 0; + Overscan.Type = Type; + + if (ScaledToMode) { + Overscan.OverscanTop = ScaledToMode->CrtcVDisplay - Mode->CrtcVDisplay; + Overscan.OverscanLeft = ScaledToMode->CrtcHDisplay - Mode->CrtcHDisplay; + + if (!Overscan.OverscanTop && !Overscan.OverscanLeft) + Overscan.Type = RHD_CRTC_SCALE_TYPE_NONE; + + /* handle down scaling */ + if (Overscan.OverscanTop < 0) { + Overscan.Type = RHD_CRTC_SCALE_TYPE_SCALE; + Overscan.OverscanTop = 0; + } + if (Overscan.OverscanLeft < 0) { + Overscan.Type = RHD_CRTC_SCALE_TYPE_SCALE; + Overscan.OverscanLeft = 0; + } + } + + switch (Type) { + case RHD_CRTC_SCALE_TYPE_NONE: + break; + + case RHD_CRTC_SCALE_TYPE_CENTER: + tmp = Overscan.OverscanTop; + Overscan.OverscanTop >>= 1; + Overscan.OverscanBottom = tmp - Overscan.OverscanTop; + tmp = Overscan.OverscanLeft; + Overscan.OverscanLeft >>= 1; + Overscan.OverscanRight = tmp - Overscan.OverscanLeft; + break; + + case RHD_CRTC_SCALE_TYPE_SCALE: + Overscan.OverscanLeft = Overscan.OverscanRight = Overscan.OverscanTop = Overscan.OverscanBottom = 0; + break; + case RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO: + { + int p1, p2, tmp; + Overscan.OverscanLeft = Overscan.OverscanRight = Overscan.OverscanTop = Overscan.OverscanBottom = 0; + p1 = Mode->CrtcVDisplay * ScaledToMode->CrtcHDisplay; + p2 = ScaledToMode->CrtcVDisplay * Mode->CrtcHDisplay; + if (p1 == p2) { + Overscan.Type = RHD_CRTC_SCALE_TYPE_SCALE; + } else if (p1 > p2) { + tmp = (p2 / Mode->CrtcVDisplay); + tmp = ScaledToMode->CrtcHDisplay - tmp; + Overscan.OverscanLeft = tmp >> 1; + Overscan.OverscanRight = tmp - Overscan.OverscanLeft; + ErrorF("HScale %i %i\n", Overscan.OverscanLeft, Overscan.OverscanRight); + } else { + tmp = (p1 / Mode->CrtcHDisplay); + tmp = ScaledToMode->CrtcVDisplay - tmp; + Overscan.OverscanTop = tmp >> 1; + Overscan.OverscanBottom = tmp - Overscan.OverscanTop; + ErrorF("VScale %i %i\n", Overscan.OverscanTop, Overscan.OverscanBottom); + } + break; + } + } + + return Overscan; +} + +/* + * + */ +static ModeStatus +DxScaleValid(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, + DisplayModePtr Mode, DisplayModePtr ScaledToMode) +{ + struct rhdScalerOverscan Overscan; + + /* D1_MODE_VIEWPORT_WIDTH: 14bits */ + if (Mode->CrtcHDisplay >= 0x4000) + return MODE_BAD_HVALUE; + + /* D1_MODE_VIEWPORT_HEIGHT: 14bits */ + if (Mode->CrtcVDisplay >= 0x4000) + return MODE_BAD_VVALUE; + + Overscan = rhdCalculateOverscan(Mode, ScaledToMode, Type); + + if (Overscan.OverscanLeft >= 4096 || Overscan.OverscanRight >= 4096) + return MODE_HBLANK_WIDE; + + if (Overscan.OverscanTop >= 4096 || Overscan.OverscanBottom >= 4096) + return MODE_VBLANK_WIDE; + + if ((Type == RHD_CRTC_SCALE_TYPE_SCALE + || Type == RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO) + && (Mode->Flags & V_INTERLACE)) + return MODE_NO_INTERLACE; + + /* should we also fail of Type != Overscan.Type? */ + + return MODE_OK; +} + +/* + * + */ +static void +DxScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, + DisplayModePtr Mode, DisplayModePtr ScaledToMode) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + CARD16 RegOff; + struct rhdScalerOverscan Overscan; + + RHDDebug(Crtc->scrnIndex, "FUNCTION: %s: %s viewport: %ix%i\n", __func__, Crtc->Name, + Mode->CrtcHDisplay, Mode->CrtcVDisplay); + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + Overscan = rhdCalculateOverscan(Mode, ScaledToMode, Type); + Type = Overscan.Type; + + RHDDebug(Crtc->scrnIndex, "FUNCTION: %s: %s viewport: %ix%i - OverScan: T: %i B: %i R: %i L: %i\n", + __func__, Crtc->Name, Mode->CrtcHDisplay, Mode->CrtcVDisplay, + Overscan.OverscanTop, Overscan.OverscanBottom, + Overscan.OverscanLeft, Overscan.OverscanRight); + + /* D1Mode registers */ + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_SIZE, + Mode->CrtcVDisplay | (Mode->CrtcHDisplay << 16)); + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_START, 0); + + RHDRegWrite(Crtc, RegOff + D1MODE_EXT_OVERSCAN_LEFT_RIGHT, + (Overscan.OverscanLeft << 16) | Overscan.OverscanRight); + RHDRegWrite(Crtc, RegOff + D1MODE_EXT_OVERSCAN_TOP_BOTTOM, + (Overscan.OverscanTop << 16) | Overscan.OverscanBottom); + + switch (Type) { + case RHD_CRTC_SCALE_TYPE_NONE: /* No scaling whatsoever */ + ErrorF("None\n"); + RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, 0); + RHDRegWrite(Crtc, RegOff + D1SCL_TAP_CONTROL, 0); + RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 0); + break; + case RHD_CRTC_SCALE_TYPE_CENTER: /* center of the actual mode */ + ErrorF("Center\n"); + RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, 0); + RHDRegWrite(Crtc, RegOff + D1SCL_TAP_CONTROL, 0); + RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 1); + break; + case RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO: /* scaled to fullscreen */ + case RHD_CRTC_SCALE_TYPE_SCALE: /* scaled to fullscreen */ + ErrorF("Full\n"); + if (Type == RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO) + RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 1); + else + RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 0); + + RHDRegWrite(Crtc, RegOff + D1SCL_UPDATE, 0); + RHDRegWrite(Crtc, RegOff + D1SCL_DITHER, 0); + + RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, 1); + RHDRegWrite(Crtc, RegOff + D1SCL_HVSCALE, 0x00010001); /* both h/v */ + + RHDRegWrite(Crtc, RegOff + D1SCL_TAP_CONTROL, 0x00000101); + + RHDRegWrite(Crtc, RegOff + D1SCL_HFILTER, 0x00030100); + RHDRegWrite(Crtc, RegOff + D1SCL_VFILTER, 0x00030100); + + RHDRegWrite(Crtc, RegOff + D1SCL_DITHER, 0x00001010); + break; + } + RHDMCTuneAccessForDisplay(rhdPtr, Crtc->Id, Mode, + ScaledToMode ? ScaledToMode : Mode); +} + +/* + * + */ +static void +DxScaleSave(struct rhdCrtc *Crtc) +{ + struct rhdCrtcScalePrivate *ScalePriv; + CARD32 RegOff; + + if (!Crtc->ScalePriv) + ScalePriv = xnfcalloc(1, sizeof(struct rhdCrtcScalePrivate)); + else + ScalePriv = Crtc->ScalePriv; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + ScalePriv->StoreModeViewPortSize = RHDRegRead(Crtc, RegOff + D1MODE_VIEWPORT_SIZE); + ScalePriv->StoreModeViewPortStart = RHDRegRead(Crtc, RegOff + D1MODE_VIEWPORT_START); + ScalePriv->StoreModeOverScanH = + RHDRegRead(Crtc, RegOff + D1MODE_EXT_OVERSCAN_LEFT_RIGHT); + ScalePriv->StoreModeOverScanV = + RHDRegRead(Crtc, RegOff + D1MODE_EXT_OVERSCAN_TOP_BOTTOM); + + ScalePriv->StoreScaleEnable = RHDRegRead(Crtc, RegOff + D1SCL_ENABLE); + ScalePriv->StoreScaleTapControl = RHDRegRead(Crtc, RegOff + D1SCL_TAP_CONTROL); + ScalePriv->StoreModeCenter = RHDRegRead(Crtc, RegOff + D1MODE_CENTER); + ScalePriv->StoreScaleHV = RHDRegRead(Crtc, RegOff + D1SCL_HVSCALE); + ScalePriv->StoreScaleHFilter = RHDRegRead(Crtc, RegOff + D1SCL_HFILTER); + ScalePriv->StoreScaleVFilter = RHDRegRead(Crtc, RegOff + D1SCL_VFILTER); + ScalePriv->StoreScaleDither = RHDRegRead(Crtc, RegOff + D1SCL_DITHER); + + Crtc->ScalePriv = ScalePriv; +} + +/* + * + */ +static void +DxScaleRestore(struct rhdCrtc *Crtc) +{ + struct rhdCrtcScalePrivate *ScalePriv = Crtc->ScalePriv; + CARD32 RegOff; + + if (!ScalePriv) { + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, "%s: no registers stored!\n", + __func__); + return; + } + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + /* ScaleSet */ + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_SIZE, ScalePriv->StoreModeViewPortSize); + + /* ScaleSet/ViewPortStart */ + RHDRegWrite(Crtc, RegOff + D1MODE_VIEWPORT_START, ScalePriv->StoreModeViewPortStart); + + /* ScaleSet */ + RHDRegWrite(Crtc, RegOff + D1MODE_EXT_OVERSCAN_LEFT_RIGHT, + ScalePriv->StoreModeOverScanH); + RHDRegWrite(Crtc, RegOff + D1MODE_EXT_OVERSCAN_TOP_BOTTOM, + ScalePriv->StoreModeOverScanV); + + RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, ScalePriv->StoreScaleEnable); + RHDRegWrite(Crtc, RegOff + D1SCL_TAP_CONTROL, ScalePriv->StoreScaleTapControl); + RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, ScalePriv->StoreModeCenter); + RHDRegWrite(Crtc, RegOff + D1SCL_HVSCALE, ScalePriv->StoreScaleHV); + RHDRegWrite(Crtc, RegOff + D1SCL_HFILTER, ScalePriv->StoreScaleHFilter); + RHDRegWrite(Crtc, RegOff + D1SCL_VFILTER, ScalePriv->StoreScaleVFilter); + RHDRegWrite(Crtc, RegOff + D1SCL_DITHER, ScalePriv->StoreScaleDither); +} + +/* + * + */ +static void +DxScaleDestroy(struct rhdCrtc *Crtc) +{ + RHDFUNC(Crtc); + + if (Crtc->ScalePriv) + xfree(Crtc->ScalePriv); + Crtc->ScalePriv = NULL; +} + +/* + * + */ +static void +D1LUTSelect(struct rhdCrtc *Crtc, struct rhdLUT *LUT) +{ + RHDFUNC(Crtc); + + RHDRegWrite(Crtc, D1GRPH_LUT_SEL, LUT->Id & 1); + Crtc->LUT = LUT; +} + +/* + * + */ +static void +D2LUTSelect(struct rhdCrtc *Crtc, struct rhdLUT *LUT) +{ + RHDFUNC(Crtc); + + RHDRegWrite(Crtc, D2GRPH_LUT_SEL, LUT->Id & 1); + Crtc->LUT = LUT; +} + +/* + * + */ +static void +DxLUTSave(struct rhdCrtc *Crtc) +{ + struct rhdCrtcLUTPrivate *LUTPriv; + CARD32 RegOff; + + if (!Crtc->LUTPriv) + LUTPriv = xnfcalloc(1, sizeof(struct rhdCrtcLUTPrivate)); + else + LUTPriv = Crtc->LUTPriv; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + LUTPriv->StoreGrphLutSel = RHDRegRead(Crtc, RegOff + D1GRPH_LUT_SEL); + + Crtc->LUTPriv = LUTPriv; +} + +/* + * + */ +static void +DxLUTRestore(struct rhdCrtc *Crtc) +{ + struct rhdCrtcLUTPrivate *LUTPriv = Crtc->LUTPriv; + CARD32 RegOff; + + if (!LUTPriv) { + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, "%s: no registers stored!\n", + __func__); + return; + } + + if (Crtc->Id == RHD_CRTC_1) + RegOff = D1_REG_OFFSET; + else + RegOff = D2_REG_OFFSET; + + /* LUTSelect */ + RHDRegWrite(Crtc, RegOff + D1GRPH_LUT_SEL, LUTPriv->StoreGrphLutSel); +} + +/* + * + */ +static void +DxLUTDestroy(struct rhdCrtc *Crtc) +{ + RHDFUNC(Crtc); + + if (Crtc->LUTPriv) + xfree(Crtc->LUTPriv); + Crtc->LUTPriv = NULL; +} + +/* + * + */ +static void +D1ViewPortStart(struct rhdCrtc *Crtc, CARD16 X, CARD16 Y) +{ + RHDFUNC(Crtc); + + /* not as granular as docs make it seem to be. + * if the lower two bits are set the line buffer might screw up, requiring + * a power cycle. */ + X = (X + 0x02) & ~0x03; + Y &= ~0x01; + + RHDRegMask(Crtc, D1SCL_UPDATE, 0x00010000, 0x0001000); + RHDRegWrite(Crtc, D1MODE_VIEWPORT_START, (X << 16) | Y); + RHDRegMask(Crtc, D1SCL_UPDATE, 0, 0x0001000); + + Crtc->X = X; + Crtc->Y = Y; +} + +/* + * + */ +static void +D2ViewPortStart(struct rhdCrtc *Crtc, CARD16 X, CARD16 Y) +{ + RHDFUNC(Crtc); + + /* not as granular as docs make it seem to be. */ + X = (X + 0x02) & ~0x03; + Y &= ~0x01; + + RHDRegMask(Crtc, D2SCL_UPDATE, 0x00010000, 0x0001000); + RHDRegWrite(Crtc, D2MODE_VIEWPORT_START, (X << 16) | Y); + RHDRegMask(Crtc, D2SCL_UPDATE, 0, 0x0001000); + + Crtc->X = X; + Crtc->Y = Y; +} + +#define CRTC_SYNC_WAIT 0x100000 +/* + * + */ +static Bool +D1CRTCDisable(struct rhdCrtc *Crtc) +{ + if (RHDRegRead(Crtc, D1CRTC_CONTROL) & 0x00000001) { + CARD32 Control = RHDRegRead(Crtc, D1CRTC_CONTROL); + int i; + + RHDRegMask(Crtc, D1CRTC_CONTROL, 0, 0x00000301); + (void)RHDRegRead(Crtc, D1CRTC_CONTROL); + + for (i = 0; i < CRTC_SYNC_WAIT; i++) + if (!(RHDRegRead(Crtc, D1CRTC_CONTROL) & 0x00010000)) { + RHDDebug(Crtc->scrnIndex, "%s: %d loops\n", __func__, i); + RHDRegMask(Crtc, D1CRTC_CONTROL, Control, 0x00000300); + return TRUE; + } + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, + "%s: Failed to Unsync %s\n", __func__, Crtc->Name); + RHDRegMask(Crtc, D1CRTC_CONTROL, Control, 0x00000300); + return FALSE; + } + return TRUE; +} + +/* + * + */ +static Bool +D2CRTCDisable(struct rhdCrtc *Crtc) +{ + if (RHDRegRead(Crtc, D2CRTC_CONTROL) & 0x00000001) { + CARD32 Control = RHDRegRead(Crtc, D2CRTC_CONTROL); + int i; + + RHDRegMask(Crtc, D2CRTC_CONTROL, 0, 0x00000301); + (void)RHDRegRead(Crtc, D2CRTC_CONTROL); + + for (i = 0; i < CRTC_SYNC_WAIT; i++) + if (!(RHDRegRead(Crtc, D2CRTC_CONTROL) & 0x00010000)) { + RHDDebug(Crtc->scrnIndex, "%s: %d loops\n", __func__, i); + RHDRegMask(Crtc, D2CRTC_CONTROL, Control, 0x00000300); + return TRUE; + } + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, + "%s: Failed to Unsync %s\n", __func__, Crtc->Name); + RHDRegMask(Crtc, D2CRTC_CONTROL, Control, 0x00000300); + return FALSE; + } + return TRUE; +} + +/* + * + */ +static Bool +D1Power(struct rhdCrtc *Crtc, int Power) +{ + Bool ret; + RHDFUNC(Crtc); + + switch (Power) { + case RHD_POWER_ON: + RHDRegMask(Crtc, D1GRPH_ENABLE, 0x00000001, 0x00000001); + usleep(2); + RHDRegMask(Crtc, D1CRTC_CONTROL, 0, 0x01000000); /* enable read requests */ + RHDRegMask(Crtc, D1CRTC_CONTROL, 1, 1); + return TRUE; + case RHD_POWER_RESET: + RHDRegMask(Crtc, D1CRTC_CONTROL, 0x01000000, 0x01000000); /* disable read requests */ + return D1CRTCDisable(Crtc); + case RHD_POWER_SHUTDOWN: + default: + RHDRegMask(Crtc, D1CRTC_CONTROL, 0x01000000, 0x01000000); /* disable read requests */ + ret = D1CRTCDisable(Crtc); + RHDRegMask(Crtc, D1GRPH_ENABLE, 0, 0x00000001); + return ret; + } +} + +/* + * + */ +static Bool +D2Power(struct rhdCrtc *Crtc, int Power) +{ + Bool ret; + RHDFUNC(Crtc); + + switch (Power) { + case RHD_POWER_ON: + RHDRegMask(Crtc, D2GRPH_ENABLE, 0x00000001, 0x00000001); + usleep(2); + RHDRegMask(Crtc, D2CRTC_CONTROL, 0, 0x01000000); /* enable read requests */ + RHDRegMask(Crtc, D2CRTC_CONTROL, 1, 1); + return TRUE; + case RHD_POWER_RESET: + RHDRegMask(Crtc, D2CRTC_CONTROL, 0x01000000, 0x01000000); /* disable read requests */ + return D2CRTCDisable(Crtc); + case RHD_POWER_SHUTDOWN: + default: + RHDRegMask(Crtc, D2CRTC_CONTROL, 0x01000000, 0x01000000); /* disable read requests */ + ret = D2CRTCDisable(Crtc); + RHDRegMask(Crtc, D2GRPH_ENABLE, 0, 0x00000001); + return ret; + } +} + +/* + * This is quite different from Power. Power disables and enables things, + * this here makes the hw send out black, and can switch back and forth + * immediately. Useful for covering up a framebuffer that is not filled + * in yet. + */ +static void +D1Blank(struct rhdCrtc *Crtc, Bool Blank) +{ + RHDFUNC(Crtc); + + RHDRegWrite(Crtc, D1CRTC_BLACK_COLOR, 0); + if (Blank) + RHDRegMask(Crtc, D1CRTC_BLANK_CONTROL, 0x00000100, 0x00000100); + else + RHDRegMask(Crtc, D1CRTC_BLANK_CONTROL, 0, 0x00000100); +} + +/* + * + */ +static void +D2Blank(struct rhdCrtc *Crtc, Bool Blank) +{ + RHDFUNC(Crtc); + + RHDRegWrite(Crtc, D2CRTC_BLACK_COLOR, 0); + if (Blank) + RHDRegMask(Crtc, D2CRTC_BLANK_CONTROL, 0x00000100, 0x00000100); + else + RHDRegMask(Crtc, D2CRTC_BLANK_CONTROL, 0, 0x00000100); +} + +/* + * + */ +static void +DxFMTSet(struct rhdCrtc *Crtc, struct rhdFMTDither *FMTDither) +{ + CARD32 RegOff; + CARD32 fmt_cntl = 0; + + RHDFUNC(Crtc); + + if (Crtc->Id == RHD_CRTC_1) + RegOff = FMT1_REG_OFFSET; + else + RegOff = FMT2_REG_OFFSET; + + if (FMTDither) { + + /* set dither depth to 18/24 */ + fmt_cntl = FMTDither->LVDS24Bit + ? (RV62_FMT_SPATIAL_DITHER_DEPTH | RV62_FMT_TEMPORAL_DITHER_DEPTH) + : 0; + RHDRegMask(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL, fmt_cntl, + RV62_FMT_SPATIAL_DITHER_DEPTH | RV62_FMT_TEMPORAL_DITHER_DEPTH); + + /* set temporal dither */ + if (FMTDither->LVDSTemporalDither) { + fmt_cntl = FMTDither->LVDSGreyLevel ? RV62_FMT_TEMPORAL_LEVEL : 0x0; + /* grey level */ + RHDRegMask(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL, + fmt_cntl, RV62_FMT_TEMPORAL_LEVEL); + /* turn on temporal dither and reset */ + RHDRegMask(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL, + RV62_FMT_TEMPORAL_DITHER_EN | RV62_FMT_TEMPORAL_DITHER_RESET, + RV62_FMT_TEMPORAL_DITHER_EN | RV62_FMT_TEMPORAL_DITHER_RESET); + usleep(20); + /* turn off reset */ + RHDRegMask(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL, 0x0, + RV62_FMT_TEMPORAL_DITHER_RESET); + } + /* spatial dither */ + RHDRegMask(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL, + FMTDither->LVDSSpatialDither ? RV62_FMT_SPATIAL_DITHER_EN : 0, + RV62_FMT_SPATIAL_DITHER_EN); + } else + RHDRegWrite(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL, 0); + + /* 4:4:4 encoding */ + RHDRegMask(Crtc, RegOff + RV620_FMT1_CONTROL, 0, RV62_FMT_PIXEL_ENCODING); + /* disable color clamping */ + RHDRegWrite(Crtc, RegOff + RV620_FMT1_CLAMP_CNTL, 0); +} + +/* + * + */ +static void +DxFMTSave(struct rhdCrtc *Crtc) +{ + struct rhdCrtcFMTPrivate *FMTPrivate; + CARD32 RegOff; + + RHDFUNC(Crtc); + + if (!Crtc->FMTPriv) + FMTPrivate = xnfcalloc(sizeof (struct rhdCrtcFMTPrivate),1); + else + FMTPrivate = Crtc->FMTPriv; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = FMT1_REG_OFFSET; + else + RegOff = FMT2_REG_OFFSET; + + FMTPrivate->StoreControl = RHDRegRead(Crtc, RegOff + RV620_FMT1_CONTROL); + FMTPrivate->StoreBitDepthControl = RHDRegRead(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL); + FMTPrivate->StoreClampCntl = RHDRegRead(Crtc, RegOff + RV620_FMT1_CLAMP_CNTL); + + Crtc->FMTPriv = FMTPrivate; +} + +/* + * + */ +static void +DxFMTRestore(struct rhdCrtc *Crtc) +{ + struct rhdCrtcFMTPrivate *FMTPrivate = Crtc->FMTPriv; + CARD32 RegOff; + + RHDFUNC(Crtc); + + if (!FMTPrivate) + return; + + if (Crtc->Id == RHD_CRTC_1) + RegOff = FMT1_REG_OFFSET; + else + RegOff = FMT2_REG_OFFSET; + + RHDRegWrite(Crtc, RegOff + RV620_FMT1_CONTROL, FMTPrivate->StoreControl); + RHDRegWrite(Crtc, RegOff + RV620_FMT1_BIT_DEPTH_CONTROL, FMTPrivate->StoreBitDepthControl); + RHDRegWrite(Crtc, RegOff + RV620_FMT1_CLAMP_CNTL, FMTPrivate->StoreClampCntl); +} + +/* + * + */ +static void +DxFMTDestroy(struct rhdCrtc *Crtc) +{ + RHDFUNC(Crtc); + + if (Crtc->FMTPriv) + xfree(Crtc->FMTPriv); + Crtc->FMTPriv = NULL; +} + +/* + * + */ +static enum rhdCrtcScaleType +rhdInitScaleType(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + if (rhdPtr->scaleTypeOpt.set) { + if (!strcasecmp(rhdPtr->scaleTypeOpt.val.string, "none")) + return RHD_CRTC_SCALE_TYPE_NONE; + else if (!strcasecmp(rhdPtr->scaleTypeOpt.val.string, "center")) + return RHD_CRTC_SCALE_TYPE_CENTER; + else if (!strcasecmp(rhdPtr->scaleTypeOpt.val.string, "scale")) + return RHD_CRTC_SCALE_TYPE_SCALE; + else if (!strcasecmp(rhdPtr->scaleTypeOpt.val.string, "scale_keep_aspect_ratio")) + return RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO; + else if (!strcasecmp(rhdPtr->scaleTypeOpt.val.string, "default")) + return RHD_CRTC_SCALE_TYPE_DEFAULT; + else { + xf86DrvMsgVerb(rhdPtr->scrnIndex, X_ERROR, 0, + "Unknown scale type: %s\n", rhdPtr->scaleTypeOpt.val.string); + return RHD_CRTC_SCALE_TYPE_DEFAULT; + } + } else + return RHD_CRTC_SCALE_TYPE_DEFAULT; +} + +/* + * + */ +Bool +RHDCrtcsInit(RHDPtr rhdPtr) +{ + struct rhdCrtc *Crtc; + enum rhdCrtcScaleType ScaleType; + Bool useAtom; + + RHDFUNC(rhdPtr); + + useAtom = RHDUseAtom(rhdPtr, NULL, atomUsageCrtc); + + ScaleType = rhdInitScaleType(rhdPtr); + + Crtc = xnfcalloc(sizeof(struct rhdCrtc), 1); + Crtc->scrnIndex = rhdPtr->scrnIndex; + Crtc->Name = "CRTC 1"; + Crtc->Id = RHD_CRTC_1; + + Crtc->ScaleType = ScaleType; + + if (rhdPtr->ChipSet >= RHD_RV620) { + Crtc->FMTDestroy = DxFMTDestroy; + Crtc->FMTSave = DxFMTSave; + Crtc->FMTRestore = DxFMTRestore; + Crtc->FMTModeSet = DxFMTSet; + } + Crtc->FMTPriv = NULL; + + Crtc->FBValid = DxFBValid; + Crtc->FBSet = DxFBSet; + Crtc->FBSave = DxFBSave; + Crtc->FBRestore = DxFBRestore; + Crtc->FBDestroy = DxFBDestroy; + + Crtc->ModeValid = DxModeValid; + Crtc->ModeSet = DxModeSet; + Crtc->ModeSave = DxModeSave; + Crtc->ModeRestore = DxModeRestore; + Crtc->ModeDestroy = DxModeDestroy; + Crtc->ModePriv = NULL; + + Crtc->ScaleValid = DxScaleValid; + Crtc->ScaleSet = DxScaleSet; + Crtc->ScaleSave = DxScaleSave; + Crtc->ScaleRestore = DxScaleRestore; + Crtc->ScaleDestroy = DxScaleDestroy; + Crtc->ScalePriv = NULL; + + Crtc->LUTSelect = D1LUTSelect; + Crtc->LUTSave = DxLUTSave; + Crtc->LUTRestore = DxLUTRestore; + Crtc->LUTDestroy = DxLUTDestroy; + Crtc->LUTPriv = NULL; + + Crtc->FrameSet = D1ViewPortStart; + + Crtc->Power = D1Power; + Crtc->Blank = D1Blank; + + rhdPtr->Crtc[0] = Crtc; + + Crtc = xnfcalloc(sizeof(struct rhdCrtc), 1); + Crtc->scrnIndex = rhdPtr->scrnIndex; + Crtc->Name = "CRTC 2"; + Crtc->Id = RHD_CRTC_2; + + Crtc->ScaleType = ScaleType; + + if (rhdPtr->ChipSet >= RHD_RV620) { + Crtc->FMTDestroy = DxFMTDestroy; + Crtc->FMTSave = DxFMTSave; + Crtc->FMTRestore = DxFMTRestore; + Crtc->FMTModeSet = DxFMTSet; + } + Crtc->FMTPriv = NULL; + + Crtc->FBValid = DxFBValid; + Crtc->FBSet = DxFBSet; + Crtc->FBSave = DxFBSave; + Crtc->FBRestore = DxFBRestore; + Crtc->FBDestroy = DxFBDestroy; + + Crtc->ModeValid = DxModeValid; + Crtc->ModeSet = DxModeSet; + Crtc->ModeSave = DxModeSave; + Crtc->ModeRestore = DxModeRestore; + Crtc->ModeDestroy = DxModeDestroy; + Crtc->ModePriv = NULL; + + Crtc->ScaleValid = DxScaleValid; + Crtc->ScaleSet = DxScaleSet; + Crtc->ScaleSave = DxScaleSave; + Crtc->ScaleRestore = DxScaleRestore; + Crtc->ScaleDestroy = DxScaleDestroy; + Crtc->ScalePriv = NULL; + + Crtc->LUTSelect = D2LUTSelect; + Crtc->LUTSave = DxLUTSave; + Crtc->LUTRestore = DxLUTRestore; + Crtc->LUTDestroy = DxLUTDestroy; + Crtc->LUTPriv = NULL; + + Crtc->FrameSet = D2ViewPortStart; + + Crtc->Power = D2Power; + Crtc->Blank = D2Blank; + + rhdPtr->Crtc[1] = Crtc; + + return !useAtom; +} + +/* + * + */ +void +RHDCrtcsDestroy(RHDPtr rhdPtr) +{ + struct rhdCrtc *Crtc; + int i; + + RHDFUNC(rhdPtr); + + for (i = 0; i < 2; i++) { + Crtc = rhdPtr->Crtc[i]; + if (Crtc) { + if (Crtc->FMTDestroy) + Crtc->FMTDestroy(Crtc); + + if (Crtc->LUTDestroy) + Crtc->LUTDestroy(Crtc); + + if (Crtc->FBDestroy) + Crtc->FBDestroy(Crtc); + + if (Crtc->ScaleDestroy) + Crtc->ScaleDestroy(Crtc); + + if (Crtc->ModeDestroy) + Crtc->ModeDestroy(Crtc); + + xfree(Crtc); + rhdPtr->Crtc[i] = NULL; + } + } +} + + +/* + * + */ +void +RHDCrtcSave(struct rhdCrtc *Crtc) +{ + RHDDebug(Crtc->scrnIndex, "%s: %s\n", __func__, Crtc->Name); + + if (Crtc->FMTSave) + Crtc->FMTSave(Crtc); + + if (Crtc->FBSave) + Crtc->FBSave(Crtc); + + if (Crtc->LUTSave) + Crtc->LUTSave(Crtc); + + if (Crtc->ScaleSave) + Crtc->ScaleSave(Crtc); + + if (Crtc->ModeSave) + Crtc->ModeSave(Crtc); +} + +/* + * + */ +void +RHDCrtcRestore(struct rhdCrtc *Crtc) +{ + + RHDDebug(Crtc->scrnIndex, "%s: %s\n", __func__, Crtc->Name); + + if (Crtc->FMTRestore) + Crtc->FMTRestore(Crtc); + + if (Crtc->FBRestore) + Crtc->FBRestore(Crtc); + + if (Crtc->LUTRestore) + Crtc->LUTRestore(Crtc); + + if (Crtc->ScaleRestore) + Crtc->ScaleRestore(Crtc); + + if (Crtc->ModeRestore) + Crtc->ModeRestore(Crtc); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_crtc.h b/driver/xf86-video-radeonhd/src/rhd_crtc.h new file mode 100644 index 000000000..af3916af0 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_crtc.h @@ -0,0 +1,139 @@ +/* + * Copyright 2004-2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_CRTC_H +# define _RHD_CRTC_H + +struct rhdFMTDither { + Bool LVDS24Bit; + Bool LVDSSpatialDither; + Bool LVDSTemporalDither; + int LVDSGreyLevel; +}; + +enum rhdCrtcScaleType { + RHD_CRTC_SCALE_TYPE_NONE, /* top left */ + RHD_CRTC_SCALE_TYPE_CENTER, /* center of the actual mode */ + RHD_CRTC_SCALE_TYPE_SCALE, /* scaled to fullscreen */ + RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO /* scaled to fullscreen */ +}; + +#define RHD_CRTC_SCALE_TYPE_DEFAULT RHD_CRTC_SCALE_TYPE_SCALE_KEEP_ASPECT_RATIO + + +struct rhdCrtc { + int scrnIndex; + + char *Name; +#define RHD_CRTC_1 0 +#define RHD_CRTC_2 1 + int Id; /* for others to hook onto */ + + Bool Active; + + int Offset; /* Current offset */ + int bpp; + int Pitch; + int Width; + int Height; + int X, Y; /* Current frame */ + int MinX, MinY, MaxX, MaxY; /* Panning Area: Max != 0 if used */ + enum rhdCrtcScaleType ScaleType; + struct rhdPLL *PLL; /* Currently attached PLL: move to private */ + struct rhdLUT *LUT; /* Currently attached LUT: move to private */ + struct rhdCursor *Cursor; /* Fixed to the MODE engine */ + + DisplayModePtr CurrentMode; + DisplayModePtr Modes; /* Validated ones: Cycle through these */ + + DisplayModePtr ScaledToMode; /* usually a fixed mode from one of the monitors */ + + struct rhdCrtcFMTPrivate *FMTPriv; /* each CRTC subsystem may define this independently */ + void (*FMTModeSet)(struct rhdCrtc *Crtc, struct rhdFMTDither *FMTDither); + void (*FMTSave)(struct rhdCrtc *Crtc); + void (*FMTRestore)(struct rhdCrtc *Crtc); + void (*FMTDestroy) (struct rhdCrtc *Crtc); + + struct rhdCrtcFBPrivate *FBPriv; /* each CRTC subsystem may define this independently */ + ModeStatus (*FBValid) (struct rhdCrtc *Crtc, CARD16 Width, CARD16 Height, + int bpp, CARD32 Offset, CARD32 Size, CARD32 *pPitch); + void (*FBSet) (struct rhdCrtc *Crtc, CARD16 Pitch, CARD16 Width, + CARD16 Height, int bpp, CARD32 Offset); + void (*FBSave) (struct rhdCrtc *Crtc); + void (*FBRestore) (struct rhdCrtc *Crtc); + void (*FBDestroy) (struct rhdCrtc *Crtc); + + struct rhdCrtcModePrivate *ModePriv; /* each CRTC subsystem may define this independently */ + ModeStatus (*ModeValid) (struct rhdCrtc *Crtc, DisplayModePtr Mode); + void (*ModeSet) (struct rhdCrtc *Crtc, DisplayModePtr Mode); + void (*ModeSave) (struct rhdCrtc *Crtc); + void (*ModeRestore) (struct rhdCrtc *Crtc); + void (*ModeDestroy) (struct rhdCrtc *Crtc); + + struct rhdCrtcScalePrivate *ScalePriv; /* each CRTC subsystem may define this independently */ + ModeStatus (*ScaleValid) (struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, DisplayModePtr Mode, DisplayModePtr ScaledToMode); + void (*ScaleSet) (struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, DisplayModePtr Mode, DisplayModePtr ScaledToMode); + void (*ScaleSave) (struct rhdCrtc *Crtc); + void (*ScaleRestore) (struct rhdCrtc *Crtc); + void (*ScaleDestroy) (struct rhdCrtc *Crtc); + + void (*FrameSet) (struct rhdCrtc *Crtc, CARD16 X, CARD16 Y); + + /* callback for pll setting lives here */ + /* callback for lut setting lives here */ + struct rhdCrtcLUTPrivate *LUTPriv; /* each CRTC subsystem may define this independently */ + void (*LUTSelect) (struct rhdCrtc *Crtc, struct rhdLUT *LUT); + void (*LUTSave) (struct rhdCrtc *Crtc); + void (*LUTRestore) (struct rhdCrtc *Crtc); + void (*LUTDestroy) (struct rhdCrtc *Crtc); + + Bool (*Power) (struct rhdCrtc *Crtc, int Power); + void (*Blank) (struct rhdCrtc *Crtc, Bool Blank); +}; + +Bool RHDCrtcsInit(RHDPtr rhdPtr); +void RHDAtomCrtcsInit(RHDPtr rhdPtr); +void RHDCrtcsDestroy(RHDPtr rhdPtr); +void RHDCrtcSave(struct rhdCrtc *Crtc); +void RHDCrtcRestore(struct rhdCrtc *Crtc); + +/* + * Calculate overscan values for scaler. + */ +struct rhdScalerOverscan +{ + int OverscanTop; + int OverscanBottom; + int OverscanLeft; + int OverscanRight; + enum rhdCrtcScaleType Type; +}; + +extern struct rhdScalerOverscan +rhdCalculateOverscan(DisplayModePtr Mode, + DisplayModePtr ScaledToMode, + enum rhdCrtcScaleType Type); + + +#endif /* _RHD_CRTC_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_cs.c b/driver/xf86-video-radeonhd/src/rhd_cs.c new file mode 100644 index 000000000..14cbe684c --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_cs.c @@ -0,0 +1,670 @@ +/* + * Copyright 2008 Luc Verhaegen + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * Command Submission backend. + */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include + +#include "rhd.h" +#include "rhd_cs.h" +#include "r5xx_regs.h" + +#if 1 +#define BUILD_CS_MMIO 1 +#endif + +#define CS_LOOP_COUNT 10000000 + +#ifdef BUILD_CS_MMIO +/* + * + * MMIO infrastructure. + * + */ + +/* First... provide some macro's for accessing the registers, which will + somewhat speed up things */ +#define CSMMIORegRead(Reg) MMIO_IN32(MMIOBase, (Reg)) +#define CSMMIORegWrite(Reg, Value) MMIO_OUT32(MMIOBase, (Reg), (Value)) + +static void +CSMMIORBBMStuff(struct RhdCS *CS) +{ + CARD8 *MMIOBase = RHDPTRI(CS)->MMIOBase; + CARD32 BufferEntries = (CS->Wptr - CS->Flushed) / 2; + CARD32 RBBMEntries = CSMMIORegRead(R5XX_RBBM_STATUS) & R5XX_RBBM_FIFOCNT_MASK; + int i, Entries; + + if (RBBMEntries < BufferEntries) + Entries = RBBMEntries; + else + Entries = BufferEntries; + + for (i = 0; i < Entries; i++) { + CSMMIORegWrite((CS->Buffer[CS->Flushed] & 0x3FFF) << 2, + CS->Buffer[CS->Flushed + 1]); + CS->Flushed += 2; +#ifdef RHD_CS_DEBUG + CS->Grabbed -= 2; +#endif + } +} + +/* + * + */ +static void +CSMMIOFlush(struct RhdCS *CS) +{ + int i; + +#ifdef RHD_CS_DEBUG + if (CS->Flushed & 1) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: CS->Flushed is not aligned (%d - (%s))!\n", + __func__, (unsigned int) CS->Flushed, CS->Func); + if (CS->Wptr & 1) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: CS->Wptr is not aligned (%d - (%s))!\n", + __func__, (unsigned int) CS->Wptr, CS->Func); +#endif + + /* go from CS->Flushed to CP->Wptr and write it out */ + for (i = 0; i < CS_LOOP_COUNT; i++) { + if (CS->Flushed != CS->Wptr) + CSMMIORBBMStuff(CS); + else + return; + } + + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Failed to empty the RBBM.\n", __func__); +} + +/* + * + */ +static void +CSMMIOGrab(struct RhdCS *CS, CARD32 Count) +{ + int i; + +#ifdef RHD_CS_DEBUG + if (CS->Flushed & 1) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: CS->Flushed is not aligned (%d - (%s))!\n", + __func__, (unsigned int) CS->Flushed, CS->Func); + if (CS->Wptr & 1) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: CS->Wptr is not aligned (%d - (%s))!\n", + __func__, (unsigned int) CS->Wptr, CS->Func); +#endif + + for (i = 0; i < CS_LOOP_COUNT; i++) { + if ((CS->Size - CS->Wptr) >= Count) + return; + if (CS->Flushed == CS->Wptr) { + CS->Wptr = 0; + CS->Flushed = 0; + return; + } + CSMMIORBBMStuff(CS); + } + + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Failed to get %d slots in the RBBM.\n", + __func__, (unsigned int) Count); +} + +/* + * + */ +static void +CSMMIODestroy(struct RhdCS *CS) +{ + if (CS->Buffer) + xfree(CS->Buffer); + + CS->Destroy = NULL; +} + +/* + * + */ +static void +CSMMIOInit(struct RhdCS *CS) +{ + xf86DrvMsg(CS->scrnIndex, X_INFO, + "Using MMIO Command Submission for acceleration.\n"); + + CS->Type = RHD_CS_MMIO; + + /* allocate a 64kB buffer here as well */ + CS->Size = (64 << 10) / 4; + CS->Buffer = xnfcalloc(1, 4 * CS->Size); + + CS->Grab = CSMMIOGrab; + CS->Flush = CSMMIOFlush; + CS->AdvanceFlush = TRUE; + CS->Idle = NULL; /* just the flush is enough, the rest is in the accel code */ + CS->Start = NULL; /* already in 2d accel code */ + CS->Reset = NULL; /* already in 2d accel code */ + CS->Stop = CSMMIOFlush; + CS->Destroy = CSMMIODestroy; +} + +#endif /* BUILD_CS_MMIO */ + +#ifdef USE_DRI + +/* + * + * DRM CP Backend. + * + */ + +#include "xf86drm.h" +/* Workaround for header mismatches */ +#ifndef DEPRECATED +# define DEPRECATED __attribute__ ((deprecated)) +# define __user +#endif +#include "radeon_drm.h" + +#define R5XX_IDLE_RETRY 16 /* Fall out of idle loops after this count */ + +struct RhdDRMCP { + int DrmFd; + drmBufPtr DrmBuffer; +}; + +/* + * Flush the indirect buffer to the kernel for submission to the card + */ +static void +DRMCPFlush(struct RhdCS *CS) +{ + RHDPtr rhdPtr = RHDPTRI(CS); + struct RhdDRMCP *CP = CS->Private; + struct drm_radeon_indirect indirect; + + if (!CP->DrmBuffer) + return; + + if (rhdPtr->ChipSet >= RHD_R600) { + while ((CS->Wptr * 4) & 0x3c) { + RHDCSGrab(CS, 1); + RHDCSWrite(CS, CP_PACKET2()); + RHDCSAdvance(CS); + } + } + + indirect.idx = CP->DrmBuffer->idx; + indirect.start = CS->Flushed * 4; + indirect.end = CS->Wptr * 4; + indirect.discard = 0; + + drmCommandWriteRead(CP->DrmFd, DRM_RADEON_INDIRECT, + &indirect, sizeof(struct drm_radeon_indirect)); + + /* make sure we are quadword aligned */ + if (CS->Wptr & 1) + CS->Wptr++; + + + CS->Flushed = CS->Wptr; +#ifdef RHD_CS_DEBUG + CS->Grabbed = 0; +#endif +} + +/* + * + */ +static void +DRMCPBufferDiscard(struct RhdCS *CS) +{ + RHDPtr rhdPtr = RHDPTRI(CS); + struct RhdDRMCP *CP = CS->Private; + struct drm_radeon_indirect indirect; + + if (rhdPtr->ChipSet >= RHD_R600) { + while ((CS->Wptr * 4) & 0x3c){ + RHDCSGrab(CS, 1); + RHDCSWrite(CS, CP_PACKET2()); + RHDCSAdvance(CS); + } + } + + indirect.idx = CP->DrmBuffer->idx; + indirect.start = CS->Flushed * 4; + indirect.end = CS->Wptr * 4; + indirect.discard = 1; + + drmCommandWriteRead(CP->DrmFd, DRM_RADEON_INDIRECT, + &indirect, sizeof(struct drm_radeon_indirect)); +} + +/* + * + */ +static void +DRMCPStart(struct RhdCS *CS) +{ + struct RhdDRMCP *CP = CS->Private; + int ret; + + ret = drmCommandNone(CP->DrmFd, DRM_RADEON_CP_START); + if (ret) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: DRM CP START returned %d\n", __func__, ret); + + /* Move the responsibility of checking for a buffer away from the Grab, + to provide symmetry with the Stop. */ + if (CP->DrmBuffer) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: stale buffer present!\n", __func__); + DRMCPBufferDiscard(CS); + } + + CP->DrmBuffer = RHDDRMCPBuffer(CS->scrnIndex); + CS->Buffer = CP->DrmBuffer->address; +} + +/* + * + */ +static void +DRMCPStop(struct RhdCS *CS) +{ + struct RhdDRMCP *CP = CS->Private; + struct drm_radeon_cp_stop stop; + int ret, i; + + /* flush and discard the indirect buffer */ + if (CP->DrmBuffer) + DRMCPBufferDiscard(CS); + CP->DrmBuffer = NULL; + CS->Buffer = NULL; + + /* now stop the CP itself */ + stop.flush = 0; /* pointless in drm */ + stop.idle = 1; + for (i = 0; i < R5XX_IDLE_RETRY; i++) { + ret = drmCommandWrite(CP->DrmFd, DRM_RADEON_CP_STOP, + &stop, sizeof(struct drm_radeon_cp_stop)); + if (!ret) + return; + else if (ret != -16) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s Stop/Idle failed: %d\n", __func__, ret); + return; + } + } + + stop.idle = 0; + if (drmCommandWrite(CP->DrmFd, DRM_RADEON_CP_STOP, + &stop, sizeof(struct drm_radeon_cp_stop))) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s Stop failed: %d\n", __func__, ret); +} + +/* + * + */ +static void +DRMCPReset(struct RhdCS *CS) +{ + struct RhdDRMCP *CP = CS->Private; + int ret; + + ret = drmCommandNone(CP->DrmFd, DRM_RADEON_CP_RESET); + if (ret) + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: Reset failed %d\n", __func__, ret); + + ret = drmCommandNone(CP->DrmFd, DRM_RADEON_CP_START); + if (ret) + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: Start failed %d\n", __func__, ret); +} + +/* + * + */ +static Bool +DRMCPIdle(struct RhdCS *CS) +{ + struct RhdDRMCP *CP = CS->Private; + int i, ret; + + /* The DRM CP IDLE call does quite a lot more than just wait for the CP + * going idle. It waits on the RBBM as well. This number needs to be huge, + * as the DRM cluelessly uses loops instead of usecs, and this is therefor + * decreasing rapidly with CPU advancement. */ + for (i = 0; i < 2000000; i++) { + ret = drmCommandNone(CP->DrmFd, DRM_RADEON_CP_IDLE); + if (!ret) + return TRUE; + else if (ret != -16) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: DRM CP IDLE returned %d\n", __func__, ret); + return FALSE; + } else + xf86DrvMsg(CS->scrnIndex, X_WARNING, "%s: DRM CP IDLE returned BUSY!\n", __func__); + } + + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: Failed!\n", __func__); + return FALSE; +} + +/* + * + */ +static void +DRMCPGrab(struct RhdCS *CS, CARD32 Count) +{ + struct RhdDRMCP *CP = CS->Private; + + if (!CP->DrmBuffer || ((CS->Size - CS->Wptr) < Count)) { + if (CP->DrmBuffer) + DRMCPBufferDiscard(CS); + + CP->DrmBuffer = RHDDRMCPBuffer(CS->scrnIndex); + CS->Buffer = CP->DrmBuffer->address; + CS->Flushed = 0; + CS->Wptr = 0; +#ifdef RHD_CS_DEBUG + CS->Grabbed = 0; +#endif + } +} + +/* + * + */ +static void +DRMCPDestroy(struct RhdCS *CS) +{ + struct RhdDRMCP *CP = CS->Private; + + if (!CP) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Out of order: already destroyed.\n", __func__); + return; + } + + if (CP->DrmBuffer) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Shouldn't you call Stop first?\n", __func__); + + xfree(CP); + CS->Private = NULL; + CS->Destroy = NULL; +} + +/* + * + */ +static Bool +CSDRMCPInit(struct RhdCS *CS) +{ + struct RhdDRMCP *CP; + int DrmFd = RHDDRMFDGet(CS->scrnIndex); + + if (DrmFd < 0) + return FALSE; + + xf86DrvMsg(CS->scrnIndex, X_INFO, + "Using DRM Command Processor (indirect) for acceleration.\n"); + + CP = xnfcalloc(1, sizeof(struct RhdDRMCP)); + CP->DrmFd = DrmFd; + + CS->Private = CP; + + CS->Type = RHD_CS_CPDMA; + + CS->Size = (64 << 10) / 4; + + CS->Grab = DRMCPGrab; + CS->Flush = DRMCPFlush; + /* The DRILeaveServer call flushes all the time for us */ + CS->AdvanceFlush = FALSE; + CS->Idle = DRMCPIdle; + CS->Start = DRMCPStart; + CS->Reset = DRMCPReset; + CS->Stop = DRMCPStop; + CS->Destroy = DRMCPDestroy; + + return TRUE; +} + +#endif /* USE_DRI */ + +/* + * + * Actual highlevel Command Submission. + * + */ + +/* + * The logic is kind of tricky, we can use both ringbuffers as normal buffers. + */ + +#ifdef RHD_CS_DEBUG +/* + * Since we're CS_DEBUG, we don't really need to care about performance much. + */ +void +RHDCSGrabDebug(struct RhdCS *CS, CARD32 Count, const char *func) +{ + if (!CS->Active) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Grabbing while CS is not started!\n", func); + + if (CS->Wptr != (CS->Flushed + CS->Grabbed)) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Wptr != Flushed + Grabbed (%d vs %d + %d) (%s -> %s)\n", + func, (unsigned int) CS->Wptr, (unsigned int) CS->Flushed, + (unsigned int) CS->Grabbed, CS->Func, func); + + _RHDCSGrab(CS, Count); + + CS->Grabbed += Count; + CS->Func = func; +} +#endif /* RHD_CS_DEBUG */ + +/* + * + */ +void +RHDCSFlush(struct RhdCS *CS) +{ +#ifdef RHD_CS_DEBUG + if (!CS->Active) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: CS is not active (%s)!\n", + __func__, CS->Func); + return; + } + + if (CS->Wptr != (CS->Flushed + CS->Grabbed)) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Wptr != Flushed + Grabbed (%d vs %d + %d) (From %s)\n", + __func__, (unsigned int) CS->Wptr, (unsigned int) CS->Flushed, + (unsigned int) CS->Grabbed, CS->Func); +#endif + + if (CS->Flushed != CS->Wptr) + CS->Flush(CS); +} + +/* + * + */ +Bool +RHDCSIdle(struct RhdCS *CS) +{ +#ifdef RHD_CS_DEBUG + if (!CS->Active) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: CS is not active!\n", + __func__); + return TRUE; + } +#endif + + if (CS->Idle) + return CS->Idle(CS); + + return TRUE; +} + +/* + * + */ +void +RHDCSStart(struct RhdCS *CS) +{ + RHDFUNC(CS); + + if (CS->Active) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: Command Submission backend is " + "already active!\n", __func__); + return; + } + + if (CS->Start) + CS->Start(CS); + + CS->Flushed = 0; + CS->Wptr = 0; +#ifdef RHD_CS_DEBUG + CS->Grabbed = 0; +#endif + + CS->Clean = RHD_CS_CLEAN_DONE; + CS->Active = TRUE; +} + +/* + * + */ +void +RHDCSReset(struct RhdCS *CS) +{ + RHDFUNC(CS); + +#ifdef RHD_CS_DEBUG + if (!CS->Active) + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: CS is not active!\n", + __func__); +#endif + + if (CS->Reset) + CS->Reset(CS); +} + +/* + * + */ +void +RHDCSStop(struct RhdCS *CS) +{ + RHDFUNC(CS); + + if (!CS->Active) { + xf86DrvMsg(CS->scrnIndex, X_ERROR, "%s: Command Submission backend is " + "not active!\n", __func__); + return; + } + +#ifdef RHD_CS_DEBUG + if (CS->Wptr != (CS->Flushed + CS->Grabbed)) + xf86DrvMsg(CS->scrnIndex, X_ERROR, + "%s: Wptr != Flushed + Grabbed (%d vs %d + %d) (From %s)\n", + __func__, (unsigned int) CS->Wptr, (unsigned int) CS->Flushed, + (unsigned int) CS->Grabbed, CS->Func); +#endif + + CS->Stop(CS); + + CS->Flushed = 0; + CS->Wptr = 0; +#ifdef RHD_CS_DEBUG + CS->Grabbed = 0; +#endif + + CS->Active = FALSE; +} + +/* + * + */ +void +RHDCSInit(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RhdCS *CS = xnfcalloc(1, sizeof(struct RhdCS)); + + CS->scrnIndex = pScrn->scrnIndex; + + rhdPtr->CS = CS; + +#ifdef USE_DRI + if (CSDRMCPInit(CS)) + return; +#endif + + if (rhdPtr->ChipSet >= RHD_R600) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "%s: CS for R600 requires DRI.\n", __func__); + xfree(CS); + rhdPtr->CS = NULL; + return; + } + + /* hook in direct CP backend here */ + + CSMMIOInit(CS); +} + +/* + * + */ +void +RHDCSDestroy(ScrnInfoPtr pScrn) +{ + struct RhdCS *CS = RHDPTR(pScrn)->CS; + + if (CS->Destroy) + CS->Destroy(CS); + + xfree(CS); + RHDPTR(pScrn)->CS = NULL; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_cs.h b/driver/xf86-video-radeonhd/src/rhd_cs.h new file mode 100644 index 000000000..f565d67df --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_cs.h @@ -0,0 +1,159 @@ +/* + * Copyright 2008 Luc Verhaegen + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * Command Submission backend. + */ +#ifndef _HAVE_RHD_CS_ +#define _HAVE_RHD_CS_ 1 + +/* + * Enable tracking of buffer usage. + */ +#if 0 +#define RHD_CS_DEBUG 1 +#endif + +enum RhdCSType { + RHD_CS_NONE = 0, + RHD_CS_MMIO, + RHD_CS_CP, /* CP but without the GART (Direct CP) */ + RHD_CS_CPDMA /* CP with kernel support (DRM or indirect CP) */ +}; + +struct RhdCS { + int scrnIndex; + + enum RhdCSType Type; + + Bool Active; + + /* The DIRTY state is actually superfluous, but it makes it easier to + * understand the logic. */ +#define RHD_CS_CLEAN_DIRTY 0 +#define RHD_CS_CLEAN_UNTOUCHED 1 +#define RHD_CS_CLEAN_QUEUED 2 +#define RHD_CS_CLEAN_DONE 3 + CARD8 Clean; + + /* track the ring state. */ + CARD32 *Buffer; + CARD32 Flushed; + CARD32 Wptr; + CARD32 Size; + +#ifdef RHD_CS_DEBUG + CARD32 Grabbed; + const char *Func; +#endif + + /* callbacks, set up according to MMIO, direct or indirect CP */ + + void (*Grab) (struct RhdCS *CS, CARD32 Count); + + void (*Flush) (struct RhdCS *CS); + Bool AdvanceFlush; /* flush the buffer all the time? */ + Bool (*Idle) (struct RhdCS *CS); + + void (*Start) (struct RhdCS *CS); + void (*Reset) (struct RhdCS *CS); + void (*Stop) (struct RhdCS *CS); + + void (*Destroy) (struct RhdCS *CS); + + void *Private; /* holds MMIO or direct/indirect CP specific information */ +}; + +/* some interface bleedover from rhd_dri.c */ +#ifdef USE_DRI +int RHDDRMFDGet(int scrnIndex); +struct _drmBuf *RHDDRMCPBuffer(int scrnIndex); +#endif + +/* + * Some CP defines. + */ +#define CP_PACKET0(reg, n) (((n - 1) << 16) | ((reg) >> 2)) +#define CP_PACKET2() (0x80000000) +#define CP_PACKET3(pkt, n) (0xC0000000 | (pkt) | ((n) << 16)) + +#define R5XX_CP_PACKET3_CNTL_HOSTDATA_BLT 0x00009400 +#define R200_CP_PACKET3_3D_DRAW_IMMD_2 0x00003500 +#define RADEON_CP_VC_CNTL_PRIM_TYPE_QUAD_LIST 0x0000000d +#define RADEON_CP_VC_CNTL_PRIM_WALK_RING 0x00000030 +#define RADEON_CP_VC_CNTL_NUM_SHIFT 16 + +/* + * CS Calls and macros. + */ +void RHDCSFlush(struct RhdCS *CS); +Bool RHDCSIdle(struct RhdCS *CS); +void RHDCSStart(struct RhdCS *CS); +void RHDCSReset(struct RhdCS *CS); +void RHDCSStop(struct RhdCS *CS); + +void RHDCSInit(ScrnInfoPtr pScrn); +void RHDCSDestroy(ScrnInfoPtr pScrn); + +/* + * I seriously dislike big macros. They make code unreadable and they invite + * others to make it even more unreadable. But i also cannot deny the numbers + * from the benchmarks. + */ +#define _RHDCSGrab(CS, Count) \ +do { \ + if ((CS->Clean == RHD_CS_CLEAN_QUEUED) || (CS->Clean == RHD_CS_CLEAN_UNTOUCHED)) \ + CS->Clean = RHD_CS_CLEAN_DONE; \ + CS->Grab(CS, Count); \ +} while (0) + +#ifdef RHD_CS_DEBUG +void RHDCSGrabDebug(struct RhdCS *CS, CARD32 Count, const char *func); +#define RHDCSGrab(CS, Count) RHDCSGrabDebug((CS), (Count), __func__) +#else +#define RHDCSGrab(CS, Count) _RHDCSGrab((CS), (Count)) +#endif + +#define RHDCSWrite(CS, Value) (CS)->Buffer[(CS)->Wptr++] = (Value) +#define RHDCSRegWrite(CS, Reg, Value) \ +do { \ + (CS)->Buffer[(CS)->Wptr++] = CP_PACKET0((Reg), 1); \ + (CS)->Buffer[(CS)->Wptr++] = (Value); \ +} while (0) + +#define RHDCSAdvance(CS) \ +do { \ + if ((CS)->AdvanceFlush) \ + RHDCSFlush((CS)); \ +} while (0) + +#ifdef USE_DRI +/* + * Some extra handling for those who want to use separate indirect buffers. + */ +CARD8 *RHDDRMIndirectBufferGet(int scrnIndex, unsigned int *IntAddress, CARD32 *Size); +void RHDDRMIndirectBufferDiscard(int scrnIndex, CARD8 *Buffer); +#endif + +#endif /* _HAVE_RHD_CS_ */ diff --git a/driver/xf86-video-radeonhd/src/rhd_cursor.c b/driver/xf86-video-radeonhd/src/rhd_cursor.c new file mode 100644 index 000000000..af5c2ef60 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_cursor.c @@ -0,0 +1,649 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * Cursor handling. + * + * Only supports ARGB cursors. + * Bitmap cursors are converted to ARGB internally. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* All drivers should typically include these */ +#include "xf86.h" + +#include "xf86Cursor.h" +#include "cursorstr.h" +#include "servermd.h" +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +#include +#endif + +/* Driver specific headers */ +#include "rhd.h" +#include "rhd_cursor.h" +#include "rhd_crtc.h" +#include "rhd_regs.h" + +/* + * Bit-banging ONLY + */ + +/* RadeonHD registers are double buffered, exchange only during vertical blank. + * By locking registers, a set of registers is updated atomically. + * Probably not necessary for cursors, but trivial and fast. */ +static void +lockCursor(struct rhdCursor *Cursor, Bool Lock) +{ + /* Locking disables double buffering of HW cursor registers. + * Set D*CURSOR_UPDATE_LOCK bit to 1 to lock. + * We want *_DISABLE_MULTIPLE_UPDATE to always be 0, and since all other + * meaningful bits are read-only for D*CUR_UPDATE registers, it is safe + * to use RHDRegWrite() instead of RHDRegMask(); the latter is slower. + */ + if (Lock) + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_UPDATE, 0x00010000); + else + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_UPDATE, 0x00000000); +} + +/* RadeonHD has hardware support for hotspots, but doesn't allow negative + * cursor coordinates. Emulated in rhdShowCursor. + * Coordinates are absolute, not relative to visible fb portion. */ +static void +setCursorPos(struct rhdCursor *Cursor, CARD32 x, CARD32 y, + CARD32 hotx, CARD32 hoty) +{ + /* R600 only has 13 bits, but well... */ + ASSERT (x < 0x10000); + ASSERT (y < 0x10000); + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_POSITION, x << 16 | y); + /* Note: unknown whether hotspot may be outside width/height */ + ASSERT (hotx < MAX_CURSOR_WIDTH); + ASSERT (hoty < MAX_CURSOR_HEIGHT); + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_HOT_SPOT, hotx << 16 | hoty); +} + +static void +setCursorSize(struct rhdCursor *Cursor, CARD32 width, CARD32 height) +{ + ASSERT ((width > 0) && (width <= MAX_CURSOR_WIDTH)); + ASSERT ((height > 0) && (height <= MAX_CURSOR_HEIGHT)); + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SIZE, + (width - 1) << 16 | (height - 1)); +} + +static void +enableCursor(struct rhdCursor *Cursor, Bool Enable) +{ + /* Make sure mode stays the same even when disabled; bug #13405 */ + if (Enable) + /* pre-multiplied ARGB, Enable */ + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, 0x00000201); + else + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, 0x00000200); +} + +/* Activate already uploaded cursor image. */ +static void +setCursorImage(struct rhdCursor *Cursor) +{ + RHDPtr rhdPtr = RHDPTRI(Cursor); + + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SURFACE_ADDRESS, + rhdPtr->FbIntAddress + Cursor->Base); +} + +/* Upload image. + * Hardware only supports 64-wide cursor images. + * img: (MAX_CURSOR_WIDTH * height) ARGB tuples */ +static void +uploadCursorImage(struct rhdCursor *Cursor, CARD32 *img) +{ + RHDPtr rhdPtr = RHDPTRI(Cursor); + + memcpy(((CARD8 *) rhdPtr->FbBase + Cursor->Base), img, + MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4); +} + +static void +saveCursor(struct rhdCursor *Cursor) +{ + ScrnInfoPtr pScrn = xf86Screens[Cursor->scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(Cursor); + + Cursor->StoreControl = RHDRegRead(Cursor, Cursor->RegOffset + + D1CUR_CONTROL); + Cursor->StoreOffset = RHDRegRead(Cursor, Cursor->RegOffset + + D1CUR_SURFACE_ADDRESS) + - rhdPtr->FbIntAddress; + Cursor->StoreSize = RHDRegRead(Cursor, Cursor->RegOffset + + D1CUR_SIZE); + Cursor->StorePosition = RHDRegRead(Cursor, Cursor->RegOffset + + D1CUR_POSITION); + Cursor->StoreHotSpot = RHDRegRead(Cursor, Cursor->RegOffset + + D1CUR_HOT_SPOT); + + Cursor->Stored = TRUE; +} + +static void +restoreCursor(struct rhdCursor *Cursor) +{ + RHDPtr rhdPtr = RHDPTRI(Cursor); + RHDFUNC(Cursor); + + if (!Cursor->Stored) { + xf86DrvMsg(Cursor->scrnIndex, X_ERROR, "%s: trying to restore " + "uninitialized values.\n", __func__); + return; + } + + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_CONTROL, + Cursor->StoreControl); + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SURFACE_ADDRESS, + Cursor->StoreOffset + rhdPtr->FbIntAddress); + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_SIZE, + Cursor->StoreSize); + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_POSITION, + Cursor->StorePosition); + RHDRegWrite(Cursor, Cursor->RegOffset + D1CUR_HOT_SPOT, + Cursor->StoreHotSpot); +} + +/* + * Helper functions + */ + +/* Internal interface to RealizeCursor - we need width/height */ +struct rhd_Cursor_Bits { + int width, height; + /* Cursor source bitmap follows */ + /* Cursor mask bitmap follows */ +} ; + +/* Convert bitmaps as defined in rhd_Cursor_Bits to ARGB tupels */ +static void +convertBitsToARGB(struct rhd_Cursor_Bits *bits, CARD32 *dest, + CARD32 color0, CARD32 color1) +{ + CARD8 *src = (CARD8 *) &bits[1]; + int srcPitch = BitmapBytePad(bits->width); + CARD8 *mask = src + srcPitch * bits->height; + int x, y; + + memset(dest, 0, MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4); + + for (y = 0; y < bits->height; y++) { + CARD8 *s = src, *m = mask; + CARD32 *d = dest; + for (x = 0; x < bits->width; x++) { + if (m[x/8] & (1<<(x&7))) { + if (s[x/8] & (1<<(x&7))) + *d++ = color1; + else + *d++ = color0; + } else + *d++ = 0; + } + src += srcPitch; + mask += srcPitch; + dest += MAX_CURSOR_WIDTH; + } +} + +/* + * Returns if CRTC has a visible cursor + */ +static Bool +hasVisibleCursor(struct rhdCrtc *Crtc, int X, int Y) +{ + if (((X + MAX_CURSOR_WIDTH) < Crtc->X) && + ((Y + MAX_CURSOR_HEIGHT) < Crtc->Y)) + return FALSE; + + if ((X >= (Crtc->X + Crtc->Width)) && + (Y >= (Crtc->Y + Crtc->Height))) + return FALSE; + + return TRUE; +} + + +/* + * Internal Driver + Xorg Interface + */ +void +rhdShowCursor(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + if (Crtc->Active && (Crtc->scrnIndex == pScrn->scrnIndex) && + hasVisibleCursor(Crtc, Crtc->Cursor->X, Crtc->Cursor->Y)) + rhdCrtcShowCursor(Crtc); + } +} + +void +rhdHideCursor(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { + rhdCrtcHideCursor(Crtc); + } + } +} + +/* Called for saving VT cursor info */ +void +rhdSaveCursor(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + RHDFUNC(pScrn); + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + /* Even save cursor state for non-active screens */ + if (Crtc->scrnIndex == pScrn->scrnIndex) + saveCursor(Crtc->Cursor); + } +} + +/* Called for restoring VT cursor info */ +void +rhdRestoreCursor(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + RHDFUNC(pScrn); + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + if (Crtc->Active && Crtc->scrnIndex == pScrn->scrnIndex) { + struct rhdCursor *Cursor = Crtc->Cursor; + + lockCursor (Cursor, TRUE); + restoreCursor(Cursor); + lockCursor (Cursor, FALSE); + } + } +} + +/* Called for restoring Xorg cursor */ +void +rhdReloadCursor(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + RHDFUNC(pScrn); + if (! rhdPtr->CursorImage) + return; + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + if (Crtc->scrnIndex == pScrn->scrnIndex) { + rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage); + } + } +} + +/* + * Xorg Interface + */ +static void +rhdSetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + /* Cursor here is relative to frame. */ + if (Crtc->Active && (Crtc->scrnIndex == pScrn->scrnIndex) && + hasVisibleCursor(Crtc, x + pScrn->frameX0, y + pScrn->frameY0)) + rhdCrtcSetCursorPosition(Crtc, x + pScrn->frameX0, y + pScrn->frameY0); + } +} + +static void +rhdSetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + rhdPtr->CursorColor0 = bg | 0xff000000; + rhdPtr->CursorColor1 = fg | 0xff000000; + + if (!rhdPtr->CursorBits) + return; + + /* Re-convert cursor bits if color changed */ + convertBitsToARGB(rhdPtr->CursorBits, rhdPtr->CursorImage, + rhdPtr->CursorColor0, rhdPtr->CursorColor1); + + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + if (Crtc->scrnIndex == pScrn->scrnIndex) { + rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage); + } + } +} + +static void +rhdLoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhd_Cursor_Bits *bits = (struct rhd_Cursor_Bits *) src; + int i; + + rhdPtr->CursorBits = bits; + convertBitsToARGB(bits, rhdPtr->CursorImage, + rhdPtr->CursorColor0, rhdPtr->CursorColor1); + + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + if (Crtc->scrnIndex == pScrn->scrnIndex) { + rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage); + } + } +} + +static Bool +rhdUseHWCursor(ScreenPtr pScreen, CursorPtr cur) +{ + /* Inconsistency in interface: UseHWCursor == NULL is trivial accept, + * UseHWCursorARGB == NULL is trivial reject. */ + if (cur->bits->width <= MAX_CURSOR_WIDTH && + cur->bits->height <= MAX_CURSOR_HEIGHT) + return TRUE; + return FALSE; +} + +static void +rhdLoadCursorARGB(ScrnInfoPtr pScrn, CursorPtr cur) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + rhdPtr->CursorBits = NULL; + + /* Hardware only supports 64-wide cursor images. */ + memset(rhdPtr->CursorImage, 0, MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4); + for (i = 0; i < cur->bits->height; i++) { + CARD32 *img = rhdPtr->CursorImage + MAX_CURSOR_WIDTH*i; + memcpy(img, + cur->bits->argb + cur->bits->width*i, + cur->bits->width*4); + } + + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + + if (Crtc->scrnIndex == pScrn->scrnIndex) { + rhdCrtcLoadCursorARGB(Crtc, rhdPtr->CursorImage); + } + } +} + +/* Save cursor parameters for later re-use */ +static unsigned char* +rhdRealizeCursor(xf86CursorInfoPtr infoPtr, CursorPtr cur) +{ + int len = BitmapBytePad(cur->bits->width) * cur->bits->height; + struct rhd_Cursor_Bits *bits = xalloc(sizeof(struct rhd_Cursor_Bits) + + 2*len); + char *bitmap = (char *) &bits[1]; + + bits->width = cur->bits->width; + bits->height = cur->bits->height; + memcpy (bitmap, cur->bits->source, len); + memcpy (bitmap+len, cur->bits->mask, len); + + return (unsigned char *) bits; +} + +/* + * Init + */ + +void +RHDCursorsInit(RHDPtr rhdPtr) +{ + int size = RHD_FB_CHUNK(MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4); + int i; + + RHDFUNC(rhdPtr); + + for (i = 0; i < 2; i++) { + struct rhdCursor *Cursor = xnfcalloc(sizeof(struct rhdCursor), 1); + + Cursor->scrnIndex = rhdPtr->scrnIndex; + + Cursor->RegOffset = i * 0x0800; + + /* grab our cursor FB */ + if (!rhdPtr->swCursor.val.bool) + Cursor->Base = RHDAllocFb(rhdPtr, size, "Cursor Image"); + ASSERT(Cursor->Base != -1); + + rhdPtr->Crtc[i]->Cursor = Cursor; /* HW is fixed anyway */ + } +} + +void +RHDCursorsDestroy(RHDPtr rhdPtr) +{ + int i; + RHDFUNC(rhdPtr); + + for (i = 0; i < 2; i++) { + if (!rhdPtr->Crtc[i] || !rhdPtr->Crtc[i]->Cursor) + continue; + + xfree(rhdPtr->Crtc[i]->Cursor); + rhdPtr->Crtc[i]->Cursor = NULL; + } +} + +Bool +RHDxf86InitCursor(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + xf86CursorInfoPtr infoPtr; + + infoPtr = xf86CreateCursorInfoRec(); + if (!infoPtr) + return FALSE; + + infoPtr->MaxWidth = MAX_CURSOR_WIDTH; + infoPtr->MaxHeight = MAX_CURSOR_HEIGHT; + infoPtr->Flags = HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | + HARDWARE_CURSOR_UPDATE_UNHIDDEN | + HARDWARE_CURSOR_AND_SOURCE_WITH_MASK +#if defined (ARGB_CURSOR) && defined (HARDWARE_CURSOR_ARGB) + | HARDWARE_CURSOR_ARGB +#endif + ; + + infoPtr->SetCursorColors = rhdSetCursorColors; + infoPtr->SetCursorPosition = rhdSetCursorPosition; + infoPtr->LoadCursorImage = rhdLoadCursorImage; + infoPtr->HideCursor = rhdHideCursor; + infoPtr->ShowCursor = rhdShowCursor; + infoPtr->UseHWCursor = rhdUseHWCursor; +#ifdef ARGB_CURSOR + infoPtr->UseHWCursorARGB = rhdUseHWCursor; + infoPtr->LoadCursorARGB = rhdLoadCursorARGB; +#endif + infoPtr->RealizeCursor = rhdRealizeCursor; + + if (!xf86InitCursor(pScreen, infoPtr)) { + xf86DestroyCursorInfoRec(infoPtr); + return FALSE; + } + rhdPtr->CursorInfo = infoPtr; + rhdPtr->CursorImage = xalloc(MAX_CURSOR_WIDTH * MAX_CURSOR_HEIGHT * 4); + xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Using HW cursor\n"); + + return TRUE; +} + +/* + * Cursor Funcs as used by RandR + */ +void +rhdCrtcShowCursor(struct rhdCrtc *Crtc) +{ + struct rhdCursor *Cursor = Crtc->Cursor; + lockCursor (Cursor, TRUE); + enableCursor(Cursor, TRUE); + lockCursor (Cursor, FALSE); +} + +/* + * + */ +void +rhdCrtcHideCursor(struct rhdCrtc *Crtc) +{ + struct rhdCursor *Cursor = Crtc->Cursor; + + lockCursor (Cursor, TRUE); + enableCursor(Cursor, FALSE); + lockCursor (Cursor, FALSE); +} + +/* + * + */ +void +rhdCrtcSetCursorPosition(struct rhdCrtc *Crtc, int x, int y) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + struct rhdCursor *Cursor = Crtc->Cursor; + int hotx, hoty, width, cursor_end, frame_end; + + Cursor->X = x; + Cursor->Y = y; + + hotx = 0; + hoty = 0; + + /* Hardware doesn't allow negative cursor pos; compensate using hotspot */ + if (x < 0) { + hotx = -x; + x = 0; + } + if (y < 0) { + hoty = -y; + y = 0; + } + + lockCursor (Cursor, TRUE); + + /* Work around rare corruption cases by adjusting cursor size; + * related to bug #13405 + * For dual-screen: + * - Cursor's right-edge must not end on multiples of 128px. + * - For panning, cursor image cannot horizontally extend past end of viewport. + */ + if (rhdPtr->Crtc[0]->Active && rhdPtr->Crtc[1]->Active) { + width = MAX_CURSOR_WIDTH; + cursor_end = x + width; + frame_end = Crtc->X + Crtc->Width; + + if (cursor_end > frame_end) { + width -= cursor_end - frame_end; + cursor_end = x + width; + } + if (! (cursor_end & 0x7f)) { + width--; + } + /* If the cursor is effectively invisible, move it out of visible area */ + if (width <= 0) { + width = 1; + x = 0; + y = Crtc->Y + Crtc->Height; + hotx = 0; + hoty = 0; + } + setCursorSize(Cursor, width, MAX_CURSOR_HEIGHT); + } + + setCursorPos (Cursor, x, y, hotx, hoty); + lockCursor (Cursor, FALSE); +} + +/* + * + */ +void +rhdCrtcSetCursorColors(struct rhdCrtc *Crtc, int bg, int fg) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + + rhdPtr->CursorColor0 = bg | 0xff000000; + rhdPtr->CursorColor1 = fg | 0xff000000; +} + +/* + * + */ +void +rhdCrtcLoadCursorARGB(struct rhdCrtc *Crtc, CARD32 *Image) +{ + struct rhdCursor *Cursor = Crtc->Cursor; + + lockCursor (Cursor, TRUE); + uploadCursorImage(Cursor, Image); + setCursorImage (Cursor); + setCursorSize (Cursor, MAX_CURSOR_WIDTH, MAX_CURSOR_HEIGHT); + lockCursor (Cursor, FALSE); +} + diff --git a/driver/xf86-video-radeonhd/src/rhd_cursor.h b/driver/xf86-video-radeonhd/src/rhd_cursor.h new file mode 100644 index 000000000..d6970d892 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_cursor.h @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_CURSOR_H +# define _RHD_CURSOR_H + +#define MAX_CURSOR_WIDTH 64 +#define MAX_CURSOR_HEIGHT 64 + +/* + * + */ +struct rhdCursor +{ + int scrnIndex; + + int RegOffset; + + int Base; + + int X; + int Y; + + Bool Stored; + + CARD32 StoreControl; + CARD32 StoreOffset; + CARD32 StoreSize; + CARD32 StorePosition; + CARD32 StoreHotSpot; +}; + +void RHDCursorsInit(RHDPtr rhdPtr); +void RHDCursorsDestroy(RHDPtr rhdPtr); +Bool RHDxf86InitCursor(ScreenPtr pScreen); +void rhdShowCursor(ScrnInfoPtr); +void rhdHideCursor(ScrnInfoPtr); +void rhdReloadCursor(ScrnInfoPtr pScrn); +void rhdSaveCursor(ScrnInfoPtr pScrn); +void rhdRestoreCursor(ScrnInfoPtr pScrn); + +void rhdCrtcShowCursor(struct rhdCrtc *Crtc); /* */ +void rhdCrtcHideCursor(struct rhdCrtc *Crtc); /* */ +void rhdCrtcLoadCursorARGB(struct rhdCrtc *Crtc, CARD32 *Image); /* */ +void rhdCrtcSetCursorColors(struct rhdCrtc *Crtc, int bg, int fg); +void rhdCrtcSetCursorPosition(struct rhdCrtc *Crtc, int x, int y); + +#endif diff --git a/driver/xf86-video-radeonhd/src/rhd_dac.c b/driver/xf86-video-radeonhd/src/rhd_dac.c new file mode 100644 index 000000000..8d05fe50c --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_dac.c @@ -0,0 +1,1099 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +#endif + +#include "rhd.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_crtc.h" +#include "rhd_regs.h" +#ifdef ATOM_BIOS +# include "rhd_atombios.h" +#endif + +#define REG_DACA_OFFSET 0 +#define RV620_REG_DACA_OFFSET 0 +#define REG_DACB_OFFSET 0x200 +#define RV620_REG_DACB_OFFSET 0x100 + +struct rhdDACPrivate { + Bool Stored; + + CARD32 Store_Powerdown; + CARD32 Store_Force_Output_Control; + CARD32 Store_Force_Data; + CARD32 Store_Source_Select; + CARD32 Store_Sync_Select; + CARD32 Store_Enable; + CARD32 Store_Control1; + CARD32 Store_Control2; + CARD32 Store_Tristate_Control; + CARD32 Store_Auto_Calib_Control; + CARD32 Store_Dac_Bgadj_Src; +}; + +/* ----------------------------------------------------------- */ + +/* + * + */ +static unsigned char +DACSense(struct rhdOutput *Output, CARD32 offset, Bool TV) +{ + CARD32 CompEnable, Control1, Control2, DetectControl, Enable; + CARD8 ret; + + CompEnable = RHDRegRead(Output, offset + DACA_COMPARATOR_ENABLE); + Control1 = RHDRegRead(Output, offset + DACA_CONTROL1); + Control2 = RHDRegRead(Output, offset + DACA_CONTROL2); + DetectControl = RHDRegRead(Output, offset + DACA_AUTODETECT_CONTROL); + Enable = RHDRegRead(Output, offset + DACA_ENABLE); + + RHDRegWrite(Output, offset + DACA_ENABLE, 1); + /* ack autodetect */ + RHDRegMask(Output, offset + DACA_AUTODETECT_INT_CONTROL, 0x01, 0x01); + RHDRegMask(Output, offset + DACA_AUTODETECT_CONTROL, 0, 0x00000003); + RHDRegMask(Output, offset + DACA_CONTROL2, 0, 0x00000001); + RHDRegMask(Output, offset + DACA_CONTROL2, 0, 0x00ff0000); + + if (offset) { /* We can do TV on DACA but only DACB has mux for separate connector */ + if (TV) + RHDRegMask(Output, offset + DACA_CONTROL2, 0x00000100, 0x00000100); + else + RHDRegMask(Output, offset + DACA_CONTROL2, 0, 0x00000100); + } + RHDRegWrite(Output, offset + DACA_FORCE_DATA, 0); + RHDRegMask(Output, offset + DACA_CONTROL2, 0x00000001, 0x0000001); + + RHDRegMask(Output, offset + DACA_COMPARATOR_ENABLE, 0x00070000, 0x00070101); + RHDRegWrite(Output, offset + DACA_CONTROL1, 0x00050802); + RHDRegMask(Output, offset + DACA_POWERDOWN, 0, 0x00000001); /* Shut down Bandgap Voltage Reference Power */ + usleep(5); + + RHDRegMask(Output, offset + DACA_POWERDOWN, 0, 0x01010100); /* Shut down RGB */ + + RHDRegWrite(Output, offset + DACA_FORCE_DATA, 0x1e6); /* 486 out of 1024 */ + usleep(200); + + RHDRegMask(Output, offset + DACA_POWERDOWN, 0x01010100, 0x01010100); /* Enable RGB */ + usleep(88); + + RHDRegMask(Output, offset + DACA_POWERDOWN, 0, 0x01010100); /* Shut down RGB */ + + RHDRegMask(Output, offset + DACA_COMPARATOR_ENABLE, 0x00000100, 0x00000100); + usleep(100); + + /* Get RGB detect values + * If only G is detected, we could have a monochrome monitor, + * but we don't bother with this at the moment. + */ + ret = (RHDRegRead(Output, offset + DACA_COMPARATOR_OUTPUT) & 0x0E) >> 1; + + RHDRegMask(Output, offset + DACA_COMPARATOR_ENABLE, CompEnable, 0x00FFFFFF); + RHDRegWrite(Output, offset + DACA_CONTROL1, Control1); + RHDRegMask(Output, offset + DACA_CONTROL2, Control2, 0x000001FF); + RHDRegMask(Output, offset + DACA_AUTODETECT_CONTROL, DetectControl, 0x000000FF); + RHDRegMask(Output, offset + DACA_ENABLE, Enable, 0x000000FF); + + RHDDebug(Output->scrnIndex, "%s: DAC: 0x0%1X\n", __func__, ret); + + return ret; +} + +/* + * + */ +static enum rhdSensedOutput +DACASense(struct rhdOutput *Output, struct rhdConnector *Connector) +{ + enum rhdConnectorType Type = Connector->Type; + RHDFUNC(Output); + + switch (Type) { + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + case RHD_CONNECTOR_VGA: + return (DACSense(Output, REG_DACA_OFFSET, FALSE) == 0x7) + ? RHD_SENSED_VGA + : RHD_SENSED_NONE; + default: + xf86DrvMsg(Output->scrnIndex, X_WARNING, + "%s: connector type %d is not supported on DACA.\n", + __func__, Type); + return RHD_SENSED_NONE; + } +} + +/* + * + */ +static enum rhdSensedOutput +DACBSense(struct rhdOutput *Output, struct rhdConnector *Connector) +{ + enum rhdConnectorType Type = Connector->Type; + RHDFUNC(Output); + + switch (Type) { + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + case RHD_CONNECTOR_VGA: + return (DACSense(Output, REG_DACB_OFFSET, FALSE) == 0x7) + ? RHD_SENSED_VGA + : RHD_SENSED_NONE; + case RHD_CONNECTOR_TV: + switch (DACSense(Output, REG_DACB_OFFSET, TRUE) & 0x7) { + case 0x7: + return RHD_SENSED_TV_COMPONENT; + case 0x6: + return RHD_SENSED_TV_SVIDEO; + case 0x1: + return RHD_SENSED_TV_COMPOSITE; + default: + return RHD_SENSED_NONE; + } + default: + xf86DrvMsg(Output->scrnIndex, X_WARNING, + "%s: connector type %d is not supported on DACB.\n", + __func__, Type); + return RHD_SENSED_NONE; + } +} + +enum outputType { + TvPAL = 0, + TvNTSC, + VGA, + TvCV, + typeLast = VGA +}; + +/* + * + */ +static void +DACGetElectrical(RHDPtr rhdPtr, enum outputType type, int dac, CARD8 *bandgap, CARD8 *whitefine) +{ +#ifdef ATOM_BIOS + enum _AtomBiosRequestID bg = 0, wf = 0; + AtomBiosArgRec atomBiosArg; +#endif + struct + { + CARD16 pciIdMin; + CARD16 pciIdMax; + CARD8 bandgap[2][4]; + CARD8 whitefine[2][4]; + } list[] = { + { 0x791E, 0x791F, + { { 0x07, 0x07, 0x07, 0x07 }, + { 0x07, 0x07, 0x07, 0x07 } }, + { { 0x09, 0x09, 0x04, 0x09 }, + { 0x09, 0x09, 0x04, 0x09 } }, + }, + { 0x793F, 0x7942, + { { 0x09, 0x09, 0x09, 0x09 }, + { 0x09, 0x09, 0x09, 0x09 } }, + { { 0x0a, 0x0a, 0x08, 0x0a }, + { 0x0a, 0x0a, 0x08, 0x0a } }, + }, + { 0x9500, 0x9519, + { { 0x00, 0x00, 0x00, 0x00 }, + { 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x00, 0x20, 0x00 }, + { 0x25, 0x25, 0x26, 0x26 } }, + }, + { 0, 0, + { { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } }, + { { 0, 0, 0, 0 }, + { 0, 0, 0, 0 } } + } + }; + + *bandgap = *whitefine = 0; + +#ifdef ATOM_BIOS + switch (type) { + case TvPAL: + bg = ATOM_DAC2_PAL_BG_ADJ; + wf = ATOM_DAC2_PAL_DAC_ADJ; + break; + case TvNTSC: + bg = ATOM_DAC2_NTSC_BG_ADJ; + wf = ATOM_DAC2_NTSC_DAC_ADJ; + break; + case TvCV: + bg = ATOM_DAC2_CV_BG_ADJ; + wf = ATOM_DAC2_CV_DAC_ADJ; + break; + case VGA: + switch (dac) { + case 0: + bg = ATOM_DAC1_BG_ADJ; + wf = ATOM_DAC1_DAC_ADJ; + break; + default: + bg = ATOM_DAC2_CRTC2_BG_ADJ; + wf = ATOM_DAC2_CRTC2_DAC_ADJ; + break; + } + break; + } + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, bg, &atomBiosArg) + == ATOM_SUCCESS) { + *bandgap = atomBiosArg.val; + RHDDebug(rhdPtr->scrnIndex, "%s: BandGap found in CompassionateData.\n",__func__); + } + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, wf, &atomBiosArg) + == ATOM_SUCCESS) { + *whitefine = atomBiosArg.val; + RHDDebug(rhdPtr->scrnIndex, "%s: WhiteFine found in CompassionateData.\n",__func__); + } + if (*whitefine == 0) { + CARD8 w_f = 0, b_g = 0; + + if (atomBiosArg.val = 0x18, + RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CODE_DATA_TABLE, + &atomBiosArg) == ATOM_SUCCESS) { + struct AtomDacCodeTableData *data + = (struct AtomDacCodeTableData *)atomBiosArg.CommandDataTable.loc; + if (atomBiosArg.CommandDataTable.size + < (sizeof (struct AtomDacCodeTableData) >> (dac ? 0 : 1))) { /* IGPs only have 1 DAC -> table_size / 2 */ + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "Code table data size: %i doesn't match expected size: %u\n", + atomBiosArg.CommandDataTable.size, + (unsigned int) sizeof (struct AtomDacCodeTableData)); + return; + } + RHDDebug(rhdPtr->scrnIndex, "%s: WhiteFine found in Code Table.\n",__func__); + switch (type) { + case TvPAL: + w_f = dac ? data->DAC2PALWhiteFine : data->DAC1PALWhiteFine; + b_g = dac ? data->DAC2PALBandGap : data->DAC1PALBandGap; + break; + case TvNTSC: + w_f = dac ? data->DAC2NTSCWhiteFine : data->DAC1NTSCWhiteFine; + b_g = dac ? data->DAC2NTSCBandGap : data->DAC1NTSCBandGap; + break; + case TvCV: + w_f = dac ? data->DAC2CVWhiteFine : data->DAC1CVWhiteFine; + b_g = dac ? data->DAC2CVBandGap : data->DAC1CVBandGap; + break; + case VGA: + w_f = dac ? data->DAC2VGAWhiteFine : data->DAC1VGAWhiteFine; + b_g = dac ? data->DAC2VGABandGap : data->DAC1VGABandGap; + break; + } + *whitefine = w_f; + if (rhdPtr->ChipSet >= RHD_RV770) /* Dunno why this is broken on older ASICs */ + *bandgap = b_g; + } + } +#endif + if (*bandgap == 0 || *whitefine == 0) { + int i = 0; + while (list[i].pciIdMin != 0) { + if (list[i].pciIdMin <= rhdPtr->PciDeviceID + && list[i].pciIdMax >= rhdPtr->PciDeviceID) { +#if 0 + ErrorF(">> %x %x %x -- %x %x\n",list[i].pciIdMin, + rhdPtr->PciDeviceID,list[i].pciIdMax, + list[i].bandgap[dac][type],list[i].whitefine[dac][type]); + ErrorF(">> %i %i\n",dac,type); +#endif + if (*bandgap == 0) *bandgap = list[i].bandgap[dac][type]; + if (*whitefine == 0) *whitefine = list[i].whitefine[dac][type]; + break; + } + i++; + } + if (list[i].pciIdMin != 0) + RHDDebug(rhdPtr->scrnIndex, "%s: BandGap and WhiteFine found in Table.\n",__func__); + } + RHDDebug(rhdPtr->scrnIndex, "%s: DAC[%i] BandGap: 0x%2.2x WhiteFine: 0x%2.2x\n", + __func__, dac, *bandgap, *whitefine); +} + +/* + * + */ +static inline void +DACSet(struct rhdOutput *Output, CARD16 offset) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + CARD8 Standard, WhiteFine, Bandgap; + Bool TV; + CARD32 Mask = 0; + + switch (Output->SensedType) { + case RHD_SENSED_TV_SVIDEO: + case RHD_SENSED_TV_COMPOSITE: + /* might want to selectively enable lines based on type */ + TV = TRUE; + + switch (rhdPtr->tvMode) { + case RHD_TV_NTSC: + case RHD_TV_NTSCJ: + DACGetElectrical(rhdPtr, TvNTSC, offset ? 1 : 0, &Bandgap, &WhiteFine); + Standard = 1; /* NTSC */ + break; + case RHD_TV_PAL: + case RHD_TV_PALN: + case RHD_TV_PALCN: + case RHD_TV_PAL60: + default: + DACGetElectrical(rhdPtr, TvPAL, offset ? 1 : 0, &Bandgap, &WhiteFine); + Standard = 0; /* PAL */ + break; + } + break; + + case RHD_SENSED_TV_COMPONENT: + TV = TRUE; + DACGetElectrical(rhdPtr, TvCV, offset ? 1 : 0, &Bandgap, &WhiteFine); + Standard = 3; /* HDTV */ + break; + + case RHD_SENSED_VGA: + default: + TV = FALSE; + DACGetElectrical(rhdPtr, VGA, offset ? 1 : 0, &Bandgap, &WhiteFine); + Standard = 2; /* VGA */ + break; + } + if (Bandgap) Mask |= 0xFF << 16; + if (WhiteFine) Mask |= 0xFF << 8; + + RHDRegMask(Output, offset + DACA_CONTROL1, Standard, 0x000000FF); + /* white level fine adjust */ + RHDRegMask(Output, offset + DACA_CONTROL1, (Bandgap << 16) | (WhiteFine << 8), Mask); + + if (TV) { + /* tv enable */ + if (offset) /* TV mux only available on DACB */ + RHDRegMask(Output, offset + DACA_CONTROL2, 0x00000100, 0x0000FF00); + /* select tv encoder */ + RHDRegMask(Output, offset + DACA_SOURCE_SELECT, 0x00000002, 0x00000003); + } else { + if (offset) /* TV mux only available on DACB */ + RHDRegMask(Output, offset + DACA_CONTROL2, 0, 0x0000FF00); + /* select a crtc */ + RHDRegMask(Output, offset + DACA_SOURCE_SELECT, Output->Crtc->Id & 0x01, 0x00000003); + } + + RHDRegMask(Output, offset + DACA_FORCE_OUTPUT_CNTL, 0x00000701, 0x00000701); + RHDRegMask(Output, offset + DACA_FORCE_DATA, 0, 0x0000FFFF); +} + +/* + * + */ +static void +DACASet(struct rhdOutput *Output, DisplayModePtr unused) +{ + RHDFUNC(Output); + + DACSet(Output, REG_DACA_OFFSET); +} + +/* + * + */ +static void +DACBSet(struct rhdOutput *Output, DisplayModePtr unused) +{ + RHDFUNC(Output); + + DACSet(Output, REG_DACB_OFFSET); +} + +/* + * + */ +static inline void +DACPower(struct rhdOutput *Output, CARD16 offset, int Power) +{ + CARD32 powerdown; + + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); + + switch (Power) { + case RHD_POWER_ON: + switch (Output->SensedType) { + case RHD_SENSED_TV_SVIDEO: + powerdown = 0 /* 0x100 */; + break; + case RHD_SENSED_TV_COMPOSITE: + powerdown = 0 /* 0x1010000 */; + break; + case RHD_SENSED_TV_COMPONENT: + powerdown = 0; + break; + case RHD_SENSED_VGA: + default: + powerdown = 0; + break; + } + RHDRegWrite(Output, offset + DACA_ENABLE, 1); + RHDRegWrite(Output, offset + DACA_POWERDOWN, 0); + usleep (14); + RHDRegMask(Output, offset + DACA_POWERDOWN, powerdown, 0xFFFFFF00); + usleep(2); + RHDRegWrite(Output, offset + DACA_FORCE_OUTPUT_CNTL, 0); + RHDRegMask(Output, offset + DACA_SYNC_SELECT, 0, 0x00000101); + RHDRegWrite(Output, offset + DACA_SYNC_TRISTATE_CONTROL, 0); + return; + case RHD_POWER_RESET: /* don't bother */ + return; + case RHD_POWER_SHUTDOWN: + default: + RHDRegMask(Output, offset + DACA_FORCE_DATA, 0, 0x0000FFFF); + RHDRegMask(Output, offset + DACA_FORCE_OUTPUT_CNTL, 0x0000701, 0x0000701); + RHDRegWrite(Output, offset + DACA_POWERDOWN, 0x01010100); + RHDRegWrite(Output, offset + DACA_POWERDOWN, 0x01010101); + RHDRegWrite(Output, offset + DACA_ENABLE, 0); + RHDRegWrite(Output, offset + DACA_ENABLE, 0); + return; + } +} + +/* + * + */ +static void +DACAPower(struct rhdOutput *Output, int Power) +{ + RHDFUNC(Output); + + DACPower(Output, REG_DACA_OFFSET, Power); +} + +/* + * + */ +static void +DACBPower(struct rhdOutput *Output, int Power) +{ + RHDFUNC(Output); + + DACPower(Output, REG_DACB_OFFSET, Power); +} + +/* + * + */ +static inline void +DACSave(struct rhdOutput *Output, CARD16 offset) +{ + struct rhdDACPrivate *Private = (struct rhdDACPrivate *) Output->Private; + + Private->Store_Powerdown = RHDRegRead(Output, offset + DACA_POWERDOWN); + Private->Store_Force_Output_Control = RHDRegRead(Output, offset + DACA_FORCE_OUTPUT_CNTL); + Private->Store_Force_Data = RHDRegRead(Output, offset + DACA_FORCE_DATA); + Private->Store_Source_Select = RHDRegRead(Output, offset + DACA_SOURCE_SELECT); + Private->Store_Sync_Select = RHDRegRead(Output, offset + DACA_SYNC_SELECT); + Private->Store_Enable = RHDRegRead(Output, offset + DACA_ENABLE); + Private->Store_Control1 = RHDRegRead(Output, offset + DACA_CONTROL1); + Private->Store_Control2 = RHDRegRead(Output, offset + DACA_CONTROL2); + Private->Store_Tristate_Control = RHDRegRead(Output, offset + DACA_SYNC_TRISTATE_CONTROL); + + Private->Stored = TRUE; +} + +/* + * + */ +static void +DACASave(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + DACSave(Output, REG_DACA_OFFSET); +} + +/* + * + */ +static void +DACBSave(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + DACSave(Output, REG_DACB_OFFSET); +} + +/* + * + */ +static inline void +DACRestore(struct rhdOutput *Output, CARD16 offset) +{ + struct rhdDACPrivate *Private = (struct rhdDACPrivate *) Output->Private; + + RHDRegWrite(Output, offset + DACA_POWERDOWN, Private->Store_Powerdown); + RHDRegWrite(Output, offset + DACA_FORCE_OUTPUT_CNTL, Private->Store_Force_Output_Control); + RHDRegWrite(Output, offset + DACA_FORCE_DATA, Private->Store_Force_Data); + RHDRegWrite(Output, offset + DACA_SOURCE_SELECT, Private->Store_Source_Select); + RHDRegWrite(Output, offset + DACA_SYNC_SELECT, Private->Store_Sync_Select); + RHDRegWrite(Output, offset + DACA_ENABLE, Private->Store_Enable); + RHDRegWrite(Output, offset + DACA_CONTROL1, Private->Store_Control1); + RHDRegWrite(Output, offset + DACA_CONTROL2, Private->Store_Control2); + RHDRegWrite(Output, offset + DACA_SYNC_TRISTATE_CONTROL, Private->Store_Tristate_Control); +} + +/* + * + */ +static void +DACARestore(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + if (!((struct rhdDACPrivate *) Output->Private)->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + DACRestore(Output, REG_DACA_OFFSET); +} + +/* + * + */ +static void +DACBRestore(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + if (!((struct rhdDACPrivate *) Output->Private)->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + DACRestore(Output, REG_DACB_OFFSET); +} + +/* ----------------------------------------------------------- */ + +/* + * + */ +static CARD32 +DACSenseRV620(struct rhdOutput *Output, CARD32 offset, Bool TV) +{ + CARD32 ret; + CARD32 DetectControl, AutodetectIntCtl, ForceData, + Control1, Control2, CompEnable; + + RHDFUNC(Output); + + Control1 = RHDRegRead(Output, offset + RV620_DACA_MACRO_CNTL); /* 7ef4 */ + Control2 = RHDRegRead(Output, offset + RV620_DACA_CONTROL2); /* 7058 */ + ForceData = RHDRegRead(Output, offset + RV620_DACA_FORCE_DATA); + AutodetectIntCtl = RHDRegRead(Output, offset + RV620_DACA_AUTODETECT_INT_CONTROL); + DetectControl = RHDRegRead(Output, offset + RV620_DACA_AUTODETECT_CONTROL); + CompEnable = RHDRegRead(Output, offset + RV620_DACA_COMPARATOR_ENABLE); + + if (offset) { /* We can do TV on DACA but only DACB has mux for separate connector */ + if (TV) + RHDRegMask(Output, offset + RV620_DACA_CONTROL2, 0x100, 0xff00); + else + RHDRegMask(Output, offset + RV620_DACA_CONTROL2, 0x00, 0xff00); + } + RHDRegMask(Output, offset + RV620_DACA_FORCE_DATA, 0x18, 0xffff); + RHDRegMask(Output, offset + RV620_DACA_AUTODETECT_INT_CONTROL, 0x01, 0x01); + RHDRegMask(Output, offset + RV620_DACA_AUTODETECT_CONTROL, 0x00, 0xff); + RHDRegMask(Output, offset + RV620_DACA_MACRO_CNTL, + (offset > 0) ? 0x2502 : 0x2002, 0xffff); + /* enable comparators for R/G/B, disable DDET and SDET reference */ + RHDRegMask(Output, offset + RV620_DACA_COMPARATOR_ENABLE, 0x70000, 0x070101); + RHDRegMask(Output, offset + RV620_DACA_AUTODETECT_CONTROL, 0x01, 0xff); + usleep(50); + ret = RHDRegRead(Output, offset + RV620_DACA_AUTODETECT_STATUS); + RHDRegWrite(Output, offset + RV620_DACA_AUTODETECT_CONTROL, DetectControl); + RHDRegWrite(Output, offset + RV620_DACA_MACRO_CNTL, Control1); + RHDRegWrite(Output, offset + RV620_DACA_CONTROL2, Control2); + RHDRegWrite(Output, offset + RV620_DACA_FORCE_DATA, ForceData); + RHDRegWrite(Output, offset + RV620_DACA_AUTODETECT_INT_CONTROL, AutodetectIntCtl); +#ifdef DEBUG + RHDDebug(Output->scrnIndex, "DAC%i: ret = 0x%x %s\n",offset ? "A" : "B", + ret,TV ? "TV" : ""); +#endif + return ret; +} + +/* + * + */ +static enum rhdSensedOutput +DACASenseRV620(struct rhdOutput *Output, struct rhdConnector *Connector) +{ + enum rhdConnectorType Type = Connector->Type; + RHDFUNC(Output); + + switch (Type) { + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + case RHD_CONNECTOR_VGA: + return (DACSenseRV620(Output, RV620_REG_DACA_OFFSET, FALSE) + & 0x1010100) ? RHD_SENSED_VGA : RHD_SENSED_NONE; + case RHD_CONNECTOR_TV: + switch (DACSenseRV620(Output, RV620_REG_DACA_OFFSET, TRUE) + & 0x1010100) { + case 0x1010100: + return RHD_SENSED_NONE; /* on DAC A we cannot distinguish VGA and CV */ + case 0x10100: + return RHD_SENSED_TV_SVIDEO; + case 0x1000000: + return RHD_SENSED_TV_COMPOSITE; + default: + return RHD_SENSED_NONE; + } + default: + xf86DrvMsg(Output->scrnIndex, X_WARNING, + "%s: connector type %d is not supported.\n", + __func__, Type); + return RHD_SENSED_NONE; + } +} + +/* + * + */ +static enum rhdSensedOutput +DACBSenseRV620(struct rhdOutput *Output, struct rhdConnector *Connector) +{ + enum rhdConnectorType Type = Connector->Type; + RHDFUNC(Output); + + switch (Type) { + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + case RHD_CONNECTOR_VGA: + return (DACSenseRV620(Output, RV620_REG_DACB_OFFSET, FALSE) + & 0x1010100) ? RHD_SENSED_VGA : RHD_SENSED_NONE; + case RHD_CONNECTOR_TV: + switch (DACSenseRV620(Output, RV620_REG_DACB_OFFSET, TRUE) + & 0x1010100) { + case 0x1000000: + return RHD_SENSED_TV_COMPONENT; + case 0x1010100: + return RHD_SENSED_TV_SVIDEO; + case 0x10100: + return RHD_SENSED_TV_COMPOSITE; + default: + return RHD_SENSED_NONE; + } + default: + xf86DrvMsg(Output->scrnIndex, X_WARNING, + "%s: connector type %d is not supported.\n", + __func__, Type); + return RHD_SENSED_NONE; + } +} + +/* + * + */ +static inline void +DACSetRV620(struct rhdOutput *Output, CARD16 offset) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 Source; + CARD32 Mode; + CARD32 TV; + CARD8 WhiteFine, Bandgap; + CARD32 Mask = 0; + + switch (Output->SensedType) { + case RHD_SENSED_TV_SVIDEO: + case RHD_SENSED_TV_COMPOSITE: + TV = 0x1; + Source = 0x2; /* tv encoder */ + switch (rhdPtr->tvMode) { + case RHD_TV_NTSC: + case RHD_TV_NTSCJ: + DACGetElectrical(rhdPtr, TvNTSC, offset ? 1 : 0, &Bandgap, &WhiteFine); + Mode = 1; + break; + case RHD_TV_PAL: + case RHD_TV_PALN: + case RHD_TV_PALCN: + case RHD_TV_PAL60: + default: + DACGetElectrical(rhdPtr, TvPAL, offset ? 1 : 0, &Bandgap, &WhiteFine); + Mode = 0; + break; + } + break; + case RHD_SENSED_TV_COMPONENT: + DACGetElectrical(rhdPtr, TvCV, offset ? 1 : 0, &Bandgap, &WhiteFine); + Mode = 3; /* HDTV */ + TV = 0x1; /* tv on?? */ + Source = 0x2; /* tv encoder ?? */ + break; + case RHD_SENSED_VGA: + default: + DACGetElectrical(rhdPtr, VGA, offset ? 1 : 0, &Bandgap, &WhiteFine); + Mode = 2; + TV = 0; + Source = Output->Crtc->Id; + break; + } + if (Bandgap) Mask |= 0xFF << 16; + if (WhiteFine) Mask |= 0xFF << 8; + + RHDRegMask(Output, offset + RV620_DACA_MACRO_CNTL, Mode, 0xFF); /* no fine control yet */ + RHDRegMask(Output, offset + RV620_DACA_SOURCE_SELECT, Source, 0x00000003); + if (offset) /* TV mux only present on DACB */ + RHDRegMask(Output, offset + RV620_DACA_CONTROL2, TV << 8, 0x0100); /* tv enable/disable */ + /* use fine control from white_fine control register */ + RHDRegMask(Output, offset + RV620_DACA_AUTO_CALIB_CONTROL, 0x0, 0x4); + RHDRegMask(Output, offset + RV620_DACA_BGADJ_SRC, 0x0, 0x30); + RHDRegMask(Output, offset + RV620_DACA_MACRO_CNTL, (Bandgap << 16) | (WhiteFine << 8), Mask); + /* Reset the FMT register on CRTC leading to this output */ + Output->Crtc->FMTModeSet(Output->Crtc, NULL); +} + +/* + * + */ +static void +DACASetRV620(struct rhdOutput *Output, DisplayModePtr unused) +{ + RHDFUNC(Output); + + DACSetRV620(Output, RV620_REG_DACA_OFFSET); +} + +/* + * + */ +static void +DACBSetRV620(struct rhdOutput *Output, DisplayModePtr unused) +{ + RHDFUNC(Output); + + DACSetRV620(Output, RV620_REG_DACB_OFFSET); +} + +/* + * + */ +static inline void +DACPowerRV620(struct rhdOutput *Output, CARD16 offset, int Power) +{ + CARD32 powerdown; + + switch (Power) { + case RHD_POWER_ON: + switch (Output->SensedType) { + case RHD_SENSED_TV_SVIDEO: + powerdown = 0 /* 0x100 */; + break; + case RHD_SENSED_TV_COMPOSITE: + powerdown = 0 /* 0x1010000 */; + break; + case RHD_SENSED_TV_COMPONENT: + powerdown = 0; + break; + case RHD_SENSED_VGA: + default: + powerdown = 0; + break; + } + + if (!(RHDRegRead(Output, offset + RV620_DACA_ENABLE) & 0x01)) + RHDRegMask(Output, offset + RV620_DACA_ENABLE, 0x1, 0xff); + RHDRegMask(Output, offset + RV620_DACA_FORCE_OUTPUT_CNTL, 0x01, 0x01); + RHDRegMask(Output, offset + RV620_DACA_POWERDOWN, 0x0, 0xff); + usleep (0x14); + RHDRegMask(Output, offset + RV620_DACA_POWERDOWN, powerdown, 0xffffff00); + usleep(2); + RHDRegMask(Output, offset + RV620_DACA_FORCE_DATA, 0, 0x0000ffff); + RHDRegWrite(Output, offset + RV620_DACA_FORCE_OUTPUT_CNTL, 0x0); + RHDRegWrite(Output, offset + RV620_DACA_SYNC_TRISTATE_CONTROL, 0); + return; + case RHD_POWER_RESET: /* don't bother */ + return; + case RHD_POWER_SHUTDOWN: + default: + RHDRegWrite(Output, offset + RV620_DACA_POWERDOWN, 0x01010100); + RHDRegWrite(Output, offset + RV620_DACA_POWERDOWN, 0x01010101); + RHDRegWrite(Output, offset + RV620_DACA_ENABLE, 0); + RHDRegMask(Output, offset + RV620_DACA_FORCE_DATA, 0, 0xffff); + RHDRegMask(Output, offset + RV620_DACA_FORCE_OUTPUT_CNTL, 0x701, 0x701); + return; + } +} + +/* + * + */ +static void +DACAPowerRV620(struct rhdOutput *Output, int Power) +{ + RHDFUNC(Output); + + DACPowerRV620(Output, RV620_REG_DACA_OFFSET, Power); +} + +/* + * + */ +static void +DACBPowerRV620(struct rhdOutput *Output, int Power) +{ + RHDFUNC(Output); + + DACPowerRV620(Output, RV620_REG_DACB_OFFSET, Power); +} + +/* + * + */ +static inline void +DACSaveRV620(struct rhdOutput *Output, CARD16 offset) +{ + struct rhdDACPrivate *Private = (struct rhdDACPrivate *) Output->Private; + + Private->Store_Powerdown = RHDRegRead(Output, offset + RV620_DACA_POWERDOWN); + Private->Store_Force_Output_Control = RHDRegRead(Output, offset + RV620_DACA_FORCE_OUTPUT_CNTL); + Private->Store_Force_Data = RHDRegRead(Output, offset + RV620_DACA_FORCE_DATA); + Private->Store_Source_Select = RHDRegRead(Output, offset + RV620_DACA_SOURCE_SELECT); + Private->Store_Enable = RHDRegRead(Output, offset + RV620_DACA_ENABLE); + Private->Store_Control1 = RHDRegRead(Output, offset + RV620_DACA_MACRO_CNTL); + Private->Store_Control2 = RHDRegRead(Output, offset + RV620_DACA_CONTROL2); + Private->Store_Tristate_Control = RHDRegRead(Output, offset + RV620_DACA_SYNC_TRISTATE_CONTROL); + Private->Store_Auto_Calib_Control = RHDRegRead(Output, offset + RV620_DACA_AUTO_CALIB_CONTROL); + Private->Store_Dac_Bgadj_Src = RHDRegRead(Output, offset + RV620_DACA_BGADJ_SRC); + + Private->Stored = TRUE; +} + +/* + * + */ +static void +DACASaveRV620(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + DACSaveRV620(Output, RV620_REG_DACA_OFFSET); +} + +/* + * + */ +static void +DACBSaveRV620(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + DACSaveRV620(Output, RV620_REG_DACB_OFFSET); +} + +/* + * + */ +static inline void +DACRestoreRV620(struct rhdOutput *Output, CARD16 offset) +{ + struct rhdDACPrivate *Private = (struct rhdDACPrivate *) Output->Private; + + RHDRegWrite(Output, offset + RV620_DACA_BGADJ_SRC, Private->Store_Dac_Bgadj_Src); + RHDRegWrite(Output, offset + RV620_DACA_AUTO_CALIB_CONTROL, Private->Store_Auto_Calib_Control); + RHDRegWrite(Output, offset + RV620_DACA_POWERDOWN, Private->Store_Powerdown); + RHDRegWrite(Output, offset + RV620_DACA_FORCE_OUTPUT_CNTL, Private->Store_Force_Output_Control); + RHDRegWrite(Output, offset + RV620_DACA_FORCE_DATA, Private->Store_Force_Data); + RHDRegWrite(Output, offset + RV620_DACA_SOURCE_SELECT, Private->Store_Source_Select); + RHDRegWrite(Output, offset + RV620_DACA_ENABLE, Private->Store_Enable); + RHDRegWrite(Output, offset + RV620_DACA_MACRO_CNTL, Private->Store_Control1); + RHDRegWrite(Output, offset + RV620_DACA_CONTROL2, Private->Store_Control2); + RHDRegWrite(Output, offset + RV620_DACA_SYNC_TRISTATE_CONTROL, Private->Store_Tristate_Control); + +} + +/* + * + */ +static void +DACARestoreRV620(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + if (!((struct rhdDACPrivate *) Output->Private)->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + DACRestoreRV620(Output, RV620_REG_DACA_OFFSET); +} + +/* + * + */ +static void +DACBRestoreRV620(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + if (!((struct rhdDACPrivate *) Output->Private)->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + DACRestoreRV620(Output, RV620_REG_DACB_OFFSET); +} + +/* ----------------------------------------------------------- */ + +/* + * + */ +static ModeStatus +DACModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + if (Mode->Clock < 20000) + return MODE_CLOCK_LOW; + + if (Mode->Clock > 400000) + return MODE_CLOCK_HIGH; + + return MODE_OK; +} + +/* + * + */ +static void +DACDestroy(struct rhdOutput *Output) +{ + RHDFUNC(Output); + + if (!Output->Private) + return; + + xfree(Output->Private); + Output->Private = NULL; +} + +/* + * + */ +struct rhdOutput * +RHDDACAInit(RHDPtr rhdPtr) +{ + struct rhdOutput *Output; + struct rhdDACPrivate *Private; + + RHDFUNC(rhdPtr); + + Output = xnfcalloc(sizeof(struct rhdOutput), 1); + + Output->scrnIndex = rhdPtr->scrnIndex; + Output->Name = "DAC A"; + Output->Id = RHD_OUTPUT_DACA; + + if (rhdPtr->ChipSet < RHD_RV620) { + Output->Sense = DACASense; + Output->Mode = DACASet; + Output->Power = DACAPower; + Output->Save = DACASave; + Output->Restore = DACARestore; + } else { + Output->Sense = DACASenseRV620; + Output->Mode = DACASetRV620; + Output->Power = DACAPowerRV620; + Output->Save = DACASaveRV620; + Output->Restore = DACARestoreRV620; + } + Output->ModeValid = DACModeValid; + Output->Destroy = DACDestroy; + Private = xnfcalloc(sizeof(struct rhdDACPrivate), 1); + Output->Private = Private; + + return Output; +} + +/* + * + */ +struct rhdOutput * +RHDDACBInit(RHDPtr rhdPtr) +{ + struct rhdOutput *Output; + struct rhdDACPrivate *Private; + + RHDFUNC(rhdPtr); + + Output = xnfcalloc(sizeof(struct rhdOutput), 1); + + Output->scrnIndex = rhdPtr->scrnIndex; + Output->Name = "DAC B"; + Output->Id = RHD_OUTPUT_DACB; + + if (rhdPtr->ChipSet < RHD_RV620) { + Output->Sense = DACBSense; + Output->Mode = DACBSet; + Output->Power = DACBPower; + Output->Save = DACBSave; + Output->Restore = DACBRestore; + } else { + Output->Sense = DACBSenseRV620; + Output->Mode = DACBSetRV620; + Output->Power = DACBPowerRV620; + Output->Save = DACBSaveRV620; + Output->Restore = DACBRestoreRV620; + } + Output->ModeValid = DACModeValid; + Output->Destroy = DACDestroy; + + Private = xnfcalloc(sizeof(struct rhdDACPrivate), 1); + Output->Private = Private; + + return Output; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_ddia.c b/driver/xf86-video-radeonhd/src/rhd_ddia.c new file mode 100644 index 000000000..effd0b7a2 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_ddia.c @@ -0,0 +1,389 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_regs.h" +#ifdef ATOM_BIOS +#include "rhd_atombios.h" +#endif + +struct DDIAPrivate +{ + Bool RunDualLink; + CARD32 PcieCfgReg7; + CARD32 CapabilityFlag; + + Bool Stored; + + CARD32 DdiaPathControl; + CARD32 DdiaCntl; + CARD32 DdiaDcbalancerControl; + CARD32 DdiaPcieLinkControl2; + CARD32 DdiaBitDepthControl; +}; + +/* + * + */ +static ModeStatus +DDIAModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + if (Mode->Flags & V_INTERLACE) + return MODE_NO_INTERLACE; + + if (Mode->Clock < 25000) + return MODE_CLOCK_LOW; + + if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE) { + if (Mode->Clock > 165000) + return MODE_CLOCK_HIGH; + } else if (Output->Connector->Type == RHD_CONNECTOR_DVI) { + if (Mode->Clock > 330000) /* could go higher still */ + return MODE_CLOCK_HIGH; + } + + return MODE_OK; +} + +/* + * + */ +static void +DDIAMode(struct rhdOutput *Output, DisplayModePtr Mode) +{ + struct DDIAPrivate *Private = (struct DDIAPrivate *)Output->Private; + CARD32 mux0, mux1, mux2, mux3; + Bool LaneReversal; + RHDPtr rhdPtr = RHDPTRI(Output); + + RHDFUNC(Output); + + if (Mode->SynthClock >= 165000) + Private->RunDualLink = TRUE; + else + Private->RunDualLink = FALSE; + + /* reset on - will be enabled at POWER_ON */ + RHDRegMask(Output, RS69_DDIA_PATH_CONTROL, RS69_DDIA_PIXVLD_RESET, RS69_DDIA_PIXVLD_RESET); + /* RGB 4:4:4 */ + RHDRegMask(Output, RS69_DDIA_CNTL, 0, RS69_DDIA_PIXEL_ENCODING); + /* TMDS_AC */ + RHDRegMask(Output, RS69_DDIA_PATH_CONTROL, + 2 << RS69_DDIA_PATH_SELECT_SHIFT, + 0x3 << RS69_DDIA_PATH_SELECT_SHIFT); + /* dual link */ + RHDRegMask(Output, RS69_DDIA_CNTL, Private->RunDualLink ? + RS69_DDIA_DUAL_LINK_ENABLE : 0, RS69_DDIA_DUAL_LINK_ENABLE); + RHDRegMask(Output, RS69_DDIA_DCBALANCER_CONTROL, + RS69_DDIA_DCBALANCER_EN, + RS69_DDIA_SYNC_DCBAL_EN_MASK | RS69_DDIA_DCBALANCER_EN); + + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x0, 0x80); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x0, 0x100); + + mux0 = Private->PcieCfgReg7 & 0x3; + mux1 = (Private->PcieCfgReg7 >> 2) & 0x3; + mux2 = (Private->PcieCfgReg7 >> 4) & 0x3; + mux3 = (Private->PcieCfgReg7 >> 6) & 0x3; + + RHDRegMask(Output, RS69_DDIA_PCIE_LINK_CONTROL2, + (mux0 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL0) + | (mux1 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL1) + | (mux2 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL2) + | (mux3 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL3), + (3 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL0) + | (3 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL1) + | (3 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL2) + | (3 << RS69_DDIA_PCIE_OUTPUT_MUX_SEL3) + ); + LaneReversal = Private->PcieCfgReg7 & (0x1 << 10); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x0, 0x3); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x2, 0x2); + + RHDRegMask(Output, RS69_DDIA_PCIE_LINK_CONTROL3, + LaneReversal ? RS69_DDIA_PCIE_MIRROR_EN : 0, + RS69_DDIA_PCIE_MIRROR_EN); + + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x70, 0x70); + + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0, 0x10); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0, 0x60); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0, 0x4000000); + + switch (rhdPtr->PciDeviceID) { + case 0x791E: + if (Mode->SynthClock <= 25000) { + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x2780, 0x3f80); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x0, 0xc000); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x039f0000, 0x03000000 | 0x039f0000); + } else if (Mode->SynthClock <= 60000) { + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x2780, 0x3f80); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x0, 0xc000); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x024f0000, 0x03000000 | 0x024f0000); + } else { + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x0980, 0x3f80); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x0, 0xc000); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x01270000, 0x03000000 | 0x01270000); + } + break; + case 0x791F: + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x0980, 0x3f80); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x4000, 0xc000); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x00ac0000, 0x03000000 | 0x00ac0000); + if (Private->CapabilityFlag & 0x10) { + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x0, 0xc000); + if (Mode->SynthClock <= 6500) + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x01ac0000, 0x03ff0000); + else + RHDRegMaskD(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x01110000, 0x03ff0000); + } + break; + } + usleep (1); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x04000000, 0x04000000); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x60, 0x60); + usleep(30); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x01, 0x01); + usleep(1); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x02, 0x02); + usleep(1); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x04, 0x04); + usleep(1); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x08, 0x08); + usleep(1); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x10, 0x10); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL1, 0x0, 0xf); + + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x0180, 0x0180); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x600, 0x600); + usleep(5); + RHDRegMask(Output, RS69_DDIA_PCIE_PHY_CONTROL2, 0x0, 0x600); + + /* hw reset will be turned off at POWER_ON */ + + /* select crtc source, sync_a, no stereosync */ + RHDRegMask(Output, RS69_DDIA_SOURCE_SELECT, Output->Crtc->Id, + RS69_DDIA_SOURCE_SELECT_BIT + | RS69_DDIA_SYNC_SELECT + | RS69_DDIA_STEREOSYNC_SELECT); +} + +/* + * + */ +static void +DDIAPower(struct rhdOutput *Output, int Power) +{ + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); + + switch (Power) { + case RHD_POWER_ON: + RHDRegMask(Output, RS69_DDIA_PATH_CONTROL, RS69_DDIA_PIXVLD_RESET, + RS69_DDIA_PIXVLD_RESET); + RHDRegWrite(Output, RS69_DDIA_BIT_DEPTH_CONTROL, 0); + RHDRegMask(Output, RS69_DDIA_BIT_DEPTH_CONTROL, + RS69_DDIA_TEMPORAL_DITHER_RESET, RS69_DDIA_TEMPORAL_DITHER_RESET); + RHDRegMask(Output, RS69_DDIA_BIT_DEPTH_CONTROL, + 0, RS69_DDIA_TEMPORAL_DITHER_RESET); + RHDRegMask(Output, RS69_DDIA_CNTL, RS69_DDIA_ENABLE, RS69_DDIA_ENABLE); + RHDRegMask(Output, RS69_DDIA_PATH_CONTROL, 0, RS69_DDIA_PIXVLD_RESET); + return; + case RHD_POWER_RESET: + RHDRegMask(Output, RS69_DDIA_CNTL, 0, RS69_DDIA_ENABLE); + return; + case RHD_POWER_SHUTDOWN: + RHDRegMask(Output, RS69_DDIA_BIT_DEPTH_CONTROL, + RS69_DDIA_TEMPORAL_DITHER_RESET, RS69_DDIA_TEMPORAL_DITHER_RESET); + RHDRegMask(Output, RS69_DDIA_BIT_DEPTH_CONTROL, + 0, RS69_DDIA_TEMPORAL_DITHER_RESET); + RHDRegMask(Output, RS69_DDIA_BIT_DEPTH_CONTROL, + 0, + RS69_DDIA_TRUNCATE_EN + | RS69_DDIA_TRUNCATE_DEPTH + | RS69_DDIA_SPATIAL_DITHER_EN + | RS69_DDIA_SPATIAL_DITHER_DEPTH); + RHDRegMask(Output, RS69_DDIA_BIT_DEPTH_CONTROL, + 0, + RS69_DDIA_TEMPORAL_DITHER_EN + | RS69_DDIA_TEMPORAL_DITHER_EN + | RS69_DDIA_TEMPORAL_DITHER_DEPTH + | RS69_DDIA_TEMPORAL_LEVEL); + RHDRegMask(Output, RS69_DDIA_CNTL, 0, RS69_DDIA_ENABLE); + return; + default: + return; + } +} + +/* + * + */ +static void +DDIASave(struct rhdOutput *Output) +{ + struct DDIAPrivate *Private = (struct DDIAPrivate *)Output->Private; + + RHDFUNC(Output); + + Private->DdiaPathControl = RHDRegRead(Output, RS69_DDIA_PATH_CONTROL); + Private->DdiaCntl = RHDRegRead(Output, RS69_DDIA_CNTL); + Private->DdiaDcbalancerControl = RHDRegRead(Output, RS69_DDIA_DCBALANCER_CONTROL); + Private->DdiaPcieLinkControl2 = RHDRegRead(Output, RS69_DDIA_PCIE_LINK_CONTROL2); + Private->DdiaBitDepthControl = RHDRegRead(Output, RS69_DDIA_BIT_DEPTH_CONTROL); + + Private->Stored = TRUE; +} + +/* + * + */ +static void +DDIARestore(struct rhdOutput *Output) +{ + struct DDIAPrivate *Private = (struct DDIAPrivate *)Output->Private; + RHDFUNC(Output); + + if (!Private->Stored) + return; + + /* disalbe */ + RHDRegMask(Output, RS69_DDIA_CNTL, 0, RS69_DDIA_ENABLE); + /* reset on */ + RHDRegMask(Output, RS69_DDIA_PATH_CONTROL, RS69_DDIA_PIXVLD_RESET, RS69_DDIA_PIXVLD_RESET); + RHDRegWrite(Output, RS69_DDIA_PATH_CONTROL, Private->DdiaPathControl | RS69_DDIA_PIXVLD_RESET); + + RHDRegWrite(Output, RS69_DDIA_BIT_DEPTH_CONTROL, Private->DdiaBitDepthControl); + /* temporal dither reset on */ + RHDRegWrite(Output, RS69_DDIA_BIT_DEPTH_CONTROL, Private->DdiaBitDepthControl + | RS69_DDIA_TEMPORAL_DITHER_RESET); + /* temporal dither reset off */ + RHDRegWrite(Output, RS69_DDIA_BIT_DEPTH_CONTROL, Private->DdiaBitDepthControl); + + RHDRegWrite(Output, RS69_DDIA_DCBALANCER_CONTROL, Private->DdiaDcbalancerControl); + RHDRegWrite(Output, RS69_DDIA_PCIE_LINK_CONTROL2, Private->DdiaPcieLinkControl2); + /* enable if enabled at startup */ + RHDRegWrite(Output, RS69_DDIA_CNTL, Private->DdiaCntl); + /* reset off */ + RHDRegWrite(Output, RS69_DDIA_PATH_CONTROL, Private->DdiaPathControl); +} + +/* + * + */ +static void +DDIADestroy(struct rhdOutput *Output) +{ + struct DDIAPrivate *Private = (struct DDIAPrivate *)Output->Private; + + RHDFUNC(Output); + + xfree(Private); + Output->Private = NULL; +} + +/* + * + */ +struct rhdOutput * +RHDDDIAInit(RHDPtr rhdPtr) +{ +#ifdef ATOM_BIOS + struct rhdOutput *Output; + struct DDIAPrivate *Private; + AtomBiosArgRec data; + + RHDFUNC(rhdPtr); + + /* + * This needs to be handled separately + * for now we only deal with it here. + */ + if (rhdPtr->ChipSet < RHD_RS600 || rhdPtr->ChipSet >= RHD_RS740) + return FALSE; + + Output = xnfcalloc(sizeof(struct rhdOutput), 1); + + Output->Name = "DDIA"; + + Output->scrnIndex = rhdPtr->scrnIndex; + Output->Id = RHD_OUTPUT_DVO; + + Output->Sense = NULL; + Output->ModeValid = DDIAModeValid; + Output->Mode = DDIAMode; + Output->Power = DDIAPower; + Output->Save = DDIASave; + Output->Restore = DDIARestore; + Output->Destroy = DDIADestroy; + + Private = xnfcalloc(1, sizeof(struct DDIAPrivate)); + Output->Private = Private; + Private->Stored = FALSE; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_PCIENB_CFG_REG7, &data) == ATOM_SUCCESS) { + Private->PcieCfgReg7 = data.val; + } else { + xf86DrvMsg(Output->scrnIndex, X_ERROR, "Retrieval of PCIE MUX values failed. " + "no DDIA block support available\n"); + goto error; + } + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CAPABILITY_FLAG, &data) == ATOM_SUCCESS) { + Private->CapabilityFlag = data.val; + } else { + xf86DrvMsg(Output->scrnIndex, X_ERROR, "Retrieval of Capability flag failed. " + "no DDIA block support available\n"); + goto error; + } + + return Output; +error: + xfree(Private); + return NULL; + +#else + return NULL; +#endif +} diff --git a/driver/xf86-video-radeonhd/src/rhd_dig.c b/driver/xf86-video-radeonhd/src/rhd_dig.c new file mode 100644 index 000000000..782c8db3a --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_dig.c @@ -0,0 +1,1897 @@ +/* + * Copyright 2007-2009 Luc Verhaegen + * Copyright 2007-2009 Matthias Hopf + * Copyright 2007-2009 Egbert Eich + * Copyright 2007-2009 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_regs.h" +#include "rhd_hdmi.h" +#include "rhd_acpi.h" +#ifdef ATOM_BIOS +#include "rhd_atombios.h" +#include "rhd_atomout.h" +#endif + +#define FMT2_OFFSET 0x800 +#define DIG1_OFFSET 0x000 +#define DIG2_OFFSET 0x400 + +/* + * Transmitter + */ +struct transmitter { + enum rhdSensedOutput (*Sense) (struct rhdOutput *Output, + enum rhdConnectorType Type); + ModeStatus (*ModeValid) (struct rhdOutput *Output, DisplayModePtr Mode); + void (*Mode) (struct rhdOutput *Output, struct rhdCrtc *Crtc, DisplayModePtr Mode); + void (*Power) (struct rhdOutput *Output, int Power); + void (*Save) (struct rhdOutput *Output); + void (*Restore) (struct rhdOutput *Output); + void (*Destroy) (struct rhdOutput *Output); + Bool (*Property) (struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val); + Bool (*WrappedPropertyCallback) (struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val); + void *PropertyPrivate; + void *Private; +}; + +/* + * Encoder + */ +struct encoder { + ModeStatus (*ModeValid) (struct rhdOutput *Output, DisplayModePtr Mode); + void (*Mode) (struct rhdOutput *Output, struct rhdCrtc *Crtc, DisplayModePtr Mode); + void (*Power) (struct rhdOutput *Output, int Power); + void (*Save) (struct rhdOutput *Output); + void (*Restore) (struct rhdOutput *Output); + void (*Destroy) (struct rhdOutput *Output); + void *Private; +}; + +/* + * + */ +enum encoderMode { + DISPLAYPORT = 0, + LVDS = 1, + TMDS_DVI = 2, + TMDS_HDMI = 3, + SDVO = 4 +}; + +enum encoderID { + ENCODER_NONE, + ENCODER_DIG1, + ENCODER_DIG2 +}; + +struct DIGPrivate +{ + struct encoder Encoder; + struct transmitter Transmitter; + enum encoderID EncoderID; + enum encoderMode EncoderMode; + Bool Coherent; + Bool RunDualLink; + DisplayModePtr Mode; + struct rhdHdmi *Hdmi; + + /* LVDS */ + Bool FPDI; + CARD32 PowerSequenceDe2Bl; + CARD32 PowerSequenceDig2De; + CARD32 OffDelay; + struct rhdFMTDither FMTDither; + int BlLevel; + + void (*SetBacklight)(struct rhdOutput *Output, int val); + int (*GetBacklight)(struct rhdOutput *Output); + +}; + +/* + * LVTMA Transmitter + */ + +struct LVTMATransmitterPrivate +{ + Bool Stored; + + CARD32 StoredTransmitterControl; + CARD32 StoredTransmitterAdjust; + CARD32 StoredPreemphasisControl; + CARD32 StoredMacroControl; + CARD32 StoredLVTMADataSynchronization; + CARD32 StoredTransmiterEnable; + CARD32 StoredPwrSeqCntl; + CARD32 StoredPwrSeqRevDiv; + CARD32 StoredPwrSeqDelay1; + CARD32 StoredPwrSeqDelay2; +}; + +/* + * + */ +static ModeStatus +LVTMATransmitterModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE + && Mode->SynthClock > 165000) + return MODE_CLOCK_HIGH; + + return MODE_OK; +} + +static void +LVDSSetBacklight(struct rhdOutput *Output, int level) +{ + RHDFUNC(Output); + + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_REF_DIV, + 0x144 << LVTMA_BL_MOD_REF_DI_SHIFT, + 0x7ff << LVTMA_BL_MOD_REF_DI_SHIFT); + RHDRegWrite(Output, RV620_LVTMA_BL_MOD_CNTL, + 0xff << LVTMA_BL_MOD_RES_SHIFT + | level << LVTMA_BL_MOD_LEVEL_SHIFT + | LVTMA_BL_MOD_EN); +} + +/* + * + */ +static int +LVDSGetBacklight(struct rhdOutput *Output) +{ + CARD32 level; + + level = RHDRegRead(Output, RV620_LVTMA_BL_MOD_CNTL); + if ((level & 0x01) != 0x01) return -1; + + return (level >> LVTMA_BL_MOD_LEVEL_SHIFT) & 0xFF; +} + +/* + * + */ +static Bool +LVDSTransmitterPropertyControl(struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct DIGPrivate *Private = (struct DIGPrivate *) Output->Private; + + RHDFUNC(Output); + switch (Action) { + case rhdPropertyCheck: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + if (Private->BlLevel < 0) + return FALSE; + return TRUE; + default: + return FALSE; + } + case rhdPropertyGet: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + Private->BlLevel = Private->GetBacklight(Output); + if (Private->BlLevel < 0) + return FALSE; + val->integer = Private->BlLevel; + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertySet: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + if (Private->BlLevel < 0) + return FALSE; + Private->BlLevel = val->integer; + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertyCommit: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + if (Private->BlLevel < 0) + return FALSE; + Private->SetBacklight(Output, Private->BlLevel); + return TRUE; + default: + return FALSE; + } + break; + } + return TRUE; +} + +/* + * + */ +static Bool +TMDSTransmitterPropertyControl(struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct DIGPrivate *Private = (struct DIGPrivate *) Output->Private; + + RHDFUNC(Output); + switch (Action) { + case rhdPropertyCheck: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + case RHD_OUTPUT_AUDIO_WORKAROUND: + return TRUE; + default: + return FALSE; + } + case rhdPropertyGet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + val->Bool = Private->Coherent; + return TRUE; + case RHD_OUTPUT_HDMI: + val->Bool = Private->EncoderMode == TMDS_HDMI; + return TRUE; + case RHD_OUTPUT_AUDIO_WORKAROUND: + val->Bool = RHDHdmiGetAudioWorkaround(Private->Hdmi); + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertySet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + Private->Coherent = val->Bool; + break; + case RHD_OUTPUT_HDMI: + Private->EncoderMode = val->Bool ? TMDS_HDMI : TMDS_DVI; + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiSetAudioWorkaround(Private->Hdmi, val->Bool); + break; + default: + return FALSE; + } + break; + case rhdPropertyCommit: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + Output->Mode(Output, Private->Mode); + Output->Power(Output, RHD_POWER_ON); + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiCommitAudioWorkaround(Private->Hdmi); + break; + default: + return FALSE; + } + break; + } + return TRUE; +} + +/* + * + */ +static void +LVTMATransmitterSet(struct rhdOutput *Output, struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; +#ifdef ATOM_BIOS + CARD32 value = 0; + AtomBiosArgRec data; + RHDPtr rhdPtr = RHDPTRI(Output); +#endif + Bool doCoherent = Private->Coherent; + RHDFUNC(Output); + + /* set coherent / not coherent mode; whatever that is */ + if (Output->Connector->Type != RHD_CONNECTOR_PANEL) + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + doCoherent ? 0 : RV62_LVTMA_BYPASS_PLL, RV62_LVTMA_BYPASS_PLL); + +#ifdef ATOM_BIOS + RHDDebug(Output->scrnIndex, "%s: SynthClock: %i Hex: %x EncoderMode: %x\n",__func__, + (Mode->SynthClock),(Mode->SynthClock / 10), Private->EncoderMode); + + /* Set up magic value that's used for list lookup */ + value = ((Mode->SynthClock / 10 / ((Private->RunDualLink) ? 2 : 1)) & 0xffff) + | (Private->EncoderMode << 16) + | ((doCoherent ? 0x2 : 0) << 24); + + RHDDebug(Output->scrnIndex, "%s: GetConditionalGoldenSettings for: %x\n", __func__, value); + + /* Get data from DIG2TransmitterControl table */ + data.val = 0x4d; + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_GET_CODE_DATA_TABLE, + &data) == ATOM_SUCCESS) { + AtomBiosArgRec data1; + CARD32 *d_p = NULL; + + data1.GoldenSettings.BIOSPtr = data.CommandDataTable.loc; + data1.GoldenSettings.End = data1.GoldenSettings.BIOSPtr + data.CommandDataTable.size; + data1.GoldenSettings.value = value; + + /* now find pointer */ + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CONDITIONAL_GOLDEN_SETTINGS, &data1) == ATOM_SUCCESS) { + d_p = (CARD32*)data1.GoldenSettings.BIOSPtr; + } else { + /* nothing found, now try toggling the coherent setting */ + doCoherent = !doCoherent; + value = (value & ~(0x2 << 24)) | ((doCoherent ? 0x2 : 0) << 24); + data1.GoldenSettings.value = value; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CONDITIONAL_GOLDEN_SETTINGS, &data1) == ATOM_SUCCESS) { + d_p = (CARD32*)data1.GoldenSettings.BIOSPtr; + /* set coherent / not coherent mode; whatever that is */ + xf86DrvMsg(Output->scrnIndex, X_INFO, "%s: %soherent Mode not supported, switching to %soherent.\n", + __func__, doCoherent ? "Inc" : "C", doCoherent ? "C" : "Inc"); + if (Output->Connector->Type != RHD_CONNECTOR_PANEL) + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + doCoherent ? 0 : RV62_LVTMA_BYPASS_PLL, RV62_LVTMA_BYPASS_PLL); + } else + doCoherent = Private->Coherent; /* reset old value if nothing found either */ + } + if (d_p) { + RHDDebug(Output->scrnIndex, "TransmitterAdjust: 0x%8.8x\n",d_p[0]); + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_ADJUST, d_p[0]); + + RHDDebug(Output->scrnIndex, "PreemphasisControl: 0x%8.8x\n",d_p[1]); + RHDRegWrite(Output, RV620_LVTMA_PREEMPHASIS_CONTROL, d_p[1]); + + RHDDebug(Output->scrnIndex, "MacroControl: 0x%8.8x\n",d_p[2]); + RHDRegWrite(Output, RV620_LVTMA_MACRO_CONTROL, d_p[2]); + } else + xf86DrvMsg(Output->scrnIndex, X_WARNING, "%s: cannot get golden settings\n",__func__); + } else +#endif + { + xf86DrvMsg(Output->scrnIndex, X_WARNING, "%s: No AtomBIOS supplied " + "electrical parameters available\n", __func__); + } +} + +/* + * + */ +static void +LVTMATransmitterSave(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct LVTMATransmitterPrivate *Private = (struct LVTMATransmitterPrivate*)digPrivate->Transmitter.Private; + + Private->StoredTransmitterControl = RHDRegRead(Output, RV620_LVTMA_TRANSMITTER_CONTROL); + Private->StoredTransmitterAdjust = RHDRegRead(Output, RV620_LVTMA_TRANSMITTER_ADJUST); + Private->StoredPreemphasisControl = RHDRegRead(Output, RV620_LVTMA_PREEMPHASIS_CONTROL); + Private->StoredMacroControl = RHDRegRead(Output, RV620_LVTMA_MACRO_CONTROL); + Private->StoredLVTMADataSynchronization = RHDRegRead(Output, RV620_LVTMA_DATA_SYNCHRONIZATION); + Private->StoredTransmiterEnable = RHDRegRead(Output, RV620_LVTMA_TRANSMITTER_ENABLE); +} + +/* + * + */ +static void +LVTMATransmitterRestore(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct LVTMATransmitterPrivate *Private = (struct LVTMATransmitterPrivate*)digPrivate->Transmitter.Private; + + RHDFUNC(Output); + + /* write control values back */ + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_CONTROL,Private->StoredTransmitterControl); + usleep (14); + /* reset PLL */ + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_CONTROL,Private->StoredTransmitterControl + | RV62_LVTMA_PLL_RESET); + usleep (10); + /* unreset PLL */ + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_CONTROL,Private->StoredTransmitterControl); + usleep(1000); + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_ADJUST, Private->StoredTransmitterAdjust); + RHDRegWrite(Output, RV620_LVTMA_PREEMPHASIS_CONTROL, Private->StoredPreemphasisControl); + RHDRegWrite(Output, RV620_LVTMA_MACRO_CONTROL, Private->StoredMacroControl); + /* start data synchronization */ + RHDRegWrite(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, (Private->StoredLVTMADataSynchronization + & ~(CARD32)RV62_LVTMA_DSYNSEL) + | RV62_LVTMA_PFREQCHG); + usleep (1); + RHDRegWrite(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, Private->StoredLVTMADataSynchronization); + usleep(10); + RHDRegWrite(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, Private->StoredLVTMADataSynchronization); + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_ENABLE, Private->StoredTransmiterEnable); +} + +/* + * + */ +static void +LVTMA_TMDSTransmitterSet(struct rhdOutput *Output, struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + /* TMDS Mode */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_USE_CLK_DATA, RV62_LVTMA_USE_CLK_DATA); + + LVTMATransmitterSet(Output, Crtc, Mode); + + /* use differential post divider input */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_IDSCKSEL, RV62_LVTMA_IDSCKSEL); +} + +/* + * + */ +static void +LVTMA_TMDSTransmitterPower(struct rhdOutput *Output, int Power) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + + RHDFUNC(Output); + + switch (Power) { + case RHD_POWER_ON: + /* enable PLL */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_PLL_ENABLE, RV62_LVTMA_PLL_ENABLE); + usleep(14); + /* PLL reset on */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_PLL_RESET, RV62_LVTMA_PLL_RESET); + usleep(10); + /* PLL reset off */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + 0, RV62_LVTMA_PLL_RESET); + usleep(1000); + /* start data synchronization */ + RHDRegMask(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, + RV62_LVTMA_PFREQCHG, RV62_LVTMA_PFREQCHG); + usleep(1); + /* restart write address logic */ + RHDRegMask(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, + RV62_LVTMA_DSYNSEL, RV62_LVTMA_DSYNSEL); +#if 1 + /* TMDS Mode ?? */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_MODE, RV62_LVTMA_MODE); +#endif + /* enable lower link */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, + RV62_LVTMA_LNKL, + RV62_LVTMA_LNK_ALL); + if (Private->RunDualLink) { + usleep (28); + /* enable upper link */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, + RV62_LVTMA_LNKU, + RV62_LVTMA_LNKU); + } + return; + case RHD_POWER_RESET: + /* disable all links */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, + 0, RV62_LVTMA_LNK_ALL); + return; + case RHD_POWER_SHUTDOWN: + default: + /* disable transmitter */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, + 0, RV62_LVTMA_LNK_ALL); + /* PLL reset */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_PLL_RESET, RV62_LVTMA_PLL_RESET); + usleep(10); + /* end PLL reset */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + 0, RV62_LVTMA_PLL_RESET); + /* disable data synchronization */ + RHDRegMask(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, + 0, RV62_LVTMA_DSYNSEL); + /* reset macro control */ + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_ADJUST, 0); + + return; + } +} + +/* + * + */ +static void +LVTMA_TMDSTransmitterSave(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct LVTMATransmitterPrivate *Private = (struct LVTMATransmitterPrivate*)digPrivate->Transmitter.Private; + + RHDFUNC(Output); + + LVTMATransmitterSave(Output); + + Private->Stored = TRUE; +} + +/* + * + */ +static void +LVTMA_TMDSTransmitterRestore(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct LVTMATransmitterPrivate *Private = (struct LVTMATransmitterPrivate*)digPrivate->Transmitter.Private; + + RHDFUNC(Output); + + if (!Private->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + LVTMATransmitterRestore(Output); +} + +/* + * + */ +static void +LVTMA_LVDSTransmitterSet(struct rhdOutput *Output, struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + /* LVDS Mode */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + 0, RV62_LVTMA_USE_CLK_DATA); + + LVTMATransmitterSet(Output, Crtc, Mode); + + /* use IDCLK */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, RV62_LVTMA_IDSCKSEL, RV62_LVTMA_IDSCKSEL); + /* enable pwrseq, pwrseq overwrite PPL enable, reset */ + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_CNTL, + RV62_LVTMA_PWRSEQ_EN + | RV62_LVTMA_PLL_ENABLE_PWRSEQ_MASK + | RV62_LVTMA_PLL_RESET_PWRSEQ_MASK, + RV62_LVTMA_PWRSEQ_EN + | RV62_LVTMA_PLL_ENABLE_PWRSEQ_MASK + | RV62_LVTMA_PLL_RESET_PWRSEQ_MASK + ); + +} + +/* + * + */ +static void +LVTMA_LVDSTransmitterPower(struct rhdOutput *Output, int Power) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + CARD32 tmp, tmp1; + int i; + + RHDFUNC(Output); + + switch (Power) { + case RHD_POWER_ON: + /* enable PLL */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_PLL_ENABLE, RV62_LVTMA_PLL_ENABLE); + usleep(14); + /* PLL reset on */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + RV62_LVTMA_PLL_RESET, RV62_LVTMA_PLL_RESET); + usleep(10); + /* PLL reset off */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + 0, RV62_LVTMA_PLL_RESET); + usleep(1000); + /* start data synchronization */ + RHDRegMask(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, + RV62_LVTMA_PFREQCHG, RV62_LVTMA_PFREQCHG); + usleep(1); + /* restart write address logic */ + RHDRegMask(Output, RV620_LVTMA_DATA_SYNCHRONIZATION, + RV62_LVTMA_DSYNSEL, RV62_LVTMA_DSYNSEL); + /* SYNCEN disables pwrseq ?? */ + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_CNTL, + RV62_LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_EN, + RV62_LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_EN); + /* LVDS Mode ?? */ + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_CONTROL, + 0, RV62_LVTMA_MODE); + /* enable links */ + if (Private->RunDualLink) { + if (Private->FMTDither.LVDS24Bit) + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, 0x3ff, 0x3ff); + else + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, 0x1ef, 0x3ff); + } else { + if (Private->FMTDither.LVDS24Bit) + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, 0x1f, 0x3ff); + else + RHDRegMask(Output, RV620_LVTMA_TRANSMITTER_ENABLE, 0x0f, 0x3ff); + } + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_CNTL, 0, + RV62_LVTMA_DIGON_OVRD | RV62_LVTMA_BLON_OVRD); + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_REF_DIV, 3999, 0xffff); /* 4000 - 1 */ + tmp = Private->PowerSequenceDe2Bl * 10 / 4; + tmp1 = Private->PowerSequenceDig2De * 10 / 4; + /* power sequencing delay for on / off between DIGON and SYNCEN, and SYNCEN and BLON */ + RHDRegWrite(Output, RV620_LVTMA_PWRSEQ_DELAY1, (tmp1 << 24) | tmp1 | (tmp << 8) | (tmp << 16)); + RHDRegWrite(Output, RV620_LVTMA_PWRSEQ_DELAY2, Private->OffDelay / 4); + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_CNTL, 0, RV62_LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_EN); + for (i = 0; i < 500; i++) { + CARD32 tmp; + + usleep(1000); + tmp = RHDRegRead(Output, RV620_LVTMA_PWRSEQ_STATE); + tmp >>= RV62_LVTMA_PWRSEQ_STATE_SHIFT; + tmp &= 0xff; + if (tmp <= RV62_POWERUP_DONE) + break; + if (tmp >= RV62_POWERDOWN_DONE) + break; + } + /* LCD on */ + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_CNTL, RV62_LVTMA_PWRSEQ_TARGET_STATE, + RV62_LVTMA_PWRSEQ_TARGET_STATE); + return; + + case RHD_POWER_RESET: + /* Disable LCD and BL */ + RHDRegMask(Output, RV620_LVTMA_PWRSEQ_CNTL, 0, + RV62_LVTMA_PWRSEQ_TARGET_STATE + | RV62_LVTMA_DIGON_OVRD + | RV62_LVTMA_BLON_OVRD); + for (i = 0; i < 500; i++) { + CARD32 tmp; + + usleep(1000); + tmp = RHDRegRead(Output, RV620_LVTMA_PWRSEQ_STATE); + tmp >>= RV62_LVTMA_PWRSEQ_STATE_SHIFT; + tmp &= 0xff; + if (tmp >= RV62_POWERDOWN_DONE) + break; + } + return; + case RHD_POWER_SHUTDOWN: + LVTMA_LVDSTransmitterPower(Output, RHD_POWER_RESET); + /* op-amp down, bias current for output driver down, shunt resistor down */ + RHDRegWrite(Output, RV620_LVTMA_TRANSMITTER_ADJUST, 0x00e00000); + /* set macro control */ + RHDRegWrite(Output, RV620_LVTMA_MACRO_CONTROL, 0x07430408); + default: + return; + } +} + +/* + * + */ +static void +LVTMA_LVDSTransmitterSave(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct LVTMATransmitterPrivate *Private = (struct LVTMATransmitterPrivate*)digPrivate->Transmitter.Private; + + RHDFUNC(Output); + + LVTMATransmitterSave(Output); + + Private->StoredPwrSeqCntl = RHDRegRead(Output, RV620_LVTMA_PWRSEQ_CNTL); + Private->StoredPwrSeqRevDiv = RHDRegRead(Output, RV620_LVTMA_PWRSEQ_REF_DIV); + Private->StoredPwrSeqDelay1 = RHDRegRead(Output, RV620_LVTMA_PWRSEQ_DELAY1); + Private->StoredPwrSeqDelay2 = RHDRegRead(Output, RV620_LVTMA_PWRSEQ_DELAY2); + + Private->Stored = TRUE; +} + +/* + * + */ +static void +LVTMA_LVDSTransmitterRestore(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct LVTMATransmitterPrivate *Private = (struct LVTMATransmitterPrivate*)digPrivate->Transmitter.Private; + + RHDFUNC(Output); + + if (!Private->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + LVTMATransmitterRestore(Output); + + RHDRegWrite(Output, RV620_LVTMA_PWRSEQ_REF_DIV, Private->StoredPwrSeqRevDiv); + RHDRegWrite(Output, RV620_LVTMA_PWRSEQ_DELAY1, Private->StoredPwrSeqDelay1); + RHDRegWrite(Output, RV620_LVTMA_PWRSEQ_DELAY2, Private->StoredPwrSeqDelay2); + RHDRegWrite(Output, RV620_LVTMA_PWRSEQ_CNTL, Private->StoredPwrSeqCntl); +} + +/* + * + */ +static void +LVTMATransmitterDestroy(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + + RHDFUNC(Output); + + if (!digPrivate) + return; + + xfree(digPrivate->Transmitter.Private); +} + +/* + * + */ +void +rhdPrintDigDebug(RHDPtr rhdPtr, const char *name) +{ + xf86DrvMsgVerb(rhdPtr->scrnIndex, X_INFO, 7, "%s: DIGn_CNTL: n=1: 0x%x n=2: 0x%x\n", + name, (unsigned int) RHDRegRead(rhdPtr, RV620_DIG1_CNTL), + (unsigned int) RHDRegRead(rhdPtr, DIG2_OFFSET + RV620_DIG1_CNTL)); +} + +/* + * + */ +static CARD32 +digProbeEncoder(struct rhdOutput *Output) +{ + if (Output->Id == RHD_OUTPUT_KLDSKP_LVTMA) { + return ENCODER_DIG2; + } else { + Bool swap = (RHDRegRead(Output, RV620_DCIO_LINK_STEER_CNTL) + & RV62_LINK_STEER_SWAP) == RV62_LINK_STEER_SWAP; + + switch (Output->Id) { + case RHD_OUTPUT_UNIPHYA: + if (swap) { + RHDDebug(Output->scrnIndex, "%s: detected ENCODER_DIG2 for UNIPHYA\n",__func__); + return ENCODER_DIG2; + } else { + RHDDebug(Output->scrnIndex, "%s: detected ENCODER_DIG1 for UNIPHYA\n",__func__); + return ENCODER_DIG1; + } + break; + case RHD_OUTPUT_UNIPHYB: + if (swap) { + RHDDebug(Output->scrnIndex, "%s: detected ENCODER_DIG1 for UNIPHYB\n",__func__); + return ENCODER_DIG1; + } else { + RHDDebug(Output->scrnIndex, "%s: detected ENCODER_DIG2 for UNIPHYB\n",__func__); + return ENCODER_DIG2; + } + break; + default: + return ENCODER_NONE; /* should not get here */ + } + } + return ENCODER_NONE; +} + +#if defined(ATOM_BIOS) && defined(ATOM_BIOS_PARSER) + +struct ATOMTransmitterPrivate +{ + struct atomTransmitterConfig atomTransmitterConfig; + enum atomTransmitter atomTransmitterID; +}; + +/* + * + */ +static ModeStatus +ATOMTransmitterModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + + RHDFUNC(Output); + + if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE + && Mode->SynthClock > 165000) + return MODE_CLOCK_HIGH; + + return MODE_OK; +} + +/* + * + */ +static void +ATOMTransmitterSet(struct rhdOutput *Output, struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct ATOMTransmitterPrivate *transPrivate + = (struct ATOMTransmitterPrivate*) Private->Transmitter.Private; + struct atomTransmitterConfig *atc = &transPrivate->atomTransmitterConfig; + + RHDFUNC(Output); + + atc->Coherent = Private->Coherent; + atc->PixelClock = Mode->SynthClock; + + rhdPrintDigDebug(rhdPtr,__func__); + + if (Private->RunDualLink) { + atc->Mode = atomDualLink; + + if (atc->Link == atomTransLinkA) + atc->Link = atomTransLinkAB; + else if (atc->Link == atomTransLinkB) + atc->Link = atomTransLinkBA; + + } else { + atc->Mode = atomSingleLink; + + if (atc->Link == atomTransLinkAB) + atc->Link = atomTransLinkA; + else if (atc->Link == atomTransLinkBA) + atc->Link = atomTransLinkB; + + } + + atc->PixelClock = Mode->SynthClock; + + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, transPrivate->atomTransmitterID, + atomTransSetup, atc); + rhdPrintDigDebug(rhdPtr,__func__); +} + +/* + * + */ +static void +ATOMTransmitterPower(struct rhdOutput *Output, int Power) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct ATOMTransmitterPrivate *transPrivate + = (struct ATOMTransmitterPrivate*) Private->Transmitter.Private; + struct atomTransmitterConfig *atc = &transPrivate->atomTransmitterConfig; + + RHDFUNC(Output); + + rhdPrintDigDebug(rhdPtr,__func__); + + if (Private->RunDualLink) + atc->LinkCnt = atomDualLink; + else + atc->LinkCnt = atomSingleLink; + + atc->Coherent = Private->Coherent; + + if (atc->Encoder == atomEncoderNone) { + switch (digProbeEncoder(Output)) { + case ENCODER_DIG1: + if (rhdPtr->DigEncoderOutput[0]) { + RHDDebug(Output->scrnIndex,"%s: DIG1 for %s already taken\n",__func__,Output->Name); + return; + } + atc->Encoder = atomEncoderDIG1; + break; + case ENCODER_DIG2: + if (rhdPtr->DigEncoderOutput[1]) { + RHDDebug(Output->scrnIndex,"%s: DIG2 for %s already taken\n",__func__,Output->Name); + return; + } + atc->Encoder = atomEncoderDIG2; + break; + default: + return; + } + } + + switch (Power) { + case RHD_POWER_ON: + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, transPrivate->atomTransmitterID, + atomTransEnable, atc); + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, transPrivate->atomTransmitterID, + atomTransEnableOutput, atc); + break; + case RHD_POWER_RESET: + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, transPrivate->atomTransmitterID, + atomTransDisableOutput, atc); + break; + case RHD_POWER_SHUTDOWN: + if (!Output->Connector || Output->Connector->Type == RHD_CONNECTOR_DVI) + atc->Mode = atomDVI; + + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, transPrivate->atomTransmitterID, + atomTransDisableOutput, atc); + rhdAtomDigTransmitterControl(rhdPtr->atomBIOS, transPrivate->atomTransmitterID, + atomTransDisable, atc); + break; + } + rhdPrintDigDebug(rhdPtr,__func__); +} + +/* + * + */ +static void +ATOMTransmitterSave(struct rhdOutput *Output) +{ + RHDFUNC(Output); +} + +/* + * + */ +static void +ATOMTransmitterRestore(struct rhdOutput *Output) +{ + RHDFUNC(Output); +} + +/* + * + */ +static void +ATOMTransmitterDestroy(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + + RHDFUNC(Output); + + if (!digPrivate) + return; + + xfree(digPrivate->Transmitter.Private); +} + +#endif /* ATOM_BIOS && ATOM_BIOS_PASER */ + +/* + * Encoder + */ + +struct DIGEncoder +{ + Bool Stored; + + CARD32 StoredOff; + + CARD32 StoredRegExt1DiffPostDivCntl; + CARD32 StoredRegExt2DiffPostDivCntl; + CARD32 StoredDIGClockPattern; + CARD32 StoredLVDSDataCntl; + CARD32 StoredTMDSPixelEncoding; + CARD32 StoredTMDSCntl; + CARD32 StoredDIGCntl; + CARD32 StoredDIGMisc1; + CARD32 StoredDIGMisc2; + CARD32 StoredDIGMisc3; + CARD32 StoredDCCGPclkDigCntl; + CARD32 StoredDCCGSymclkCntl; + CARD32 StoredDCIOLinkSteerCntl; + CARD32 StoredBlModCntl; +}; + +/* + * + */ +static ModeStatus +EncoderModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + return MODE_OK; +} + +/* + * + */ +static void +LVDSEncoder(struct rhdOutput *Output) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + CARD32 off; + + RHDFUNC(Output); + + ASSERT(Private->EncoderID != ENCODER_NONE); + + off = (Private->EncoderID == ENCODER_DIG2) ? DIG2_OFFSET : DIG1_OFFSET; + /* Clock pattern ? */ + RHDRegMask(Output, off + RV620_DIG1_CLOCK_PATTERN, 0x0063, 0xFFFF); + /* set panel type: 18/24 bit mode */ + RHDRegMask(Output, off + RV620_LVDS1_DATA_CNTL, + (Private->FMTDither.LVDS24Bit ? RV62_LVDS_24BIT_ENABLE : 0) + | (Private->FPDI ? RV62_LVDS_24BIT_FORMAT : 0), + RV62_LVDS_24BIT_ENABLE | RV62_LVDS_24BIT_FORMAT); + + Output->Crtc->FMTModeSet(Output->Crtc, &Private->FMTDither); +} + +/* + * + */ +static void +TMDSEncoder(struct rhdOutput *Output) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + CARD32 off; + + RHDFUNC(Output); + + ASSERT(Private->EncoderID != ENCODER_NONE); + off = (Private->EncoderID == ENCODER_DIG2) ? DIG2_OFFSET : DIG1_OFFSET; + /* clock pattern ? */ + RHDRegMask(Output, off + RV620_DIG1_CLOCK_PATTERN, 0x001F, 0xFFFF); + /* color format RGB - normal color format 24bpp, Twin-Single 30bpp or Dual 48bpp*/ + RHDRegMask(Output, off + RV620_TMDS1_CNTL, 0x0, + RV62_TMDS_PIXEL_ENCODING | RV62_TMDS_COLOR_FORMAT); + /* no dithering */ + Output->Crtc->FMTModeSet(Output->Crtc, NULL); +} + +/* + * + */ +static void +EncoderSet(struct rhdOutput *Output, struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 off; + + RHDFUNC(Output); + + ASSERT(Private->EncoderID != ENCODER_NONE); + off = (Private->EncoderID == ENCODER_DIG2) ? DIG2_OFFSET : DIG1_OFFSET; + + rhdPrintDigDebug(rhdPtr,__func__); + + RHDRegMask(Output, off + RV620_DIG1_CNTL, Output->Crtc->Id, + RV62_DIG_SOURCE_SELECT); + + if (Output->Id == RHD_OUTPUT_UNIPHYA) { + /* select LinkA ?? */ + RHDRegMask(Output, RV620_DCIO_LINK_STEER_CNTL, + ((Private->EncoderID == ENCODER_DIG2) + ? RV62_LINK_STEER_SWAP + : 0), RV62_LINK_STEER_SWAP); /* swap if DIG2 */ + if (!Private->RunDualLink) { + RHDRegMask(Output, off + RV620_DIG1_CNTL, + 0, + RV62_DIG_SWAP |RV62_DIG_DUAL_LINK_ENABLE); + } else { + RHDRegMask(Output, off + RV620_DIG1_CNTL, + RV62_DIG_DUAL_LINK_ENABLE, + RV62_DIG_SWAP | RV62_DIG_DUAL_LINK_ENABLE); + } + } else if (Output->Id == RHD_OUTPUT_UNIPHYB) { + /* select LinkB ?? */ + RHDRegMask(Output, RV620_DCIO_LINK_STEER_CNTL, + ((Private->EncoderID == ENCODER_DIG2) + ? 0 + : RV62_LINK_STEER_SWAP), RV62_LINK_STEER_SWAP); + if (!Private->RunDualLink) + RHDRegMask(Output, off + RV620_DIG1_CNTL, + 0, + RV62_DIG_SWAP | RV62_DIG_DUAL_LINK_ENABLE); + else + RHDRegMask(Output, off + RV620_DIG1_CNTL, + RV62_DIG_SWAP | RV62_DIG_DUAL_LINK_ENABLE, + RV62_DIG_SWAP | RV62_DIG_DUAL_LINK_ENABLE); + } else { /* LVTMA */ + RHDRegMask(Output, RV620_EXT2_DIFF_POST_DIV_CNTL, 0, RV62_EXT2_DIFF_DRIVER_ENABLE); + } + + if (Private->EncoderMode == LVDS) + LVDSEncoder(Output); + else if (Private->EncoderMode == DISPLAYPORT) + RhdAssertFailed("No displayport support yet!",__FILE__, __LINE__, __func__); /* bugger ! */ + else + TMDSEncoder(Output); + + /* Start DIG, set links, disable stereo sync, select FMT source */ + RHDRegMask(Output, off + RV620_DIG1_CNTL, + (Private->EncoderMode & 0x7) << 8 + | RV62_DIG_START + | (Private->RunDualLink ? RV62_DIG_DUAL_LINK_ENABLE : 0) + | Output->Crtc->Id, + RV62_DIG_MODE + | RV62_DIG_START + | RV62_DIG_DUAL_LINK_ENABLE + | RV62_DIG_STEREOSYNC_SELECT + | RV62_DIG_SOURCE_SELECT); + rhdPrintDigDebug(rhdPtr,__func__); +} + +/* + * + */ +static void +EncoderPower(struct rhdOutput *Output, int Power) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + CARD32 off; + enum encoderID EncoderID = Private->EncoderID; + RHDPtr rhdPtr = RHDPTRI(Output); + + RHDFUNC(Output); + + if (EncoderID == ENCODER_NONE) { + EncoderID = digProbeEncoder(Output); + switch (EncoderID) { + case ENCODER_DIG1: + if (rhdPtr->DigEncoderOutput[0]) { + RHDDebug(Output->scrnIndex,"%s: DIG1 for %s already taken\n",__func__,Output->Name); + return; + } + break; + case ENCODER_DIG2: + if (rhdPtr->DigEncoderOutput[1]) { + RHDDebug(Output->scrnIndex,"%s: DIG2 for %s already taken\n",__func__,Output->Name); + return; + } + break; + default: + return; + } + } + + off = (EncoderID == ENCODER_DIG2) ? DIG2_OFFSET : DIG1_OFFSET; + + /* clock src is pixel PLL */ + RHDRegMask(Output, RV620_DCCG_SYMCLK_CNTL, 0x0, + 0x3 << ((EncoderID == ENCODER_DIG2) + ? RV62_SYMCLKB_SRC_SHIFT + : RV62_SYMCLKA_SRC_SHIFT)); + + rhdPrintDigDebug(rhdPtr,__func__); + switch (Power) { + case RHD_POWER_ON: + RHDDebug(Output->scrnIndex,"%s(RHD_POWER_ON, %i)\n",__func__, + EncoderID); + /* enable DIG */ + RHDRegMask(Output, off + RV620_DIG1_CNTL, 0x10, 0x10); + RHDRegMask(Output, (EncoderID == ENCODER_DIG2) + ? RV620_DCCG_PCLK_DIGB_CNTL + : RV620_DCCG_PCLK_DIGA_CNTL, + RV62_PCLK_DIGA_ON, RV62_PCLK_DIGA_ON); /* @@@ */ + rhdPrintDigDebug(rhdPtr,__func__); + return; + case RHD_POWER_RESET: + case RHD_POWER_SHUTDOWN: + default: + RHDDebug(Output->scrnIndex,"%s(RHD_POWER_SHUTDOWN, %i)\n",__func__, + EncoderID); + /* disable differential clock driver */ + if (EncoderID == ENCODER_DIG1) + RHDRegMask(Output, RV620_EXT1_DIFF_POST_DIV_CNTL, + 0, + RV62_EXT1_DIFF_DRIVER_ENABLE); + else + RHDRegMask(Output, RV620_EXT2_DIFF_POST_DIV_CNTL, + 0, + RV62_EXT2_DIFF_DRIVER_ENABLE); + /* disable DIG */ + RHDRegMask(Output, off + RV620_DIG1_CNTL, 0x0, 0x10); + RHDRegMask(Output, (EncoderID == ENCODER_DIG2) + ? RV620_DCCG_PCLK_DIGB_CNTL + : RV620_DCCG_PCLK_DIGA_CNTL, + 0, RV62_PCLK_DIGA_ON); /* @@@ */ + rhdPrintDigDebug(rhdPtr,__func__); + return; + } +} + +/* + * + */ +static void +EncoderSave(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct DIGEncoder *Private = (struct DIGEncoder *)(digPrivate->Encoder.Private); + CARD32 off; + enum encoderID EncoderID; + + RHDFUNC(Output); + + EncoderID = digProbeEncoder(Output); + off = (EncoderID == ENCODER_DIG2) ? DIG2_OFFSET : DIG1_OFFSET; + Private->StoredOff = off; + + Private->StoredRegExt1DiffPostDivCntl = RHDRegRead(Output, off + RV620_EXT1_DIFF_POST_DIV_CNTL); + Private->StoredRegExt2DiffPostDivCntl = RHDRegRead(Output, off + RV620_EXT2_DIFF_POST_DIV_CNTL); + Private->StoredDIGClockPattern = RHDRegRead(Output, off + RV620_DIG1_CLOCK_PATTERN); + Private->StoredLVDSDataCntl = RHDRegRead(Output, off + RV620_LVDS1_DATA_CNTL); + Private->StoredDIGCntl = RHDRegRead(Output, off + RV620_DIG1_CNTL); + Private->StoredTMDSCntl = RHDRegRead(Output, off + RV620_TMDS1_CNTL); + Private->StoredDCIOLinkSteerCntl = RHDRegRead(Output, RV620_DCIO_LINK_STEER_CNTL); + Private->StoredDCCGPclkDigCntl = RHDRegRead(Output, + (off == DIG2_OFFSET) + ? RV620_DCCG_PCLK_DIGB_CNTL + : RV620_DCCG_PCLK_DIGA_CNTL); + Private->StoredDCCGSymclkCntl = RHDRegRead(Output, RV620_DCCG_SYMCLK_CNTL); + Private->StoredBlModCntl = RHDRegRead(Output, RV620_LVTMA_BL_MOD_CNTL); + Private->Stored = TRUE; +} + +/* + * + */ +static void +EncoderRestore(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + struct DIGEncoder *Private = (struct DIGEncoder *)(digPrivate->Encoder.Private); + CARD32 off; + + RHDFUNC(Output); + + if (!Private->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + off = Private->StoredOff; + + RHDRegWrite(Output, off + RV620_EXT1_DIFF_POST_DIV_CNTL, Private->StoredRegExt1DiffPostDivCntl); + RHDRegWrite(Output, off + RV620_EXT2_DIFF_POST_DIV_CNTL, Private->StoredRegExt2DiffPostDivCntl); + /* reprogram all values but don't start the encoder, yet */ + RHDRegWrite(Output, off + RV620_DIG1_CNTL, Private->StoredDIGCntl & ~(CARD32)RV62_DIG_START); + RHDRegWrite(Output, RV620_DCIO_LINK_STEER_CNTL, Private->StoredDCIOLinkSteerCntl); + RHDRegWrite(Output, off + RV620_DIG1_CLOCK_PATTERN, Private->StoredDIGClockPattern); + RHDRegWrite(Output, off + RV620_LVDS1_DATA_CNTL, Private->StoredLVDSDataCntl); + RHDRegWrite(Output, off + RV620_TMDS1_CNTL, Private->StoredTMDSCntl); + RHDRegWrite(Output, (off == DIG2_OFFSET) + ? RV620_DCCG_PCLK_DIGB_CNTL + : RV620_DCCG_PCLK_DIGA_CNTL, + Private->StoredDCCGPclkDigCntl); + /* now enable the encoder */ + RHDRegWrite(Output, off + RV620_DIG1_CNTL, Private->StoredDIGCntl); + RHDRegWrite(Output, RV620_DCCG_SYMCLK_CNTL, Private->StoredDCCGSymclkCntl); + RHDRegWrite(Output, RV620_LVTMA_BL_MOD_CNTL, Private->StoredBlModCntl); +} + +/* + * + */ +static void +EncoderDestroy(struct rhdOutput *Output) +{ + struct DIGPrivate *digPrivate = (struct DIGPrivate *)Output->Private; + + RHDFUNC(Output); + + if (!digPrivate || !digPrivate->Encoder.Private) + return; + + xfree(digPrivate->Encoder.Private); +} + +/* + * Housekeeping + */ +void +GetLVDSInfo(RHDPtr rhdPtr, struct DIGPrivate *Private) +{ + CARD32 off = (Private->EncoderID == ENCODER_DIG2) ? DIG2_OFFSET : DIG1_OFFSET; + CARD32 tmp; + + RHDFUNC(rhdPtr); + + Private->FPDI = ((RHDRegRead(rhdPtr, off + RV620_LVDS1_DATA_CNTL) + & RV62_LVDS_24BIT_FORMAT) != 0); + Private->RunDualLink = ((RHDRegRead(rhdPtr, off + RV620_DIG1_CNTL) + & RV62_DIG_DUAL_LINK_ENABLE) != 0); + Private->FMTDither.LVDS24Bit = ((RHDRegRead(rhdPtr, off + RV620_LVDS1_DATA_CNTL) + & RV62_LVDS_24BIT_ENABLE) != 0); + + tmp = RHDRegRead(rhdPtr, RV620_LVTMA_BL_MOD_CNTL); + if (tmp & LVTMA_BL_MOD_EN) + Private->BlLevel = ( tmp >> LVTMA_BL_MOD_LEVEL_SHIFT ) & 0xff; + else + Private->BlLevel = -1; + + tmp = RHDRegRead(rhdPtr, RV620_LVTMA_PWRSEQ_REF_DIV); + tmp &= 0xffff; + tmp += 1; + tmp /= 1000; + Private->PowerSequenceDig2De = Private->PowerSequenceDe2Bl = + RHDRegRead(rhdPtr, RV620_LVTMA_PWRSEQ_REF_DIV); + Private->PowerSequenceDig2De = ((Private->PowerSequenceDig2De & 0xff) * tmp) / 10; + Private->PowerSequenceDe2Bl = (((Private->PowerSequenceDe2Bl >> 8) & 0xff) * tmp) / 10; + Private->OffDelay = RHDRegRead(rhdPtr, RV620_LVTMA_PWRSEQ_DELAY2); + Private->OffDelay *= tmp; + + /* This is really ugly! */ + { + CARD32 fmt_offset; + + tmp = RHDRegRead(rhdPtr, off + RV620_DIG1_CNTL); + fmt_offset = (tmp & RV62_DIG_SOURCE_SELECT) ? FMT2_OFFSET :0; + tmp = RHDRegRead(rhdPtr, fmt_offset + RV620_FMT1_BIT_DEPTH_CONTROL); + Private->FMTDither.LVDSSpatialDither = ((tmp & 0x100) != 0); + Private->FMTDither.LVDSGreyLevel = ((tmp & 0x10000) != 0); + Private->FMTDither.LVDSTemporalDither + = (Private->FMTDither.LVDSGreyLevel > 0) || ((tmp & 0x1000000) != 0); + } + +#ifdef ATOM_BIOS + { + AtomBiosArgRec data; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_FPDI, &data) == ATOM_SUCCESS) + Private->FPDI = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_DUALLINK, &data) == ATOM_SUCCESS) + Private->RunDualLink = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_GREYLVL, &data) == ATOM_SUCCESS) + Private->FMTDither.LVDSGreyLevel = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SEQ_DIG_ONTO_DE, &data) == ATOM_SUCCESS) + Private->PowerSequenceDig2De = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SEQ_DE_TO_BL, &data) == ATOM_SUCCESS) + Private->PowerSequenceDe2Bl = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_OFF_DELAY, &data) == ATOM_SUCCESS) + Private->OffDelay = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_24BIT, &data) == ATOM_SUCCESS) + Private->FMTDither.LVDS24Bit = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SPATIAL_DITHER, &data) == ATOM_SUCCESS) + Private->FMTDither.LVDSSpatialDither = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_TEMPORAL_DITHER, &data) == ATOM_SUCCESS) + Private->FMTDither.LVDSTemporalDither = data.val; + + Private->PowerSequenceDe2Bl = data.val; + + } +#endif + +} + +/* + * Infrastructure + */ + +static ModeStatus +DigModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct transmitter *Transmitter = &Private->Transmitter; + struct encoder *Encoder = &Private->Encoder; + ModeStatus Status; + + RHDFUNC(Output); + + if ((Status = Transmitter->ModeValid(Output, Mode)) == MODE_OK) + return ((Encoder->ModeValid(Output, Mode))); + else + return Status; +} + +/* + * + */ +static void +DigPower(struct rhdOutput *Output, int Power) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct transmitter *Transmitter = &Private->Transmitter; + struct encoder *Encoder = &Private->Encoder; + + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); + + switch (Power) { + case RHD_POWER_ON: + Encoder->Power(Output, Power); + Transmitter->Power(Output, Power); + RHDHdmiEnable(Private->Hdmi, Private->EncoderMode == TMDS_HDMI); + return; + case RHD_POWER_RESET: + Transmitter->Power(Output, Power); + Encoder->Power(Output, Power); + return; + case RHD_POWER_SHUTDOWN: + default: + Transmitter->Power(Output, Power); + Encoder->Power(Output, Power); + RHDHdmiEnable(Private->Hdmi, FALSE); + return; + } +} + +/* + * + */ +static Bool +DigPropertyControl(struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + + RHDFUNC(Output); + + switch(Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_BACKLIGHT: + case RHD_OUTPUT_HDMI: + case RHD_OUTPUT_AUDIO_WORKAROUND: + { + if (!Private->Transmitter.Property) + return FALSE; + return Private->Transmitter.Property(Output, Action, Property, val); + } + default: + return FALSE; + } + return TRUE; +} + + +/* + * + */ +static void +DigMode(struct rhdOutput *Output, DisplayModePtr Mode) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct transmitter *Transmitter = &Private->Transmitter; + struct encoder *Encoder = &Private->Encoder; + struct rhdCrtc *Crtc = Output->Crtc; + + RHDFUNC(Output); + + Private->Mode = Mode; + + /* + * For dual link capable DVI we need to decide from the pix clock if we are dual link. + * Do it here as it is convenient. + */ + if (Output->Connector->Type == RHD_CONNECTOR_DVI) + Private->RunDualLink = (Mode->SynthClock > 165000) ? TRUE : FALSE; + + Encoder->Mode(Output, Crtc, Mode); + Transmitter->Mode(Output, Crtc, Mode); + RHDHdmiSetMode(Private->Hdmi, Mode); +} + +/* + * + */ +static void +DigSave(struct rhdOutput *Output) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct transmitter *Transmitter = &Private->Transmitter; + struct encoder *Encoder = &Private->Encoder; + + RHDFUNC(Output); + + Encoder->Save(Output); + Transmitter->Save(Output); + RHDHdmiSave(Private->Hdmi); +} + +/* + * + */ +static void +DigRestore(struct rhdOutput *Output) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct transmitter *Transmitter = &Private->Transmitter; + struct encoder *Encoder = &Private->Encoder; + + RHDFUNC(Output); + + Encoder->Restore(Output); + Transmitter->Restore(Output); + RHDHdmiRestore(Private->Hdmi); +} + +/* + * + */ +static void +DigDestroy(struct rhdOutput *Output) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + struct transmitter *Transmitter = &Private->Transmitter; + struct encoder *Encoder = &Private->Encoder; + + RHDFUNC(Output); + + Encoder->Destroy(Output); + Transmitter->Destroy(Output); + RHDHdmiDestroy(Private->Hdmi); + if (Transmitter->PropertyPrivate) + RhdAtomDestroyBacklightControlProperty(Output, Transmitter->PropertyPrivate); + xfree(Private); + Output->Private = NULL; +} + +/* + * + */ +static Bool +DigAllocFree(struct rhdOutput *Output, enum rhdOutputAllocation Alloc) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + char *TransmitterName; + + RHDFUNC(rhdPtr); + + switch (Output->Id) { + case RHD_OUTPUT_KLDSKP_LVTMA: + TransmitterName = "KLDSKP_LVTMA"; + break; + case RHD_OUTPUT_UNIPHYA: + TransmitterName = "UNIPHYA"; + break; + case RHD_OUTPUT_UNIPHYB: + TransmitterName = "UNIPHYB"; + break; + default: + return FALSE; + } + switch (Alloc) { + case RHD_OUTPUT_ALLOC: + + if (Private->EncoderID != ENCODER_NONE) + return TRUE; + + /* + * LVTMA can only use DIG2. Thus exclude + * DIG1 for LVTMA and prefer it for the + * UNIPHYs. + */ + if (Output->Id == RHD_OUTPUT_KLDSKP_LVTMA) { + if (!rhdPtr->DigEncoderOutput[1]) { + rhdPtr->DigEncoderOutput[1] = Output; + Private->EncoderID = ENCODER_DIG2; + xf86DrvMsg(Output->scrnIndex, X_INFO, + "Mapping DIG2 encoder to %s\n",TransmitterName); + return TRUE; + } else + return FALSE; + } else +#if defined(ATOM_BIOS) && defined(ATOM_BIOS_PARSER) + { + struct ATOMTransmitterPrivate *transPrivate = + (struct ATOMTransmitterPrivate *)Private->Transmitter.Private; + struct atomTransmitterConfig *atc = &transPrivate->atomTransmitterConfig; + if (!rhdPtr->DigEncoderOutput[0]) { + rhdPtr->DigEncoderOutput[0] = Output; + Private->EncoderID = ENCODER_DIG1; + atc->Encoder = atomEncoderDIG1; + xf86DrvMsg(Output->scrnIndex, X_INFO, + "Mapping DIG1 encoder to %s\n",TransmitterName); + return TRUE; + } else if (!rhdPtr->DigEncoderOutput[1]) { + rhdPtr->DigEncoderOutput[1] = Output; + Private->EncoderID = ENCODER_DIG2; + atc->Encoder = atomEncoderDIG2; + xf86DrvMsg(Output->scrnIndex, X_INFO, + "Mapping DIG2 encoder to %s\n",TransmitterName); + return TRUE; + } else + return FALSE; + } +#else + return FALSE; +#endif + case RHD_OUTPUT_FREE: + Private->EncoderID = ENCODER_NONE; + if (rhdPtr->DigEncoderOutput[0] == Output) { + rhdPtr->DigEncoderOutput[0] = NULL; + return TRUE; + } else if (rhdPtr->DigEncoderOutput[1] == Output) { + rhdPtr->DigEncoderOutput[1] = NULL; + return TRUE; + } else + return FALSE; + break; + default: + return FALSE; + } +} + +/* + * + */ +static Bool +digTransmitterPropertyWrapper(struct rhdOutput *Output, + enum rhdPropertyAction Action, + enum rhdOutputProperty Property, + union rhdPropertyData *val) +{ + struct DIGPrivate *Private = (struct DIGPrivate *)Output->Private; + void *storePrivate = Output->Private; + Bool (*func)(struct rhdOutput *,enum rhdPropertyAction, enum rhdOutputProperty, + union rhdPropertyData *) = Private->Transmitter.WrappedPropertyCallback; + Bool ret; + + Output->Private = Private->Transmitter.PropertyPrivate; + ret = func(Output, Action, Property, val); + Output->Private = storePrivate; + + return ret; +} + +/* + * + */ +struct rhdOutput * +RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType, CARD8 ConnectorType) +{ + struct rhdOutput *Output; + struct DIGPrivate *Private; + struct DIGEncoder *Encoder; + + RHDFUNC(rhdPtr); + + Output = xnfcalloc(sizeof(struct rhdOutput), 1); + + Output->scrnIndex = rhdPtr->scrnIndex; + Output->Id = outputType; + + Output->Sense = NULL; + Output->ModeValid = DigModeValid; + Output->Mode = DigMode; + Output->Power = DigPower; + Output->Save = DigSave; + Output->Restore = DigRestore; + Output->Destroy = DigDestroy; + Output->Property = DigPropertyControl; + Output->AllocFree = DigAllocFree; + + Private = xnfcalloc(sizeof(struct DIGPrivate), 1); + Output->Private = Private; + + Private->EncoderID = ENCODER_NONE; + + switch (outputType) { + case RHD_OUTPUT_UNIPHYA: +#if defined (ATOM_BIOS) && defined (ATOM_BIOS_PARSER) + Output->Name = "UNIPHY_A"; + Private->Transmitter.Private = + (struct ATOMTransmitterPrivate *)xnfcalloc(sizeof (struct ATOMTransmitterPrivate), 1); + + Private->Transmitter.Sense = NULL; + Private->Transmitter.ModeValid = ATOMTransmitterModeValid; + Private->Transmitter.Mode = ATOMTransmitterSet; + Private->Transmitter.Power = ATOMTransmitterPower; + Private->Transmitter.Save = ATOMTransmitterSave; + Private->Transmitter.Restore = ATOMTransmitterRestore; + Private->Transmitter.Destroy = ATOMTransmitterDestroy; + Private->Transmitter.Property = TMDSTransmitterPropertyControl; + { + struct ATOMTransmitterPrivate *transPrivate = + (struct ATOMTransmitterPrivate *)Private->Transmitter.Private; + struct atomTransmitterConfig *atc = &transPrivate->atomTransmitterConfig; + atc->Coherent = Private->Coherent = FALSE; + atc->Link = atomTransLinkA; + atc->Encoder = atomEncoderNone; + if (RHDIsIGP(rhdPtr->ChipSet)) { + AtomBiosArgRec data; + data.val = 1; + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_GET_PCIE_LANES, + &data) == ATOM_SUCCESS) + atc->Lanes = data.pcieLanes.Chassis; /* only do 'chassis' for now */ + else { + xfree(Private); + xfree(Output); + return NULL; + } + } + if (RHDIsIGP(rhdPtr->ChipSet)) + transPrivate->atomTransmitterID = atomTransmitterPCIEPHY; + else + transPrivate->atomTransmitterID = atomTransmitterUNIPHY; + } + break; +#else + xfree(Private); + xfree(Output); + return NULL; +#endif /* ATOM_BIOS && ATOM_BIOS_PARSER */ + + case RHD_OUTPUT_UNIPHYB: +#if defined (ATOM_BIOS) && defined (ATOM_BIOS_PARSER) + Output->Name = "UNIPHY_B"; + Private->Transmitter.Private = + (struct atomTransmitterPrivate *)xnfcalloc(sizeof (struct ATOMTransmitterPrivate), 1); + + Private->Transmitter.Sense = NULL; + Private->Transmitter.ModeValid = ATOMTransmitterModeValid; + Private->Transmitter.Mode = ATOMTransmitterSet; + Private->Transmitter.Power = ATOMTransmitterPower; + Private->Transmitter.Save = ATOMTransmitterSave; + Private->Transmitter.Restore = ATOMTransmitterRestore; + Private->Transmitter.Destroy = ATOMTransmitterDestroy; + Private->Transmitter.Property = TMDSTransmitterPropertyControl; + { + struct ATOMTransmitterPrivate *transPrivate = + (struct ATOMTransmitterPrivate *)Private->Transmitter.Private; + struct atomTransmitterConfig *atc = &transPrivate->atomTransmitterConfig; + atc->Coherent = Private->Coherent = FALSE; + atc->Link = atomTransLinkB; + atc->Encoder = atomEncoderNone; + if (RHDIsIGP(rhdPtr->ChipSet)) { + AtomBiosArgRec data; + data.val = 2; + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_GET_PCIE_LANES, + &data) == ATOM_SUCCESS) + atc->Lanes = data.pcieLanes.Chassis; /* only do 'chassis' for now */ + else { + xfree(Private); + xfree(Output); + return NULL; + } + } + if (RHDIsIGP(rhdPtr->ChipSet)) + transPrivate->atomTransmitterID = atomTransmitterPCIEPHY; + else + transPrivate->atomTransmitterID = atomTransmitterUNIPHY; + } + break; +#else + xfree(Private); + xfree(Output); + return NULL; +#endif /* ATOM_BIOS && ATOM_BIOS_PARSER */ + + case RHD_OUTPUT_KLDSKP_LVTMA: + Output->Name = "UNIPHY_KLDSKP_LVTMA"; + Private->Coherent = FALSE; + Private->Transmitter.Private = + (struct LVTMATransmitterPrivate *)xnfcalloc(sizeof (struct LVTMATransmitterPrivate), 1); + Private->Transmitter.Sense = NULL; + Private->Transmitter.ModeValid = LVTMATransmitterModeValid; + if (ConnectorType != RHD_CONNECTOR_PANEL) { + Private->Transmitter.Mode = LVTMA_TMDSTransmitterSet; + Private->Transmitter.Power = LVTMA_TMDSTransmitterPower; + Private->Transmitter.Save = LVTMA_TMDSTransmitterSave; + Private->Transmitter.Restore = LVTMA_TMDSTransmitterRestore; + } else { + Private->Transmitter.Mode = LVTMA_LVDSTransmitterSet; + Private->Transmitter.Power = LVTMA_LVDSTransmitterPower; + Private->Transmitter.Save = LVTMA_LVDSTransmitterSave; + Private->Transmitter.Restore = LVTMA_LVDSTransmitterRestore; + } + Private->Transmitter.Destroy = LVTMATransmitterDestroy; + if (ConnectorType == RHD_CONNECTOR_PANEL) + Private->Transmitter.Property = LVDSTransmitterPropertyControl; + else + Private->Transmitter.Property = TMDSTransmitterPropertyControl; + break; + + default: + xfree(Private); + xfree(Output); + return NULL; + } + + + Encoder = (struct DIGEncoder *)(xnfcalloc(sizeof (struct DIGEncoder),1)); + Private->Encoder.Private = Encoder; + Private->Encoder.ModeValid = EncoderModeValid; + Private->Encoder.Mode = EncoderSet; + Private->Encoder.Power = EncoderPower; + Private->Encoder.Save = EncoderSave; + Private->Encoder.Restore = EncoderRestore; + Private->Encoder.Destroy = EncoderDestroy; + + switch (ConnectorType) { + case RHD_CONNECTOR_PANEL: + Private->EncoderMode = LVDS; + GetLVDSInfo(rhdPtr, Private); + if (Private->BlLevel >= 0) { + Private->SetBacklight = LVDSSetBacklight; + Private->GetBacklight = LVDSGetBacklight; + xf86DrvMsg(Output->scrnIndex,X_INFO, "Native Backlight Control found.\n"); + } else { + Private->BlLevel = RhdACPIGetBacklightControl(Output); + if (Private->BlLevel >= 0) { + xf86DrvMsg(Output->scrnIndex,X_INFO, "ACPI Backlight Control found.\n"); + Private->SetBacklight = RhdACPISetBacklightControl; + Private->GetBacklight = RhdACPIGetBacklightControl; + } +#ifdef ATOM_BIOS + else { + Private->BlLevel = RhdAtomSetupBacklightControlProperty( + Output, + &Private->Transmitter.WrappedPropertyCallback, + &Private->Transmitter.PropertyPrivate); + if (Private->Transmitter.PropertyPrivate) + Private->Transmitter.Property = digTransmitterPropertyWrapper; + xf86DrvMsg(Output->scrnIndex,X_INFO, + "Falling back to AtomBIOS controlled Backlight.\n"); + } +#endif + } + + Private->Hdmi = NULL; + break; + case RHD_CONNECTOR_DVI: + Private->RunDualLink = FALSE; /* will be set later acc to pxclk */ + Private->EncoderMode = TMDS_DVI; + Private->Hdmi = RHDHdmiInit(rhdPtr, Output); + break; + case RHD_CONNECTOR_DVI_SINGLE: + Private->RunDualLink = FALSE; + Private->EncoderMode = TMDS_DVI; /* changed later to HDMI if aplicateable */ + Private->Hdmi = RHDHdmiInit(rhdPtr, Output); + break; + } + + return Output; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_dri.c b/driver/xf86-video-radeonhd/src/rhd_dri.c new file mode 100644 index 000000000..27d328b68 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_dri.c @@ -0,0 +1,1995 @@ +/* + * Copyright 2000 ATI Technologies Inc., Markham, Ontario, + * Copyright 2000 VA Linux Systems Inc., Fremont, California. + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 Advanced Micro Devices, Inc. + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ + +/* + * Based on radeon_dri.c + * Original authors: + * Kevin E. Martin + * Rickard E. Faith + * Gareth Hughes + * Additional main authors: + * Dave Airlie + * Michel Dänzer + * Benjamin Herrenschmidt + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +/* X and server generic header files */ +#include "xf86.h" +#include "xaa.h" +#ifdef USE_EXA +# include "exa.h" +#endif +#include "xf86PciInfo.h" +#include "windowstr.h" + +/* GLX/DRI/DRM definitions */ +#define _XF86DRI_SERVER_ +#include "dri.h" +/* Workaround for header mismatches */ +#ifndef DEPRECATED +# define DEPRECATED __attribute__ ((deprecated)) +# define __user +#endif +#include "radeon_drm.h" +#include "GL/glxint.h" +#include "GL/glxtokens.h" +#include "sarea.h" + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +#endif + +/* Driver data structures */ +#include "rhd.h" +#include "rhd_regs.h" +#include "rhd_dri.h" +#include "r5xx_accel.h" +#include "r5xx_regs.h" +#include "r6xx_accel.h" +#include "rhd_cs.h" + +#define IS_RADEONHD_DRIVER 1 +#include "radeon_dri.h" + +#ifdef RANDR_12_SUPPORT /* FIXME check / move to rhd_randr.c */ +# include "xf86i2c.h" /* this is complete BS, stop using unnamed structs! */ +# include "xf86Crtc.h" +#endif + + +/* DRI Driver defaults */ +#define RHD_DEFAULT_GART_SIZE 16 /* MB (must be 2^n and > 4MB) */ +#define RHD_DEFAULT_RING_SIZE 2 /* MB (must be page aligned) */ +#define RHD_DEFAULT_BUFFER_SIZE 2 /* MB (must be page aligned) */ +#define RHD_DEFAULT_CP_TIMEOUT 100000 /* usecs */ +#define RHD_DEFAULT_PCI_APER_SIZE 32 /* in MB */ + +#define RADEON_MAX_DRAWABLES 256 + +#define RADEON_DRIAPI_VERSION_MAJOR 4 +#define RADEON_DRIAPI_VERSION_MAJOR_TILED 5 +#define RADEON_DRIAPI_VERSION_MINOR 3 +#define RADEON_DRIAPI_VERSION_PATCH 0 + +#define RHD_IDLE_RETRY 16 /* Fall out of idle loops after this count */ + +/* awkward... */ +#define PIXEL_CODE(x) (x->bitsPerPixel != 16 ? x->bitsPerPixel : x->depth) + +typedef struct { + /* Nothing here yet */ + int dummy; +} RADEONConfigPrivRec, *RADEONConfigPrivPtr; + +typedef struct { + /* Nothing here yet */ + int dummy; +} RADEONDRIContextRec, *RADEONDRIContextPtr; + +/* driver data only needed by dri */ +struct rhdDri { + int scrnIndex; + + /* FIXME: Some Save&Restore is still a TODO + * Need to save/restore/update GEN_INT_CNTL (interrupts) on drm init. + * AGP_BASE, MC_FB_LOCATION, MC_AGP_LOCATION are (partially) handled + * in _mc.c */ + + int pixel_code; + + DRIInfoPtr pDRIInfo; + int drmFD; + int numVisualConfigs; + __GLXvisualConfig *pVisualConfigs; + RADEONConfigPrivPtr pVisualConfigsPriv; + + drm_handle_t registerHandle; + drm_handle_t pciMemHandle; + int irq; + + int have3Dwindows; + + drmSize gartSize; + drm_handle_t agpMemHandle; /* Handle from drmAgpAlloc */ + unsigned long gartOffset; + int agpMode; + + /* CP ring buffer data */ + unsigned long ringStart; /* Offset into GART space */ + drm_handle_t ringHandle; /* Handle from drmAddMap */ + drmSize ringMapSize; /* Size of map */ + int ringSize; /* Size of ring (in MB) */ + drmAddress ring; /* Map */ + int ringSizeLog2QW; + + /* TODO: what is r/o ring space for (1 page) */ + unsigned long ringReadOffset; /* Offset into GART space */ + drm_handle_t ringReadPtrHandle; /* Handle from drmAddMap */ + drmSize ringReadMapSize; /* Size of map */ + drmAddress ringReadPtr; /* Map */ + + /* CP vertex/indirect buffer data */ + unsigned long bufStart; /* Offset into GART space */ + drm_handle_t bufHandle; /* Handle from drmAddMap */ + drmSize bufMapSize; /* Size of map */ + int bufSize; /* Size of buffers (in MB) */ + drmAddress buf; /* Map */ + int bufNumBufs; /* Number of buffers */ + drmBufMapPtr buffers; /* Buffer map */ + + /* CP GART Texture data */ + unsigned long gartTexStart; /* Offset into GART space */ + drm_handle_t gartTexHandle; /* Handle from drmAddMap */ + drmSize gartTexMapSize; /* Size of map */ + int gartTexSize; /* Size of GART tex space (in MB) */ + drmAddress gartTex; /* Map */ + int log2GARTTexGran; + + /* DRI screen private data */ + int frontOffset; + int frontPitch; + int backOffset; + int backPitch; + int depthOffset; + int depthPitch; + int depthBits; + int textureOffset; + int textureSize; + int log2TexGran; + + int pciGartSize; + CARD32 pciGartOffset; + void *pciGartBackup; + + CARD32 gartLocation; +}; + +static size_t radeon_drm_page_size; +static char *dri_driver_name = "radeon"; +static char *r300_driver_name = "r300"; +static char *r600_driver_name = "r600"; + + +extern void GlxSetVisualConfigs(int nconfigs, __GLXvisualConfig *configs, + void **configprivs); + + +static void RHDDRIAllocatePCIGARTTable(ScrnInfoPtr pScrn); +static int RHDDRIGetPciAperTableSize(ScrnInfoPtr pScrn); +static int RHDDRISetParam(ScrnInfoPtr pScrn, + unsigned int param, int64_t value); +static void RHDDRITransitionTo2d(ScreenPtr pScreen); +static void RHDDRITransitionTo3d(ScreenPtr pScreen); +static void RHDDRITransitionMultiToSingle3d(ScreenPtr pScreen); +static void RHDDRITransitionSingleToMulti3d(ScreenPtr pScreen); + + +/* Compute log base 2 of val */ +static __inline__ int RHDMinBits(int val) +{ + int bits; + + if (!val) return 1; + for (bits = 0; val; val >>= 1, ++bits); + return bits; +} + +/* Initialize the visual configs that are supported by the hardware. + * These are combined with the visual configs that the indirect + * rendering core supports, and the intersection is exported to the + * client. */ +static Bool RHDInitVisualConfigs(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + struct rhdDri *rhdDRI = RHDPTR(pScrn)->dri; + int numConfigs = 0; + __GLXvisualConfig *pConfigs = 0; + RADEONConfigPrivPtr pRADEONConfigs = 0; + RADEONConfigPrivPtr *pRADEONConfigPtrs = 0; + int i, accum, stencil, db; + int pixel_code = PIXEL_CODE(pScrn); + RHDFUNC(pScrn); + +#define RHD_USE_ACCUM 1 +#define RHD_USE_STENCIL 1 +#define RHD_USE_DB 1 + + switch (pixel_code) { + + case 16: + case 32: + numConfigs = 1; + if (RHD_USE_ACCUM) numConfigs *= 2; + if (RHD_USE_STENCIL) numConfigs *= 2; + if (RHD_USE_DB) numConfigs *= 2; + + if (!(pConfigs + = (__GLXvisualConfig *)xcalloc(sizeof(__GLXvisualConfig), + numConfigs))) { + return FALSE; + } + if (!(pRADEONConfigs + = (RADEONConfigPrivPtr)xcalloc(sizeof(RADEONConfigPrivRec), + numConfigs))) { + xfree(pConfigs); + return FALSE; + } + if (!(pRADEONConfigPtrs + = (RADEONConfigPrivPtr *)xcalloc(sizeof(RADEONConfigPrivPtr), + numConfigs))) { + xfree(pConfigs); + xfree(pRADEONConfigs); + return FALSE; + } + + i = 0; + for (db = RHD_USE_DB; db >= 0; db--) { + for (accum = 0; accum <= RHD_USE_ACCUM; accum++) { + for (stencil = 0; stencil <= RHD_USE_STENCIL; stencil++) { + pRADEONConfigPtrs[i] = &pRADEONConfigs[i]; + + pConfigs[i].vid = (VisualID)(-1); + pConfigs[i].class = -1; + pConfigs[i].rgba = TRUE; + if (pixel_code == 32) { + pConfigs[i].redSize = 8; + pConfigs[i].greenSize = 8; + pConfigs[i].blueSize = 8; + pConfigs[i].alphaSize = 8; + pConfigs[i].redMask = 0x00FF0000; + pConfigs[i].greenMask = 0x0000FF00; + pConfigs[i].blueMask = 0x000000FF; + pConfigs[i].alphaMask = 0xFF000000; + } else { + pConfigs[i].redSize = 5; + pConfigs[i].greenSize = 6; + pConfigs[i].blueSize = 5; + pConfigs[i].redMask = 0x0000F800; + pConfigs[i].greenMask = 0x000007E0; + pConfigs[i].blueMask = 0x0000001F; + } + if (accum) { /* Simulated in software */ + pConfigs[i].accumRedSize = 16; + pConfigs[i].accumGreenSize = 16; + pConfigs[i].accumBlueSize = 16; + if (pixel_code == 32) + pConfigs[i].accumAlphaSize = 16; + } + pConfigs[i].doubleBuffer = db; + pConfigs[i].bufferSize = pixel_code; + pConfigs[i].depthSize = rhdDRI->depthBits; + if (stencil) + pConfigs[i].stencilSize = 8; + if (accum || + (pConfigs[i].stencilSize && pConfigs[i].depthSize != 24)) + pConfigs[i].visualRating = GLX_SLOW_CONFIG; + else + pConfigs[i].visualRating = GLX_NONE; + pConfigs[i].transparentPixel = GLX_NONE; + i++; + } + } + } + break; + + default: + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] RHDInitVisualConfigs failed " + "(depth %d not supported). " + "Disabling DRI.\n", pixel_code); + return FALSE; + } + + rhdDRI->numVisualConfigs = numConfigs; + rhdDRI->pVisualConfigs = pConfigs; + rhdDRI->pVisualConfigsPriv = pRADEONConfigs; + GlxSetVisualConfigs(numConfigs, pConfigs, (void**)pRADEONConfigPtrs); + return TRUE; +} + +/* Create the Radeon-specific context information */ +static Bool RHDCreateContext(ScreenPtr pScreen, VisualPtr visual, + drm_context_t hwContext, void *pVisualConfigPriv, + DRIContextType contextStore) +{ + return TRUE; +} + +/* Destroy the Radeon-specific context information */ +static void RHDDestroyContext(ScreenPtr pScreen, drm_context_t hwContext, + DRIContextType contextStore) +{ +} + +/* + * + */ +void +RHDDRIContextClaim(ScrnInfoPtr pScrn) +{ + drm_radeon_sarea_t *pSAREAPriv = + (drm_radeon_sarea_t *) DRIGetSAREAPrivate(pScrn->pScreen); + + pSAREAPriv->ctx_owner = DRIGetContext(pScrn->pScreen); +} + +/* Called when the X server is woken up to allow the last client's + * context to be saved and the X server's context to be loaded. This is + * not necessary for the Radeon since the client detects when it's + * context is not currently loaded and then load's it itself. Since the + * registers to start and stop the CP are privileged, only the X server + * can start/stop the engine. */ +static void RHDEnterServer(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RhdCS *CS = rhdPtr->CS; + drm_radeon_sarea_t *pSAREAPriv; + +#ifdef USE_EXA + if (rhdPtr->EXAInfo) + exaMarkSync(pScrn->pScreen); +#endif + + pSAREAPriv = (drm_radeon_sarea_t *)DRIGetSAREAPrivate(pScreen); + if (pSAREAPriv->ctx_owner != (signed) DRIGetContext(pScreen)) { + if (rhdPtr->ChipSet < RHD_R600) { + struct R5xx3D *R5xx3D = rhdPtr->ThreeDPrivate; + + if (CS->Clean != RHD_CS_CLEAN_QUEUED) { + R5xxDstCacheFlush(CS); + R5xxZCacheFlush(CS); + R5xxEngineWaitIdleFull(CS); + + CS->Clean = RHD_CS_CLEAN_QUEUED; + } + + if (R5xx3D) + R5xx3D->XHas3DEngineState = FALSE; + } else { + struct r6xx_accel_state *accel_state = rhdPtr->TwoDPrivate; + + if (CS->Clean != RHD_CS_CLEAN_QUEUED) { + R6xxCacheFlush(CS); + R6xxEngineWaitIdleFull(CS); + + CS->Clean = RHD_CS_CLEAN_QUEUED; + } + + if (accel_state) + accel_state->XHas3DEngineState = FALSE; + } + } else { + /* if the engine has been untouched, we need to track this too. */ + if (CS->Clean != RHD_CS_CLEAN_QUEUED) + CS->Clean = RHD_CS_CLEAN_UNTOUCHED; + } +} + +/* Called when the X server goes to sleep to allow the X server's + * context to be saved and the last client's context to be loaded. This + * is not necessary for the Radeon since the client detects when it's + * context is not currently loaded and then load's it itself. Since the + * registers to start and stop the CP are privileged, only the X server + * can start/stop the engine. */ +static void RHDLeaveServer(ScreenPtr pScreen) +{ + struct RhdCS *CS = RHDPTR(xf86Screens[pScreen->myNum])->CS; + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + /* The CP is always running, but if we've generated any CP commands + * we must flush them to the kernel module now. */ + if (CS->Clean == RHD_CS_CLEAN_DONE) { + if (rhdPtr->ChipSet >= RHD_R600) { + R6xxCacheFlush(CS); + } else { + R5xxDstCacheFlush(CS); + R5xxZCacheFlush(CS); + } + + RHDCSFlush(CS); /* was a Release... */ + + CS->Clean = RHD_CS_CLEAN_DIRTY; + } +} + +/* Contexts can be swapped by the X server if necessary. This callback + * is currently only used to perform any functions necessary when + * entering or leaving the X server, and in the future might not be + * necessary. */ +static void RHDDRISwapContext(ScreenPtr pScreen, DRISyncType syncType, + DRIContextType oldContextType, + void *oldContext, + DRIContextType newContextType, + void *newContext) +{ + /* is this the right place to check this? Because SwapContext is still being + called when we already switched away. --libv */ + if (!xf86Screens[pScreen->myNum]->vtSema) + return; + + if ((syncType==DRI_3D_SYNC) && (oldContextType==DRI_2D_CONTEXT) && + (newContextType==DRI_2D_CONTEXT)) { /* Entering from Wakeup */ + RHDEnterServer(pScreen); + } + + if ((syncType==DRI_2D_SYNC) && (oldContextType==DRI_NO_CONTEXT) && + (newContextType==DRI_2D_CONTEXT)) { /* Exiting from Block Handler */ + RHDLeaveServer(pScreen); + } +} + +/* Initialize the state of the back and depth buffers */ +static void RHDDRIInitBuffers(WindowPtr pWin, RegionPtr prgn, CARD32 indx) +{ + /* NOOP. There's no need for the 2d driver to be clearing buffers + * for the 3d client. It knows how to do that on its own. + */ +} + +/* Copy the back and depth buffers when the X server moves a window */ +static void RHDDRIMoveBuffers(WindowPtr pParent, DDXPointRec ptOldOrg, + RegionPtr prgnSrc, CARD32 indx) +{ + /* TODO: ATM we do not move window contents at all - back+z buffers should + * be moved, but we need full cp support & varying-pitch + varying-tiled + * screen-to-screen copy for that. + * Nobody will probably notice that anyways (not with games or video + * players, which constantly update their window contents anyway). Doesn't + * work with EXA with radeon either. + * Alternative: create Expose events for this region */ +} + +static void RHDDRIInitGARTValues(struct rhdDri * rhdDRI) +{ + int s, l; + + RHDFUNC(rhdDRI); + + rhdDRI->gartOffset = 0; + + /* Initialize the CP ring buffer data */ + rhdDRI->ringStart = rhdDRI->gartOffset; + rhdDRI->ringMapSize = rhdDRI->ringSize*1024*1024 + radeon_drm_page_size; + rhdDRI->ringSizeLog2QW = RHDMinBits(rhdDRI->ringSize*1024*1024/8)-1; + + rhdDRI->ringReadOffset = rhdDRI->ringStart + rhdDRI->ringMapSize; + rhdDRI->ringReadMapSize = radeon_drm_page_size; + + /* Reserve space for vertex/indirect buffers */ + rhdDRI->bufStart = rhdDRI->ringReadOffset + rhdDRI->ringReadMapSize; + rhdDRI->bufMapSize = rhdDRI->bufSize*1024*1024; + + /* Reserve the rest for GART textures */ + rhdDRI->gartTexStart = rhdDRI->bufStart + rhdDRI->bufMapSize; + s = (rhdDRI->gartSize*1024*1024 - rhdDRI->gartTexStart); + l = RHDMinBits((s-1) / RADEON_NR_TEX_REGIONS); + if (l < RADEON_LOG_TEX_GRANULARITY) l = RADEON_LOG_TEX_GRANULARITY; + rhdDRI->gartTexMapSize = (s >> l) << l; + rhdDRI->log2GARTTexGran = l; +} + +/* Set AGP transfer mode according to requests and constraints */ +static Bool RHDSetAgpMode(struct rhdDri * rhdDRI) +{ + RHDPtr rhdPtr = RHDPTRI(rhdDRI); + unsigned long mode = drmAgpGetMode(rhdDRI->drmFD); /* Default mode */ + unsigned int vendor = drmAgpVendorId(rhdDRI->drmFD); + unsigned int device = drmAgpDeviceId(rhdDRI->drmFD); + + if (rhdPtr->ChipSet < RHD_R600) { + /* ignore agp 3.0 mode bit from the chip as it's buggy on some cards with + pcie-agp rialto bridge chip - use the one from bridge which must match */ + CARD32 agp_status = (RHDRegRead (rhdDRI, AGP_STATUS) | AGPv3_MODE) & mode; + Bool is_v3 = (agp_status & AGPv3_MODE); + + RHDFUNC(rhdDRI); + + if (is_v3) { + rhdDRI->agpMode = (agp_status & AGPv3_8X_MODE) ? 8 : 4; + } else { + if (agp_status & AGP_4X_MODE) + rhdDRI->agpMode = 4; + else if (agp_status & AGP_2X_MODE) + rhdDRI->agpMode = 2; + else + rhdDRI->agpMode = 1; + } + xf86DrvMsg(rhdDRI->scrnIndex, X_DEFAULT, "Using AGP %dx\n", rhdDRI->agpMode); + + mode &= ~AGP_MODE_MASK; + if (is_v3) { + /* only set one mode bit for AGPv3 */ + switch (rhdDRI->agpMode) { + case 8: mode |= AGPv3_8X_MODE; break; + case 4: default: mode |= AGPv3_4X_MODE; + } + } else { + switch (rhdDRI->agpMode) { + case 4: mode |= AGP_4X_MODE; + case 2: mode |= AGP_2X_MODE; + case 1: default: mode |= AGP_1X_MODE; + } + } + } else + rhdDRI->agpMode = 8; /* doesn't matter at this point */ + + xf86DrvMsg(rhdDRI->scrnIndex, X_INFO, + "[agp] Mode 0x%08lx [AGP 0x%04x/0x%04x]\n", + mode, vendor, device); + + if (drmAgpEnable(rhdDRI->drmFD, mode) < 0) { + xf86DrvMsg(rhdDRI->scrnIndex, X_ERROR, "[agp] AGP not enabled\n"); + drmAgpRelease(rhdDRI->drmFD); + return FALSE; + } + + return TRUE; +} + +/* Initialize Radeon's AGP registers */ +static void RHDSetAgpBase(struct rhdDri * rhdDRI) +{ + RHDPtr rhdPtr = RHDPTRI(rhdDRI); + + if (rhdPtr->ChipSet < RHD_R600) + RHDRegWrite (rhdDRI, AGP_BASE, drmAgpBase(rhdDRI->drmFD)); +} + +/* Initialize the AGP state. Request memory for use in AGP space, and + * initialize the Radeon registers to point to that memory. */ +static Bool RHDDRIAgpInit(struct rhdDri * rhdDRI, ScreenPtr pScreen) +{ + int ret; + + RHDFUNC(rhdDRI); + + if (drmAgpAcquire(rhdDRI->drmFD) < 0) { + xf86DrvMsg(pScreen->myNum, X_WARNING, "[agp] AGP not available\n"); + return FALSE; + } + + if (!RHDSetAgpMode(rhdDRI)) + return FALSE; + + RHDDRIInitGARTValues(rhdDRI); + + if ((ret = drmAgpAlloc(rhdDRI->drmFD, rhdDRI->gartSize*1024*1024, 0, NULL, + &rhdDRI->agpMemHandle)) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Out of memory (%d)\n", ret); + drmAgpRelease(rhdDRI->drmFD); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] %d kB allocated with handle 0x%08x\n", + rhdDRI->gartSize*1024, rhdDRI->agpMemHandle); + + if (drmAgpBind(rhdDRI->drmFD, + rhdDRI->agpMemHandle, rhdDRI->gartOffset) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not bind\n"); + drmAgpFree(rhdDRI->drmFD, rhdDRI->agpMemHandle); + drmAgpRelease(rhdDRI->drmFD); + return FALSE; + } + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->ringStart, rhdDRI->ringMapSize, + DRM_AGP, DRM_READ_ONLY, &rhdDRI->ringHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] Could not add ring mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] ring handle = 0x%08x\n", rhdDRI->ringHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->ringHandle, rhdDRI->ringMapSize, + &rhdDRI->ring) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[agp] Could not map ring\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] Ring mapped at 0x%08lx\n", + (unsigned long)rhdDRI->ring); + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->ringReadOffset, rhdDRI->ringReadMapSize, + DRM_AGP, DRM_READ_ONLY, &rhdDRI->ringReadPtrHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] Could not add ring read ptr mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] ring read ptr handle = 0x%08x\n", + rhdDRI->ringReadPtrHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->ringReadPtrHandle, rhdDRI->ringReadMapSize, + &rhdDRI->ringReadPtr) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] Could not map ring read ptr\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] Ring read ptr mapped at 0x%08lx\n", + (unsigned long)rhdDRI->ringReadPtr); + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->bufStart, rhdDRI->bufMapSize, + DRM_AGP, 0, &rhdDRI->bufHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] Could not add vertex/indirect buffers mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] vertex/indirect buffers handle = 0x%08x\n", + rhdDRI->bufHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->bufHandle, rhdDRI->bufMapSize, + &rhdDRI->buf) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] Could not map vertex/indirect buffers\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] Vertex/indirect buffers mapped at 0x%08lx\n", + (unsigned long)rhdDRI->buf); + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->gartTexStart, rhdDRI->gartTexMapSize, + DRM_AGP, 0, &rhdDRI->gartTexHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] Could not add GART texture map mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] GART texture map handle = 0x%08x\n", + rhdDRI->gartTexHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->gartTexHandle, rhdDRI->gartTexMapSize, + &rhdDRI->gartTex) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] Could not map GART texture map\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] GART Texture map mapped at 0x%08lx\n", + (unsigned long)rhdDRI->gartTex); + + RHDSetAgpBase(rhdDRI); + + return TRUE; +} + +/* Initialize the PCI GART state. Request memory for use in PCI space, + * and initialize the Radeon registers to point to that memory. */ +static Bool RHDDRIPciInit(struct rhdDri * rhdDRI, ScreenPtr pScreen) +{ + int ret; + int flags = DRM_READ_ONLY | DRM_LOCKED | DRM_KERNEL; + + RHDFUNC(rhdDRI); + + ret = drmScatterGatherAlloc(rhdDRI->drmFD, rhdDRI->gartSize*1024*1024, + &rhdDRI->pciMemHandle); + if (ret < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[pci] Out of memory (%d)\n", ret); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] %d kB allocated with handle 0x%08x\n", + rhdDRI->gartSize*1024, rhdDRI->pciMemHandle); + + RHDDRIInitGARTValues(rhdDRI); + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->ringStart, rhdDRI->ringMapSize, + DRM_SCATTER_GATHER, flags, &rhdDRI->ringHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] Could not add ring mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] ring handle = 0x%08x\n", rhdDRI->ringHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->ringHandle, rhdDRI->ringMapSize, + &rhdDRI->ring) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[pci] Could not map ring\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] Ring mapped at 0x%08lx\n", + (unsigned long)rhdDRI->ring); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] Ring contents 0x%08lx\n", + *(unsigned long *)(pointer)rhdDRI->ring); + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->ringReadOffset, rhdDRI->ringReadMapSize, + DRM_SCATTER_GATHER, flags, &rhdDRI->ringReadPtrHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] Could not add ring read ptr mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] ring read ptr handle = 0x%08x\n", + rhdDRI->ringReadPtrHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->ringReadPtrHandle, rhdDRI->ringReadMapSize, + &rhdDRI->ringReadPtr) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] Could not map ring read ptr\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] Ring read ptr mapped at 0x%08lx\n", + (unsigned long)rhdDRI->ringReadPtr); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] Ring read ptr contents 0x%08lx\n", + *(unsigned long *)(pointer)rhdDRI->ringReadPtr); + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->bufStart, rhdDRI->bufMapSize, + DRM_SCATTER_GATHER, 0, &rhdDRI->bufHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] Could not add vertex/indirect buffers mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] vertex/indirect buffers handle = 0x%08x\n", + rhdDRI->bufHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->bufHandle, rhdDRI->bufMapSize, + &rhdDRI->buf) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] Could not map vertex/indirect buffers\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] Vertex/indirect buffers mapped at 0x%08lx\n", + (unsigned long)rhdDRI->buf); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] Vertex/indirect buffers contents 0x%08lx\n", + *(unsigned long *)(pointer)rhdDRI->buf); + + if (drmAddMap(rhdDRI->drmFD, rhdDRI->gartTexStart, rhdDRI->gartTexMapSize, + DRM_SCATTER_GATHER, 0, &rhdDRI->gartTexHandle) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] Could not add GART texture map mapping\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] GART texture map handle = 0x%08x\n", + rhdDRI->gartTexHandle); + + if (drmMap(rhdDRI->drmFD, rhdDRI->gartTexHandle, rhdDRI->gartTexMapSize, + &rhdDRI->gartTex) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] Could not map GART texture map\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[pci] GART Texture map mapped at 0x%08lx\n", + (unsigned long)rhdDRI->gartTex); + + return TRUE; +} + +/* Add a map for the MMIO registers that will be accessed by any + * DRI-based clients. */ +static Bool RHDDRIMapInit(RHDPtr rhdPtr, ScreenPtr pScreen) +{ + struct rhdDri *rhdDRI = rhdPtr->dri; + + RHDFUNC(rhdPtr); + + /* Map registers */ + if (drmAddMap(rhdDRI->drmFD, + rhdPtr->MMIOPCIAddress, rhdPtr->MMIOMapSize, + DRM_REGISTERS, DRM_READ_ONLY, &rhdDRI->registerHandle) < 0) { + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] register handle = 0x%08x\n", rhdDRI->registerHandle); + + return TRUE; +} + +/* Initialize the kernel data structures */ +static int RHDDRIKernelInit(RHDPtr rhdPtr, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + struct rhdDri *rhdDRI = rhdPtr->dri; + int bytesPerPixel = pScrn->bitsPerPixel / 8; + drm_radeon_init_t drmInfo; + + RHDFUNC(rhdDRI); + + memset(&drmInfo, 0, sizeof(drm_radeon_init_t)); + if (rhdPtr->ChipSet >= RHD_R600) + drmInfo.func = RADEON_INIT_R600_CP; + else + drmInfo.func = RADEON_INIT_R300_CP; + + drmInfo.sarea_priv_offset = sizeof(XF86DRISAREARec); + drmInfo.is_pci = (rhdPtr->cardType != RHD_CARD_AGP); + drmInfo.cp_mode = R5XX_CSQ_PRIBM_INDBM; + drmInfo.gart_size = rhdDRI->gartSize*1024*1024; + drmInfo.ring_size = rhdDRI->ringSize*1024*1024; + drmInfo.usec_timeout = RHD_DEFAULT_CP_TIMEOUT; + + drmInfo.fb_bpp = PIXEL_CODE(pScrn); + drmInfo.depth_bpp = (rhdDRI->depthBits - 8) * 2; + + drmInfo.front_offset = rhdDRI->frontOffset; + drmInfo.front_pitch = rhdDRI->frontPitch * bytesPerPixel; + drmInfo.back_offset = rhdDRI->backOffset; + drmInfo.back_pitch = rhdDRI->backPitch * bytesPerPixel; + drmInfo.depth_offset = rhdDRI->depthOffset; + drmInfo.depth_pitch = rhdDRI->depthPitch * drmInfo.depth_bpp / 8; + + drmInfo.ring_offset = rhdDRI->ringHandle; + drmInfo.ring_rptr_offset = rhdDRI->ringReadPtrHandle; + drmInfo.buffers_offset = rhdDRI->bufHandle; + drmInfo.gart_textures_offset= rhdDRI->gartTexHandle; + + /* Make sure the MC has been set up before DRM_RADEON_CP_INIT is called */ + ASSERT((RHD_CHECKDEBUGFLAG(rhdPtr, MC_SETUP))); + + if (drmCommandWrite(rhdDRI->drmFD, DRM_RADEON_CP_INIT, + &drmInfo, sizeof(drm_radeon_init_t)) < 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, "[dri] CP_INIT failed\n"); + return FALSE; + } + + /* - FIXME: this is to be moved to rhd_cp + * - DRM_RADEON_CP_INIT does an engine reset, which resets some engine + * registers back to their default values, so we need to restore + * those engine register here. + * - R5xx2DSetup(pScrn); */ + + return TRUE; +} + +static void RHDDRIGartHeapInit(struct rhdDri * rhdDRI, ScreenPtr pScreen) +{ + drm_radeon_mem_init_heap_t drmHeap; + + RHDFUNC(rhdDRI); + + /* Start up the simple memory manager for GART space */ + drmHeap.region = RADEON_MEM_REGION_GART; + drmHeap.start = 0; + drmHeap.size = rhdDRI->gartTexMapSize; + + if (drmCommandWrite(rhdDRI->drmFD, DRM_RADEON_INIT_HEAP, + &drmHeap, sizeof(drmHeap))) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[drm] Failed to initialize GART heap manager\n"); + } else { + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] Initialized kernel GART heap manager, %d\n", + rhdDRI->gartTexMapSize); + } +} + +/* Add a map for the vertex buffers that will be accessed by any + * DRI-based clients. */ +static Bool RHDDRIBufInit(RHDPtr rhdPtr, ScreenPtr pScreen) +{ + struct rhdDri *rhdDRI = rhdPtr->dri; + + RHDFUNC(rhdPtr); + + /* Initialize vertex buffers */ + rhdDRI->bufNumBufs = drmAddBufs(rhdDRI->drmFD, + rhdDRI->bufMapSize / RADEON_BUFFER_SIZE, + RADEON_BUFFER_SIZE, + (rhdPtr->cardType != RHD_CARD_AGP) ? DRM_SG_BUFFER : DRM_AGP_BUFFER, + rhdDRI->bufStart); + + if (rhdDRI->bufNumBufs <= 0) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[drm] Could not create vertex/indirect buffers list\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] Added %d %d byte vertex/indirect buffers\n", + rhdDRI->bufNumBufs, RADEON_BUFFER_SIZE); + + if (!(rhdDRI->buffers = drmMapBufs(rhdDRI->drmFD))) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[drm] Failed to map vertex/indirect buffers list\n"); + return FALSE; + } + xf86DrvMsg(pScreen->myNum, X_INFO, + "[drm] Mapped %d vertex/indirect buffers\n", + rhdDRI->buffers->count); + + return TRUE; +} + +static void RHDDRIIrqInit(RHDPtr rhdPtr, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + struct rhdDri *rhdDRI = rhdPtr->dri; + + RHDFUNC(rhdPtr); + + if (!rhdDRI->irq) { + rhdDRI->irq = drmGetInterruptFromBusID( + rhdDRI->drmFD, + PCI_BUS(rhdPtr->PciInfo), + PCI_DEV(rhdPtr->PciInfo), + PCI_FUNC(rhdPtr->PciInfo)); + + if ((drmCtlInstHandler(rhdDRI->drmFD, rhdDRI->irq)) != 0) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[drm] failure adding irq handler, " + "there is a device already using that irq\n" + "[drm] falling back to irq-free operation\n"); + rhdDRI->irq = 0; + } else { +/* FIXME + rhdDRI->ModeReg->gen_int_cntl = RHDRegRead (rhdDRI, RADEON_GEN_INT_CNTL ); */ + } + } + + if (rhdDRI->irq) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[drm] dma control initialized, using IRQ %d\n", + rhdDRI->irq); +} + +/* + * Get the DRM version and do some basic useability checks of DRI + */ +static Bool +RHDDRIVersionCheck(RHDPtr rhdPtr) +{ + drmVersionPtr DrmVersion = NULL; + int major, minor, patch, fd; + char *busId; + + RHDFUNC(rhdPtr); + + /* Check that the GLX, DRI, and DRM modules have been loaded by testing + * for known symbols in each module. */ + if (!xf86LoaderCheckSymbol("GlxSetVisualConfigs")) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: symbol GlxSetVisualConfigs not available.\n", __func__); + return FALSE; + } + + if (!xf86LoaderCheckSymbol("drmAvailable")) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: symbol drmAvailable not available.\n", __func__); + return FALSE; + } + + if (!xf86LoaderCheckSymbol("DRIQueryVersion")) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: symbol DRIQueryVersion not available." + "(libdri.a is too old)\n", __func__); + return FALSE; + } + + /* Check the DRI version */ + DRIQueryVersion(&major, &minor, &patch); + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "Found libdri %d.%d.%d.\n", major, minor, patch); + + if (major != DRIINFO_MAJOR_VERSION) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: Version Mismatch: libdri >= %d.0.0 is needed.\n", + __func__, DRIINFO_MAJOR_VERSION); + return FALSE; + } + + /* Create a bus Id */ + if (xf86LoaderCheckSymbol("DRICreatePCIBusID")) { + busId = DRICreatePCIBusID(rhdPtr->PciInfo); + } else { + busId = xalloc(64); + sprintf(busId, "PCI:%d:%d:%d", PCI_BUS(rhdPtr->PciInfo), + PCI_DEV(rhdPtr->PciInfo), PCI_FUNC(rhdPtr->PciInfo)); + } + + /* Low level DRM open */ + fd = drmOpen(dri_driver_name, busId); + if (fd < 0) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: drmOpen(\"%s\", \"%s\") failed.\n", + __func__, dri_driver_name, busId); + xfree(busId); + return FALSE; + } + xfree(busId); + + /* Check the lib version */ + if (xf86LoaderCheckSymbol("drmGetLibVersion")) + DrmVersion = drmGetLibVersion(fd); + if (DrmVersion == NULL) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: drmGetLibVersion failed.\n", __func__); + drmClose(fd); + return FALSE; + } + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Found libdrm %d.%d.%d.\n", + DrmVersion->version_major, DrmVersion->version_minor, + DrmVersion->version_patchlevel); + + if ((DrmVersion->version_major != 1) || + ((DrmVersion->version_major == 1) && (DrmVersion->version_minor < 2))) { + /* incompatible drm library version */ + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Version Mismatch: " + "libdrm >= 1.2.0 is needed.\n", __func__); + drmFreeVersion(DrmVersion); + drmClose(fd); + return FALSE; + } + drmFreeVersion(DrmVersion); + DrmVersion = NULL; + + /* Get DRM version & close DRM */ + DrmVersion = drmGetVersion(fd); + drmClose(fd); + if (DrmVersion == NULL) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: drmGetVersion failed.\n", + __func__); + return FALSE; + } + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Found radeon drm %d.%d.%d.\n", + DrmVersion->version_major, DrmVersion->version_minor, + DrmVersion->version_patchlevel); + + /* Incompatible drm version */ + if ((DrmVersion->version_major < 1) || + ((DrmVersion->version_major == 1) && (DrmVersion->version_minor < 28))) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: Version Mismatch: " + "radeon drm >= 1.28.0 is needed.\n", __func__); + drmFreeVersion(DrmVersion); + return FALSE; + } + + drmFreeVersion(DrmVersion); + return TRUE; +} + +static Bool RHDDRISetVBlankInterrupt(ScrnInfoPtr pScrn, Bool on) +{ +#ifdef RADEON_SETPARAM_VBLANK_CRTC + struct rhdDri * rhdDRI = RHDPTR(pScrn)->dri; + int value = 0; + + RHDFUNC(rhdDRI); + + if (rhdDRI->irq) { + if (on) { + value = DRM_RADEON_VBLANK_CRTC1; + +#ifdef RANDR_12_SUPPORT /* FIXME check / move to rhd_randr.c */ + if (RHDPTR(pScrn)->randr) { + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); + if (xf86_config->num_crtc > 1 && xf86_config->crtc[1]->enabled) + value |= DRM_RADEON_VBLANK_CRTC2; + } +#endif + } + + if (RHDDRISetParam(pScrn, RADEON_SETPARAM_VBLANK_CRTC, value)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "RHD Vblank Crtc Setup Failed %d\n", value); + return FALSE; + } + } +#endif + return TRUE; +} + +/* PreInit */ +Bool RHDDRIPreInit(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI; + int pixel_code = PIXEL_CODE(pScrn); + + RHDFUNC(rhdPtr); + + rhdPtr->directRenderingEnabled = FALSE; + + if (!rhdPtr->useDRI.val.bool) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Direct rendering explicitly turned off.\n"); + return FALSE; + } + + if (xf86IsEntityShared(rhdPtr->pEnt->index)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Direct Rendering Disabled -- " + "Dual-head configuration is not working with " + "DRI at present.\n" + "Please use a RandR merged framebuffer setup if you " + "want Dual-head with DRI.\n"); + return FALSE; + } + + if (!RHDDRIVersionCheck(rhdPtr)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "%s: Version check failed. Disabling DRI.\n", __func__); + return FALSE; + } + + rhdDRI = xnfcalloc(1, sizeof(struct rhdDri)); + rhdDRI->scrnIndex = rhdPtr->scrnIndex; + rhdPtr->dri = rhdDRI; + + rhdDRI->gartSize = RHD_DEFAULT_GART_SIZE; + rhdDRI->ringSize = RHD_DEFAULT_RING_SIZE; + rhdDRI->bufSize = RHD_DEFAULT_BUFFER_SIZE; + + rhdDRI->drmFD = -1; + + rhdDRI->gartLocation = 0; + +#if 0 + if ((xf86GetOptValInteger(rhdPtr->Options, + OPTION_GART_SIZE, (int *)&(rhdDRI->gartSize))) || + (xf86GetOptValInteger(rhdPtr->Options, + OPTION_GART_SIZE_OLD, (int *)&(rhdDRI->gartSize)))) { + switch (rhdDRI->gartSize) { + case 4: + case 8: + case 16: + case 32: + case 64: + case 128: + case 256: + break; + + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Illegal GART size: %d MB\n", rhdDRI->gartSize); + xfree(rhdDRI); + return NULL; + } + } +#endif + + rhdDRI->gartTexSize = rhdDRI->gartSize - (rhdDRI->ringSize + rhdDRI->bufSize); + radeon_drm_page_size = getpagesize(); + + /* Only 16 and 32 color depths are supports currently. */ + if (pixel_code != 16 && pixel_code != 32) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[dri] RHDInitVisualConfigs failed " + "(depth %d not supported). " + "Disabling DRI.\n", pixel_code); + xfree(rhdDRI); + rhdPtr->dri = NULL; + return FALSE; + } + + /* Currently 32bpp pixel buffer implies 32bpp depth(+stencil). + * Same for 16bpp. */ + rhdDRI->depthBits = pScrn->depth; + + if (rhdPtr->AccelMethod == RHD_ACCEL_SHADOWFB) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "DRI conflicts with SHADOWFB\n"); + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + } + + return TRUE; +} + + +/* Allocate all framebuffer chunks. + * ATM this is still static. When this gets dynamic, it doesn't have to occure + * in PreInit at all any more */ +Bool RHDDRIAllocateBuffers(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = rhdPtr->dri; + int bytesPerPixel = pScrn->bitsPerPixel / 8; + int depthBytesPerPixel = (rhdDRI->depthBits == 24 ? 32 : rhdDRI->depthBits) / 8; + int size, depth_size; + unsigned int old_freeoffset, old_freesize; + + RHDFUNC(rhdPtr); + + size = pScrn->displayWidth * bytesPerPixel * pScrn->virtualY; + + old_freeoffset = rhdPtr->FbFreeStart; + old_freesize = rhdPtr->FbFreeSize; + + rhdDRI->frontPitch = pScrn->displayWidth; + rhdDRI->frontOffset = rhdPtr->FbScanoutStart; + + rhdDRI->backPitch = pScrn->displayWidth; + rhdDRI->backOffset = RHDAllocFb(rhdPtr, size, "DRI Back Buffer"); + + /* Due to tiling, the Z buffer pitch must be a multiple of 32 pixels, + * which is always the case if color tiling is used due to color pitch + * but not necessarily otherwise, and its height a multiple of 16 lines. */ + rhdDRI->depthPitch = ALIGN(pScrn->displayWidth,32); + depth_size = ALIGN(pScrn->virtualY, 16) * rhdDRI->depthPitch + * depthBytesPerPixel; + rhdDRI->depthOffset = RHDAllocFb(rhdPtr, depth_size, "DRI Depth Buffer"); + if (rhdDRI->backOffset == -1 || rhdDRI->depthOffset == -1) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "DRI: Failed allocating buffers, disabling\n"); + rhdPtr->FbFreeStart = old_freeoffset; + rhdPtr->FbFreeSize = old_freesize; + + /* so far we are called from PreInit(): if we fail we free the DRI struct */ + xfree(rhdPtr->dri); + rhdPtr->dri = NULL; + return FALSE; + } + + RHDDRIAllocatePCIGARTTable(pScrn); + + rhdDRI->textureSize = rhdPtr->FbFreeSize; + if (rhdDRI->textureSize > 0) { + int l = RHDMinBits((rhdDRI->textureSize-1) / RADEON_NR_TEX_REGIONS); + if (l < RADEON_LOG_TEX_GRANULARITY) + l = RADEON_LOG_TEX_GRANULARITY; + /* Round the texture size up to the nearest whole number of + * texture regions. Again, be greedy about this, don't + * round down. */ + rhdDRI->log2TexGran = l; + rhdDRI->textureSize = (rhdDRI->textureSize >> l) << l; + } else { + rhdDRI->textureSize = 0; + } + if (rhdDRI->textureSize < 512 * 1024) + /* Minimum texture size is for 2 256x256x32bpp textures */ + rhdDRI->textureSize = 0; + + if (rhdDRI->textureSize > 0) { + rhdDRI->textureOffset = RHDAllocFb(rhdPtr, rhdDRI->textureSize, + "DRI Textures"); + ASSERT(rhdDRI->textureOffset != -1); + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB GART aperture\n", rhdDRI->gartSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB for the ring buffer\n", rhdDRI->ringSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB for vertex/indirect buffers\n", rhdDRI->bufSize); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %d MB for GART textures\n", rhdDRI->gartTexSize); + + return TRUE; +} + + +/* Initialize the screen-specific data structures for the DRI and the + * Radeon. This is the main entry point to the device-specific + * initialization code. It calls device-independent DRI functions to + * create the DRI data structures and initialize the DRI state. */ +Bool RHDDRIScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = rhdPtr->dri; + DRIInfoPtr pDRIInfo; + RADEONDRIPtr pRADEONDRI; + + RHDFUNC(rhdPtr); + + /* Create the DRI data structure, and fill it in before calling the + * DRIScreenInit(). */ + if (!(pDRIInfo = DRICreateInfoRec())) return FALSE; + + rhdDRI->pDRIInfo = pDRIInfo; + pDRIInfo->drmDriverName = dri_driver_name; + + if (rhdPtr->ChipSet >= RHD_R600) + pDRIInfo->clientDriverName = r600_driver_name; + else + pDRIInfo->clientDriverName = r300_driver_name; + + if (xf86LoaderCheckSymbol("DRICreatePCIBusID")) { + pDRIInfo->busIdString = DRICreatePCIBusID(rhdPtr->PciInfo); + } else { + pDRIInfo->busIdString = xalloc(64); + sprintf(pDRIInfo->busIdString, + "PCI:%d:%d:%d", + PCI_BUS(rhdPtr->PciInfo), + PCI_DEV(rhdPtr->PciInfo), + PCI_FUNC(rhdPtr->PciInfo)); + } + pDRIInfo->ddxDriverMajorVersion = /* TODO rhdDRI->allowColorTiling ? + RADEON_VERSION_MAJOR_TILED : */ RADEON_DRIAPI_VERSION_MAJOR; + pDRIInfo->ddxDriverMinorVersion = RADEON_DRIAPI_VERSION_MINOR; + pDRIInfo->ddxDriverPatchVersion = RADEON_DRIAPI_VERSION_PATCH; + pDRIInfo->frameBufferPhysicalAddress = (void *) (size_t) rhdPtr->FbPCIAddress; + + pDRIInfo->frameBufferSize = rhdPtr->FbFreeStart + rhdPtr->FbFreeSize; + pDRIInfo->frameBufferStride = (pScrn->displayWidth * + pScrn->bitsPerPixel / 8); + pDRIInfo->ddxDrawableTableEntry = RADEON_MAX_DRAWABLES; + pDRIInfo->maxDrawableTableEntry = (SAREA_MAX_DRAWABLES + < RADEON_MAX_DRAWABLES + ? SAREA_MAX_DRAWABLES + : RADEON_MAX_DRAWABLES); + /* kill DRIAdjustFrame. We adjust sarea frame info ourselves to work + correctly with pageflip + mergedfb/color tiling */ + pDRIInfo->wrap.AdjustFrame = NULL; + + /* For now the mapping works by using a fixed size defined + * in the SAREA header */ + if (sizeof(XF86DRISAREARec)+sizeof(drm_radeon_sarea_t) > SAREA_MAX) { + ErrorF("Data does not fit in SAREA\n"); + RHDDRICloseScreen(pScreen); + return FALSE; + } + pDRIInfo->SAREASize = SAREA_MAX; + + if (!(pRADEONDRI = (RADEONDRIPtr)xcalloc(sizeof(RADEONDRIRec),1))) { + RHDDRICloseScreen(pScreen); + return FALSE; + } + + pDRIInfo->devPrivate = pRADEONDRI; + pDRIInfo->devPrivateSize = sizeof(RADEONDRIRec); + pDRIInfo->contextSize = sizeof(RADEONDRIContextRec); + + pDRIInfo->CreateContext = RHDCreateContext; + pDRIInfo->DestroyContext = RHDDestroyContext; + pDRIInfo->SwapContext = RHDDRISwapContext; + pDRIInfo->InitBuffers = RHDDRIInitBuffers; + pDRIInfo->MoveBuffers = RHDDRIMoveBuffers; + pDRIInfo->bufferRequests = DRI_ALL_WINDOWS; + pDRIInfo->TransitionTo2d = RHDDRITransitionTo2d; + pDRIInfo->TransitionTo3d = RHDDRITransitionTo3d; + pDRIInfo->TransitionSingleToMulti3D = RHDDRITransitionSingleToMulti3d; + pDRIInfo->TransitionMultiToSingle3D = RHDDRITransitionMultiToSingle3d; + + pDRIInfo->createDummyCtx = TRUE; + pDRIInfo->createDummyCtxPriv = FALSE; + + if (!DRIScreenInit(pScreen, pDRIInfo, &rhdDRI->drmFD)) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[dri] DRIScreenInit failed. Disabling DRI.\n"); + RHDDRICloseScreen(pScreen); + return FALSE; + } + + /* Initialize AGP */ + if (rhdPtr->cardType == RHD_CARD_AGP && + !RHDDRIAgpInit(rhdDRI, pScreen)) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[agp] AGP failed to initialize. Disabling the DRI.\n" ); + xf86DrvMsg(pScreen->myNum, X_INFO, + "[agp] You may want to make sure the agpgart kernel " + "module\nis loaded before the radeon kernel module.\n"); + RHDDRICloseScreen(pScreen); + return FALSE; + } + + /* Initialize PCI */ + if (rhdPtr->cardType != RHD_CARD_AGP && + !RHDDRIPciInit(rhdDRI, pScreen)) { + xf86DrvMsg(pScreen->myNum, X_ERROR, + "[pci] PCI failed to initialize. Disabling the DRI.\n" ); + RHDDRICloseScreen(pScreen); + return FALSE; + } + + /* DRIScreenInit doesn't add all the common mappings. Add additional + * mappings here. */ + if (!RHDDRIMapInit(rhdPtr, pScreen)) { + RHDDRICloseScreen(pScreen); + return FALSE; + } + + /* FIXME: When are these mappings unmapped? */ + if (!RHDInitVisualConfigs(pScreen)) { + RHDDRICloseScreen(pScreen); + return FALSE; + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[dri] Visual configs initialized\n"); + + /* Tell DRI about new memory map */ + if (RHDDRISetParam(pScrn, RADEON_SETPARAM_NEW_MEMMAP, 1) < 0) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "[drm] failed to enable new memory map\n"); + RHDDRICloseScreen(pScreen); + return FALSE; + } + + return TRUE; +} + +/* + * + */ +static int +RHDDRIGARTBaseGet(RHDPtr rhdPtr) +{ + struct rhdDri *Dri = rhdPtr->dri; + drm_radeon_getparam_t gp; + int gart_base; + + memset(&gp, 0, sizeof(gp)); + gp.param = RADEON_PARAM_GART_BASE; + gp.value = &gart_base; + + if (drmCommandWriteRead(Dri->drmFD, DRM_RADEON_GETPARAM, &gp, + sizeof(gp)) < 0) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: Failed to determine GART area MC location.\n", __func__); + return 0; + } else { + RHDDebug(rhdPtr->scrnIndex, "GART location: 0x%08X\n", gart_base); + return gart_base; + } +} + +/* Finish initializing the device-dependent DRI state, and call + * DRIFinishScreenInit() to complete the device-independent DRI + * initialization. + */ +Bool RHDDRIFinishScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = rhdPtr->dri; + drm_radeon_sarea_t *pSAREAPriv; + RADEONDRIPtr pRADEONDRI; + + RHDFUNC(rhdPtr); + + if (! rhdDRI) + return FALSE; + if (rhdPtr->cardType == RHD_CARD_PCIE) + { + if (RHDDRISetParam(pScrn, RADEON_SETPARAM_PCIGART_LOCATION, rhdDRI->pciGartOffset) < 0) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] failed set pci gart location\n"); + +#ifdef RADEON_SETPARAM_PCIGART_TABLE_SIZE + if (RHDDRISetParam(pScrn, RADEON_SETPARAM_PCIGART_TABLE_SIZE, rhdDRI->pciGartSize) < 0) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] failed set pci gart table size\n"); +#endif + } + RHDDebug(pScrn->scrnIndex, "DRI Finishing init !\n"); + + rhdDRI->pDRIInfo->driverSwapMethod = DRI_HIDE_X_CONTEXT; + + /* NOTE: DRIFinishScreenInit must be called before *DRIKernelInit + * because *DRIKernelInit requires that the hardware lock is held by + * the X server, and the first time the hardware lock is grabbed is + * in DRIFinishScreenInit. */ + if (!DRIFinishScreenInit(pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: DRIFinishScreenInit Failed.\n", __func__); + return RHDDRICloseScreen(pScreen); + } + + /* Initialize the kernel data structures */ + if (!RHDDRIKernelInit(rhdPtr, pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: RHDDRIKernelInit Failed.\n", __func__); + return RHDDRICloseScreen(pScreen); + } + + /* Initialize the vertex buffers list */ + if (!RHDDRIBufInit(rhdPtr, pScreen)) + return RHDDRICloseScreen(pScreen); + + /* Initialize IRQ */ + RHDDRIIrqInit(rhdPtr, pScreen); + + /* Initialize kernel GART memory manager */ + RHDDRIGartHeapInit(rhdDRI, pScreen); + + /* Initialize the SAREA private data structure */ + pSAREAPriv = (drm_radeon_sarea_t *)DRIGetSAREAPrivate(pScreen); + memset(pSAREAPriv, 0, sizeof(*pSAREAPriv)); + + pRADEONDRI = (RADEONDRIPtr)rhdDRI->pDRIInfo->devPrivate; + + pRADEONDRI->deviceID = rhdPtr->PciDeviceID; + pRADEONDRI->width = pScrn->virtualX; + pRADEONDRI->height = pScrn->virtualY; + pRADEONDRI->depth = pScrn->depth; + pRADEONDRI->bpp = pScrn->bitsPerPixel; + + pRADEONDRI->IsPCI = (rhdPtr->cardType != RHD_CARD_AGP); + pRADEONDRI->AGPMode = rhdDRI->agpMode; + + pRADEONDRI->frontOffset = rhdDRI->frontOffset; + pRADEONDRI->frontPitch = rhdDRI->frontPitch; + pRADEONDRI->backOffset = rhdDRI->backOffset; + pRADEONDRI->backPitch = rhdDRI->backPitch; + pRADEONDRI->depthOffset = rhdDRI->depthOffset; + pRADEONDRI->depthPitch = rhdDRI->depthPitch; + pRADEONDRI->textureOffset = rhdDRI->textureOffset; + pRADEONDRI->textureSize = rhdDRI->textureSize; + pRADEONDRI->log2TexGran = rhdDRI->log2TexGran; + + pRADEONDRI->registerHandle = rhdDRI->registerHandle; + pRADEONDRI->registerSize = rhdPtr->MMIOMapSize; + + pRADEONDRI->statusHandle = rhdDRI->ringReadPtrHandle; + pRADEONDRI->statusSize = rhdDRI->ringReadMapSize; + + pRADEONDRI->gartTexHandle = rhdDRI->gartTexHandle; + pRADEONDRI->gartTexMapSize = rhdDRI->gartTexMapSize; + pRADEONDRI->log2GARTTexGran = rhdDRI->log2GARTTexGran; + pRADEONDRI->gartTexOffset = rhdDRI->gartTexStart; + + pRADEONDRI->sarea_priv_offset = sizeof(XF86DRISAREARec); + + /* disable vblank at startup */ + RHDDRISetVBlankInterrupt (pScrn, FALSE); + + /* TODO: If RADEON_PARAM_GART_BASE is ever to be saved/restored, it has + * to be updated here. Same on EnterVT. */ + + rhdDRI->gartLocation = RHDDRIGARTBaseGet(rhdPtr); + + /* TODO: call drm's DRM_RADEON_GETPARAM in the EXA case, for accelerated + * DownloadFromScreen hook. Same on EnterVT. */ + + /* TODO: display buffer watermark calculation + * (radeon: legacy_crtc.c/InitDispBandwidth) + * Don't know the registers for r5xx & r6xx yet. + * Probably should be in _driver.c anyway. */ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Direct rendering enabled\n"); + + return TRUE; +} + +/* Reinit after vt switch / resume */ +void RHDDRIEnterVT(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = rhdPtr->dri; + int ret; + + RHDFUNC(rhdPtr); + + if (rhdDRI->drmFD == -1) + return; + + if (rhdPtr->cardType == RHD_CARD_AGP) { + if (!RHDSetAgpMode(rhdDRI)) + return; + RHDSetAgpBase(rhdDRI); + } + + /* TODO: maybe using CP_INIT instead of CP_RESUME is enough, so we wouldn't + * need an additional copy of the GART table in main memory. OTOH the table + * must be initialized but not allocated anew. */ + /* Restore the PCIE GART TABLE */ + if (rhdDRI->pciGartBackup) + memcpy((char *)rhdPtr->FbBase + rhdDRI->pciGartOffset, + rhdDRI->pciGartBackup, rhdDRI->pciGartSize); + + RHDDRISetVBlankInterrupt(pScrn, rhdDRI->have3Dwindows); + + if ( (ret = drmCommandNone(rhdDRI->drmFD, DRM_RADEON_CP_RESUME)) ) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: CP resume %d\n", __func__, ret); +} + +/* Stop all before vt switch / suspend */ +void RHDDRILeaveVT(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = rhdPtr->dri; + + RHDFUNC(rhdPtr); + + if (rhdDRI->drmFD == -1) + return; + + RHDDRISetVBlankInterrupt (pScrn, FALSE); + DRILock(pScrn->pScreen, 0); + + /* Backup the PCIE GART TABLE from fb memory */ + if (rhdDRI->pciGartBackup) + memcpy(rhdDRI->pciGartBackup, + (char*)rhdPtr->FbBase + rhdDRI->pciGartOffset, rhdDRI->pciGartSize); + + /* Make sure 3D clients will re-upload textures to video RAM */ + if (rhdDRI->textureSize) { + drm_radeon_sarea_t *pSAREAPriv = DRIGetSAREAPrivate(pScreen); + struct drm_tex_region *list = pSAREAPriv->tex_list[0]; + int age = ++pSAREAPriv->tex_age[0], i = 0; + do { + list[i].age = age; + i = list[i].next; + } while (i != 0); + } +} + +/* The screen is being closed, so clean up any state and free any + * resources used by the DRI. */ +/* This is Bool and returns FALSE always to ease cleanup */ +Bool RHDDRICloseScreen(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = rhdPtr->dri; + /* drm_radeon_init_t drmInfo; */ + drm_radeon_init_t drmInfo; + + RHDFUNC(pScrn); + + if (rhdDRI->irq) { + RHDDRISetVBlankInterrupt (pScrn, FALSE); + drmCtlUninstHandler(rhdDRI->drmFD); + rhdDRI->irq = 0; +/* rhdDRI->ModeReg->gen_int_cntl = 0; */ + } + + /* invalidate GART location for EXA */ + rhdDRI->gartLocation = 0; + + /* De-allocate vertex buffers */ + if (rhdDRI->buffers) { + drmUnmapBufs(rhdDRI->buffers); + rhdDRI->buffers = NULL; + } + + /* De-allocate all kernel resources */ + memset(&drmInfo, 0, sizeof(drm_radeon_init_t)); + drmInfo.func = RADEON_CLEANUP_CP; + drmCommandWrite(rhdDRI->drmFD, DRM_RADEON_CP_INIT, + &drmInfo, sizeof(drm_radeon_init_t)); + + /* De-allocate all GART resources */ + if (rhdDRI->gartTex) { + drmUnmap(rhdDRI->gartTex, rhdDRI->gartTexMapSize); + rhdDRI->gartTex = NULL; + } + if (rhdDRI->buf) { + drmUnmap(rhdDRI->buf, rhdDRI->bufMapSize); + rhdDRI->buf = NULL; + } + if (rhdDRI->ringReadPtr) { + drmUnmap(rhdDRI->ringReadPtr, rhdDRI->ringReadMapSize); + rhdDRI->ringReadPtr = NULL; + } + if (rhdDRI->ring) { + drmUnmap(rhdDRI->ring, rhdDRI->ringMapSize); + rhdDRI->ring = NULL; + } + if (rhdDRI->agpMemHandle != DRM_AGP_NO_HANDLE) { + drmAgpUnbind(rhdDRI->drmFD, rhdDRI->agpMemHandle); + drmAgpFree(rhdDRI->drmFD, rhdDRI->agpMemHandle); + rhdDRI->agpMemHandle = DRM_AGP_NO_HANDLE; + drmAgpRelease(rhdDRI->drmFD); + } + if (rhdDRI->pciMemHandle) { + drmScatterGatherFree(rhdDRI->drmFD, rhdDRI->pciMemHandle); + rhdDRI->pciMemHandle = 0; + } + if (rhdDRI->pciGartBackup) { + xfree(rhdDRI->pciGartBackup); + rhdDRI->pciGartBackup = NULL; + } + + /* De-allocate all DRI resources */ + DRICloseScreen(pScreen); + rhdDRI->drmFD = -1; + + /* De-allocate all DRI data structures */ + if (rhdDRI->pDRIInfo) { + if (rhdDRI->pDRIInfo->devPrivate) { + xfree(rhdDRI->pDRIInfo->devPrivate); + rhdDRI->pDRIInfo->devPrivate = NULL; + } + DRIDestroyInfoRec(rhdDRI->pDRIInfo); + rhdDRI->pDRIInfo = NULL; + } + if (rhdDRI->pVisualConfigs) { + xfree(rhdDRI->pVisualConfigs); + rhdDRI->pVisualConfigs = NULL; + } + if (rhdDRI->pVisualConfigsPriv) { + xfree(rhdDRI->pVisualConfigsPriv); + rhdDRI->pVisualConfigsPriv = NULL; + } + + rhdPtr->directRenderingEnabled = FALSE; + + return TRUE; +} + + +static void RHDDisablePageFlip(ScreenPtr pScreen) +{ + drm_radeon_sarea_t * pSAREAPriv = DRIGetSAREAPrivate(pScreen); + pSAREAPriv->pfState = 0; +} + +static void RHDDRITransitionSingleToMulti3d(ScreenPtr pScreen) +{ + RHDDisablePageFlip(pScreen); +} + +static void RHDDRITransitionMultiToSingle3d(ScreenPtr pScreen) +{ + /* Let the remaining 3d app start page flipping again + * RHDEnablePageFlip(pScreen); */ +} + +static void RHDDRITransitionTo3d(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + struct rhdDri *rhdDRI = RHDPTR(pScrn)->dri; + + rhdDRI->have3Dwindows = TRUE; +/* RHDChangeSurfaces(pScrn); *//* FIXME needed for tiling */ +/* RHDEnablePageFlip(pScreen); */ + + RHDDRISetVBlankInterrupt(pScrn, TRUE); +} + +static void RHDDRITransitionTo2d(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + struct rhdDri * rhdDRI = RHDPTR(pScrn)->dri; + drm_radeon_sarea_t * pSAREAPriv = DRIGetSAREAPrivate(pScreen); + + rhdDRI->have3Dwindows = FALSE; + + /* Try flipping back to the front page if necessary */ + if (pSAREAPriv->pfCurrentPage == 1) + drmCommandNone(rhdDRI->drmFD, DRM_RADEON_FLIP); + + /* Shut down shadowing if we've made it back to the front page */ + if (pSAREAPriv->pfCurrentPage == 0) { + RHDDisablePageFlip(pScreen); + } else { + xf86DrvMsg(pScreen->myNum, X_WARNING, + "[dri] RHDDRITransitionTo2d: " + "kernel failed to unflip buffers.\n"); + } +/* RHDChangeSurfaces(pScrn); */ + + RHDDRISetVBlankInterrupt(pScrn, FALSE); +} + +static int RHDDRIGetPciAperTableSize(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int page_size = getpagesize(); + int ret_size; + int num_pages; + + num_pages = (RHD_DEFAULT_PCI_APER_SIZE * 1024 * 1024) / page_size; + + if ((rhdPtr->ChipSet >= RHD_R600) || + (rhdPtr->ChipSet == RHD_RS600)) + ret_size = num_pages * sizeof(uint64_t); + else + ret_size = num_pages * sizeof(unsigned int); + + return ret_size; +} + +static void RHDDRIAllocatePCIGARTTable(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = RHDPTR(pScrn)->dri; + + RHDFUNC(rhdPtr); + + if (rhdPtr->cardType != RHD_CARD_PCIE) + return; + + rhdDRI->pciGartSize = RHDDRIGetPciAperTableSize(pScrn); + + if (rhdPtr->FbFreeSize < (unsigned) rhdDRI->pciGartSize) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Was not able to reserve %d kb for PCI GART\n", + rhdDRI->pciGartSize/1024); + return; + } + /* Allocate at end of FB, so it's not part of the general memory map */ + rhdDRI->pciGartOffset = rhdPtr->FbFreeStart + rhdPtr->FbFreeSize - rhdDRI->pciGartSize; + rhdPtr->FbFreeSize -= rhdDRI->pciGartSize; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "FB: Allocated GART table at offset 0x%08X (size = 0x%08X, end of FB)\n", + (unsigned int) rhdDRI->pciGartOffset, rhdDRI->pciGartSize); + rhdDRI->pciGartBackup = xalloc(rhdDRI->pciGartSize); +} + +static int RHDDRISetParam(ScrnInfoPtr pScrn, unsigned int param, int64_t value) +{ + drm_radeon_setparam_t radeonsetparam; + struct rhdDri * rhdDRI = RHDPTR(pScrn)->dri; + int ret; + + memset(&radeonsetparam, 0, sizeof(drm_radeon_setparam_t)); + radeonsetparam.param = param; + radeonsetparam.value = value; + ret = drmCommandWrite(rhdDRI->drmFD, DRM_RADEON_SETPARAM, + &radeonsetparam, sizeof(drm_radeon_setparam_t)); + return ret; +} + +/* + * + */ +int +RHDDRMFDGet(int scrnIndex) +{ + struct rhdDri *Dri = RHDPTR(xf86Screens[scrnIndex])->dri; + + if (!Dri) + return -1; + else + return Dri->drmFD; +} + +/* + * Get an indirect buffer for the CP 2D acceleration commands + */ +struct _drmBuf * +RHDDRMCPBuffer(int scrnIndex) +{ + struct rhdDri *Dri = RHDPTR(xf86Screens[scrnIndex])->dri; + drmDMAReq dma; + drmBufPtr buf = NULL; + int indx = 0; + int size = 0; + int i; + + /* This is the X server's context */ + dma.context = 0x00000001; + dma.send_count = 0; + dma.send_list = NULL; + dma.send_sizes = NULL; + dma.flags = 0; + dma.request_count = 1; + dma.request_size = 64 << 10; + dma.request_list = &indx; + dma.request_sizes = &size; + dma.granted_count = 0; + + for (i = 0; i < R5XX_LOOP_COUNT; i++) { + int ret = drmDMA(Dri->drmFD, &dma); + if (!ret) { + buf = &Dri->buffers->list[indx]; + /* xf86DrvMsg(scrnIndex, X_INFO, "%s: index %d, addr %p\n", __func__, buf->idx, buf->address); */ + buf->used = 0; + return buf; + } else if (ret != -16) + xf86DrvMsg(scrnIndex, X_ERROR, "%s: drmDMA returned %d\n", + __func__, ret); + } + + /* There is nothing we can do here... If we fail, we either failed to set + * up the buffers correctly, or we passed the wrong info here, or we didn't + * free the buffers correctly. No engine reset will save us, ever. We + * should just return, and let the X server segfault itself. */ + xf86DrvMsg(scrnIndex, X_ERROR, + "%s: throwing in the towel: SIGSEGV ahead!\n", __func__); + return NULL; +} + +/* + * + */ +CARD8 * +RHDDRMIndirectBufferGet(int scrnIndex, unsigned int *IntAddress, CARD32 *Size) +{ + struct rhdDri *Dri = RHDPTR(xf86Screens[scrnIndex])->dri; + struct _drmBuf *DrmBuffer; + CARD8 *Buffer; + + if (!Dri->gartLocation) + return NULL; + + DrmBuffer = RHDDRMCPBuffer(scrnIndex); + Buffer = DrmBuffer->address; + *Size = DrmBuffer->total; + *IntAddress = Dri->gartLocation + Dri->bufStart + DrmBuffer->idx * DrmBuffer->total; + + return Buffer; +} + +/* + * + */ +void +RHDDRMIndirectBufferDiscard(int scrnIndex, CARD8 *Buffer) +{ + struct rhdDri *Dri = RHDPTR(xf86Screens[scrnIndex])->dri; + struct drm_radeon_indirect indirect; + int i; + + for (i = 0; i < Dri->bufNumBufs; i++) + if (Buffer == Dri->buffers->list[i].address) { + /* stick a NOP in our Buffer */ + ((CARD32 *) Buffer)[0] = CP_PACKET2(); + + indirect.idx = Dri->buffers->list[i].idx; + indirect.start = 0; + indirect.end = 1; + indirect.discard = 1; + + drmCommandWriteRead(Dri->drmFD, DRM_RADEON_INDIRECT, + &indirect, sizeof(struct drm_radeon_indirect)); + return; + } + + xf86DrvMsg(scrnIndex, X_ERROR, + "%s: Unable to retrieve the indirect Buffer at address %p!\n", + __func__, Buffer); +} + +unsigned int +RHDDRIGetIntGARTLocation(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdDri *rhdDRI = rhdPtr->dri; + + if (!rhdDRI->gartLocation) + return 0; + + return rhdDRI->gartLocation + rhdDRI->bufStart; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_dri.h b/driver/xf86-video-radeonhd/src/rhd_dri.h new file mode 100644 index 000000000..ac860efb2 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_dri.h @@ -0,0 +1,41 @@ +/* + * Copyright 2007-2008 Luc Verhaegen + * Copyright 2007-2008 Matthias Hopf + * Copyright 2007-2008 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_DRI_ +#define _RHD_DRI_ + +extern Bool RHDDRIPreInit(ScrnInfoPtr pScrn); +extern Bool RHDDRIAllocateBuffers(ScrnInfoPtr pScrn); +extern Bool RHDDRIScreenInit(ScreenPtr pScreen); + +extern Bool RHDDRICloseScreen(ScreenPtr pScreen); +extern Bool RHDDRIFinishScreenInit(ScreenPtr pScreen); +extern void RHDDRIEnterVT(ScreenPtr pScreen); +extern void RHDDRILeaveVT(ScreenPtr pScreen); +extern Bool RHDDRIScreenInit(ScreenPtr pScreen); + +/* Claim the 3D context */ +void RHDDRIContextClaim(ScrnInfoPtr pScrn); + +#endif diff --git a/driver/xf86-video-radeonhd/src/rhd_driver.c b/driver/xf86-video-radeonhd/src/rhd_driver.c new file mode 100644 index 000000000..e502c5f76 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_driver.c @@ -0,0 +1,3120 @@ +/* + * Copyright 2007-2009 Luc Verhaegen + * Copyright 2007-2009 Matthias Hopf + * Copyright 2007-2009 Egbert Eich + * Copyright 2007-2009 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef ATOM_BIOS_PARSER +# define ATOM_ASIC_INIT +#endif + +#define MODULEVENDORSTRING "AMD GPG" /* @@@ */ +#include "xf86.h" +#include "xf86_OSproc.h" + +/* For PIO/MMIO */ +#include "compiler.h" + +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 +#include "xf86Resources.h" +/* Needed by Resources Access Control (RAC) */ +#include "xf86RAC.h" +#endif + +#include "xf86PciInfo.h" +/* do we need to access PCI config space directly? */ +#include "xf86Pci.h" + +/* Memory manager */ +#include "xf86fbman.h" + +/* For SW cursor */ +#include "mipointer.h" + +/* For HW cursor */ +#include "xf86Cursor.h" + +/* optional backing store */ +#include "mibstore.h" + +/* mi colormap manipulation */ +#include "micmap.h" + +#include "xf86cmap.h" + +#include "fb.h" + +#ifdef HAVE_XEXTPROTO_71 +#include "X11/extensions/dpmsconst.h" +#else +#define DPMS_SERVER +#include "X11/extensions/dpms.h" +#endif + + +/* int10 - for now at least */ +#include "xf86int10.h" +#include "vbe.h" + +/* Needed for Device Data Channel (DDC) support */ +#include "xf86DDC.h" + +#include "picturestr.h" + +#ifdef USE_DRI +#define _XF86DRI_SERVER_ +#include "dri.h" +#include "GL/glxint.h" +#endif + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +# include +# define stat_t struct stat +#endif + +/* + * Driver data structures. + */ +#include "rhd.h" +#include "rhd_regs.h" +#include "rhd_cursor.h" +#include "rhd_atombios.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_biosscratch.h" +#include "rhd_pll.h" +#include "rhd_vga.h" +#include "rhd_mc.h" +#include "rhd_monitor.h" +#include "rhd_crtc.h" +#include "rhd_modes.h" +#include "rhd_lut.h" +#include "rhd_i2c.h" +#include "rhd_shadow.h" +#include "rhd_card.h" +#include "rhd_randr.h" +#include "rhd_cs.h" +#include "rhd_audio.h" +#include "rhd_pm.h" +#include "r5xx_accel.h" +#include "rhd_video.h" + +#ifdef USE_DRI +#include "r6xx_accel.h" +#include "rhd_dri.h" +#endif + +/* ??? */ +#include "servermd.h" + +/* Mandatory functions */ +static const OptionInfoRec * RHDAvailableOptions(int chipid, int busid); +#ifdef XSERVER_LIBPCIACCESS +static Bool RHDPciProbe(DriverPtr drv, int entityNum, + struct pci_device *dev, intptr_t matchData); +#else +static Bool RHDProbe(DriverPtr drv, int flags); +#endif +static Bool RHDPreInit(ScrnInfoPtr pScrn, int flags); +static Bool RHDScreenInit(int Index, ScreenPtr pScreen, int argc, + char **argv); +static Bool RHDEnterVT(int scrnIndex, int flags); +static void RHDLeaveVT(int scrnIndex, int flags); +static Bool RHDCloseScreen(int scrnIndex, ScreenPtr pScreen); +static void RHDFreeScreen(int scrnIndex, int flags); +static Bool RHDSwitchMode(int scrnIndex, DisplayModePtr mode, int flags); +static void RHDAdjustFrame(int scrnIndex, int x, int y, int flags); +static void RHDDisplayPowerManagementSet(ScrnInfoPtr pScrn, + int PowerManagementMode, + int flags); +static void RHDLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, + LOCO *colors, VisualPtr pVisual); +static Bool RHDSaveScreen(ScreenPtr pScrn, int on); + +static void rhdProcessOptions(ScrnInfoPtr pScrn); +static void rhdSave(RHDPtr rhdPtr); +static void rhdRestore(RHDPtr rhdPtr); +static Bool rhdModeLayoutSelect(RHDPtr rhdPtr); +static void rhdModeLayoutPrint(RHDPtr rhdPtr); +static void rhdModeDPISet(ScrnInfoPtr pScrn); +static Bool rhdAllIdle(RHDPtr rhdPtr); +static void rhdModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode); +static void rhdSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode); +static Bool rhdMapMMIO(RHDPtr rhdPtr); +static void rhdUnmapMMIO(RHDPtr rhdPtr); +static Bool rhdMapFB(RHDPtr rhdPtr); +static void rhdUnmapFB(RHDPtr rhdPtr); +static CARD32 rhdGetVideoRamSize(RHDPtr rhdPtr); +static void rhdFbOffscreenGrab(ScrnInfoPtr pScrn); +static void rhdGetIGPNorthBridgeInfo(RHDPtr rhdPtr); +static enum rhdCardType rhdGetCardType(RHDPtr rhdPtr); + +/* rhd_id.c */ +extern SymTabRec RHDChipsets[]; +extern PciChipsets RHDPCIchipsets[]; +extern void RHDIdentify(int flags); +extern struct rhdCard *RHDCardIdentify(ScrnInfoPtr pScrn); +#ifdef XSERVER_LIBPCIACCESS +extern const struct pci_id_match RHDDeviceMatch[]; +#endif + +/* keep accross drivers */ +static int pix24bpp = 0; + +/* required for older X.Org releases */ +#ifndef _X_EXPORT +#define _X_EXPORT +#endif + +#ifdef __linux__ +# define FGLRX_SYS_PATH "/sys/module/fglrx" +#endif + +#if XORG_VERSION_CURRENT >= 6 * 10000000 + +static const char *xaaSymbols[] = { + "XAACreateInfoRec", + "XAADestroyInfoRec", + "XAAInit", + NULL +}; + +# ifdef USE_EXA +static const char *exaSymbols[] = { + "exaDriverAlloc", + "exaDriverFini", + "exaDriverInit", + "exaGetPixmapOffset", + "exaGetPixmapPitch", + "exaMarkSync", + "exaWaitSync", + NULL +}; +# endif /* USE_EXA */ +#endif + +_X_EXPORT DriverRec RADEONHD = { + RHD_VERSION, + RHD_DRIVER_NAME, + RHDIdentify, +#ifdef XSERVER_LIBPCIACCESS + NULL, +#else + RHDProbe, +#endif + RHDAvailableOptions, + NULL, + 0, + NULL, +#ifdef XSERVER_LIBPCIACCESS + RHDDeviceMatch, + RHDPciProbe +#endif +}; + +typedef enum { + OPTION_NOACCEL, + OPTION_ACCELMETHOD, + OPTION_OFFSCREENSIZE, + OPTION_SW_CURSOR, + OPTION_IGNORECONNECTOR, + OPTION_FORCEREDUCED, + OPTION_FORCEDPI, + OPTION_USECONFIGUREDMONITOR, + OPTION_HPD, + OPTION_NORANDR, + OPTION_RROUTPUTORDER, + OPTION_DRI, + OPTION_TV_MODE, + OPTION_SCALE_TYPE, +#ifdef ATOM_BIOS + OPTION_USE_ATOMBIOS, + OPTION_ATOMBIOS, /* only for testing, don't document in man page! */ +#endif + OPTION_UNVERIFIED_FEAT, + OPTION_AUDIO, + OPTION_AUDIO_WORKAROUND, + OPTION_HDMI, + OPTION_COHERENT, + OPTION_FORCE_LOW_POWER, + OPTION_LOW_POWER_CLOCK +} RHDOpts; + +static const OptionInfoRec RHDOptions[] = { + /* See above definition of enum RHDOpts for which options need + * documentation and which ones should not be documented in the + * man page. + */ + { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_ACCELMETHOD, "AccelMethod", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_OFFSCREENSIZE, "offscreensize", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_IGNORECONNECTOR, "ignoreconnector", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_FORCEREDUCED, "forcereduced", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_FORCEDPI, "forcedpi", OPTV_INTEGER, {0}, FALSE }, + { OPTION_USECONFIGUREDMONITOR, "useconfiguredmonitor", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_HPD, "HPD", OPTV_STRING, {0}, FALSE }, + { OPTION_NORANDR, "NoRandr", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_RROUTPUTORDER, "RROutputOrder", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_DRI, "DRI", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_TV_MODE, "TVMode", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_SCALE_TYPE, "ScaleType", OPTV_ANYSTR, {0}, FALSE }, +#ifdef ATOM_BIOS + { OPTION_USE_ATOMBIOS, "UseAtomBIOS", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_ATOMBIOS, "AtomBIOS", OPTV_ANYSTR, {0}, FALSE }, +#endif + { OPTION_UNVERIFIED_FEAT, "UnverifiedFeatures", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_AUDIO, "Audio", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_AUDIO_WORKAROUND, "AudioStreamSilence", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_HDMI, "HDMI", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_COHERENT, "COHERENT", OPTV_ANYSTR, {0}, FALSE }, + { OPTION_FORCE_LOW_POWER, "ForceLowPowerMode", OPTV_BOOLEAN, {0}, FALSE }, + { OPTION_LOW_POWER_CLOCK, "LowPowerModeEngineClock", OPTV_INTEGER, {0}, FALSE }, + { -1, NULL, OPTV_NONE, {0}, FALSE } +}; + +static MODULESETUPPROTO(rhdSetup); + +static XF86ModuleVersionInfo rhdVersRec = +{ + "radeonhd", + MODULEVENDORSTRING, + MODINFOSTRING1, + MODINFOSTRING2, + XORG_VERSION_CURRENT, + RHD_MAJOR_VERSION, RHD_MINOR_VERSION, RHD_PATCHLEVEL, + ABI_CLASS_VIDEODRV, + ABI_VIDEODRV_VERSION, + MOD_CLASS_VIDEODRV, + {0,0,0,0} +}; + +_X_EXPORT XF86ModuleData radeonhdModuleData = { &rhdVersRec, rhdSetup, NULL }; + +static pointer +rhdSetup(pointer module, pointer opts, int *errmaj, int *errmin) +{ + static Bool setupDone = FALSE; + + if (!setupDone) { + setupDone = TRUE; + xf86AddDriver(&RADEONHD, module, HaveDriverFuncs); +#if 0 /* @@@ */ + LoaderRefSymLists(NULL); +#endif + /* return non-NULL even with no teardown */ + return (pointer)1; + } else { + if (errmaj) *errmaj = LDR_ONCEONLY; + return NULL; + } +} + +static Bool +RHDGetRec(ScrnInfoPtr pScrn) +{ + if (pScrn->driverPrivate != NULL) + return TRUE; + + pScrn->driverPrivate = xnfcalloc(sizeof(RHDRec), 1); + + if (pScrn->driverPrivate == NULL) + return FALSE; + + RHDPTR(pScrn)->scrnIndex = pScrn->scrnIndex; + + return TRUE; +} + +static void +RHDFreeRec(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr; + + if (pScrn->driverPrivate == NULL) + return; + + rhdPtr = RHDPTR(pScrn); + + xfree(rhdPtr->Options); + + RHDMCDestroy(rhdPtr); + RHDVGADestroy(rhdPtr); + RHDPLLsDestroy(rhdPtr); + RHDAudioDestroy(rhdPtr); + RHDLUTsDestroy(rhdPtr); + RHDOutputsDestroy(rhdPtr); + RHDConnectorsDestroy(rhdPtr); + RHDCursorsDestroy(rhdPtr); + RHDCrtcsDestroy(rhdPtr); + RHDI2CFunc(pScrn->scrnIndex, rhdPtr->I2C, RHD_I2C_TEARDOWN, NULL); +#ifdef ATOM_BIOS + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, + ATOM_TEARDOWN, NULL); +#endif + RHDShadowDestroy(rhdPtr); + if (rhdPtr->CursorInfo) + xf86DestroyCursorInfoRec(rhdPtr->CursorInfo); + + xfree(pScrn->driverPrivate); /* == rhdPtr */ + pScrn->driverPrivate = NULL; +} + +static const OptionInfoRec * +RHDAvailableOptions(int chipid, int busid) +{ + return RHDOptions; +} + +/* + * + */ +#ifdef XSERVER_LIBPCIACCESS +static Bool +RHDPciProbe(DriverPtr drv, int entityNum, + struct pci_device *dev, intptr_t matchData) +{ + ScrnInfoPtr pScrn; + RHDPtr rhdPtr; + + pScrn = xf86ConfigPciEntity(NULL, 0, entityNum, NULL, + RES_SHARED_VGA, NULL, NULL, NULL, NULL); + if (pScrn != NULL) { + + pScrn->driverVersion = RHD_VERSION; + pScrn->driverName = RHD_DRIVER_NAME; + pScrn->name = RHD_NAME; + pScrn->Probe = NULL; + pScrn->PreInit = RHDPreInit; + pScrn->ScreenInit = RHDScreenInit; + pScrn->SwitchMode = RHDSwitchMode; + pScrn->AdjustFrame = RHDAdjustFrame; + pScrn->EnterVT = RHDEnterVT; + pScrn->LeaveVT = RHDLeaveVT; + pScrn->FreeScreen = RHDFreeScreen; + pScrn->ValidMode = NULL; /* we do our own validation */ + + if (!RHDGetRec(pScrn)) + return FALSE; + + rhdPtr = RHDPTR(pScrn); + + rhdPtr->PciInfo = dev; + rhdPtr->ChipSet = matchData; + } + + return (pScrn != NULL); +} + +#else + +static Bool +RHDProbe(DriverPtr drv, int flags) +{ + Bool foundScreen = FALSE; + int numDevSections, numUsed; + GDevPtr *devSections; + int *usedChips; + int i; + + if ((numDevSections = xf86MatchDevice(RHD_DRIVER_NAME, + &devSections)) <= 0) { + return FALSE; + } + + /* PCI BUS */ + if (xf86GetPciVideoInfo() ) { + numUsed = xf86MatchPciInstances(RHD_NAME, PCI_VENDOR_ATI, + RHDChipsets, RHDPCIchipsets, + devSections,numDevSections, + drv, &usedChips); + + if (numUsed > 0) { + if (flags & PROBE_DETECT) + foundScreen = TRUE; + else for (i = 0; i < numUsed; i++) { + ScrnInfoPtr pScrn = NULL; + + if ((pScrn = xf86ConfigPciEntity(pScrn, 0, usedChips[i], + RHDPCIchipsets,NULL, NULL, + NULL, NULL, NULL))) { + pScrn->driverVersion = RHD_VERSION; + pScrn->driverName = RHD_DRIVER_NAME; + pScrn->name = RHD_NAME; + pScrn->Probe = RHDProbe; + pScrn->PreInit = RHDPreInit; + pScrn->ScreenInit = RHDScreenInit; + pScrn->SwitchMode = RHDSwitchMode; + pScrn->AdjustFrame = RHDAdjustFrame; + pScrn->EnterVT = RHDEnterVT; + pScrn->LeaveVT = RHDLeaveVT; + pScrn->FreeScreen = RHDFreeScreen; + pScrn->ValidMode = NULL; /* we do our own validation */ + foundScreen = TRUE; + } + } + xfree(usedChips); + } + } + + xfree(devSections); + return foundScreen; +} +#endif + +/* + * + */ +static Bool +RHDPreInit(ScrnInfoPtr pScrn, int flags) +{ + RHDPtr rhdPtr; + Bool ret = FALSE; + RHDI2CDataArg i2cArg; + DisplayModePtr Modes; /* Non-RandR-case only */ + stat_t statbuf; + + if (flags & PROBE_DETECT) { + /* do dynamic mode probing */ + return TRUE; + } + +#ifdef FGLRX_SYS_PATH + /* check for fglrx kernel module */ + if (stat (FGLRX_SYS_PATH, &statbuf) == 0) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "The fglrx kernel module is loaded. This can have obvious\n" + " or subtle side effects. See radeonhd(4) for details.\n"); + } +#endif + +#ifndef XSERVER_LIBPCIACCESS + /* + * Allocate the RhdRec driverPrivate + * (for the PCIACCESS case this is done in Probe already) + */ + if (!RHDGetRec(pScrn)) { + return FALSE; + } +#endif + rhdPtr = RHDPTR(pScrn); + + /* Get server verbosity level */ + rhdPtr->verbosity = xf86GetVerbosity(); + + /* This driver doesn't expect more than one entity per screen */ + if (pScrn->numEntities > 1) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Driver doesn't support more than one entity per screen\n"); + goto error0; + } + /* @@@ move to Probe? */ + if (!(rhdPtr->pEnt = xf86GetEntityInfo(pScrn->entityList[0]))) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to get entity info\n"); + goto error0; + } + +#ifndef XSERVER_LIBPCIACCESS + if (rhdPtr->pEnt->resources) { + xfree(rhdPtr->pEnt); + goto error0; + } +#endif + + pScrn->videoRam = rhdPtr->pEnt->device->videoRam; + rhdPtr->entityIndex = rhdPtr->pEnt->index; + +#ifndef XSERVER_LIBPCIACCESS + rhdPtr->ChipSet = rhdPtr->pEnt->chipset; + + rhdPtr->PciInfo = xf86GetPciInfoForEntity(rhdPtr->pEnt->index); + rhdPtr->PciTag = pciTag(rhdPtr->PciInfo->bus, + rhdPtr->PciInfo->device, + rhdPtr->PciInfo->func); +/* #else: RHDPciProbe() did this for us already */ +#endif + if (RHDIsIGP(rhdPtr->ChipSet)) + rhdGetIGPNorthBridgeInfo(rhdPtr); + + pScrn->chipset = (char *)xf86TokenToString(RHDChipsets, rhdPtr->ChipSet); + +#ifndef XSERVER_LIBPCIACCESS + /* We will disable access to VGA legacy resources emulation and + save/restore VGA thru MMIO when necessary */ + if (xf86RegisterResources(rhdPtr->entityIndex, NULL, ResNone)) + goto error0; +#endif + +#ifndef ATOM_ASIC_INIT + if (xf86LoadSubModule(pScrn, "int10")) { + xf86Int10InfoPtr Int10; + xf86DrvMsg(pScrn->scrnIndex,X_INFO,"Initializing INT10\n"); + if ((Int10 = xf86InitInt10(rhdPtr->entityIndex))) { + /* + * here we kludge to get a copy of V_BIOS for + * the AtomBIOS code. After POSTing a PCI BIOS + * is not accessible any more. On a non-primary + * card it's lost after we do xf86FreeInt10(), + * so we save it here before we kill int10. + * This still begs the question what to do + * on a non-primary card that has been POSTed + * by an earlier Xserver start. + */ + if ((rhdPtr->BIOSCopy = xalloc(RHD_VBIOS_SIZE))) { + (void)memcpy(rhdPtr->BIOSCopy, + xf86int10Addr(Int10, Int10->BIOSseg << 4), + RHD_VBIOS_SIZE); + } + xf86FreeInt10(Int10); + } + } +#endif + + /* xf86CollectOptions cluelessly depends on these and + will SIGSEGV otherwise */ + pScrn->monitor = pScrn->confScreen->monitor; + + if (!xf86SetDepthBpp(pScrn, 24, 0, 0, Support32bppFb)) { + goto error0; + } else { + /* Check that the returned depth is one we support */ + switch (pScrn->depth) { + case 8: + case 15: + case 16: + case 24: + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Given depth (%d) is not supported by this driver\n", + pScrn->depth); + goto error0; + } + } + xf86PrintDepthBpp(pScrn); + + rhdProcessOptions(pScrn); + + /* Now check whether we know this card */ + rhdPtr->Card = RHDCardIdentify(pScrn); + if (rhdPtr->Card) + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected an %s on a %s\n", + pScrn->chipset, rhdPtr->Card->name); + else + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "Detected an %s on an " + "unidentified card\n", pScrn->chipset); + if (rhdPtr->Card && rhdPtr->Card->flags & RHD_CARD_FLAG_HPDSWAP && + rhdPtr->hpdUsage == RHD_HPD_USAGE_AUTO) + rhdPtr->hpdUsage = RHD_HPD_USAGE_AUTO_SWAP; + if (rhdPtr->Card && rhdPtr->Card->flags & RHD_CARD_FLAG_HPDOFF && + rhdPtr->hpdUsage == RHD_HPD_USAGE_AUTO) + rhdPtr->hpdUsage = RHD_HPD_USAGE_AUTO_OFF; + + /* We need access to IO space already */ + if (!rhdMapMMIO(rhdPtr)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to map MMIO.\n"); + goto error0; + } + + rhdPtr->cardType = rhdGetCardType(rhdPtr); + +#ifdef ATOM_BIOS + { + AtomBiosArgRec atomBiosArg; + + if (RHDAtomBiosFunc(pScrn->scrnIndex, NULL, ATOM_INIT, &atomBiosArg) + == ATOM_SUCCESS) { + rhdPtr->atomBIOS = atomBiosArg.atomhandle; + } else { + if (RHDUseAtom(rhdPtr, NULL, atomUsageAny)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "No AtomBIOS image found but required for AtomBIOS based mode setting\n"); + goto error0; /* @@@ No blacklist handling. So far no blacklists are used for any subsystem */ + } + } + } +#else + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "**************************************************\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "** Code has been built without AtomBIOS support **\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "** this may seriously affect the functionality ***\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "** of this driver ***\n"); + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "**************************************************\n"); + if (RHDUseAtom(rhdPtr, NULL, atomUsageAny)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "No AtomBIOS support compiled in but required for this chipset/ current settings\n"); + goto error0; + } +#endif + rhdPtr->tvMode = RHD_TV_NONE; + { + const struct { char *name; enum RHD_TV_MODE mode; } + rhdTVModeMapName[] = { + {"NTSC", RHD_TV_NTSC}, + {"NTSCJ", RHD_TV_NTSCJ}, + {"PAL", RHD_TV_PAL}, + {"PALM", RHD_TV_PALM}, + {"PALCN", RHD_TV_PALCN}, + {"PALN", RHD_TV_PALN}, + {"PAL60", RHD_TV_PAL60}, + {"SECAM", RHD_TV_SECAM}, + {"CV", RHD_TV_CV}, + {NULL, RHD_TV_NONE} + }; + + + if (rhdPtr->tvModeName.set) { + int i = 0; + + while (rhdTVModeMapName[i].name) { + if (!strcmp(rhdTVModeMapName[i].name, rhdPtr->tvModeName.val.string)) { + rhdPtr->tvMode = rhdTVModeMapName[i].mode; + break; + } + i++; + } + if (rhdPtr->tvMode == RHD_TV_NONE) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "Specified TV Mode %s is invalid\n", rhdPtr->tvModeName.val.string); + } + } +#ifdef ATOM_BIOS + if (rhdPtr->tvMode == RHD_TV_NONE) { + AtomBiosArgRec atomBiosArg; + + int i = 0; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_ANALOG_TV_DEFAULT_MODE, &atomBiosArg) + == ATOM_SUCCESS) { + rhdPtr->tvMode = atomBiosArg.tvMode; + while (rhdTVModeMapName[i].name) { + if (rhdTVModeMapName[i].mode == rhdPtr->tvMode) { + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "Found default TV Mode %s\n",rhdTVModeMapName[i].name); + break; + } + i++; + } + } + } +#endif + } + /* We can use a register which is programmed by the BIOS to find out the + size of our framebuffer */ + if (!pScrn->videoRam) { + pScrn->videoRam = rhdGetVideoRamSize(rhdPtr); + if (!pScrn->videoRam) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No Video RAM detected.\n"); + goto error1; + } + } + xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "VideoRAM: %d kByte\n", + pScrn->videoRam); + + rhdPtr->FbFreeStart = 0; + rhdPtr->FbFreeSize = pScrn->videoRam * 1024; + +#ifdef ATOM_BIOS + if (rhdPtr->atomBIOS) { /* for testing functions */ + + AtomBiosArgRec atomBiosArg; + + atomBiosArg.fb.start = rhdPtr->FbFreeStart; + atomBiosArg.fb.size = rhdPtr->FbFreeSize; + if (RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, ATOM_ALLOCATE_FB_SCRATCH, + &atomBiosArg) == ATOM_SUCCESS) { + rhdPtr->FbFreeStart = atomBiosArg.fb.start; + rhdPtr->FbFreeSize = atomBiosArg.fb.size; + } + + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, ATOM_GET_DEFAULT_ENGINE_CLOCK, + &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, ATOM_GET_DEFAULT_MEMORY_CLOCK, + &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_MAX_PIXEL_CLOCK_PLL_INPUT, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_MIN_PIXEL_CLOCK_PLL_INPUT, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_MAX_PIXEL_CLK, &atomBiosArg); + RHDAtomBiosFunc(pScrn->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_REF_CLOCK, &atomBiosArg); + } +#endif + + if (rhdPtr->ChipSet >= RHD_R600 && rhdPtr->AccelMethod == RHD_ACCEL_XAA) { + rhdPtr->AccelMethod = RHD_ACCEL_EXA; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Accel Method XAA not supported on this chipset generation." + " Defaulting to EXA\n"); + } +#ifdef USE_DRI + ret = RHDDRIPreInit(pScrn); + if (!ret && rhdPtr->ChipSet >= RHD_R600 && rhdPtr->AccelMethod > RHD_ACCEL_SHADOWFB) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Falling back to ShadowFB acceleration\n"); + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + } +#else + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "DRI support has been disabled at compile time\n"); + if (rhdPtr->ChipSet >= RHD_R600 && rhdPtr->AccelMethod == RHD_ACCEL_EXA) { + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Accel Method EXA requires DRI on this chip. Falling back to SHADOW_FB.\n"); + } +#endif + if (rhdPtr->AccelMethod == RHD_ACCEL_FORCE_SHADOWFB) + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + + if (xf86LoadSubModule(pScrn, "i2c")) { + if (RHDI2CFunc(pScrn->scrnIndex, NULL, RHD_I2C_INIT, &i2cArg) + == RHD_I2C_SUCCESS) { + rhdPtr->I2C = i2cArg.I2CBusList; + + if (!xf86LoadSubModule(pScrn, "ddc")) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: Failed to load DDC module\n",__func__); + goto error1; + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "I2C init failed\n"); + goto error1; + } + } else { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "%s: Failed to load I2C module\n",__func__); + goto error1; + } + + /* Init modesetting structures */ + RHDVGAInit(rhdPtr); + RHDMCInit(rhdPtr); + if (!RHDCrtcsInit(rhdPtr)) + RHDAtomCrtcsInit(rhdPtr); + if (!RHDPLLsInit(rhdPtr)) + RHDAtomPLLsInit(rhdPtr); + RHDAudioInit(rhdPtr); + RHDLUTsInit(rhdPtr); + RHDCursorsInit(rhdPtr); /* do this irrespective of hw/sw cursor setting */ + RHDPmInit(rhdPtr); + + if (!RHDConnectorsInit(rhdPtr, rhdPtr->Card)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Card information has invalid connector information\n"); + goto error1; + } + { +#ifdef ATOM_BIOS + struct rhdAtomOutputDeviceList *OutputDeviceList = NULL; + + if (rhdPtr->Card + && rhdPtr->Card->ConnectorInfo[0].Type != RHD_CONNECTOR_NONE + && (rhdPtr->Card->DeviceInfo[0][0] != atomNone + || rhdPtr->Card->DeviceInfo[0][1] != atomNone)) { + int i, k = 0; + + for (i = 0; i < RHD_CONNECTORS_MAX; i++) { + int j; + if (rhdPtr->Card->ConnectorInfo[i].Type == RHD_CONNECTOR_NONE) + break; + for (j = 0; j < MAX_OUTPUTS_PER_CONNECTOR; j++) { + if (rhdPtr->Card->ConnectorInfo[i].Output[j] != RHD_OUTPUT_NONE) { + if (!(OutputDeviceList = (struct rhdAtomOutputDeviceList *)xrealloc( + OutputDeviceList, sizeof (struct rhdAtomOutputDeviceList) * (k + 1)))) + break; + OutputDeviceList[k].ConnectorType = rhdPtr->Card->ConnectorInfo[i].Type; + OutputDeviceList[k].DeviceId = rhdPtr->Card->DeviceInfo[i][j]; + OutputDeviceList[k].OutputType = rhdPtr->Card->ConnectorInfo[i].Output[j]; + RHDDebug(rhdPtr->scrnIndex, "OutputDevice: C: 0x%2.2x O: 0x%2.2x DevID: 0x%2.2x\n", + OutputDeviceList[k].ConnectorType, OutputDeviceList[k].OutputType, + OutputDeviceList[k].DeviceId); + k++; + } + } + } + } else { + AtomBiosArgRec data; + + data.chipset = rhdPtr->ChipSet; + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_OUTPUT_DEVICE_LIST, &data) == ATOM_SUCCESS) + OutputDeviceList = data.OutputDeviceList; + } + + if (OutputDeviceList) { + struct rhdOutput *Output; + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + RHDAtomSetupOutputDriverPrivate(OutputDeviceList, Output); + xfree(OutputDeviceList); + } +#endif + } + + /* + * Set this here as we might need it for the validation of a fixed mode in + * rhdModeLayoutSelect(). Later it is used for Virtual selection and mode + * pool creation. + * For Virtual selection, the scanout area is all the free space we have. + */ + rhdPtr->FbScanoutStart = rhdPtr->FbFreeStart; + rhdPtr->FbScanoutSize = rhdPtr->FbFreeSize; + + RHDRandrPreInit(pScrn); + + if (!rhdPtr->randr) { + Bool configured; + /* Pick anything for now */ + if (!rhdModeLayoutSelect(rhdPtr)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to detect a connected monitor\n"); + goto error1; + } + + /* set up rhdPtr->ConfigMonitor */ + if (!xf86GetOptValBool(rhdPtr->Options, OPTION_USECONFIGUREDMONITOR, &configured)) + configured = FALSE; + RHDConfigMonitorSet(pScrn->scrnIndex, configured); + + rhdModeLayoutPrint(rhdPtr); + } + + /* @@@ rgb bits boilerplate */ + if (pScrn->depth == 8) + pScrn->rgbBits = 8; + + /* Get the depth24 pixmap format */ + if (pScrn->depth == 24 && pix24bpp == 0) + pix24bpp = xf86GetBppFromDepth(pScrn, 24); + + /* + * This must happen after pScrn->display has been set because + * xf86SetWeight references it. + */ + if (pScrn->depth > 8) { + /* The defaults are OK for us */ + rgb zeros = {0, 0, 0}; + + if (!xf86SetWeight(pScrn, zeros, zeros)) { + goto error1; + } else { + /* XXX check that weight returned is supported */ + ; + } + } + + if (!xf86SetDefaultVisual(pScrn, -1)) { + goto error1; + } else { + /* We don't currently support DirectColor at > 8bpp */ + if (pScrn->depth > 8 && pScrn->defaultVisual != TrueColor) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Given default visual" + " (%s) is not supported at depth %d\n", + xf86GetVisualName(pScrn->defaultVisual), pScrn->depth); + goto error1; + } + } + + if (pScrn->depth > 1) { + Gamma zeros = {0.0, 0.0, 0.0}; + + /* @@@ */ + if (!xf86SetGamma(pScrn, zeros)) { + goto error1; + } + } + + /* @@@ need this? */ + pScrn->progClock = TRUE; + + if (pScrn->display->virtualX && pScrn->display->virtualY) + if (!RHDGetVirtualFromConfig(pScrn)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to find valid framebuffer dimensions\n"); + goto error1; + } + + if (! rhdPtr->randr) { + Modes = RHDModesPoolCreate(pScrn, FALSE); + if (!Modes) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No valid modes found\n"); + goto error1; + } + + if (!pScrn->virtualX || !pScrn->virtualY) + RHDGetVirtualFromModesAndFilter(pScrn, Modes, FALSE); + + RHDModesAttach(pScrn, Modes); + + rhdModeDPISet(pScrn); + } + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Using %dx%d Framebuffer with %d pitch\n", pScrn->virtualX, + pScrn->virtualY, pScrn->displayWidth); + /* grab the real scanout area and adjust the free space */ + rhdPtr->FbScanoutSize = RHD_FB_CHUNK(pScrn->displayWidth * pScrn->bitsPerPixel * + pScrn->virtualY / 8); + rhdPtr->FbScanoutStart = RHDAllocFb(rhdPtr, rhdPtr->FbScanoutSize, + "ScanoutBuffer"); + ASSERT(rhdPtr->FbScanoutStart != (unsigned)-1); + + if (!rhdPtr->randr) + xf86PrintModes(pScrn); + else + /* If monitor resolution is set on the command line, use it */ + xf86SetDpi(pScrn, 0, 0); + + if (xf86LoadSubModule(pScrn, "fb") == NULL) { + goto error1; + } + + if (!rhdPtr->swCursor.val.bool) { + if (!xf86LoadSubModule(pScrn, "ramdac")) { + goto error1; + } + } + + /* try to load the XAA module here */ + if (rhdPtr->AccelMethod == RHD_ACCEL_XAA) { + if (!xf86LoadSubModule(pScrn, "xaa")) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to load XAA module." + " Falling back to ShadowFB.\n"); + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + } + /* This is functionally void since 7.0 (old version scheme, + * and removed since 1.6.99.1 (new version scheme) */ + /* Assume anything >= 6.* is old version scheme */ +#if XORG_VERSION_CURRENT >= 6 * 10000000 + else + xf86LoaderReqSymLists(xaaSymbols, NULL); +#endif + } + +#ifdef USE_EXA + /* try to load the EXA module here */ + if (rhdPtr->AccelMethod == RHD_ACCEL_EXA) { + if (!xf86LoadSubModule(pScrn, "exa")) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to load EXA module." + " Falling back to ShadowFB.\n"); + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + } + /* This is functionally void since 7.0 (old version scheme, + * and removed since 1.6.99.1 (new version scheme) */ + /* Assume anything >= 6.* is old version scheme */ +#if XORG_VERSION_CURRENT >= 6 * 10000000 + else + xf86LoaderReqSymLists(exaSymbols, NULL); +#endif + } +#endif /* USE_EXA */ + + /* Last resort: try shadowFB */ + if (rhdPtr->AccelMethod == RHD_ACCEL_SHADOWFB) + RHDShadowPreInit(pScrn); + + if ((rhdPtr->AccelMethod == RHD_ACCEL_XAA) || + (rhdPtr->AccelMethod == RHD_ACCEL_EXA)) + rhdFbOffscreenGrab(pScrn); + +#ifdef USE_DRI + if (rhdPtr->dri) + RHDDRIAllocateBuffers(pScrn); +#endif + + RHDDebug(pScrn->scrnIndex, "Free FB offset 0x%08X (size = 0x%08X)\n", + rhdPtr->FbFreeStart, rhdPtr->FbFreeSize); + + ret = TRUE; + + error1: + rhdUnmapMMIO(rhdPtr); + error0: + if (!ret) + RHDFreeRec(pScrn); + + return ret; +} + +/* Mandatory */ +static Bool +RHDScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) +{ + ScrnInfoPtr pScrn; + RHDPtr rhdPtr; + VisualPtr visual; +#ifndef XSERVER_LIBPCIACCESS + unsigned int racflag = 0; +#endif +#ifdef USE_DRI + Bool DriScreenInited = FALSE; +#endif + + pScrn = xf86Screens[pScreen->myNum]; + rhdPtr = RHDPTR(pScrn); + RHDFUNC(pScrn); + + /* map IO and FB */ + if (!rhdMapMMIO(rhdPtr)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to map MMIO.\n"); + return FALSE; + } + + if (!rhdMapFB(rhdPtr)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to map FB.\n"); + return FALSE; + } + + /* save previous mode */ + rhdSave(rhdPtr); + + /* init DIX */ + miClearVisualTypes(); + + /* Setup the visuals we support. */ + if (!miSetVisualTypes(pScrn->depth, miGetDefaultVisualMask(pScrn->depth), + pScrn->rgbBits, pScrn->defaultVisual)) + return FALSE; + + if (!miSetPixmapDepths()) + return FALSE; + + /* Setup memory to which we draw; either shadow (RAM) or scanout (FB) */ + if (rhdPtr->AccelMethod == RHD_ACCEL_SHADOWFB) { + if (!RHDShadowScreenInit(pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "ShadowFB initialisation failed." + " Continuing without ShadowFB.\n"); + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + } + } + + /* disable all memory accesses for MC setup */ + RHDVGADisable(rhdPtr); + + if (!rhdAllIdle(rhdPtr)) + return FALSE; + + /* now set up the MC - has to be done after AllIdle and before DRI init */ + if (!RHDMCSetupFBLocation(rhdPtr, rhdPtr->FbIntAddress, rhdPtr->FbIntSize)) + return FALSE; + +#ifdef USE_DRI + /* Setup DRI after visuals have been established, but before fbScreenInit is + * called. fbScreenInit will eventually call the driver's InitGLXVisuals + * call back. */ + if (rhdPtr->dri) + DriScreenInited = RHDDRIScreenInit(pScreen); +#endif + + /* shadowfb is allowed to fail gracefully too */ + if ((rhdPtr->AccelMethod != RHD_ACCEL_SHADOWFB) && + !fbScreenInit(pScreen, (CARD8 *) rhdPtr->FbBase + rhdPtr->FbScanoutStart, + pScrn->virtualX, pScrn->virtualY, pScrn->xDpi, pScrn->yDpi, + pScrn->displayWidth, pScrn->bitsPerPixel)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: fbScreenInit failed.\n", __func__); + return FALSE; + } + + /* must be done after fbScreenInit() */ + if (pScrn->depth > 8) { + /* Fixup RGB ordering */ + visual = pScreen->visuals + pScreen->numVisuals; + while (--visual >= pScreen->visuals) { + if ((visual->class | DynamicClass) == DirectColor + && visual->nplanes > 8) { + visual->offsetRed = pScrn->offset.red; + visual->offsetGreen = pScrn->offset.green; + visual->offsetBlue = pScrn->offset.blue; + visual->redMask = pScrn->mask.red; + visual->greenMask = pScrn->mask.green; + visual->blueMask = pScrn->mask.blue; + } + } + } + + /* must be after RGB ordering fixed */ + fbPictureInit(pScreen, 0, 0); + xf86SetBlackWhitePixels(pScreen); + + /* Static power management */ + if (rhdPtr->Pm) + rhdPtr->Pm->SelectState (rhdPtr, RHD_PM_IDLE); + +#ifdef USE_DRI + if (DriScreenInited) + rhdPtr->directRenderingEnabled = RHDDRIFinishScreenInit(pScreen); +#endif + + /* Initialize command submission backend */ + RHDCSInit(pScrn); + if (rhdPtr->CS) + RHDCSStart(rhdPtr->CS); + + /* Init 2D after DRI is set up */ + switch (rhdPtr->AccelMethod) { + case RHD_ACCEL_SHADOWFB: + if (!RHDShadowSetup(pScreen)) + /* No safetynet anymore */ + return FALSE; + break; + case RHD_ACCEL_XAA: + if (rhdPtr->ChipSet < RHD_R600) { + if (!R5xxXAAInit(pScrn, pScreen)) { + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Failed to initalize XAA; disabling acceleration.\n"); + } + } else { + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "XAA is not supported on R600 and above; disabling acceleration.\n"); + } + break; +#ifdef USE_DRI + case RHD_ACCEL_EXA: + if (rhdPtr->ChipSet < RHD_R600) { + if (!R5xxEXAInit(pScrn, pScreen)) { + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Failed to initalize EXA; disabling acceleration.\n"); + } + } else { + if (!R6xxEXAInit(pScrn, pScreen)) { + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Failed to initalize EXA; disabling acceleration.\n"); + } + } + break; +#endif /* USE_DRI */ + default: + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + break; + } + + if (rhdPtr->ChipSet < RHD_R600) { + if (rhdPtr->TwoDPrivate) + R5xx2DStart(pScrn); + R5xxEngineWaitIdleFull(rhdPtr->CS); + } + + miInitializeBackingStore(pScreen); + xf86SetBackingStore(pScreen); + xf86SetSilkenMouse(pScreen); + + /* init randr */ + if (rhdPtr->randr && !RHDRandrScreenInit (pScreen)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "RandrScreenInit failed. Try Option \"noRandr\"\n"); + return FALSE; + } + +#ifdef ATOM_BIOS + /* Set accelerator mode in the BIOSScratch registers */ + RHDAtomBIOSScratchSetAccelratorMode(rhdPtr, TRUE); +#endif + + RHDPrepareMode(rhdPtr); + /* now init the new mode */ + if (rhdPtr->randr) + RHDRandrModeInit(pScrn); + else + rhdModeInit(pScrn, pScrn->currentMode); + + /* fix viewport */ + RHDAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + + /* enable/disable audio */ + RHDAudioSetEnable(rhdPtr, rhdPtr->audio.val.bool); + + /* Initialise cursor functions */ + miDCInitialize (pScreen, xf86GetPointerScreenFuncs()); + + /* Inititalize HW cursor */ + if (!rhdPtr->swCursor.val.bool) { + Bool ret; + if (rhdPtr->randr == NULL) + ret = RHDxf86InitCursor(pScreen); + else + ret = RHDRRInitCursor(pScreen); + if (!ret) + xf86DrvMsg(scrnIndex, X_ERROR, + "Hardware cursor initialization failed\n"); + } + /* default colormap */ + if(!miCreateDefColormap(pScreen)) + return FALSE; + /* fixme */ + /* Support 10-bits of precision in LUT */ + if (!xf86HandleColormaps(pScreen, 256, 10, + RHDLoadPalette, NULL, + CMAP_PALETTED_TRUECOLOR | CMAP_RELOAD_ON_MODE_SWITCH)) + return FALSE; + +#ifndef XSERVER_LIBPCIACCESS + pScrn->racIoFlags = pScrn->racMemFlags = racflag; +#endif + + /* Function to unblank, so that we don't show an uninitialised FB */ + pScreen->SaveScreen = RHDSaveScreen; + + /* Setup DPMS mode */ + + xf86DPMSInit(pScreen, (DPMSSetProcPtr)RHDDisplayPowerManagementSet,0); + + pScrn->memPhysBase = rhdPtr->FbPhysAddress + rhdPtr->FbScanoutStart; + + if (rhdPtr->TwoDPrivate) + RHDInitVideo(pScreen); + + /* Wrap the current CloseScreen function */ + rhdPtr->CloseScreen = pScreen->CloseScreen; + pScreen->CloseScreen = RHDCloseScreen; + + /* Report any unused options (only for the first generation) */ + if (serverGeneration == 1) { + xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); + } + + return TRUE; +} + +static Bool +rhdAllIdle(RHDPtr rhdPtr) +{ + int i; + + /* Make sure that VGA has been disabled before calling AllIdle() */ + ASSERT(RHD_CHECKDEBUGFLAG(rhdPtr, VGA_SETUP)); + + /* stop scanout */ + for (i = 0; i < 2; i++) + if (!rhdPtr->Crtc[i]->Power(rhdPtr->Crtc[i], RHD_POWER_RESET)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: unable to stop CRTC: cannot idle MC\n", + __func__); + return FALSE; + } + + if (!RHDMCIdleWait(rhdPtr, 1000)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "MC not idle\n"); + return FALSE; + } + return TRUE; +} + +/* + * + */ +static void +rhdEngineIdle(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RhdCS *CS = rhdPtr->CS; + + if (CS) { + if (rhdPtr->ChipSet < RHD_R600) { + R5xxDstCacheFlush(CS); + R5xxEngineWaitIdleFull(CS); + } + + RHDCSFlush(CS); + RHDCSIdle(CS); + } + + if (rhdPtr->TwoDPrivate) { +#ifdef USE_DRI + if (rhdPtr->ChipSet >= RHD_R600) + R6xxIdle(pScrn); + else +#endif /* USE_DRI */ + R5xx2DIdle(pScrn); + } + +} + +/* Mandatory */ +static Bool +RHDCloseScreen(int scrnIndex, ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + Bool Idle = TRUE; /* yes, this is correct! */ + + /* Make sure our CS and 2D status is clean before destroying it */ + if (pScrn->vtSema) + rhdEngineIdle(pScrn); + + /* tear down 2d accel infrastructure */ + if (rhdPtr->AccelMethod == RHD_ACCEL_SHADOWFB) + RHDShadowCloseScreen(pScreen); +#ifdef USE_DRI + else if (rhdPtr->AccelMethod == RHD_ACCEL_EXA) { + if (rhdPtr->ChipSet < RHD_R600) { + R5xxEXACloseScreen(pScreen); + R5xxEXADestroy(pScrn); + } else { + R6xxEXACloseScreen(pScreen); + R6xxEXADestroy(pScrn); + } + } else +#endif /* USE_DRI */ + if (rhdPtr->AccelMethod == RHD_ACCEL_XAA) { + if (rhdPtr->ChipSet < RHD_R600) + R5xxXAADestroy(pScrn); + } + + if ((rhdPtr->ChipSet < RHD_R600) && rhdPtr->ThreeDPrivate) + R5xx3DDestroy(pScrn); + + if (rhdPtr->CS) + RHDCSStop(rhdPtr->CS); + + if (pScrn->vtSema) + Idle = rhdAllIdle(rhdPtr); + +#ifdef USE_DRI + if (rhdPtr->dri) { + if (Idle) + RHDDRICloseScreen(pScreen); + else + xf86DrvMsg(scrnIndex, X_ERROR, "MC not idle, cannot close DRI\n"); + } +#endif + if (pScrn->vtSema) + rhdRestore(rhdPtr); + + rhdUnmapFB(rhdPtr); + rhdUnmapMMIO(rhdPtr); + + pScrn->vtSema = FALSE; + pScreen->CloseScreen = rhdPtr->CloseScreen; + return (*pScreen->CloseScreen)(scrnIndex, pScreen); +} + +/* Optional */ +static void +RHDFreeScreen(int scrnIndex, int flags) +{ + RHDFreeRec(xf86Screens[scrnIndex]); +} + +/* Mandatory */ +static Bool +RHDEnterVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(rhdPtr); + + rhdSave(rhdPtr); + + /* disable all memory accesses for MC setup */ + RHDVGADisable(rhdPtr); + + if (!rhdAllIdle(rhdPtr)) + return FALSE; + + /* now set up the MC - has to be done before DRI init */ + RHDMCSetupFBLocation(rhdPtr, rhdPtr->FbIntAddress, rhdPtr->FbIntSize); + +#ifdef ATOM_BIOS + /* Set accelerator mode in the BIOSScratch registers */ + RHDAtomBIOSScratchSetAccelratorMode(rhdPtr, TRUE); +#endif + + if (rhdPtr->randr) + RHDRandrModeInit(pScrn); + else + rhdModeInit(pScrn, pScrn->currentMode); + + /* @@@ video overlays can be initialized here */ + + if (rhdPtr->CursorInfo) + rhdReloadCursor(pScrn); + /* rhdShowCursor() done by AdjustFrame */ + + RHDAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); + + /* enable/disable audio */ + RHDAudioSetEnable(rhdPtr, rhdPtr->audio.val.bool); + + /* Static power management */ + if (rhdPtr->Pm) + rhdPtr->Pm->SelectState (rhdPtr, RHD_PM_IDLE); + +#ifdef USE_DRI + if (rhdPtr->dri) + RHDDRIEnterVT(pScrn->pScreen); +#endif + + if (rhdPtr->CS) { +#ifdef USE_DRI + if (rhdPtr->ChipSet >= RHD_R600) { + if (rhdPtr->TwoDPrivate) { + R600LoadShaders(pScrn); + R6xxIdle(pScrn); + + ((struct r6xx_accel_state *) rhdPtr->TwoDPrivate)->XHas3DEngineState = + FALSE; + } + } else { +#endif + if (rhdPtr->TwoDPrivate) { + R5xx2DSetup(pScrn); + R5xx2DIdle(pScrn); + } + + if (rhdPtr->ThreeDPrivate) + ((struct R5xx3D *) rhdPtr->ThreeDPrivate)->XHas3DEngineState = + FALSE; +#ifdef USE_DRI + } +#endif + + RHDCSStart(rhdPtr->CS); + + if (rhdPtr->ChipSet < RHD_R600) + R5xxEngineWaitIdleFull(rhdPtr->CS); + + RHDCSFlush(rhdPtr->CS); + RHDCSIdle(rhdPtr->CS); + } + +#ifdef USE_DRI + if (rhdPtr->dri) { + DRIUnlock(pScrn->pScreen); + } +#endif + + return TRUE; +} + +/* Mandatory */ +static void +RHDLeaveVT(int scrnIndex, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(rhdPtr); + +#ifdef USE_DRI + if (rhdPtr->dri) + RHDDRILeaveVT(pScrn->pScreen); +#endif + + rhdEngineIdle(pScrn); + + if (rhdPtr->CS) + RHDCSStop(rhdPtr->CS); + + rhdAllIdle(rhdPtr); + + if (rhdPtr->randr) + RHDRRFreeShadow(pScrn); + + rhdRestore(rhdPtr); +} + +static Bool +RHDSwitchMode(int scrnIndex, DisplayModePtr mode, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(rhdPtr); + + rhdEngineIdle(pScrn); + + if (rhdPtr->randr) + RHDRandrSwitchMode(pScrn, mode); + else { + RHDPrepareMode(rhdPtr); + rhdSetMode(xf86Screens[scrnIndex], mode); + } + + return TRUE; +} + +/* + * High level bit banging functions + */ + +static void +RHDAdjustFrame(int scrnIndex, int x, int y, int flags) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdCrtc *Crtc; + + if (! rhdPtr->randr) { + Crtc = rhdPtr->Crtc[0]; + if ((Crtc->scrnIndex == scrnIndex) && Crtc->Active) + Crtc->FrameSet(Crtc, x, y); + + Crtc = rhdPtr->Crtc[1]; + if ((Crtc->scrnIndex == scrnIndex) && Crtc->Active) + Crtc->FrameSet(Crtc, x, y); + } + + if (rhdPtr->CursorInfo) + rhdShowCursor(pScrn); +} + +static void +RHDDisplayPowerManagementSet(ScrnInfoPtr pScrn, + int PowerManagementMode, + int flags) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdOutput *Output; + struct rhdCrtc *Crtc1, *Crtc2; + + RHDFUNC(rhdPtr); + + if (!pScrn->vtSema) + return; + + Crtc1 = rhdPtr->Crtc[0]; + Crtc2 = rhdPtr->Crtc[1]; + + switch (PowerManagementMode) { + case DPMSModeOn: + if (Crtc1->Active) { + Crtc1->Power(Crtc1, RHD_POWER_ON); + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Power && Output->Active && (Output->Crtc == Crtc1)) { + Output->Power(Output, RHD_POWER_ON); +#ifdef ATOM_BIOS + RHDAtomBIOSScratchPMState(rhdPtr, Output, PowerManagementMode); +#endif + } + + Crtc1->Blank(Crtc1, FALSE); + } + + if (Crtc2->Active) { + Crtc2->Power(Crtc2, RHD_POWER_ON); + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Power && Output->Active && (Output->Crtc == Crtc2)) { + Output->Power(Output, RHD_POWER_ON); +#ifdef ATOM_BIOS + RHDAtomBIOSScratchPMState(rhdPtr, Output, PowerManagementMode); +#endif + } + Crtc2->Blank(Crtc2, FALSE); + } + break; + case DPMSModeStandby: + case DPMSModeSuspend: + case DPMSModeOff: + if (Crtc1->Active) { + Crtc1->Blank(Crtc1, TRUE); + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Power && Output->Active && (Output->Crtc == Crtc1)) { + Output->Power(Output, RHD_POWER_RESET); +#ifdef ATOM_BIOS + RHDAtomBIOSScratchPMState(rhdPtr, Output, PowerManagementMode); +#endif + } + + Crtc1->Power(Crtc1, RHD_POWER_RESET); + } + + if (Crtc2->Active) { + Crtc2->Blank(Crtc2, TRUE); + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Power && Output->Active && (Output->Crtc == Crtc2)) { + Output->Power(Output, RHD_POWER_RESET); +#ifdef ATOM_BIOS + RHDAtomBIOSScratchPMState(rhdPtr, Output, PowerManagementMode); +#endif + } + + Crtc2->Power(Crtc2, RHD_POWER_RESET); + } + break; + } +} + +/* + * + */ +static void +RHDLoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices, LOCO *colors, + VisualPtr pVisual) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdCrtc *Crtc; + + CARD16 red[256], green[256], blue[256]; + int i, index, j, n; + Bool partial_table = FALSE; + + switch (pScrn->depth) { + case 8: + case 24: + case 32: + if (numColors < 256) { + partial_table = TRUE; + break; + } + for (i = 0; i < numColors; i++) { + index = indices[i]; + red[index] = colors[index].red << 6; + green[index] = colors[index].green << 6; + blue[index] = colors[index].blue << 6; + } + break; + case 16: + if (numColors < 64) { + partial_table = TRUE; + break; + } + /* 6 bits of green, 5 bits of red and blue each */ + for (i = 0; i < numColors; i++) { + index = indices[i]; + n = index * 4; + for (j = 0; j < 4; j++) { + red[n + j] = colors[index/2].red << 6; + green[n + j] = colors[index].green << 6; + blue[n + j] = colors[index/2].blue << 6; + } + } + break; + case 15: + if (numColors < 32) { + partial_table = TRUE; + break; + } + /* 5 bits each */ + for (i = 0; i < numColors; i++) { + int j, n; + + index = indices[i]; + n = index * 8; + for (j = 0; j < 8; j++) { + red[n + j] = colors[index].red << 6; + green[n + j] = colors[index].green << 6; + blue[n+ j] = colors[index].blue << 6; + } + } + break; + } + + for (i = 0; i < 2; i++) { + Crtc = rhdPtr->Crtc[i]; + if ((pScrn->scrnIndex == Crtc->scrnIndex) && Crtc->Active) { + if (!partial_table) + Crtc->LUT->Set(Crtc->LUT, red, green, blue); + else + Crtc->LUT->SetRows(Crtc->LUT, numColors, indices, colors); + } + } +} + +/* + * + */ +static Bool +RHDSaveScreen(ScreenPtr pScreen, int on) +{ + ScrnInfoPtr pScrn; + RHDPtr rhdPtr; + struct rhdCrtc *Crtc; + Bool unblank; + + unblank = xf86IsUnblank(on); + + if (unblank) + SetTimeSinceLastInputEvent(); + + if (pScreen == NULL) + return TRUE; + + pScrn = xf86Screens[pScreen->myNum]; + + if (pScrn == NULL) + return TRUE; + + RHDFUNC(pScrn); + + rhdPtr = RHDPTR(pScrn); + + if (!pScrn->vtSema) + return TRUE; + + Crtc = rhdPtr->Crtc[0]; + if (pScreen->myNum == Crtc->scrnIndex) + Crtc->Blank(Crtc, !unblank); + + Crtc = rhdPtr->Crtc[1]; + if (pScreen->myNum == Crtc->scrnIndex) + Crtc->Blank(Crtc, !unblank); + + return TRUE; +} + +/* + * + */ +Bool +RHDScalePolicy(struct rhdMonitor *Monitor, struct rhdConnector *Connector) +{ + if (!Monitor || !Monitor->UseFixedModes || !Monitor->NativeMode) + return FALSE; + + if (Connector->Type != RHD_CONNECTOR_PANEL) + return FALSE; + + return TRUE; +} + +/* + * + */ +static Bool +rhdMapMMIO(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + +#ifdef XSERVER_LIBPCIACCESS + + rhdPtr->MMIOMapSize = rhdPtr->PciInfo->regions[RHD_MMIO_BAR].size; + rhdPtr->MMIOPCIAddress = rhdPtr->PciInfo->regions[RHD_MMIO_BAR].base_addr; + if (pci_device_map_range(rhdPtr->PciInfo, + rhdPtr->MMIOPCIAddress, rhdPtr->MMIOMapSize, + PCI_DEV_MAP_FLAG_WRITABLE, + &rhdPtr->MMIOBase)) + rhdPtr->MMIOBase = NULL; + +#else + + rhdPtr->MMIOMapSize = 1 << rhdPtr->PciInfo->size[RHD_MMIO_BAR]; + rhdPtr->MMIOPCIAddress = rhdPtr->PciInfo->memBase[RHD_MMIO_BAR]; + rhdPtr->MMIOBase = + xf86MapPciMem(rhdPtr->scrnIndex, VIDMEM_MMIO, rhdPtr->PciTag, + rhdPtr->MMIOPCIAddress, rhdPtr->MMIOMapSize); +#endif + if (!rhdPtr->MMIOBase) + return FALSE; + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Mapped IO @ 0x%x to %p (size 0x%08X)\n", + rhdPtr->MMIOPCIAddress, rhdPtr->MMIOBase, rhdPtr->MMIOMapSize); + + return TRUE; +} + +/* + * + */ +static void +rhdUnmapMMIO(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + +#ifdef XSERVER_LIBPCIACCESS + pci_device_unmap_range(rhdPtr->PciInfo, (pointer)rhdPtr->MMIOBase, + rhdPtr->MMIOMapSize); +#else + xf86UnMapVidMem(rhdPtr->scrnIndex, (pointer)rhdPtr->MMIOBase, + rhdPtr->MMIOMapSize); +#endif + rhdPtr->MMIOBase = 0; +} + +/* + * + */ +static CARD32 +rhdGetVideoRamSize(RHDPtr rhdPtr) +{ + CARD32 RamSize, BARSize; + + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) + RamSize = (RHDRegRead(rhdPtr, R5XX_CONFIG_MEMSIZE)) >> 10; + else + RamSize = (RHDRegRead(rhdPtr, R6XX_CONFIG_MEMSIZE)) >> 10; +#ifdef XSERVER_LIBPCIACCESS + BARSize = rhdPtr->PciInfo->regions[RHD_FB_BAR].size >> 10; +#else + BARSize = 1 << (rhdPtr->PciInfo->size[RHD_FB_BAR] - 10); +#endif + if (RamSize > BARSize) { + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "The detected amount of videoram" + " exceeds the PCI BAR aperture.\n"); + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Using only %dkB of the total " + "%dkB.\n", (int) BARSize, (int) RamSize); + return BARSize; + } else + return RamSize; +} + +/* + * + */ +static Bool +rhdMapFB(RHDPtr rhdPtr) +{ + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + RHDFUNC(rhdPtr); + + rhdPtr->FbBase = NULL; + +#ifdef XSERVER_LIBPCIACCESS + rhdPtr->FbPCIAddress = rhdPtr->PciInfo->regions[RHD_FB_BAR].base_addr; + rhdPtr->FbMapSize = rhdPtr->PciInfo->regions[RHD_FB_BAR].size; +#else + rhdPtr->FbPCIAddress = rhdPtr->PciInfo->memBase[RHD_FB_BAR]; + rhdPtr->FbMapSize = 1 << rhdPtr->PciInfo->size[RHD_FB_BAR]; +#endif + + /* some IGPs are special cases */ + switch (rhdPtr->ChipSet) { + case RHD_RS690: + case RHD_RS740: + rhdPtr->FbPhysAddress = RHDReadMC(rhdPtr, RS69_K8_FB_LOCATION); + break; + case RHD_RS780: + rhdPtr->FbPhysAddress = RHDReadMC(rhdPtr, RS78_K8_FB_LOCATION); + break; + default: + rhdPtr->FbPhysAddress = 0; + break; + } + + if (rhdPtr->FbPhysAddress) { + Bool SetIGPMemory = TRUE; + CARD32 option = X_DEFAULT; + + if (rhdPtr->unverifiedFeatures.set) { + option = X_CONFIG; + SetIGPMemory = rhdPtr->unverifiedFeatures.val.bool; + } + if (SetIGPMemory && ! RHD_MC_IGP_SideportMemoryPresent(rhdPtr)) { + SetIGPMemory = FALSE; + option = X_DEFAULT; + } + if (SetIGPMemory) { + CARD32 tmp = 0xfffffc00; + CARD32 s = pScrn->videoRam; + while (! (s & 0x1)) { + s >>= 1; + tmp <<= 1; + } + if (rhdPtr->FbPhysAddress & ~tmp) { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "IGP memory base 0x%8.8x seems to be bogus.\n", rhdPtr->FbPhysAddress); + SetIGPMemory = FALSE; + option = X_DEFAULT; + } + } + if (SetIGPMemory) { + CARD32 FbMapSizePCI = rhdPtr->FbMapSize; + + xf86DrvMsg(rhdPtr->scrnIndex, option, "Mapping IGP memory @ 0x%8.8x\n",rhdPtr->FbPhysAddress); + rhdPtr->FbMapSize = pScrn->videoRam * 1024; +#ifdef XSERVER_LIBPCIACCESS + if (pci_device_map_range(rhdPtr->PciInfo, + rhdPtr->FbPhysAddress, + rhdPtr->FbMapSize, + PCI_DEV_MAP_FLAG_WRITABLE + | PCI_DEV_MAP_FLAG_WRITE_COMBINE, + &rhdPtr->FbBase)) + rhdPtr->FbBase = NULL; + +#else + rhdPtr->FbBase = + xf86MapPciMem(rhdPtr->scrnIndex, VIDMEM_FRAMEBUFFER, + rhdPtr->PciTag, + rhdPtr->FbPhysAddress, + rhdPtr->FbMapSize); +#endif + /* If mapping was unsuccessful restore old size */ + if (!rhdPtr->FbBase) + rhdPtr->FbMapSize = FbMapSizePCI; + } else { + xf86DrvMsg(rhdPtr->scrnIndex, option, "Not Mapping IGP memory\n"); + } + } + + /* go through the BAR */ + if (!rhdPtr->FbBase) { + rhdPtr->FbPhysAddress = rhdPtr->FbPCIAddress; + + if (rhdPtr->FbMapSize > (unsigned) pScrn->videoRam * 1024) + rhdPtr->FbMapSize = pScrn->videoRam * 1024; + +#ifdef XSERVER_LIBPCIACCESS + if (pci_device_map_range(rhdPtr->PciInfo, + rhdPtr->FbPhysAddress, + rhdPtr->FbMapSize, + PCI_DEV_MAP_FLAG_WRITABLE + | PCI_DEV_MAP_FLAG_WRITE_COMBINE, + &rhdPtr->FbBase)) + rhdPtr->FbBase = NULL; +#else + rhdPtr->FbBase = + xf86MapPciMem(rhdPtr->scrnIndex, VIDMEM_FRAMEBUFFER, rhdPtr->PciTag, + rhdPtr->FbPhysAddress, rhdPtr->FbMapSize); +#endif + } + + RHDDebug(rhdPtr->scrnIndex, "Physical FB Address: 0x%08X (PCI BAR: 0x%08X)\n", + rhdPtr->FbPhysAddress, rhdPtr->FbPCIAddress); + + if (!rhdPtr->FbBase) + return FALSE; + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Mapped FB @ 0x%x to %p (size 0x%08X)\n", + rhdPtr->FbPhysAddress, rhdPtr->FbBase, rhdPtr->FbMapSize); + return TRUE; +} + +/* + * + */ +static void +rhdUnmapFB(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + if (!rhdPtr->FbBase) + return; + +#ifdef XSERVER_LIBPCIACCESS + pci_device_unmap_range(rhdPtr->PciInfo, (pointer)rhdPtr->FbBase, + rhdPtr->FbMapSize); +#else + xf86UnMapVidMem(rhdPtr->scrnIndex, (pointer)rhdPtr->FbBase, + rhdPtr->FbMapSize); +#endif + + rhdPtr->FbBase = NULL; +} + +/* + * + */ +static void +rhdFbOffscreenGrab(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + RHDOpt Option = rhdPtr->OffscreenOption; + int tmp; + unsigned int size = 0; + + if (Option.set) { + if ((sscanf(Option.val.string, "%dm", &tmp) == 1) || + (sscanf(Option.val.string, "%dM", &tmp) == 1)) { + /* "...m" or "...M" means megabyte. */ + size = tmp << 20; + } else if (sscanf(Option.val.string, "%d%%", &tmp) == 1) { + /* "...%" of total framebuffer memory */ + size = tmp * pScrn->videoRam / 100; + } else + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Option OffscreenSize: " + "Unable to parse \"%s\".\n", Option.val.string); + } + + if (!size) + size = pScrn->videoRam * 1024 / 10; + + if (size > rhdPtr->FbFreeSize) + size = rhdPtr->FbFreeSize; + + /* calculate the number of lines our frontbuffer and offscreen have */ + tmp = rhdPtr->FbScanoutSize + size; + tmp /= (pScrn->displayWidth * pScrn->bitsPerPixel >> 3); + + if (rhdPtr->ChipSet < RHD_R600) { + if (tmp > 0x1FFF) /* cannot go beyond 8k lines on R5xx */ + tmp = 0x1FFF; + } else { + if (tmp > 0x7FFF) /* X limit (signed short). */ + tmp = 0x7FFF; + } + + tmp -= pScrn->virtualY; + + /* get our actual size */ + tmp *= (pScrn->displayWidth * pScrn->bitsPerPixel >> 3); + + tmp = RHD_FB_CHUNK(tmp); + + rhdPtr->FbOffscreenSize = tmp; + rhdPtr->FbOffscreenStart = RHDAllocFb(rhdPtr, tmp, "Offscreen Buffer"); + ASSERT(rhdPtr->FbOffscreenStart != (unsigned)-1); +} + +/* + * + */ +static void +rhdOutputConnectorCheck(struct rhdConnector *Connector) +{ + struct rhdOutput *Output; + int i; + + /* First, try to sense */ + for (i = 0; i < 2; i++) { + Output = Connector->Output[i]; + if (Output && Output->Sense) { + /* + * This is ugly and needs to change when the TV support patches are in. + * The problem here is that the Output struct can be used for two connectors + * and thus two different devices + */ + if (Output->SensedType == RHD_SENSED_NONE) { + /* Do this before sensing as AtomBIOS sense needs this info */ + if ((Output->SensedType = Output->Sense(Output, Connector)) != RHD_SENSED_NONE) { + RHDOutputPrintSensedType(Output); + RHDOutputAttachConnector(Output, Connector); + break; + } + } + } + } + + if (i == 2) { + /* now just enable the ones without sensing */ + for (i = 0; i < 2; i++) { + Output = Connector->Output[i]; + if (Output && !Output->Sense) { + RHDOutputAttachConnector(Output, Connector); + break; + } + } + } +} + +/* + * + */ +static Bool +rhdModeLayoutSelect(RHDPtr rhdPtr) +{ + struct rhdOutput *Output; + struct rhdConnector *Connector; + Bool Found = FALSE; + RHDOpt ignore; + Bool ConnectorIsDMS59 = FALSE; + int i = 0; + + RHDFUNC(rhdPtr); + + /* housekeeping */ + rhdPtr->Crtc[0]->PLL = rhdPtr->PLLs[0]; + rhdPtr->Crtc[0]->LUT = rhdPtr->LUT[0]; + + rhdPtr->Crtc[1]->PLL = rhdPtr->PLLs[1]; + rhdPtr->Crtc[1]->LUT = rhdPtr->LUT[1]; + + /* start layout afresh */ + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) { + Output->Active = FALSE; + Output->Crtc = NULL; + Output->Connector = NULL; + } + + /* quick and dirty option so that some output choice exists */ + RhdGetOptValString (rhdPtr->Options, OPTION_IGNORECONNECTOR, &ignore, ""); + + /* handle cards with DMS-59 connectors appropriately. The DMS-59 to VGA + adapter does not raise HPD at all, so we need a fallback there. */ + if (rhdPtr->Card) { + ConnectorIsDMS59 = rhdPtr->Card->flags & RHD_CARD_FLAG_DMS59; + if (ConnectorIsDMS59) + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Card %s has a DMS-59" + " connector.\n", rhdPtr->Card->name); + } + + /* Check on the basis of Connector->HPD */ + for (i = 0; i < RHD_CONNECTORS_MAX; i++) { + Connector = rhdPtr->Connector[i]; + + if (!Connector) + continue; + + switch(RhdParseBooleanOption(&ignore, Connector->Name)) { + case RHD_OPTION_ON: + case RHD_OPTION_DEFAULT: + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "Skipping connector \"%s\"\n", Connector->Name); + continue; + case RHD_OPTION_OFF: + case RHD_OPTION_NOT_SET: + break; + } + + if (Connector->HPDCheck) { + if (Connector->HPDCheck(Connector)) { + Connector->HPDAttached = TRUE; + + rhdOutputConnectorCheck(Connector); + } else { + Connector->HPDAttached = FALSE; + if (ConnectorIsDMS59) + rhdOutputConnectorCheck(Connector); + } + } else + rhdOutputConnectorCheck(Connector); + } + + i = 0; /* counter for CRTCs */ + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Connector) { + struct rhdMonitor *Monitor = NULL; + + Connector = Output->Connector; + + Monitor = RHDMonitorInit(Connector); + + if (!Monitor && (Connector->Type == RHD_CONNECTOR_PANEL)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Unable to attach a" + " monitor to connector \"%s\"\n", Connector->Name); + Output->Active = FALSE; + } else if (!Output->AllocFree || Output->AllocFree(Output, RHD_OUTPUT_ALLOC)){ + Connector->Monitor = Monitor; + + Output->Active = TRUE; + + Output->Crtc = rhdPtr->Crtc[i & 1]; /* ;) */ + i++; + + Output->Crtc->Active = TRUE; + + if (RHDScalePolicy(Monitor, Connector)) { + Output->Crtc->ScaledToMode = RHDModeCopy(Monitor->NativeMode); + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "Crtc[%i]: found native mode from Monitor[%s]: ", + Output->Crtc->Id, Monitor->Name); + RHDPrintModeline(Output->Crtc->ScaledToMode); + } + + Found = TRUE; + + if (Monitor) { + /* If this is a DVI attached monitor, enable reduced blanking. + * TODO: iiyama vm pro 453: CRT with DVI-D == No reduced. + */ + if ((Output->Id == RHD_OUTPUT_TMDSA) || + (Output->Id == RHD_OUTPUT_LVTMA) || + (Output->Id == RHD_OUTPUT_KLDSKP_LVTMA) || + (Output->Id == RHD_OUTPUT_UNIPHYA) || + (Output->Id == RHD_OUTPUT_UNIPHYB)) + Monitor->ReducedAllowed = TRUE; + + /* allow user to override settings globally */ + if (rhdPtr->forceReduced.set) + Monitor->ReducedAllowed = rhdPtr->forceReduced.val.bool; + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "Connector \"%s\" uses Monitor \"%s\":\n", + Connector->Name, Monitor->Name); + RHDMonitorPrint(Monitor); + } else + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "Connector \"%s\": Failed to retrieve Monitor" + " information.\n", Connector->Name); + } + } + + /* Now validate the scaled modes attached to crtcs */ + for (i = 0; i < 2; i++) { + struct rhdCrtc *crtc = rhdPtr->Crtc[i]; + if (crtc->ScaledToMode && RHDValidateScaledToMode(crtc, crtc->ScaledToMode) != MODE_OK) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Crtc[%i]: scaled mode invalid.\n", crtc->Id); + xfree(crtc->ScaledToMode); + crtc->ScaledToMode = NULL; + } + } + + return Found; +} + +/* + * Calculating DPI will never be good. But here we attempt to make it work, + * somewhat, with multiple monitors. + * + * The real solution for the DPI problem cannot be something statically, + * as DPI varies with resolutions chosen and with displays attached/detached. + */ +static void +rhdModeDPISet(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + /* first cleanse the option to at least be reasonable */ + if (rhdPtr->forceDPI.set) + if ((rhdPtr->forceDPI.val.integer < 20) || + (rhdPtr->forceDPI.val.integer > 1000)) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Option ForceDPI got passed" + " an insane value: %d. Ignoring.\n", + rhdPtr->forceDPI.val.integer); + rhdPtr->forceDPI.set = FALSE; + } + + /* monitorResolution is the DPI that was passed as a server option. + * This has been available all the way back to the original Xorg import */ + if (monitorResolution > 0) { + RHDDebug(pScrn->scrnIndex, "%s: Forcing DPI through xserver argument.\n", + __func__); + + pScrn->xDpi = monitorResolution; + pScrn->yDpi = monitorResolution; + } else if (rhdPtr->forceDPI.set) { + RHDDebug(pScrn->scrnIndex, "%s: Forcing DPI through configuration option.\n", + __func__); + + pScrn->xDpi = rhdPtr->forceDPI.val.integer; + pScrn->yDpi = rhdPtr->forceDPI.val.integer; + } else { + /* go over the monitors */ + struct rhdCrtc *Crtc; + struct rhdOutput *Output; + struct rhdMonitor *Monitor; + /* we need to use split counters, x or y might fail separately */ + int i, xcount, ycount; + + pScrn->xDpi = 0; + pScrn->yDpi = 0; + xcount = 0; + ycount = 0; + + for (i = 0; i < 2; i++) { + Crtc = rhdPtr->Crtc[i]; + if (Crtc->Active) { + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) { + if (Output->Active && (Output->Crtc == Crtc)) { + if (Output->Connector && Output->Connector->Monitor) { + Monitor = Output->Connector->Monitor; + + if (Monitor->xDpi) { + pScrn->xDpi += (Monitor->xDpi - pScrn->xDpi) / (xcount + 1); + xcount++; + } + + if (Monitor->yDpi) { + pScrn->yDpi += (Monitor->yDpi - pScrn->yDpi) / (ycount + 1); + ycount++; + } + } + } + } + } + } + + /* make sure that we have at least some value */ + if (!pScrn->xDpi || !pScrn->yDpi) { + if (pScrn->xDpi) + pScrn->yDpi = pScrn->xDpi; + else if (pScrn->yDpi) + pScrn->xDpi = pScrn->yDpi; + else { + pScrn->xDpi = 96; + pScrn->yDpi = 96; + } + } + } + +#ifndef MMPERINCH +#define MMPERINCH 25.4 +#endif + pScrn->widthmm = pScrn->virtualX * MMPERINCH / pScrn->xDpi; + pScrn->heightmm = pScrn->virtualY * MMPERINCH / pScrn->yDpi; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using %dx%d DPI.\n", + pScrn->xDpi, pScrn->yDpi); +} + + +/* + * + */ +static void +rhdModeLayoutPrint(RHDPtr rhdPtr) +{ + struct rhdCrtc *Crtc; + struct rhdOutput *Output; + Bool Found; + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Listing modesetting layout:\n\n"); + + /* CRTC 1 */ + Crtc = rhdPtr->Crtc[0]; + if (Crtc->Active) { + xf86Msg(X_NONE, "\t%s: tied to %s and %s:\n", + Crtc->Name, Crtc->PLL->Name, Crtc->LUT->Name); + + Found = FALSE; + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Active && (Output->Crtc == Crtc)) { + if (!Found) { + xf86Msg(X_NONE, "\t\tOutputs: %s (%s)", + Output->Name, Output->Connector->Name); + Found = TRUE; + } else + xf86Msg(X_NONE, ", %s (%s)", Output->Name, + Output->Connector->Name); + } + + if (!Found) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s is active without outputs\n", Crtc->Name); + else + xf86Msg(X_NONE, "\n"); + } else + xf86Msg(X_NONE, "\t%s: unused\n", Crtc->Name); + xf86Msg(X_NONE, "\n"); + + /* CRTC 2 */ + Crtc = rhdPtr->Crtc[1]; + if (Crtc->Active) { + xf86Msg(X_NONE, "\t%s: tied to %s and %s:\n", + Crtc->Name, Crtc->PLL->Name, Crtc->LUT->Name); + + Found = FALSE; + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Active && (Output->Crtc == Crtc)) { + if (!Found) { + xf86Msg(X_NONE, "\t\tOutputs: %s (%s)", + Output->Name, Output->Connector->Name); + Found = TRUE; + } else + xf86Msg(X_NONE, ", %s (%s)", Output->Name, + Output->Connector->Name); + } + + if (!Found) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s is active without outputs\n", Crtc->Name); + else + xf86Msg(X_NONE, "\n"); + } else + xf86Msg(X_NONE, "\t%s: unused\n", Crtc->Name); + xf86Msg(X_NONE, "\n"); + + /* Print out unused Outputs */ + Found = FALSE; + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (!Output->Active) { + if (!Found) { + xf86Msg(X_NONE, "\t\tUnused Outputs: %s", Output->Name); + Found = TRUE; + } else + xf86Msg(X_NONE, ", %s", Output->Name); + } + + if (Found) + xf86Msg(X_NONE, "\n"); + xf86Msg(X_NONE, "\n"); +} + +/* + * + */ +void +RHDPrepareMode(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + /* Stop crap from being shown: gets reenabled through SaveScreen */ + rhdPtr->Crtc[0]->Blank(rhdPtr->Crtc[0], TRUE); + rhdPtr->Crtc[1]->Blank(rhdPtr->Crtc[1], TRUE); + /* no active outputs == no mess */ + RHDOutputsPower(rhdPtr, RHD_POWER_RESET); +} + +/* + * + */ +static void +rhdModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(rhdPtr); + pScrn->vtSema = TRUE; + + rhdSetMode(pScrn, mode); +} + +/* + * + */ +static void +rhdSetMode(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i; + + RHDFUNC(rhdPtr); + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Setting up \"%s\" (%dx%d@%3.1fHz)\n", + mode->name, mode->CrtcHDisplay, mode->CrtcVDisplay, + mode->VRefresh); + + /* Set up D1/D2 and appendages */ + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc; + + Crtc = rhdPtr->Crtc[i]; + if (Crtc->Active) { + Crtc->FBSet(Crtc, pScrn->displayWidth, pScrn->virtualX, pScrn->virtualY, + pScrn->depth, rhdPtr->FbScanoutStart); + if (Crtc->ScaledToMode) { + Crtc->ModeSet(Crtc, Crtc->ScaledToMode); + if (Crtc->ScaleSet) + Crtc->ScaleSet(Crtc, Crtc->ScaleType, mode, Crtc->ScaledToMode); + } else { + Crtc->ModeSet(Crtc, mode); + if (Crtc->ScaleSet) + Crtc->ScaleSet(Crtc, RHD_CRTC_SCALE_TYPE_NONE, mode, NULL); + } + RHDPLLSet(Crtc->PLL, mode->Clock); + Crtc->LUTSelect(Crtc, Crtc->LUT); + RHDOutputsMode(rhdPtr, Crtc, Crtc->ScaledToMode + ? Crtc->ScaledToMode : mode); + } + } + + /* shut down that what we don't use */ + RHDPLLsShutdownInactive(rhdPtr); + RHDOutputsShutdownInactive(rhdPtr); + + if (rhdPtr->Crtc[0]->Active) + rhdPtr->Crtc[0]->Power(rhdPtr->Crtc[0], RHD_POWER_ON); + else + rhdPtr->Crtc[0]->Power(rhdPtr->Crtc[0], RHD_POWER_SHUTDOWN); + + if (rhdPtr->Crtc[1]->Active) + rhdPtr->Crtc[1]->Power(rhdPtr->Crtc[1], RHD_POWER_ON); + else + rhdPtr->Crtc[1]->Power(rhdPtr->Crtc[1], RHD_POWER_SHUTDOWN); + + RHDOutputsPower(rhdPtr, RHD_POWER_ON); +} + +/* + * + */ +static void +rhdSave(RHDPtr rhdPtr) +{ + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + + RHDFUNC(rhdPtr); + + RHDMCSave(rhdPtr); + + RHDVGASave(rhdPtr); + + RHDOutputsSave(rhdPtr); +#ifdef ATOM_BIOS + rhdPtr->BIOSScratch = RHDSaveBiosScratchRegisters(rhdPtr); +#endif + RHDPLLsSave(rhdPtr); + RHDAudioSave(rhdPtr); + RHDLUTsSave(rhdPtr); + + RHDCrtcSave(rhdPtr->Crtc[0]); + RHDCrtcSave(rhdPtr->Crtc[1]); + rhdSaveCursor(pScrn); + + RHDPmSave(rhdPtr); +} + +/* + * + */ +static void +rhdRestore(RHDPtr rhdPtr) +{ + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + + RHDFUNC(rhdPtr); + + RHDMCRestore(rhdPtr); + + rhdRestoreCursor(pScrn); + + RHDPLLsRestore(rhdPtr); + RHDAudioRestore(rhdPtr); + RHDLUTsRestore(rhdPtr); + + RHDVGARestore(rhdPtr); + + /* restore after restoring CRTCs - check rhd_crtc.c for why */ + RHDCrtcRestore(rhdPtr->Crtc[0]); + RHDCrtcRestore(rhdPtr->Crtc[1]); + + RHDPmRestore(rhdPtr); + + RHDOutputsRestore(rhdPtr); +#ifdef ATOM_BIOS + RHDRestoreBiosScratchRegisters(rhdPtr, rhdPtr->BIOSScratch); +#endif +} + +#ifdef RHD_DEBUG +/* + * + */ +CARD32 +_RHDRegReadD(int scrnIndex, CARD16 offset) +{ + CARD32 tmp = MMIO_IN32(RHDPTR(xf86Screens[scrnIndex])->MMIOBase, offset); + xf86DrvMsg(scrnIndex, X_INFO, "RHDRegRead(0x%4.4x) = 0x%4.4x\n",offset,tmp); + return tmp; +} + +/* + * + */ +void +_RHDRegWriteD(int scrnIndex, CARD16 offset, CARD32 value) +{ + xf86DrvMsg(scrnIndex, X_INFO, "RHDRegWrite(0x%4.4x,0x%4.4x)\n",offset,tmp); + MMIO_OUT32(RHDPTR(xf86Screens[scrnIndex])->MMIOBase, offset, value); +} + +/* + * + */ +void +_RHDRegMaskD(int scrnIndex, CARD16 offset, CARD32 value, CARD32 mask) +{ + CARD32 tmp; + + tmp = _RHDRegReadD(scrnIndex, offset); + tmp &= ~mask; + tmp |= (value & mask); + _RHDRegWriteD(scrnIndex, offset, tmp); +} +#endif /* RHD_DEBUG */ + +/* The following two are R5XX only. R6XX doesn't require these */ +CARD32 +_RHDReadMC(int scrnIndex, CARD32 addr) +{ + RHDPtr rhdPtr = RHDPTR(xf86Screens[scrnIndex]); + CARD32 ret = 0; + + if (rhdPtr->ChipSet < RHD_RS600) { + RHDRegWrite(rhdPtr, MC_IND_INDEX, addr); + ret = RHDRegRead(rhdPtr, MC_IND_DATA); + } else if (rhdPtr->ChipSet == RHD_RS600) { + RHDRegWrite(rhdPtr, RS600_MC_INDEX, ((addr & RS600_MC_INDEX_ADDR_MASK) | RS600_MC_INDEX_CITF_ARB0)); + ret = RHDRegRead(rhdPtr, RS600_MC_DATA); + } else if (rhdPtr->ChipSet == RHD_RS690 || rhdPtr->ChipSet == RHD_RS740) { + RHDRegWrite(rhdPtr, RS690_MC_INDEX, (addr & RS690_MC_INDEX_ADDR_MASK)); + ret = RHDRegRead(rhdPtr, RS690_MC_DATA); + } else if (rhdPtr->ChipSet == RHD_RS780 || rhdPtr->ChipSet == RHD_RS880) { + RHDRegWrite(rhdPtr, RS780_MC_INDEX, (addr & RS780_MC_INDEX_ADDR_MASK)); + ret = RHDRegRead(rhdPtr, RS780_MC_DATA); + } else { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: shouldn't be here\n", __func__); + } +#ifdef RHD_DEBUG + RHDDebug(scrnIndex,"%s(0x%08X) = 0x%08X\n",__func__,(unsigned int)addr, + (unsigned int)ret); +#endif + return ret; +} + +void +_RHDWriteMC(int scrnIndex, CARD32 addr, CARD32 data) +{ + RHDPtr rhdPtr = RHDPTR(xf86Screens[scrnIndex]); + +#ifdef RHD_DEBUG + RHDDebug(scrnIndex,"%s(0x%08X, 0x%08X)\n",__func__,(unsigned int)addr, + (unsigned int)data); +#endif + + if (rhdPtr->ChipSet < RHD_RS600) { + RHDRegWrite(rhdPtr, MC_IND_INDEX, addr | MC_IND_WR_EN); + RHDRegWrite(rhdPtr, MC_IND_DATA, data); + } else if (rhdPtr->ChipSet == RHD_RS600) { + RHDRegWrite(rhdPtr, RS600_MC_INDEX, ((addr & RS600_MC_INDEX_ADDR_MASK) | RS600_MC_INDEX_CITF_ARB0 | RS600_MC_INDEX_WR_EN)); + RHDRegWrite(rhdPtr, RS600_MC_DATA, data); + } else if (rhdPtr->ChipSet == RHD_RS690 || rhdPtr->ChipSet == RHD_RS740) { + RHDRegWrite(rhdPtr, RS690_MC_INDEX, ((addr & RS690_MC_INDEX_ADDR_MASK) | RS690_MC_INDEX_WR_EN)); + RHDRegWrite(rhdPtr, RS690_MC_DATA, data); + RHDRegWrite(rhdPtr, RS690_MC_INDEX, RS690_MC_INDEX_WR_ACK); + } else if (rhdPtr->ChipSet == RHD_RS780 || rhdPtr->ChipSet == RHD_RS880) { + RHDRegWrite(rhdPtr, RS780_MC_INDEX, ((addr & RS780_MC_INDEX_ADDR_MASK) | RS780_MC_INDEX_WR_EN)); + RHDRegWrite(rhdPtr, RS780_MC_DATA, data); + } else { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: shouldn't be here\n", __func__); + } +} + +CARD32 +_RHDReadPLL(int scrnIndex, CARD16 offset) +{ + RHDPtr rhdPtr = RHDPTR(xf86Screens[scrnIndex]); + RHDRegWrite(rhdPtr, CLOCK_CNTL_INDEX, (offset & PLL_ADDR)); + return RHDRegRead(rhdPtr, CLOCK_CNTL_DATA); +} + +void +_RHDWritePLL(int scrnIndex, CARD16 offset, CARD32 data) +{ + RHDPtr rhdPtr = RHDPTR(xf86Screens[scrnIndex]); + RHDRegWrite(rhdPtr, CLOCK_CNTL_INDEX, (offset & PLL_ADDR) | PLL_WR_EN); + RHDRegWrite(rhdPtr, CLOCK_CNTL_DATA, data); +} + +/* + * Apart from handling the respective option, this also tries to map out + * what method is supported on which chips. + */ +static void +rhdAccelOptionsHandle(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + RHDOpt method, noAccel; + + /* first grab our options */ + RhdGetOptValBool(rhdPtr->Options, OPTION_NOACCEL, &noAccel, FALSE); + RhdGetOptValString(rhdPtr->Options, OPTION_ACCELMETHOD, &method, "default"); + RhdGetOptValString (rhdPtr->Options, OPTION_OFFSCREENSIZE, + &rhdPtr->OffscreenOption, "default"); + + if (method.set) { + if (!strcasecmp(method.val.string, "none")) + rhdPtr->AccelMethod = RHD_ACCEL_NONE; + else if (!strcasecmp(method.val.string, "force-shadowfb")) + rhdPtr->AccelMethod = RHD_ACCEL_FORCE_SHADOWFB; + else if (!strcasecmp(method.val.string, "shadowfb")) + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + else if (!strcasecmp(method.val.string, "xaa")) + rhdPtr->AccelMethod = RHD_ACCEL_XAA; +#ifdef USE_EXA + else if (!strcasecmp(method.val.string, "exa")) + rhdPtr->AccelMethod = RHD_ACCEL_EXA; +#endif /* USE_EXA */ + else if (!strcasecmp(method.val.string, "default")) + rhdPtr->AccelMethod = RHD_ACCEL_DEFAULT; + else { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Unknown AccelMethod \"%s\".\n", + method.val.string); + rhdPtr->AccelMethod = RHD_ACCEL_DEFAULT; + } + } else + rhdPtr->AccelMethod = RHD_ACCEL_DEFAULT; + + if (rhdPtr->AccelMethod == RHD_ACCEL_DEFAULT) { +#ifdef USE_EXA + rhdPtr->AccelMethod = RHD_ACCEL_EXA; +#else + if (rhdPtr->ChipSet < RHD_R600) + rhdPtr->AccelMethod = RHD_ACCEL_XAA; + else + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; +#endif /* USE_EXA */ + /* RV740: EXA is extremely slow due to DFS breaking for <32x32 images + * and Composite breaking with partial DFS */ + if (rhdPtr->ChipSet == RHD_RV740) + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + } + + if (noAccel.set && noAccel.val.bool && + (rhdPtr->AccelMethod > RHD_ACCEL_SHADOWFB)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Disabling HW 2D acceleration.\n"); + rhdPtr->AccelMethod = RHD_ACCEL_SHADOWFB; + } + + /* Now for some pretty print */ + switch (rhdPtr->AccelMethod) { +#ifdef USE_EXA + case RHD_ACCEL_EXA: + xf86DrvMsg(rhdPtr->scrnIndex, X_CONFIG, "Selected EXA 2D acceleration.\n"); + break; +#endif /* USE_EXA */ + case RHD_ACCEL_XAA: + xf86DrvMsg(rhdPtr->scrnIndex, X_CONFIG, "Selected XAA 2D acceleration.\n"); + break; + case RHD_ACCEL_FORCE_SHADOWFB: + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Selected forced ShadowFB (even with DRI). Known to have issues.\n"); + break; + case RHD_ACCEL_SHADOWFB: + xf86DrvMsg(rhdPtr->scrnIndex, X_CONFIG, "Selected ShadowFB.\n"); + break; + case RHD_ACCEL_NONE: + default: + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, /* corny */ + "All methods of acceleration have been disabled.\n"); + break; + } + + /* If shadowfb is explicitely selected AND dri is not explicitely asked + * for, disable dri as they don't go along */ + if (rhdPtr->AccelMethod == RHD_ACCEL_SHADOWFB && ! rhdPtr->useDRI.set) { + xf86DrvMsg(rhdPtr->scrnIndex, X_CONFIG, + "Disabling DRI by default with AccelMethod shadowfb.\n"); + rhdPtr->useDRI.val.bool = FALSE; + } +} + +/* + * breakout functions + */ +static void +rhdProcessOptions(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + RHDOpt hpd; +#ifdef ATOM_BIOS + RHDOpt atombios; +#endif + + /* Collect all of the relevant option flags (fill in pScrn->options) */ + xf86CollectOptions(pScrn, NULL); + rhdPtr->Options = xnfcalloc(sizeof(RHDOptions), 1); + memcpy(rhdPtr->Options, RHDOptions, sizeof(RHDOptions)); + + /* Process the options */ + xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, rhdPtr->Options); + + RhdGetOptValBool (rhdPtr->Options, OPTION_SW_CURSOR, + &rhdPtr->swCursor, FALSE); + RhdGetOptValBool (rhdPtr->Options, OPTION_FORCEREDUCED, + &rhdPtr->forceReduced, FALSE); + RhdGetOptValInteger(rhdPtr->Options, OPTION_FORCEDPI, + &rhdPtr->forceDPI, 0); + RhdGetOptValString (rhdPtr->Options, OPTION_HPD, + &hpd, "auto"); + RhdGetOptValBool (rhdPtr->Options, OPTION_NORANDR, + &rhdPtr->noRandr, FALSE); + RhdGetOptValString (rhdPtr->Options, OPTION_RROUTPUTORDER, + &rhdPtr->rrOutputOrder, NULL); + RhdGetOptValBool (rhdPtr->Options, OPTION_DRI, + &rhdPtr->useDRI, TRUE); + RhdGetOptValString (rhdPtr->Options, OPTION_TV_MODE, + &rhdPtr->tvModeName, NULL); + RhdGetOptValString (rhdPtr->Options, OPTION_SCALE_TYPE, + &rhdPtr->scaleTypeOpt, "default"); + RhdGetOptValBool (rhdPtr->Options, OPTION_UNVERIFIED_FEAT, + &rhdPtr->unverifiedFeatures, FALSE); + RhdGetOptValBool (rhdPtr->Options, OPTION_AUDIO, + &rhdPtr->audio, TRUE); + RhdGetOptValString (rhdPtr->Options, OPTION_AUDIO_WORKAROUND, + &rhdPtr->audioWorkaround, "none"); + RhdGetOptValString (rhdPtr->Options, OPTION_HDMI, + &rhdPtr->hdmi, "none"); + RhdGetOptValString(rhdPtr->Options, OPTION_COHERENT, + &rhdPtr->coherent, NULL); + RhdGetOptValBool (rhdPtr->Options, OPTION_FORCE_LOW_POWER, + &rhdPtr->lowPowerMode, FALSE); + RhdGetOptValInteger(rhdPtr->Options, OPTION_LOW_POWER_CLOCK, + &rhdPtr->lowPowerModeEngineClock, 0); + +#ifdef ATOM_BIOS + RhdGetOptValBool (rhdPtr->Options, OPTION_USE_ATOMBIOS, + &rhdPtr->UseAtomBIOS, FALSE); + RhdGetOptValString (rhdPtr->Options, OPTION_ATOMBIOS, + &atombios, NULL); + if (atombios.set && atombios.val.string) { + if (! rhdUpdateAtomBIOSUsage (rhdPtr, atombios.val.string)) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Cannot parse AtomBIOS usage string: %s\n", + atombios.val.string); + } +#endif + + rhdAccelOptionsHandle(pScrn); + + rhdPtr->hpdUsage = RHD_HPD_USAGE_AUTO; + if (strcasecmp(hpd.val.string, "off") == 0) { + rhdPtr->hpdUsage = RHD_HPD_USAGE_OFF; + } else if (strcasecmp(hpd.val.string, "normal") == 0) { + rhdPtr->hpdUsage = RHD_HPD_USAGE_NORMAL; + } else if (strcasecmp(hpd.val.string, "swap") == 0) { + rhdPtr->hpdUsage = RHD_HPD_USAGE_SWAP; + } else if (strcasecmp(hpd.val.string, "auto") != 0) { + xf86DrvMsgVerb(rhdPtr->scrnIndex, X_ERROR, 0, + "Unknown HPD Option \"%s\"", hpd.val.string); + } + if (rhdPtr->hpdUsage != RHD_HPD_USAGE_AUTO) + xf86DrvMsgVerb(rhdPtr->scrnIndex, X_WARNING, 0, + "!!! Option HPD is set !!!\n" + " This shall only be used to work around broken connector tables.\n" + " Please report your findings to radeonhd@opensuse.org\n"); +} + + +/* + * rhdDoReadPCIBios(): do the actual reading, return size and copy in ptr + */ +static unsigned int +rhdDoReadPCIBios(RHDPtr rhdPtr, unsigned char **ptr) +{ +#ifdef XSERVER_LIBPCIACCESS + unsigned int size = rhdPtr->PciInfo->rom_size; +#else + unsigned int size = 1 << rhdPtr->PciInfo->biosSize; + int read_len; +#endif + + if (!(*ptr = xcalloc(1, size))) { + xf86DrvMsg(rhdPtr->scrnIndex,X_ERROR, + "Cannot allocate %i bytes of memory " + "for BIOS image\n",size); + return 0; + } + xf86DrvMsg(rhdPtr->scrnIndex,X_INFO,"Getting BIOS copy from PCI ROM\n"); + +#ifdef XSERVER_LIBPCIACCESS + if (pci_device_read_rom(rhdPtr->PciInfo, *ptr)) { + xf86DrvMsg(rhdPtr->scrnIndex,X_ERROR, + "Cannot read BIOS image\n"); + xfree(*ptr); + return 0; + } +#else + if ((read_len = + xf86ReadPciBIOS(0, rhdPtr->PciTag, -1, *ptr, size)) <= 0) { + xf86DrvMsg(rhdPtr->scrnIndex,X_ERROR, + "Cannot read BIOS image\n"); + xfree(*ptr); + return 0; + } else if ((unsigned int)read_len != size) { + xf86DrvMsg(rhdPtr->scrnIndex,X_WARNING, + "Read only %i of %i bytes of BIOS image\n", + read_len, size); + return (unsigned int)read_len; + } +#endif + return size; +} + +/* + * rhdR5XXDoReadPCIBios(): enables access to R5xx BIOS, wraps rhdDoReadPCIBios() + */ +unsigned int +RHDReadPCIBios(RHDPtr rhdPtr, unsigned char **ptr) +{ + unsigned int ret; + CARD32 save_seprom_cntl1 = 0, + save_gpiopad_a, save_gpiopad_en, save_gpiopad_mask, + save_viph_cntl, + save_bus_cntl, + save_d1vga_control, save_d2vga_control, save_vga_render_control, + save_rom_cntl = 0, + save_gen_pwrmgt = 0, + save_low_vid_lower_gpio_cntl = 0, save_med_vid_lower_gpio_cntl = 0, + save_high_vid_lower_gpio_cntl = 0, save_ctxsw_vid_lower_gpio_cntl = 0, + save_lower_gpio_en = 0; + + if (rhdPtr->ChipSet < RHD_R600) + save_seprom_cntl1 = RHDRegRead(rhdPtr, SEPROM_CNTL1); + save_gpiopad_en = RHDRegRead(rhdPtr, GPIOPAD_EN); + save_gpiopad_a = RHDRegRead(rhdPtr, GPIOPAD_A); + save_gpiopad_mask = RHDRegRead(rhdPtr, GPIOPAD_MASK); + save_viph_cntl = RHDRegRead(rhdPtr, VIPH_CONTROL); + save_bus_cntl = RHDRegRead(rhdPtr, BUS_CNTL); + save_d1vga_control = RHDRegRead(rhdPtr, D1VGA_CONTROL); + save_d2vga_control = RHDRegRead(rhdPtr, D2VGA_CONTROL); + save_vga_render_control = RHDRegRead(rhdPtr, VGA_RENDER_CONTROL); + if (rhdPtr->ChipSet >= RHD_R600) { + save_rom_cntl = RHDRegRead(rhdPtr, ROM_CNTL); + save_gen_pwrmgt = RHDRegRead(rhdPtr, GENERAL_PWRMGT); + save_low_vid_lower_gpio_cntl = RHDRegRead(rhdPtr, LOW_VID_LOWER_GPIO_CNTL); + save_med_vid_lower_gpio_cntl = RHDRegRead(rhdPtr, MEDIUM_VID_LOWER_GPIO_CNTL); + save_high_vid_lower_gpio_cntl = RHDRegRead(rhdPtr, HIGH_VID_LOWER_GPIO_CNTL); + save_ctxsw_vid_lower_gpio_cntl = RHDRegRead(rhdPtr, CTXSW_VID_LOWER_GPIO_CNTL); + save_lower_gpio_en = RHDRegRead(rhdPtr, LOWER_GPIO_ENABLE); + } + + /* Set SPI ROM prescale value to change the SCK period */ + if (rhdPtr->ChipSet < RHD_R600) + RHDRegMask(rhdPtr, SEPROM_CNTL1, 0x0C << 24, SCK_PRESCALE); + /* Let chip control GPIO pads - this is the default state after power up */ + RHDRegWrite(rhdPtr, GPIOPAD_EN, 0); + RHDRegWrite(rhdPtr, GPIOPAD_A, 0); + /* Put GPIO pads in read mode */ + RHDRegWrite(rhdPtr, GPIOPAD_MASK, 0); + /* Disable VIP Host port */ + RHDRegMask(rhdPtr, VIPH_CONTROL, 0, VIPH_EN); + /* Enable BIOS ROM */ + RHDRegMask(rhdPtr, BUS_CNTL, 0, BIOS_ROM_DIS); + /* Disable VGA and select extended timings */ + RHDRegMask(rhdPtr, D1VGA_CONTROL, 0, + D1VGA_MODE_ENABLE | D1VGA_TIMING_SELECT); + RHDRegMask(rhdPtr, D2VGA_CONTROL, 0, + D2VGA_MODE_ENABLE | D2VGA_TIMING_SELECT); + RHDRegMask(rhdPtr, VGA_RENDER_CONTROL, 0, VGA_VSTATUS_CNTL); + if (rhdPtr->ChipSet >= RHD_R600) { + RHDRegMask(rhdPtr, ROM_CNTL, SCK_OVERWRITE + | 1 << SCK_PRESCALE_CRYSTAL_CLK_SHIFT, + SCK_OVERWRITE + | 1 << SCK_PRESCALE_CRYSTAL_CLK_SHIFT); + RHDRegMask(rhdPtr, GENERAL_PWRMGT, 0, OPEN_DRAIN_PADS); + RHDRegMask(rhdPtr, LOW_VID_LOWER_GPIO_CNTL, 0, 0x400); + RHDRegMask(rhdPtr, MEDIUM_VID_LOWER_GPIO_CNTL, 0, 0x400); + RHDRegMask(rhdPtr, HIGH_VID_LOWER_GPIO_CNTL, 0, 0x400); + RHDRegMask(rhdPtr, CTXSW_VID_LOWER_GPIO_CNTL, 0, 0x400); + RHDRegMask(rhdPtr, LOWER_GPIO_ENABLE, 0x400, 0x400); + } + + ret = rhdDoReadPCIBios(rhdPtr, ptr); + + if (rhdPtr->ChipSet < RHD_R600) + RHDRegWrite(rhdPtr, SEPROM_CNTL1, save_seprom_cntl1); + RHDRegWrite(rhdPtr, GPIOPAD_EN, save_gpiopad_en); + RHDRegWrite(rhdPtr, GPIOPAD_A, save_gpiopad_a); + RHDRegWrite(rhdPtr, GPIOPAD_MASK, save_gpiopad_mask); + RHDRegWrite(rhdPtr, VIPH_CONTROL, save_viph_cntl); + RHDRegWrite(rhdPtr, BUS_CNTL, save_bus_cntl); + RHDRegWrite(rhdPtr, D1VGA_CONTROL, save_d1vga_control); + RHDRegWrite(rhdPtr, D2VGA_CONTROL, save_d2vga_control); + RHDRegWrite(rhdPtr, VGA_RENDER_CONTROL, save_vga_render_control); + if (rhdPtr->ChipSet >= RHD_R600) { + RHDRegWrite(rhdPtr, ROM_CNTL, save_rom_cntl); + RHDRegWrite(rhdPtr, GENERAL_PWRMGT, save_gen_pwrmgt); + RHDRegWrite(rhdPtr, LOW_VID_LOWER_GPIO_CNTL, save_low_vid_lower_gpio_cntl); + RHDRegWrite(rhdPtr, MEDIUM_VID_LOWER_GPIO_CNTL, save_med_vid_lower_gpio_cntl); + RHDRegWrite(rhdPtr, HIGH_VID_LOWER_GPIO_CNTL, save_high_vid_lower_gpio_cntl); + RHDRegWrite(rhdPtr, CTXSW_VID_LOWER_GPIO_CNTL, save_ctxsw_vid_lower_gpio_cntl); + RHDRegWrite(rhdPtr, LOWER_GPIO_ENABLE, save_lower_gpio_en); + } + + return ret; +} + +/* + * + */ +static void +rhdGetIGPNorthBridgeInfo(RHDPtr rhdPtr) +{ + switch (rhdPtr->ChipSet) { + case RHD_RS600: + break; + case RHD_RS690: + case RHD_RS740: + case RHD_RS780: +#ifdef XSERVER_LIBPCIACCESS + rhdPtr->NBPciInfo = pci_device_find_by_slot(0,0,0,0); +#else + rhdPtr->NBPciTag = pciTag(0,0,0); +#endif + break; + default: + break; + } +} + + +/* + * + */ +static enum rhdCardType +rhdGetCardType(RHDPtr rhdPtr) +{ + uint32_t cmd_stat; + + if (rhdPtr->ChipSet == RHD_RS780) + return RHD_CARD_PCIE; + +#ifdef XSERVER_LIBPCIACCESS + pci_device_cfg_read_u32(rhdPtr->PciInfo, &cmd_stat, PCI_CMD_STAT_REG); +#else + cmd_stat = pciReadLong(rhdPtr->PciTag, PCI_CMD_STAT_REG); +#endif + if (cmd_stat & 0x100000) { + uint32_t cap_ptr, cap_id; + +#ifdef XSERVER_LIBPCIACCESS + pci_device_cfg_read_u32(rhdPtr->PciInfo, &cap_ptr, 0x34); +#else + cap_ptr = pciReadLong(rhdPtr->PciTag, 0x34); +#endif + cap_ptr &= 0xfc; + + while (cap_ptr) { +#ifdef XSERVER_LIBPCIACCESS + pci_device_cfg_read_u32(rhdPtr->PciInfo, &cap_id, cap_ptr); +#else + cap_id = pciReadLong(rhdPtr->PciTag, cap_ptr); +#endif + switch (cap_id & 0xff) { + case RHD_PCI_CAPID_AGP: + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "AGP Card Detected\n"); + return RHD_CARD_AGP; + case RHD_PCI_CAPID_PCIE: + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "PCIE Card Detected\n"); + return RHD_CARD_PCIE; + } + cap_ptr = (cap_id >> 8) & 0xff; + } + } + return RHD_CARD_NONE; +} + +/* Allocate a chunk of the framebuffer. -1 on fail. So far no free()! */ +unsigned int RHDAllocFb(RHDPtr rhdPtr, unsigned int size, const char *name) +{ + unsigned int chunk; + size = RHD_FB_CHUNK(size); + if (rhdPtr->FbFreeSize < size) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "FB: Failed allocating %s (%d KB)\n", name, size/1024); + return -1; + } + chunk = rhdPtr->FbFreeStart; + rhdPtr->FbFreeStart += size; + rhdPtr->FbFreeSize -= size; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "FB: Allocated %s at offset 0x%08X (size = 0x%08X)\n", + name, chunk, size); + return chunk; +} + diff --git a/driver/xf86-video-radeonhd/src/rhd_edid.c b/driver/xf86-video-radeonhd/src/rhd_edid.c new file mode 100644 index 000000000..5b791615c --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_edid.c @@ -0,0 +1,363 @@ +/* + * Copyright 2006-2007 Luc Verhaegen . + * + * 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, 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 + * 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. + */ + +#ifdef HAVE_CONFIG_H +# include +#endif +#ifdef HAVE_XORG_CONFIG_H +# include +#endif + +#include "xf86.h" +#include "xf86DDC.h" +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +#endif + +#include "rhd.h" +#include "rhd_modes.h" +#include "rhd_monitor.h" + +/* + * TODO: + * - for those with access to the VESA DMT standard; review please. + * - swap M_T_DEFAULT for M_T_EDID_... + */ +#define MODEPREFIX(name) NULL, NULL, name, 0,M_T_DRIVER +#define MODESUFFIX 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,FALSE,FALSE,0,NULL,0,0.0,0.0 + +static DisplayModeRec EDIDEstablishedModes[17] = { + { MODEPREFIX("800x600"), 40000, 800, 840, 968, 1056, 0, 600, 601, 605, 628, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@60Hz */ + { MODEPREFIX("800x600"), 36000, 800, 824, 896, 1024, 0, 600, 601, 603, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@56Hz */ + { MODEPREFIX("640x480"), 31500, 640, 656, 720, 840, 0, 480, 481, 484, 500, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@75Hz */ + { MODEPREFIX("640x480"), 31500, 640, 664, 704, 832, 0, 480, 489, 491, 520, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@72Hz */ + { MODEPREFIX("640x480"), 30240, 640, 704, 768, 864, 0, 480, 483, 486, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@67Hz */ + { MODEPREFIX("640x480"), 25200, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 640x480@60Hz */ + { MODEPREFIX("720x400"), 35500, 720, 738, 846, 900, 0, 400, 421, 423, 449, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 720x400@88Hz */ + { MODEPREFIX("720x400"), 28320, 720, 738, 846, 900, 0, 400, 412, 414, 449, 0, V_NHSYNC | V_PVSYNC, MODESUFFIX }, /* 720x400@70Hz */ + { MODEPREFIX("1280x1024"), 135000, 1280, 1296, 1440, 1688, 0, 1024, 1025, 1028, 1066, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1280x1024@75Hz */ + { MODEPREFIX("1024x768"), 78800, 1024, 1040, 1136, 1312, 0, 768, 769, 772, 800, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1024x768@75Hz */ + { MODEPREFIX("1024x768"), 75000, 1024, 1048, 1184, 1328, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@70Hz */ + { MODEPREFIX("1024x768"), 65000, 1024, 1048, 1184, 1344, 0, 768, 771, 777, 806, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 1024x768@60Hz */ + { MODEPREFIX("1024x768"), 44900, 1024, 1032, 1208, 1264, 0, 768, 768, 776, 817, 0, V_PHSYNC | V_PVSYNC | V_INTERLACE, MODESUFFIX }, /* 1024x768@43Hz */ + { MODEPREFIX("832x624"), 57284, 832, 864, 928, 1152, 0, 624, 625, 628, 667, 0, V_NHSYNC | V_NVSYNC, MODESUFFIX }, /* 832x624@75Hz */ + { MODEPREFIX("800x600"), 49500, 800, 816, 896, 1056, 0, 600, 601, 604, 625, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@75Hz */ + { MODEPREFIX("800x600"), 50000, 800, 856, 976, 1040, 0, 600, 637, 643, 666, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 800x600@72Hz */ + { MODEPREFIX("1152x864"), 108000, 1152, 1216, 1344, 1600, 0, 864, 865, 868, 900, 0, V_PHSYNC | V_PVSYNC, MODESUFFIX }, /* 1152x864@75Hz */ +}; + +static DisplayModePtr +EDIDModesFromEstablished(int scrnIndex, struct established_timings *timing) +{ + DisplayModePtr Modes = NULL, Mode = NULL; + CARD32 bits = (timing->t1) | (timing->t2 << 8) | + ((timing->t_manu & 0x80) << 9); + int i; + + for (i = 0; i < 17; i++) + if (bits & (0x01 << i)) { + Mode = RHDModeCopy(&(EDIDEstablishedModes[i])); + Modes = RHDModesAdd(Modes, Mode); + } + + return Modes; +} + +/* + * + */ +static DisplayModePtr +EDIDModesFromStandardTiming(int scrnIndex, struct std_timings *timing) +{ + DisplayModePtr Modes = NULL, Mode = NULL; + int i; + + for (i = 0; i < STD_TIMINGS; i++) + if (timing[i].hsize && timing[i].vsize && timing[i].refresh) { + Mode = RHDCVTMode(timing[i].hsize, timing[i].vsize, + timing[i].refresh, FALSE, FALSE); + Mode->type = M_T_DRIVER; + Modes = RHDModesAdd(Modes, Mode); + } + + return Modes; +} + +/* + * + */ +static DisplayModePtr +EDIDModeFromDetailedTiming(int scrnIndex, struct detailed_timings *timing) +{ + DisplayModePtr Mode; + + /* We don't do stereo */ + if (timing->stereo) { + xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We don't handle stereo.\n", + __func__); + return NULL; + } + + /* We only do separate sync currently */ + if (timing->sync != 0x03) { + xf86DrvMsg(scrnIndex, X_INFO, "%s: Ignoring: We only handle separate" + " sync.\n", __func__); + return NULL; + } + + Mode = xnfalloc(sizeof(DisplayModeRec)); + memset(Mode, 0, sizeof(DisplayModeRec)); + + Mode->name = xnfalloc(10); /* "1234x1234" */ + snprintf(Mode->name, 20, "%dx%d", timing->h_active, timing->v_active); + + Mode->type = M_T_DRIVER; + + Mode->Clock = timing->clock / 1000.0; + + Mode->HDisplay = timing->h_active; + Mode->HSyncStart = timing->h_active + timing->h_sync_off; + Mode->HSyncEnd = Mode->HSyncStart + timing->h_sync_width; + Mode->HTotal = timing->h_active + timing->h_blanking; + + Mode->VDisplay = timing->v_active; + Mode->VSyncStart = timing->v_active + timing->v_sync_off; + Mode->VSyncEnd = Mode->VSyncStart + timing->v_sync_width; + Mode->VTotal = timing->v_active + timing->v_blanking; + + /* We ignore h/v_size and h/v_border for now. */ + + if (timing->interlaced) + Mode->Flags |= V_INTERLACE; + + if (timing->misc & 0x02) + Mode->Flags |= V_PVSYNC; + else + Mode->Flags |= V_NVSYNC; + + if (timing->misc & 0x01) + Mode->Flags |= V_PHSYNC; + else + Mode->Flags |= V_NHSYNC; + + return Mode; +} + +/* + * + */ +static void +EDIDGuessRangesFromModes(struct rhdMonitor *Monitor, DisplayModePtr Modes) +{ + DisplayModePtr Mode = Modes; + + if (!Monitor || !Modes) + return; + + for (Mode = Modes; Mode; Mode = Mode->next) { + if (!Mode->HSync) + Mode->HSync = ((float) Mode->Clock ) / ((float) Mode->HTotal); + + if (!Mode->VRefresh) { + Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) / + ((float) (Mode->HTotal * Mode->VTotal)); + if (Mode->Flags & V_INTERLACE) + Mode->VRefresh *= 2.0; + if (Mode->Flags & V_DBLSCAN) + Mode->VRefresh /= 2.0; + } + } + + if (!Monitor->numHSync) { + /* set up the ranges for scanning through the modes */ + Monitor->numHSync = 1; + Monitor->HSync[0].lo = 1024.0; + Monitor->HSync[0].hi = 0.0; + + for (Mode = Modes; Mode; Mode = Mode->next) { + if (Mode->HSync < Monitor->HSync[0].lo) + Monitor->HSync[0].lo = Mode->HSync; + + if (Mode->HSync > Monitor->HSync[0].hi) + Monitor->HSync[0].hi = Mode->HSync; + } + } + + + if (!Monitor->numVRefresh) { + Monitor->numVRefresh = 1; + Monitor->VRefresh[0].lo = 1024.0; + Monitor->VRefresh[0].hi = 0.0; + + for (Mode = Modes; Mode; Mode = Mode->next) { + if (Mode->VRefresh < Monitor->VRefresh[0].lo) + Monitor->VRefresh[0].lo = Mode->VRefresh; + + if (Mode->VRefresh > Monitor->VRefresh[0].hi) + Monitor->VRefresh[0].hi = Mode->VRefresh; + } + } + + if (!Monitor->Bandwidth) + for (Mode = Modes; Mode; Mode = Mode->next) + if (Mode->Clock > Monitor->Bandwidth) + Monitor->Bandwidth = Mode->Clock; +} + +/* + * Determine whether this monitor does allow reduced blanking. + * Do not set it to false, to allow the user to specify this too. + */ +static void +EDIDReducedAllowed(struct rhdMonitor *Monitor, DisplayModePtr Modes) +{ + DisplayModePtr Mode; + + for (Mode = Modes; Mode; Mode = Mode->next) + if (((Mode->HTotal - Mode->HDisplay) == 160) && + ((Mode->HSyncEnd - Mode->HDisplay) == 80) && + ((Mode->HSyncEnd - Mode->HSyncStart) == 32) && + ((Mode->VSyncStart - Mode->VDisplay) == 3)) + Monitor->ReducedAllowed = TRUE; +} + +/* + * Fill out rhdMonitor with xf86MonPtr information. + */ +void +RHDMonitorEDIDSet(struct rhdMonitor *Monitor, xf86MonPtr EDID) +{ + DisplayModePtr Modes = NULL, Mode; + int i, preferred; + + if (!Monitor || !EDID) + return; + + /* We don't parse the detailed name yet, so use ABC-0123 */ + Monitor->Name = xnfcalloc(9, 1); + snprintf(Monitor->Name, 9, "%s-%04X", EDID->vendor.name, + EDID->vendor.prod_id); + + /* Add established timings */ + Mode = EDIDModesFromEstablished(Monitor->scrnIndex, &EDID->timings1); + Modes = RHDModesAdd(Modes, Mode); + + /* Add standard timings */ + Mode = EDIDModesFromStandardTiming(Monitor->scrnIndex, EDID->timings2); + Modes = RHDModesAdd(Modes, Mode); + + /* First DT timing preferred? */ + preferred = PREFERRED_TIMING_MODE(EDID->features.msc); + + /* Go through the detailed monitor sections */ + for (i = 0; i < DET_TIMINGS; i++) + switch (EDID->det_mon[i].type) { + case DS_RANGES: + if (!Monitor->numHSync) { + Monitor->numHSync = 1; + Monitor->HSync[0].lo = EDID->det_mon[i].section.ranges.min_h; + Monitor->HSync[0].hi = EDID->det_mon[i].section.ranges.max_h; + } else + xf86DrvMsg(Monitor->scrnIndex, X_INFO, + "\"%s\": keeping configured HSync.\n", + Monitor->Name); + + if (!Monitor->numVRefresh) { + Monitor->numVRefresh = 1; + Monitor->VRefresh[0].lo = EDID->det_mon[i].section.ranges.min_v; + Monitor->VRefresh[0].hi = EDID->det_mon[i].section.ranges.max_v; + } else + xf86DrvMsg(Monitor->scrnIndex, X_INFO, + "\"%s\": keeping configured VRefresh.\n", + Monitor->Name); + + if (!Monitor->Bandwidth) + Monitor->Bandwidth = + EDID->det_mon[i].section.ranges.max_clock * 1000; + + break; + case DT: + Mode = EDIDModeFromDetailedTiming(Monitor->scrnIndex, + &EDID->det_mon[i].section.d_timings); + if (Mode) { + if (preferred) { + Mode->type |= M_T_PREFERRED; + + /* also grab the DPI while we are at it */ + Monitor->xDpi = (Mode->HDisplay * 25.4) / + ((float) EDID->det_mon[i].section.d_timings.h_size) + 0.5; + Monitor->yDpi = (Mode->VDisplay * 25.4) / + ((float) EDID->det_mon[i].section.d_timings.v_size) + 0.5; + + Monitor->NativeMode = Mode; + } + preferred = FALSE; + + Modes = RHDModesAdd(Modes, Mode); + } + break; + case DS_STD_TIMINGS: + Mode = EDIDModesFromStandardTiming(Monitor->scrnIndex, + EDID->det_mon[i].section.std_t); + Modes = RHDModesAdd(Modes, Mode); + break; + case DS_NAME: + xfree(Monitor->Name); + Monitor->Name = xnfcalloc(13, 1); + memcpy(Monitor->Name, EDID->det_mon[i].section.name, 13); + break; + default: + break; + } + + if (Modes) { + EDIDGuessRangesFromModes(Monitor, Modes); + EDIDReducedAllowed(Monitor, Modes); + Monitor->Modes = RHDModesAdd(Monitor->Modes, Modes); + } + + /* Calculate DPI when we still don't have this */ + if (!Monitor->xDpi || !Monitor->yDpi) { + int HDisplay = 0, VDisplay = 0; + + for (Mode = Monitor->Modes; Mode; Mode = Mode->next) { + if (Mode->HDisplay > HDisplay) + HDisplay = Mode->HDisplay; + if (Mode->VDisplay > VDisplay) + VDisplay = Mode->VDisplay; + } + + if (HDisplay && EDID->features.hsize) + Monitor->xDpi = (HDisplay * 2.54) / ((float) EDID->features.hsize) + 0.5; + if (VDisplay && EDID->features.vsize) + Monitor->yDpi = (VDisplay * 2.54) / ((float) EDID->features.vsize) + 0.5; + + if (!Monitor->xDpi && Monitor->yDpi) + Monitor->xDpi = Monitor->yDpi; + if (!Monitor->yDpi && Monitor->xDpi) + Monitor->yDpi = Monitor->xDpi; + } +} diff --git a/driver/xf86-video-radeonhd/src/rhd_hdmi.c b/driver/xf86-video-radeonhd/src/rhd_hdmi.c new file mode 100644 index 000000000..c786fcd96 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_hdmi.c @@ -0,0 +1,611 @@ +/* + * Copyright 2008 Christian König + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_audio.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_hdmi.h" +#include "rhd_regs.h" + +enum HdmiColorFormat { + RGB = 0, + YCC_422 = 1, + YCC_444 = 2 +}; + +struct { + CARD32 Clock; + + int N_32kHz; + int CTS_32kHz; + + int N_44_1kHz; + int CTS_44_1kHz; + + int N_48kHz; + int CTS_48kHz; + +} AudioClockRegeneration[] = { + /* 32kHz 44.1kHz 48kHz */ + /* Clock N CTS N CTS N CTS */ + { 25174, 4576, 28125, 7007, 31250, 6864, 28125 }, /* 25,20/1.001 MHz */ + { 25200, 4096, 25200, 6272, 28000, 6144, 25200 }, /* 25.20 MHz */ + { 27000, 4096, 27000, 6272, 30000, 6144, 27000 }, /* 27.00 MHz */ + { 27027, 4096, 27027, 6272, 30030, 6144, 27027 }, /* 27.00*1.001 MHz */ + { 54000, 4096, 54000, 6272, 60000, 6144, 54000 }, /* 54.00 MHz */ + { 54054, 4096, 54054, 6272, 60060, 6144, 54054 }, /* 54.00*1.001 MHz */ + { 74175, 11648, 210937, 17836, 234375, 11648, 140625 }, /* 74.25/1.001 MHz */ + { 74250, 4096, 74250, 6272, 82500, 6144, 74250 }, /* 74.25 MHz */ + { 148351, 11648, 421875, 8918, 234375, 5824, 140625 }, /* 148.50/1.001 MHz */ + { 148500, 4096, 148500, 6272, 165000, 6144, 148500 }, /* 148.50 MHz */ + { 0, 4096, 0, 6272, 0, 6144, 0 } /* Other */ +}; + +/* + * calculate CTS value if it's not found in the table + */ +static void +HdmiCalcCTS(struct rhdHdmi *hdmi, CARD32 Clock, int* CTS, int N, int freq) +{ + if(*CTS == 0) *CTS = (long long)Clock*1000*N/(128*freq); + xf86DrvMsg(hdmi->scrnIndex, X_INFO, "Using ACR timing N=%d CTS=%d for frequency %d\n",N,*CTS,freq); +} + +/* + * update the N and CTS parameters for a given clock rate + */ +static void +HdmiAudioClockRegeneration(struct rhdHdmi *hdmi, CARD32 Clock) +{ + int CTS; + int N; + int i; + for(i=0; AudioClockRegeneration[i].Clock != Clock && AudioClockRegeneration[i].Clock != 0; i++); + + CTS = AudioClockRegeneration[i].CTS_32kHz; + N = AudioClockRegeneration[i].N_32kHz; + HdmiCalcCTS(hdmi, Clock, &CTS, N, 32000); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_32kHz_CTS, CTS << 12); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_32kHz_N, N); + + CTS = AudioClockRegeneration[i].CTS_44_1kHz; + N = AudioClockRegeneration[i].N_44_1kHz; + HdmiCalcCTS(hdmi, Clock, &CTS, N, 44100); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_44_1kHz_CTS, CTS << 12); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_44_1kHz_N, N); + + CTS = AudioClockRegeneration[i].CTS_48kHz; + N = AudioClockRegeneration[i].N_48kHz; + HdmiCalcCTS(hdmi, Clock, &CTS, N, 48000); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_48kHz_CTS, CTS << 12); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_48kHz_N, N); +} + +/* + * calculate the crc for a given info frame + */ +static void +HdmiInfoFrameChecksum(CARD8 packetType, CARD8 versionNumber, CARD8 length, CARD8* frame) +{ + int i; + frame[0] = packetType + versionNumber + length; + for(i=1;i<=length;i++) + frame[0] += frame[i]; + frame[0] = 0x100 - frame[0]; +} + +/* + * build a HDMI Video Info Frame + */ +static void +HdmiVideoInfoFrame( + struct rhdHdmi *hdmi, + enum HdmiColorFormat ColorFormat, + Bool ActiveInformationPresent, + CARD8 ActiveFormatAspectRatio, + CARD8 ScanInformation, + CARD8 Colorimetry, + CARD8 ExColorimetry, + CARD8 Quantization, + Bool ITC, + CARD8 PictureAspectRatio, + CARD8 VideoFormatIdentification, + CARD8 PixelRepetition, + CARD8 NonUniformPictureScaling, + CARD8 BarInfoDataValid, + CARD16 TopBar, + CARD16 BottomBar, + CARD16 LeftBar, + CARD16 RightBar +) +{ + CARD8 frame[14]; + + frame[0x0] = 0; + frame[0x1] = + (ScanInformation & 0x3) | + ((BarInfoDataValid & 0x3) << 2) | + ((ActiveInformationPresent & 0x1) << 4) | + ((ColorFormat & 0x3) << 5); + frame[0x2] = + (ActiveFormatAspectRatio & 0xF) | + ((PictureAspectRatio & 0x3) << 4) | + ((Colorimetry & 0x3) << 6); + frame[0x3] = + (NonUniformPictureScaling & 0x3) | + ((Quantization & 0x3) << 2) | + ((ExColorimetry & 0x7) << 4) | + ((ITC & 0x1) << 7); + frame[0x4] = (VideoFormatIdentification & 0x7F); + frame[0x5] = (PixelRepetition & 0xF); + frame[0x6] = (TopBar & 0xFF); + frame[0x7] = (TopBar >> 8); + frame[0x8] = (BottomBar & 0xFF); + frame[0x9] = (BottomBar >> 8); + frame[0xA] = (LeftBar & 0xFF); + frame[0xB] = (LeftBar >> 8); + frame[0xC] = (RightBar & 0xFF); + frame[0xD] = (RightBar >> 8); + + HdmiInfoFrameChecksum(0x82, 0x02, 0x0D, frame); + + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_0, + frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_1, + frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x7] << 24)); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_2, + frame[0x8] | (frame[0x9] << 8) | (frame[0xA] << 16) | (frame[0xB] << 24)); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_3, + frame[0xC] | (frame[0xD] << 8)); +} + +/* + * build a Audio Info Frame + */ +static void +HdmiAudioInfoFrame( + struct rhdHdmi *hdmi, + CARD8 ChannelCount, + CARD8 CodingType, + CARD8 SampleSize, + CARD8 SampleFrequency, + CARD8 Format, + CARD8 ChannelAllocation, + CARD8 LevelShift, + Bool DownmixInhibit +) +{ + CARD8 frame[11]; + + frame[0x0] = 0; + frame[0x1] = (ChannelCount & 0x7) | ((CodingType & 0xF) << 4); + frame[0x2] = (SampleSize & 0x3) | ((SampleFrequency & 0x7) << 2); + frame[0x3] = Format; + frame[0x4] = ChannelAllocation; + frame[0x5] = ((LevelShift & 0xF) << 3) | ((DownmixInhibit & 0x1) << 7); + frame[0x6] = 0; + frame[0x7] = 0; + frame[0x8] = 0; + frame[0x9] = 0; + frame[0xA] = 0; + + HdmiInfoFrameChecksum(0x84, 0x01, 0x0A, frame); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIOINFOFRAME_0, + frame[0x0] | (frame[0x1] << 8) | (frame[0x2] << 16) | (frame[0x3] << 24)); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIOINFOFRAME_1, + frame[0x4] | (frame[0x5] << 8) | (frame[0x6] << 16) | (frame[0x8] << 24)); +} + +/* + * test if audio buffer is filled enough to start playing + */ +static Bool +IsAudioBufferFilled(struct rhdHdmi *hdmi) +{ + return (RHDRegRead(hdmi, hdmi->Offset+HDMI_STATUS) & 0x10) != 0; +} + +/* + * allocate/initialize the HDMI structure + * output selects which engine is used + */ +struct rhdHdmi* +RHDHdmiInit(RHDPtr rhdPtr, struct rhdOutput* Output) +{ + struct rhdHdmi *hdmi; + RHDFUNC(rhdPtr); + + if(rhdPtr->ChipSet >= RHD_RS600) { + hdmi = (struct rhdHdmi *) xnfcalloc(sizeof(struct rhdHdmi), 1); + hdmi->scrnIndex = rhdPtr->scrnIndex; + hdmi->Output = Output; + + switch(Output->Id) { + case RHD_OUTPUT_TMDSA: + hdmi->Offset = HDMI_TMDS; + break; + + case RHD_OUTPUT_LVTMA: + if(RHDOutputTmdsIndex(Output) == 0) + hdmi->Offset = HDMI_TMDS; + else + hdmi->Offset = HDMI_LVTMA; + break; + + case RHD_OUTPUT_UNIPHYA: + hdmi->Offset = HDMI_TMDS; + break; + + case RHD_OUTPUT_KLDSKP_LVTMA: + hdmi->Offset = HDMI_DIG; + break; + + /*case RHD_OUTPUT_UNIPHYB: */ + + default: + xf86DrvMsg(hdmi->scrnIndex, X_ERROR, "%s: unknown HDMI output type\n", __func__); + xfree(hdmi); + return NULL; + break; + } + hdmi->Stored = FALSE; + return hdmi; + } else + return NULL; +} + +/* + * update the info frames with the data from the current display mode + */ +void +RHDHdmiSetMode(struct rhdHdmi *hdmi, DisplayModePtr Mode) +{ + if(!hdmi) return; + RHDFUNC(hdmi); + + RHDAudioSetClock(RHDPTRI(hdmi), hdmi->Output, Mode->Clock); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_UNKNOWN_0, 0x1000); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_UNKNOWN_1, 0x0); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_UNKNOWN_2, 0x1000); + + HdmiAudioClockRegeneration(hdmi, Mode->Clock); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOCNTL, 0x13); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VERSION, 0x202); + + HdmiVideoInfoFrame(hdmi, RGB, FALSE, 0, 0, 0, + 0, 0, FALSE, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + /* it's unknown what these bits do excatly, but it's indeed quite usefull for debugging */ + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_0, 0x00FFFFFF); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_1, 0x007FFFFF); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_2, 0x00000001); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_3, 0x00000001); + + RHDHdmiCommitAudioWorkaround(hdmi); + + /* audio packets per line, does anyone know how to calc this ? */ + RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x00040000, 0x001F0000); + + /* update? reset? don't realy know */ + RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x14000000, 0x14000000); +} + +/* + * have buffer status changed since last call? + */ +Bool +RHDHdmiBufferStatusChanged(struct rhdHdmi* hdmi) +{ + Bool status, result; + + if(!hdmi) return FALSE; + RHDFUNC(hdmi); + + status = IsAudioBufferFilled(hdmi); + result = hdmi->SavedBufferStatus != status; + hdmi->SavedBufferStatus = status; + + return result; +} + +/* + * update settings with current parameters from audio engine + */ +void +RHDHdmiUpdateAudioSettings( + struct rhdHdmi* hdmi, + int channels, + int rate, + int bps, + CARD8 status_bits, + CARD8 category_code +) +{ + CARD32 iec; + + if(!hdmi) return; + RHDFUNC(hdmi); + + xf86DrvMsg(hdmi->scrnIndex, X_INFO, "%s: %s with " + "%d channels, %d Hz sampling rate, %d bits per sample,\n", + __func__, IsAudioBufferFilled(hdmi) ? "playing" : "stopped", + channels, rate, bps); + xf86DrvMsg(hdmi->scrnIndex, X_INFO, "%s: " + "0x%02x IEC60958 status bits and 0x%02x category code\n", + __func__, (int)status_bits, (int)category_code); + + iec = 0; + if(status_bits & AUDIO_STATUS_PROFESSIONAL) iec |= 1 << 0; + if(status_bits & AUDIO_STATUS_NONAUDIO) iec |= 1 << 1; + if(status_bits & AUDIO_STATUS_COPYRIGHT) iec |= 1 << 2; + if(status_bits & AUDIO_STATUS_EMPHASIS) iec |= 1 << 3; + + iec |= category_code << 8; + + switch(rate) + { + case 32000: iec |= 0x3 << 24; break; + case 44100: iec |= 0x0 << 24; break; + case 88200: iec |= 0x8 << 24; break; + case 176400: iec |= 0xc << 24; break; + case 48000: iec |= 0x2 << 24; break; + case 96000: iec |= 0xa << 24; break; + case 192000: iec |= 0xe << 24; break; + } + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_IEC60958_1, iec); + + iec = 0; + switch(bps) + { + case 16: iec |= 0x2; break; + case 20: iec |= 0x3; break; + case 24: iec |= 0xb; break; + } + if(status_bits & AUDIO_STATUS_V) iec |= 0x5 << 16; + + RHDRegMask(hdmi, hdmi->Offset+HDMI_IEC60958_2, iec, 0x5000f); + + /* 0x021 or 0x031 sets the audio frame length */ + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIOCNTL, 0x31); + HdmiAudioInfoFrame(hdmi, channels-1, 0, 0, 0, 0, 0, 0, FALSE); + + RHDHdmiCommitAudioWorkaround(hdmi); + + /* update? reset? don't realy know */ + RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x04000000, 0x04000000); +} + +/* + * enable/disable the HDMI engine + * and register with audio engine + */ +void +RHDHdmiEnable(struct rhdHdmi *hdmi, Bool Enable) +{ + if(!hdmi) return; + RHDFUNC(hdmi); + + /* some version of atombios ignore the enable HDMI flag + * so enabling/disabling HDMI was moved here for TMDSA and LVTMA */ + switch(hdmi->Output->Id) { + case RHD_OUTPUT_TMDSA: + RHDRegMask(hdmi, TMDSA_CNTL, Enable ? 0x4 : 0x0, 0x4); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, Enable ? 0x101 : 0x0); + break; + + case RHD_OUTPUT_LVTMA: + RHDRegMask(hdmi, LVTMA_CNTL, Enable ? 0x4 : 0x0, 0x4); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, Enable ? 0x105 : 0x0); + break; + + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_KLDSKP_LVTMA: + /* This part is doubtfull in my opinion */ + RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, Enable ? 0x110 : 0x0); + break; + + default: + xf86DrvMsg(hdmi->scrnIndex, X_ERROR, "%s: unknown HDMI output type\n", __func__); + break; + } + if(Enable) + RHDAudioRegisterHdmi(RHDPTRI(hdmi), hdmi); + else + RHDAudioUnregisterHdmi(RHDPTRI(hdmi), hdmi); +} + +/* + * enable/disable the audio workaround function + */ +void +RHDHdmiSetAudioWorkaround(struct rhdHdmi* hdmi, Bool Enable) +{ + if(!hdmi) return; + RHDFUNC(hdmi); + + hdmi->AudioDebugWorkaround = Enable; +} + +/* + * get status of the audio workaround function + */ +Bool +RHDHdmiGetAudioWorkaround(struct rhdHdmi* hdmi) +{ + if(!hdmi) return FALSE; + RHDFUNC(hdmi); + + return hdmi->AudioDebugWorkaround; +} + +/* + * commit the audio workaround status to the hardware + */ +void +RHDHdmiCommitAudioWorkaround(struct rhdHdmi* hdmi) +{ + if(!hdmi) return; + RHDFUNC(hdmi); + + if(IsAudioBufferFilled(hdmi)) { + /* disable audio workaround and start delivering of audio frames */ + RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x00000001, 0x00001001); + + } else if(hdmi->AudioDebugWorkaround) { + /* enable audio workaround and start delivering of audio frames */ + RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x00001001, 0x00001001); + + } else { + /* disable audio workaround and stop delivering of audio frames */ + RHDRegMask(hdmi, hdmi->Offset+HDMI_CNTL, 0x00000000, 0x00001001); + } +} + +/* + * save the current config of HDMI engine + */ +void +RHDHdmiSave(struct rhdHdmi *hdmi) +{ + if(!hdmi) return; + RHDFUNC(hdmi); + + hdmi->StoreEnable = RHDRegRead(hdmi, hdmi->Offset+HDMI_ENABLE); + hdmi->StoreControl = RHDRegRead(hdmi, hdmi->Offset+HDMI_CNTL); + hdmi->StoredAudioDebugWorkaround[0x0] = RHDRegRead(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_0); + hdmi->StoredAudioDebugWorkaround[0x1] = RHDRegRead(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_1); + hdmi->StoredAudioDebugWorkaround[0x2] = RHDRegRead(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_2); + hdmi->StoredAudioDebugWorkaround[0x3] = RHDRegRead(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_3); + + hdmi->StoredFrameVersion = RHDRegRead(hdmi, hdmi->Offset+HDMI_VERSION); + + hdmi->StoredVideoControl = RHDRegRead(hdmi, hdmi->Offset+HDMI_VIDEOCNTL); + hdmi->StoreVideoInfoFrame[0x0] = RHDRegRead(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_0); + hdmi->StoreVideoInfoFrame[0x1] = RHDRegRead(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_1); + hdmi->StoreVideoInfoFrame[0x2] = RHDRegRead(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_2); + hdmi->StoreVideoInfoFrame[0x3] = RHDRegRead(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_3); + + hdmi->StoredAudioControl = RHDRegRead(hdmi, hdmi->Offset+HDMI_AUDIOCNTL); + hdmi->StoreAudioInfoFrame[0x0] = RHDRegRead(hdmi, hdmi->Offset+HDMI_AUDIOINFOFRAME_0); + hdmi->StoreAudioInfoFrame[0x1] = RHDRegRead(hdmi, hdmi->Offset+HDMI_AUDIOINFOFRAME_1); + + hdmi->Store_32kHz_N = RHDRegRead(hdmi, hdmi->Offset+HDMI_32kHz_N); + hdmi->Store_32kHz_CTS = RHDRegRead(hdmi, hdmi->Offset+HDMI_32kHz_CTS); + + hdmi->Store_44_1kHz_N = RHDRegRead(hdmi, hdmi->Offset+HDMI_44_1kHz_N); + hdmi->Store_44_1kHz_CTS = RHDRegRead(hdmi, hdmi->Offset+HDMI_44_1kHz_CTS); + + hdmi->Store_48kHz_N = RHDRegRead(hdmi, hdmi->Offset+HDMI_48kHz_N); + hdmi->Store_48kHz_CTS = RHDRegRead(hdmi, hdmi->Offset+HDMI_48kHz_CTS); + + hdmi->StoreIEC60958[0] = RHDRegRead(hdmi, hdmi->Offset+HDMI_IEC60958_1); + hdmi->StoreIEC60958[1] = RHDRegRead(hdmi, hdmi->Offset+HDMI_IEC60958_2); + + hdmi->StoreUnknown[0x0] = RHDRegRead(hdmi, hdmi->Offset+HDMI_UNKNOWN_0); + hdmi->StoreUnknown[0x1] = RHDRegRead(hdmi, hdmi->Offset+HDMI_UNKNOWN_1); + hdmi->StoreUnknown[0x2] = RHDRegRead(hdmi, hdmi->Offset+HDMI_UNKNOWN_2); + + hdmi->Stored = TRUE; +} + +/* + * restore the saved config of HDMI engine + */ +void +RHDHdmiRestore(struct rhdHdmi *hdmi) +{ + if(!hdmi) return; + RHDFUNC(hdmi); + + if (!hdmi->Stored) { + xf86DrvMsg(hdmi->scrnIndex, X_ERROR, "%s: trying to restore " + "uninitialized values.\n", __func__); + return; + } + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_ENABLE, hdmi->StoreEnable); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_CNTL, hdmi->StoreControl); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_0, hdmi->StoredAudioDebugWorkaround[0x0]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_1, hdmi->StoredAudioDebugWorkaround[0x1]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_2, hdmi->StoredAudioDebugWorkaround[0x2]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIO_DEBUG_3, hdmi->StoredAudioDebugWorkaround[0x3]); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VERSION, hdmi->StoredFrameVersion); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOCNTL, hdmi->StoredVideoControl); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_0, hdmi->StoreVideoInfoFrame[0x0]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_1, hdmi->StoreVideoInfoFrame[0x1]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_2, hdmi->StoreVideoInfoFrame[0x2]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_VIDEOINFOFRAME_3, hdmi->StoreVideoInfoFrame[0x3]); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIOCNTL, hdmi->StoredAudioControl); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIOINFOFRAME_0, hdmi->StoreAudioInfoFrame[0x0]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_AUDIOINFOFRAME_1, hdmi->StoreAudioInfoFrame[0x1]); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_32kHz_N, hdmi->Store_32kHz_N); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_32kHz_CTS, hdmi->Store_32kHz_CTS); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_44_1kHz_N, hdmi->Store_44_1kHz_N); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_44_1kHz_CTS, hdmi->Store_44_1kHz_CTS); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_48kHz_N, hdmi->Store_48kHz_N); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_48kHz_CTS, hdmi->Store_48kHz_CTS); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_IEC60958_1, hdmi->StoreIEC60958[0]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_IEC60958_2, hdmi->StoreIEC60958[1]); + + RHDRegWrite(hdmi, hdmi->Offset+HDMI_UNKNOWN_0, hdmi->StoreUnknown[0x0]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_UNKNOWN_1, hdmi->StoreUnknown[0x1]); + RHDRegWrite(hdmi, hdmi->Offset+HDMI_UNKNOWN_2, hdmi->StoreUnknown[0x2]); +} + +/* + * unregister with audio engine and release memory + */ +void +RHDHdmiDestroy(struct rhdHdmi *hdmi) +{ + if(!hdmi) return; + RHDFUNC(hdmi); + + RHDAudioUnregisterHdmi(RHDPTRI(hdmi), hdmi); + + xfree(hdmi); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_hdmi.h b/driver/xf86-video-radeonhd/src/rhd_hdmi.h new file mode 100644 index 000000000..e86b5e2a9 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_hdmi.h @@ -0,0 +1,89 @@ +/* + * Copyright 2008 Christian König + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_HDMI_H +#define _RHD_HDMI_H + +struct rhdHdmi { + struct rhdHdmi* Next; + + int scrnIndex; + + struct rhdOutput* Output; + CARD16 Offset; + + Bool SavedBufferStatus; + Bool AudioDebugWorkaround; + + Bool Stored; + CARD32 StoreEnable; + CARD32 StoreControl; + CARD32 StoreUnknown[0x3]; + CARD32 StoredAudioDebugWorkaround[0x4]; + + CARD32 StoredFrameVersion; + CARD32 StoredVideoControl; + CARD32 StoreVideoInfoFrame[0x4]; + CARD32 StoredAudioControl; + CARD32 StoreAudioInfoFrame[0x2]; + + CARD32 Store_32kHz_N; + CARD32 Store_32kHz_CTS; + + CARD32 Store_44_1kHz_N; + CARD32 Store_44_1kHz_CTS; + + CARD32 Store_48kHz_N; + CARD32 Store_48kHz_CTS; + + CARD32 StoreIEC60958[2]; +}; + +struct rhdHdmi* RHDHdmiInit(RHDPtr rhdPtr, struct rhdOutput* Output); + +void RHDHdmiSetMode(struct rhdHdmi* rhdHdmi, DisplayModePtr Mode); +void RHDHdmiEnable(struct rhdHdmi* rhdHdmi, Bool Enable); + +Bool RHDHdmiBufferStatusChanged(struct rhdHdmi* hdmi); +void RHDHdmiUpdateAudioSettings( + struct rhdHdmi* rhdHdmi, + int channels, + int rate, + int bps, + CARD8 status_bits, + CARD8 catgory_code +); + +void RHDHdmiSetAudioWorkaround(struct rhdHdmi* rhdHdmi, Bool Enabled); +Bool RHDHdmiGetAudioWorkaround(struct rhdHdmi* rhdHdmi); +void RHDHdmiCommitAudioWorkaround(struct rhdHdmi* rhdHdmi); + +void RHDHdmiSave(struct rhdHdmi* rhdHdmi); +void RHDHdmiRestore(struct rhdHdmi* rhdHdmi); + +void RHDHdmiDestroy(struct rhdHdmi* rhdHdmi); + +#endif /* _RHD_HDMI_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_helper.c b/driver/xf86-video-radeonhd/src/rhd_helper.c new file mode 100644 index 000000000..0f47bba4d --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_helper.c @@ -0,0 +1,299 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define SEGV_ON_ASSERT 1 /* Define to 1 if you want backtraces on ASSERT() */ + +#include "xf86.h" + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +# include +# include +# include +#endif + +#if SEGV_ON_ASSERT +# include +#endif + +#include "rhd.h" + +void +RhdGetOptValBool(const OptionInfoRec *table, int token, + RHDOptPtr optp, Bool def) +{ + if (!(optp->set = xf86GetOptValBool(table, token, &optp->val.bool))){ + optp->set = FALSE; + optp->val.bool = def; + } else + optp->set = TRUE; +} + +void +RhdGetOptValInteger(const OptionInfoRec *table, int token, + RHDOptPtr optp, int def) +{ + if (!(optp->set = xf86GetOptValInteger(table, token, &optp->val.integer))){ + optp->set = FALSE; + optp->val.integer = def; + } else + optp->set = TRUE; +} + +void +RhdGetOptValULong(const OptionInfoRec *table, int token, + RHDOptPtr optp, unsigned long def) +{ + if (!(optp->set = xf86GetOptValULong(table, token, &optp->val.uslong))) { + optp->set = FALSE; + optp->val.uslong = def; + } else + optp->set = TRUE; +} + +void +RhdGetOptValReal(const OptionInfoRec *table, int token, + RHDOptPtr optp, double def) +{ + if (!(optp->set = xf86GetOptValReal(table, token, &optp->val.real))) { + optp->set = FALSE; + optp->val.real = def; + } else + optp->set = TRUE; +} + +void +RhdGetOptValFreq(const OptionInfoRec *table, int token, + OptFreqUnits expectedUnits, RHDOptPtr optp, double def) +{ + if (!(optp->set = xf86GetOptValFreq(table, token, expectedUnits, + &optp->val.freq))) { + optp->set = FALSE; + optp->val.freq = def; + } else + optp->set = TRUE; +} + +void +RhdGetOptValString(const OptionInfoRec *table, int token, + RHDOptPtr optp, char *def) +{ + if (!(optp->val.string = xf86GetOptValString(table, token))) { + optp->set = FALSE; + optp->val.string = def; + } else + optp->set = TRUE; +} + +/* + * + */ +enum rhdOptStatus +RhdParseBooleanOption(struct RHDOpt *Option, char *Name) +{ + unsigned int i; + char* c; + char* str = strdup(Name); + + const char* off[] = { + "false", + "off", + "no", + "0" + }; + const char* on[] = { + "true", + "on", + "yes", + "1" + }; + + /* first fixup the name to match the randr names */ + for (c = str; *c; c++) + if (isspace(*c)) + *c='_'; + + if (Option->set) { + char *ptr = Option->val.string; + while (*ptr != '\0') { + while (isspace(*ptr)) + ptr++; + if (*ptr == '\0') + break; + + if (!strncasecmp(str,ptr,strlen(str)) || !strncasecmp("all",ptr,3)) { + if(!strncasecmp("all",ptr,3)) + ptr += 3; + else + ptr += strlen(str); + xfree(str); + + if (isspace(*ptr) || *ptr == '=') { + ptr++; + } + + for(i=0; i> 4); j++) { + char *cur = line; + char *d = c; + int k = size < 16 ? size : 16; + for (i = 0; i < k; i++) + cur += snprintf(cur,4,"%2.2x ",(unsigned char) (*(c++))); + c = d; + for (i = 0; i < k; i++) { + cur += snprintf(cur,2,"%c",((((CARD8)(*c)) > 32) + && (((CARD8)(*c)) < 128)) ? + (unsigned char) (*(c)): '.'); + c++; + } + xf86DrvMsg(scrnIndex,X_INFO,"%s\n",line); + } +} + + +/* + * X should have something like this itself. + * Also used by the RHDFUNC macro. + */ +void +RHDDebug(int scrnIndex, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + xf86VDrvMsgVerb(scrnIndex, X_INFO, LOG_DEBUG, format, ap); + va_end(ap); +} + +void +RHDDebugCont(const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + xf86VDrvMsgVerb(-1, X_NONE, LOG_DEBUG, format, ap); + va_end(ap); +} + +void +RHDDebugVerb(int scrnIndex, int verb, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + xf86VDrvMsgVerb(scrnIndex, X_INFO, LOG_DEBUG + verb, format, ap); + va_end(ap); +} + +void +RHDDebugContVerb(int verb, const char *format, ...) +{ + va_list ap; + + va_start(ap, format); + xf86VDrvMsgVerb(-1, X_NONE, LOG_DEBUG + verb, format, ap); + va_end(ap); +} +/* + * Create a new string where s2 is attached to s1, free s1. + */ +char * +RhdAppendString(char *s1, const char *s2) +{ + if (!s2) + return s1; + else if (!s1) + return xstrdup(s2); + else { + int len = strlen(s1) + strlen(s2) + 1; + char *result = (char *)xalloc(len); + + if (!result) return s1; + + strcpy(result,s1); + strcat(result,s2); + xfree(s1); + return result; + } +} + +void RhdAssertFailed(const char *str, + const char *file, int line, const char *func) +{ + ErrorF("%s:%d: %s: Assertion '%s' failed.\n", file, line, func, str); + +#if SEGV_ON_ASSERT + kill(getpid(), SIGSEGV); +#endif + FatalError ("Server aborting\n"); +} + +void RhdAssertFailedFormat(const char *str, + const char *file, int line, const char *func, + const char *format, ...) +{ + va_list args; + ErrorF("%s:%d: %s: Assertion '%s' failed.\n ", file, line, func, str); + va_start(args, format); + VErrorF(format, args); + va_end(args); + ErrorF("\n"); + +#if SEGV_ON_ASSERT + kill(getpid(), SIGSEGV); +#endif + FatalError ("Server aborting\n"); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_i2c.c b/driver/xf86-video-radeonhd/src/rhd_i2c.c new file mode 100644 index 000000000..d5b698a03 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_i2c.c @@ -0,0 +1,1458 @@ +/* + * Copyright 2007-2009 Egbert Eich + * Copyright 2007-2009 Luc Verhaegen + * Copyright 2007-2009 Matthias Hopf + * Copyright 2007-2009 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "xf86_OSproc.h" +#include "xf86i2c.h" +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +#endif + +#include "rhd.h" +#include "rhd_i2c.h" +#include "rhd_regs.h" + +#ifdef ATOM_BIOS +#include "rhd_atombios.h" +#endif + +#define MAX_I2C_LINES 6 + +#define RHD_I2C_STATUS_LOOPS 5000 + +enum rhdDDClines { + rhdDdc1data = 0, + rhdDdc2data = 2, + rhdDdc3data = 4, + rhdDdc4data = 6, /* arbirarily choosen */ + rhdVIP_DOUT_scl = 0x41, + rhdDvoData12 = 0x28, + rhdDdc5data = 0x48, + rhdDdc6data = 0x4a, + rhdDdc1clk = 1, + rhdDdc2clk = 3, + rhdDdc3clk = 5, + rhdDdc4clk = 7, /* arbirarily choosen */ + rhdVIP_DOUTvipclk = 0x42, + rhdDvoData13 = 0x29, + rhdDdc5clk = 0x49, + rhdDdc6clk = 0x4b, + rhdDdcUnknown +}; + +typedef struct _rhdI2CRec +{ + CARD16 prescale; + union { + CARD8 line; + struct i2cGpio { + enum rhdDDClines Sda; + enum rhdDDClines Scl; + CARD32 SdaReg; + CARD32 SclReg; + } Gpio; + } u; + int scrnIndex; +} rhdI2CRec; + +enum _rhdR6xxI2CBits { + /* R6_DC_I2C_TRANSACTION0 */ + R6_DC_I2C_RW0 = (0x1 << 0), + R6_DC_I2C_STOP_ON_NACK0 = (0x1 << 8), + R6_DC_I2C_ACK_ON_READ0 = (0x1 << 9), + R6_DC_I2C_START0 = (0x1 << 12), + R6_DC_I2C_STOP0 = (0x1 << 13), + R6_DC_I2C_COUNT0 = (0xff << 16), + /* R6_DC_I2C_TRANSACTION1 */ + R6_DC_I2C_RW1 = (0x1 << 0), + R6_DC_I2C_STOP_ON_NACK1 = (0x1 << 8), + R6_DC_I2C_ACK_ON_READ1 = (0x1 << 9), + R6_DC_I2C_START1 = (0x1 << 12), + R6_DC_I2C_STOP1 = (0x1 << 13), + R6_DC_I2C_COUNT1 = (0xff << 16), + /* R6_DC_I2C_DATA */ + R6_DC_I2C_DATA_RW = (0x1 << 0), + R6_DC_I2C_DATA_BIT = (0xff << 8), + R6_DC_I2C_INDEX = (0xff << 16), + R6_DC_I2C_INDEX_WRITE = (0x1 << 31), + /* R6_DC_I2C_CONTROL */ + R6_DC_I2C_GO = (0x1 << 0), + R6_DC_I2C_SOFT_RESET = (0x1 << 1), + R6_DC_I2C_SEND_RESET = (0x1 << 2), + R6_DC_I2C_SW_STATUS_RESET = (0x1 << 3), + R6_DC_I2C_SDVO_EN = (0x1 << 4), + R6_DC_I2C_SDVO_ADDR_SEL = (0x1 << 6), + R6_DC_I2C_DDC_SELECT = (0x7 << 8), + R6_DC_I2C_TRANSACTION_COUNT = (0x3 << 20), + R6_DC_I2C_SW_DONE_INT = (0x1 << 0), + R6_DC_I2C_SW_DONE_ACK = (0x1 << 1), + R6_DC_I2C_SW_DONE_MASK = (0x1 << 2), + R6_DC_I2C_DDC1_HW_DONE_INT = (0x1 << 4), + R6_DC_I2C_DDC1_HW_DONE_ACK = (0x1 << 5), + R6_DC_I2C_DDC1_HW_DONE_MASK = (0x1 << 6), + R6_DC_I2C_DDC2_HW_DONE_INT = (0x1 << 8), + R6_DC_I2C_DDC2_HW_DONE_ACK = (0x1 << 9), + R6_DC_I2C_DDC2_HW_DONE_MASK = (0x1 << 10), + R6_DC_I2C_DDC3_HW_DONE_INT = (0x1 << 12), + R6_DC_I2C_DDC3_HW_DONE_ACK = (0x1 << 13), + R6_DC_I2C_DDC3_HW_DONE_MASK = (0x1 << 14), + R6_DC_I2C_DDC4_HW_DONE_INT = (0x1 << 16), + R6_DC_I2C_DDC4_HW_DONE_ACK = (0x1 << 17), + R6_DC_I2C_DDC4_HW_DONE_MASK = (0x1 << 18), + /* R6_DC_I2C_SW_STATUS */ + R6_DC_I2C_SW_STATUS_BIT = (0x3 << 0), + R6_DC_I2C_SW_DONE = (0x1 << 2), + R6_DC_I2C_SW_ABORTED = (0x1 << 4), + R6_DC_I2C_SW_TIMEOUT = (0x1 << 5), + R6_DC_I2C_SW_INTERRUPTED = (0x1 << 6), + R6_DC_I2C_SW_BUFFER_OVERFLOW = (0x1 << 7), + R6_DC_I2C_SW_STOPPED_ON_NACK = (0x1 << 8), + R6_DC_I2C_SW_SDVO_NACK = (0x1 << 10), + R6_DC_I2C_SW_NACK0 = (0x1 << 12), + R6_DC_I2C_SW_NACK1 = (0x1 << 13), + R6_DC_I2C_SW_NACK2 = (0x1 << 14), + R6_DC_I2C_SW_NACK3 = (0x1 << 15), + R6_DC_I2C_SW_REQ = (0x1 << 18) +}; + +enum _rhdR5xxI2CBits { + /* R5_DC_I2C_STATUS1 */ + R5_DC_I2C_DONE = (0x1 << 0), + R5_DC_I2C_NACK = (0x1 << 1), + R5_DC_I2C_HALT = (0x1 << 2), + R5_DC_I2C_GO = (0x1 << 3), + /* R5_DC_I2C_RESET */ + R5_DC_I2C_SOFT_RESET = (0x1 << 0), + R5_DC_I2C_ABORT = (0x1 << 8), + /* R5_DC_I2C_CONTROL1 */ + R5_DC_I2C_START = (0x1 << 0), + R5_DC_I2C_STOP = (0x1 << 1), + R5_DC_I2C_RECEIVE = (0x1 << 2), + R5_DC_I2C_EN = (0x1 << 8), + R5_DC_I2C_PIN_SELECT = (0x3 << 16), + /* R5_DC_I2C_CONTROL2 */ + R5_DC_I2C_ADDR_COUNT = (0x7 << 0), + R5_DC_I2C_DATA_COUNT = (0xf << 8), + R5_DC_I2C_PRESCALE_LOWER = (0xff << 16), + R5_DC_I2C_PRESCALE_UPPER = (0xff << 24), + /* R5_DC_I2C_CONTROL3 */ + R5_DC_I2C_DATA_DRIVE_EN = (0x1 << 0), + R5_DC_I2C_DATA_DRIVE_SEL = (0x1 << 1), + R5_DC_I2C_CLK_DRIVE_EN = (0x1 << 7), + R5_DC_I2C_RD_INTRA_BYTE_DELAY = (0xff << 8), + R5_DC_I2C_WR_INTRA_BYTE_DELAY = (0xff << 16), + R5_DC_I2C_TIME_LIMIT = (0xff << 24), + /* R5_DC_I2C_DATA */ + R5_DC_I2C_DATA_BIT = (0xff << 0), + /* R5_DC_I2C_INTERRUPT_CONTROL */ + R5_DC_I2C_INTERRUPT_STATUS = (0x1 << 0), + R5_DC_I2C_INTERRUPT_AK = (0x1 << 8), + R5_DC_I2C_INTERRUPT_ENABLE = (0x1 << 16), + /* R5_DC_I2C_ARBITRATION */ + R5_DC_I2C_SW_WANTS_TO_USE_I2C = (0x1 << 0), + R5_DC_I2C_SW_CAN_USE_I2C = (0x1 << 1), + R5_DC_I2C_SW_DONE_USING_I2C = (0x1 << 8), + R5_DC_I2C_HW_NEEDS_I2C = (0x1 << 9), + R5_DC_I2C_ABORT_HDCP_I2C = (0x1 << 16), + R5_DC_I2C_HW_USING_I2C = (0x1 << 17) +}; + +enum _rhdRS69I2CBits { + /* RS69_DC_I2C_TRANSACTION0 */ + RS69_DC_I2C_RW0 = (0x1 << 0), + RS69_DC_I2C_STOP_ON_NACK0 = (0x1 << 8), + RS69_DC_I2C_START0 = (0x1 << 12), + RS69_DC_I2C_STOP0 = (0x1 << 13), + /* RS69_DC_I2C_TRANSACTION1 */ + RS69_DC_I2C_RW1 = (0x1 << 0), + RS69_DC_I2C_START1 = (0x1 << 12), + RS69_DC_I2C_STOP1 = (0x1 << 13), + /* RS69_DC_I2C_DATA */ + RS69_DC_I2C_DATA_RW = (0x1 << 0), + RS69_DC_I2C_INDEX_WRITE = (0x1 << 31), + /* RS69_DC_I2C_CONTROL */ + RS69_DC_I2C_GO = (0x1 << 0), + RS69_DC_I2C_TRANSACTION_COUNT = (0x3 << 20), + RS69_DC_I2C_SW_DONE_ACK = (0x1 << 1), + /* RS69_DC_I2C_SW_STATUS */ + RS69_DC_I2C_SW_DONE = (0x1 << 2), + RS69_DC_I2C_SW_ABORTED = (0x1 << 4), + RS69_DC_I2C_SW_TIMEOUT = (0x1 << 5), + RS69_DC_I2C_SW_INTERRUPTED= (0x1 << 6), + RS69_DC_I2C_SW_BUFFER_OVERFLOW= (0x1 << 7), + RS69_DC_I2C_SW_STOPPED_ON_NACK = (0x1 << 8), + RS69_DC_I2C_SW_NACK0 = (0x1 << 12), + RS69_DC_I2C_SW_NACK1 = (0x1 << 13) +}; + +/* RV620 */ +enum rv620I2CBits { + /* GENERIC_I2C_CONTROL */ + RV62_DC_I2C_GO = (0x1 << 0), + RV62_GENERIC_I2C_GO = (0x1 << 0), + RV62_GENERIC_I2C_SOFT_RESET = (0x1 << 1), + RV62_GENERIC_I2C_SEND_RESET = (0x1 << 2), + /* GENERIC_I2C_INTERRUPT_CONTROL */ + RV62_GENERIC_I2C_DONE_INT = (0x1 << 0), + RV62_GENERIC_I2C_DONE_ACK = (0x1 << 1), + RV62_GENERIC_I2C_DONE_MASK = (0x1 << 2), + /* GENERIC_I2C_STATUS */ + RV62_GENERIC_I2C_STATUS_BIT = (0xf << 0), + RV62_GENERIC_I2C_DONE = (0x1 << 4), + RV62_GENERIC_I2C_ABORTED = (0x1 << 5), + RV62_GENERIC_I2C_TIMEOUT = (0x1 << 6), + RV62_GENERIC_I2C_STOPPED_ON_NACK = (0x1 << 9), + RV62_GENERIC_I2C_NACK = (0x1 << 10), + /* GENERIC_I2C_SPEED */ + RV62_GENERIC_I2C_THRESHOLD = (0x3 << 0), + RV62_GENERIC_I2C_DISABLE_FILTER_DURING_STALL = (0x1 << 4), + RV62_GENERIC_I2C_PRESCALE = (0xffff << 16), + /* GENERIC_I2C_SETUP */ + RV62_GENERIC_I2C_DATA_DRIVE_EN = (0x1 << 0), + RV62_GENERIC_I2C_DATA_DRIVE_SEL = (0x1 << 1), + RV62_GENERIC_I2C_CLK_DRIVE_EN = (0x1 << 7), + RV62_GENERIC_I2C_INTRA_BYTE_DELAY = (0xff << 8), + RV62_GENERIC_I2C_TIME_LIMIT = (0xff << 24), + /* GENERIC_I2C_TRANSACTION */ + RV62_GENERIC_I2C_RW = (0x1 << 0), + RV62_GENERIC_I2C_STOP_ON_NACK = (0x1 << 8), + RV62_GENERIC_I2C_ACK_ON_READ = (0x1 << 9), + RV62_GENERIC_I2C_START = (0x1 << 12), + RV62_GENERIC_I2C_STOP = (0x1 << 13), + RV62_GENERIC_I2C_COUNT = (0xf << 16), + /* GENERIC_I2C_DATA */ + RV62_GENERIC_I2C_DATA_RW = (0x1 << 0), + RV62_GENERIC_I2C_DATA_BIT = (0xff << 8), + RV62_GENERIC_I2C_INDEX = (0xf << 16), + RV62_GENERIC_I2C_INDEX_WRITE = (0x1 << 31), + /* GENERIC_I2C_PIN_SELECTION */ + RV62_GENERIC_I2C_SCL_PIN_SEL_SHIFT = 0, + RV62_GENERIC_I2C_SCL_PIN_SEL = (0x7f << RV62_GENERIC_I2C_SCL_PIN_SEL_SHIFT), + RV62_GENERIC_I2C_SDA_PIN_SEL_SHIFT = 8, + RV62_GENERIC_I2C_SDA_PIN_SEL = (0x7f << RV62_GENERIC_I2C_SDA_PIN_SEL_SHIFT) +}; + +/* + * + */ +static enum rhdDDClines +getDDCLineFromGPIO(int scrnIndex, CARD32 gpio, int shift) +{ + switch (gpio) { + case 0x1f90: + switch (shift) { + case 0: + return rhdDdc1clk; /* ddc1 clk */ + case 8: + return rhdDdc1data; /* ddc1 data */ + } + break; + case 0x1f94: /* ddc2 */ + switch (shift) { + case 0: + return rhdDdc2clk; /* ddc2 clk */ + case 8: + return rhdDdc2data; /* ddc2 data */ + } + break; + case 0x1f98: /* ddc3 */ + switch (shift) { + case 0: + return rhdDdc3clk; /* ddc3 clk */ + case 8: + return rhdDdc3data; /* ddc3 data */ + } + case 0x1f80: /* ddc4 - on r6xx */ + switch (shift) { + case 0: + return rhdDdc4clk; /* ddc4 clk */ + case 8: + return rhdDdc4data; /* ddc4 data */ + } + break; + case 0x1f88: /* ddc5 */ + switch (shift) { + case 0: + return rhdVIP_DOUTvipclk; /* ddc5 clk */ + case 8: + return rhdVIP_DOUT_scl; /* ddc5 data */ + } + break; + case 0x1fda: /* ddc6 */ + switch (shift) { + case 0: + return rhdDvoData13; /* ddc6 clk */ + case 1: + return rhdDvoData12; /* ddc6 data */ + } + break; + case 0x1fc4: + switch (shift) { + case 0: + return rhdDdc5clk; + case 8: + return rhdDdc5data; + } + break; + case 0x1fe8: /* ddc6 */ + switch (shift) { + case 0: + return rhdDdc6clk; /* ddc6 clk */ + case 8: + return rhdDdc6data; /* ddc6 data */ + } + break; + } + + xf86DrvMsg(scrnIndex, X_WARNING, + "%s: Failed to match GPIO 0x%04X.%d with a known DDC line\n", + __func__, (unsigned int) gpio, shift); + return rhdDdcUnknown; +} + +/* + * + */ +static Bool +rhdI2CGetDataClkLines(RHDPtr rhdPtr, int line, + enum rhdDDClines *scl, enum rhdDDClines *sda, + CARD32 *sda_reg, CARD32 *scl_reg) +{ +#ifdef ATOM_BIOS + AtomBiosResult result; + AtomBiosArgRec data; + + /* scl register */ + data.val = line & 0x0f; + result = RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GPIO_I2C_CLK_MASK, &data); + if (result != ATOM_SUCCESS) + return FALSE; + *scl_reg = data.val; + + /* scl DDC line */ + data.val = line & 0x0f; + result = RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GPIO_I2C_CLK_MASK_SHIFT, &data); + if (result != ATOM_SUCCESS) + return FALSE; + *scl = getDDCLineFromGPIO(rhdPtr->scrnIndex, *scl_reg, data.val); + + /* sda register */ + data.val = line & 0x0f; + result = RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GPIO_I2C_DATA_MASK, &data); + if (result != ATOM_SUCCESS) + return FALSE; + *sda_reg = data.val; + + /* sda DDC line */ + data.val = line & 0x0f; + result = RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GPIO_I2C_DATA_MASK_SHIFT, &data); + if (result != ATOM_SUCCESS) + return FALSE; + *sda = getDDCLineFromGPIO(rhdPtr->scrnIndex, *sda_reg, data.val); + + if ((*scl == rhdDdcUnknown) || (*sda == rhdDdcUnknown)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "%s: failed to map gpio lines for DDC line %d\n", + __func__, line); + return FALSE; + } + + return TRUE; +#else /* ATOM_BIOS */ + return FALSE; +#endif +} + +/* R5xx */ +static Bool +rhd5xxI2CSetupStatus(I2CBusPtr I2CPtr, int line) +{ + RHDFUNC(I2CPtr); + + line &= 0xf; + + + switch (line) { + case 0: + RHDRegMask(I2CPtr, R5_DC_GPIO_DDC1_MASK, 0x0, 0xffff); + RHDRegMask(I2CPtr, R5_DC_GPIO_DDC1_A, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC1_EN, 0x0, 0xffff); + break; + case 1: + RHDRegMask(I2CPtr, R5_DC_GPIO_DDC2_MASK, 0x0, 0xffff); + RHDRegMask(I2CPtr, R5_DC_GPIO_DDC2_A, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC2_EN, 0x0, 0xffff); + break; + case 2: + RHDRegMask(I2CPtr, R5_DC_GPIO_DDC3_MASK, 0x0, 0xffff); + RHDRegMask(I2CPtr, R5_DC_GPIO_DDC3_A, 0x0, 0xffff); + RHDRegMask(I2CPtr, R5_DC_GPIO_DDC3_EN, 0x0, 0xffff); + break; + default: + xf86DrvMsg(I2CPtr->scrnIndex,X_ERROR, + "%s: Trying to initialize non-existent I2C line: %i\n", + __func__,line); + return FALSE; + } + return TRUE; +} + +static Bool +rhd5xxI2CStatus(I2CBusPtr I2CPtr) +{ + int count = RHD_I2C_STATUS_LOOPS; + CARD32 res; + + RHDFUNC(I2CPtr); + + while (count-- != 0) { + usleep (10); + if (((RHDRegRead(I2CPtr, R5_DC_I2C_STATUS1)) & R5_DC_I2C_GO) != 0) + continue; + res = RHDRegRead(I2CPtr, R5_DC_I2C_STATUS1); + RHDDebugVerb(I2CPtr->scrnIndex,1,"SW_STATUS: 0x%x %i\n", + (unsigned int)res,count); + if (res & R5_DC_I2C_DONE) + return TRUE; + else + return FALSE; + } + RHDRegMask(I2CPtr, R5_DC_I2C_RESET, R5_DC_I2C_ABORT, 0xff00); + return FALSE; +} + +Bool +rhd5xxWriteReadChunk(I2CDevPtr i2cDevPtr, int line, I2CByte *WriteBuffer, + int nWrite, I2CByte *ReadBuffer, int nRead) +{ + I2CSlaveAddr slave = i2cDevPtr->SlaveAddr; + I2CBusPtr I2CPtr = i2cDevPtr->pI2CBus; + rhdI2CPtr I2C = (rhdI2CPtr)(I2CPtr->DriverPrivate.ptr); + int prescale = I2C->prescale; + int i; + CARD32 save_I2C_CONTROL1, save_494; + CARD32 tmp32; + Bool ret = TRUE; + + RHDFUNC(i2cDevPtr->pI2CBus); + + RHDRegMask(I2CPtr, 0x28, 0x200, 0x200); + save_I2C_CONTROL1 = RHDRegRead(I2CPtr, R5_DC_I2C_CONTROL1); + save_494 = RHDRegRead(I2CPtr, 0x494); + RHDRegMask(I2CPtr, 0x494, 1, 1); + RHDRegMask(I2CPtr, R5_DC_I2C_ARBITRATION, + R5_DC_I2C_SW_WANTS_TO_USE_I2C, + R5_DC_I2C_SW_WANTS_TO_USE_I2C); + + for (i = 0; i < 50; i++) { + if (RHDRegRead(I2CPtr, R5_DC_I2C_ARBITRATION) & R5_DC_I2C_SW_CAN_USE_I2C) + break; + usleep(1); + } + if (i >= 50) { + xf86DrvMsg(I2CPtr->scrnIndex,X_ERROR, "%s: SW cannot use I2C line %i\n",__func__,line); + ret = FALSE; + } else { + + RHDRegMask(I2CPtr, R5_DC_I2C_STATUS1, R5_DC_I2C_DONE + | R5_DC_I2C_NACK + | R5_DC_I2C_HALT, 0xff); + RHDRegMask(I2CPtr, R5_DC_I2C_RESET, R5_DC_I2C_SOFT_RESET, 0xffff); + RHDRegWrite(I2CPtr, R5_DC_I2C_RESET, 0); + + RHDRegMask(I2CPtr, R5_DC_I2C_CONTROL1, + (line & 0x0f) << 16 | R5_DC_I2C_EN, + R5_DC_I2C_PIN_SELECT | R5_DC_I2C_EN); + } + + if (ret && (nWrite || !nRead)) { /* special case for bus probing */ + /* + * chip can't just write the slave address without data. + * Add a dummy byte. + */ + RHDRegWrite(I2CPtr, R5_DC_I2C_CONTROL2, + prescale << 16 | + (nWrite ? nWrite : 1) << 8 | 0x01); /* addr_cnt: 1 */ + RHDRegMask(I2CPtr, R5_DC_I2C_CONTROL3, + 0x30 << 24, 0xff << 24); /* time limit 30 */ + + RHDRegWrite(I2CPtr, R5_DC_I2C_DATA, slave); + + /* Add dummy byte */ + if (!nWrite) + RHDRegWrite(I2CPtr, R5_DC_I2C_DATA, 0); + else + while (nWrite--) + RHDRegWrite(I2CPtr, R5_DC_I2C_DATA, *WriteBuffer++); + + RHDRegMask(I2CPtr, R5_DC_I2C_CONTROL1, + R5_DC_I2C_START | R5_DC_I2C_STOP, 0xff); + RHDRegMask(I2CPtr, R5_DC_I2C_STATUS1, R5_DC_I2C_GO, 0xff); + + if ((ret = rhd5xxI2CStatus(I2CPtr))) + RHDRegMask(I2CPtr, R5_DC_I2C_STATUS1,R5_DC_I2C_DONE, 0xff); + else + ret = FALSE; + } + + if (ret && nRead) { + + RHDRegWrite(I2CPtr, R5_DC_I2C_DATA, slave | 1); /*slave*/ + RHDRegWrite(I2CPtr, R5_DC_I2C_CONTROL2, + prescale << 16 | nRead << 8 | 0x01); /* addr_cnt: 1 */ + + RHDRegMask(I2CPtr, R5_DC_I2C_CONTROL1, + R5_DC_I2C_START | R5_DC_I2C_STOP | R5_DC_I2C_RECEIVE, 0xff); + RHDRegMask(I2CPtr, R5_DC_I2C_STATUS1, R5_DC_I2C_GO, 0xff); + if ((ret = rhd5xxI2CStatus(I2CPtr))) { + RHDRegMask(I2CPtr, R5_DC_I2C_STATUS1, R5_DC_I2C_DONE, 0xff); + while (nRead--) { + *(ReadBuffer++) = (CARD8)RHDRegRead(I2CPtr, R5_DC_I2C_DATA); + } + } else + ret = FALSE; + } + + RHDRegMask(I2CPtr, R5_DC_I2C_STATUS1, + R5_DC_I2C_DONE | R5_DC_I2C_NACK | R5_DC_I2C_HALT, 0xff); + RHDRegMask(I2CPtr, R5_DC_I2C_RESET, R5_DC_I2C_SOFT_RESET, 0xff); + RHDRegWrite(I2CPtr,R5_DC_I2C_RESET, 0); + + RHDRegMask(I2CPtr,R5_DC_I2C_ARBITRATION, + R5_DC_I2C_SW_DONE_USING_I2C, 0xff00); + + RHDRegWrite(I2CPtr,R5_DC_I2C_CONTROL1, save_I2C_CONTROL1); + RHDRegWrite(I2CPtr,0x494, save_494); + tmp32 = RHDRegRead(I2CPtr,0x28); + RHDRegWrite(I2CPtr,0x28, tmp32 & 0xfffffdff); + + return ret; +} + +static Bool +rhd5xxWriteRead(I2CDevPtr i2cDevPtr, I2CByte *WriteBuffer, int nWrite, I2CByte *ReadBuffer, int nRead) +{ + /* + * Since the transaction buffer can only hold + * 15 bytes (+ the slave address) we bail out + * on every transaction that is bigger unless + * it's a read transaction following a write + * transaction sending just one byte. + * In this case we assume, that this byte is + * an offset address. Thus we will restart + * the transaction after 15 bytes sending + * a new offset. + */ + + I2CBusPtr I2CPtr = i2cDevPtr->pI2CBus; + int ddc_line; + + RHDFUNC(I2CPtr); + + if (nWrite > 15 || (nRead > 15 && nWrite != 1)) { + xf86DrvMsg(i2cDevPtr->pI2CBus->scrnIndex,X_ERROR, + "%s: Currently only I2C transfers with " + "maximally 15bytes are supported\n", + __func__); + return FALSE; + } + + ddc_line = ((rhdI2CPtr)(I2CPtr->DriverPrivate.ptr))->u.line; + + rhd5xxI2CSetupStatus(I2CPtr, ddc_line); + + if (nRead > 15) { + I2CByte offset = *WriteBuffer; + while (nRead) { + int n = nRead > 15 ? 15 : nRead; + if (!rhd5xxWriteReadChunk(i2cDevPtr, ddc_line, &offset, 1, ReadBuffer, n)) + return FALSE; + ReadBuffer += n; + nRead -= n; + offset += n; + } + return TRUE; + } else + return rhd5xxWriteReadChunk(i2cDevPtr, ddc_line, WriteBuffer, nWrite, + ReadBuffer, nRead); +} + +/* RS690 */ +static Bool +rhdRS69I2CStatus(I2CBusPtr I2CPtr) +{ + volatile CARD32 val; + int i; + + RHDFUNC(I2CPtr); + + for (i = 0; i < RHD_I2C_STATUS_LOOPS; i++) { + usleep(10); + + val = RHDRegRead(I2CPtr, RS69_DC_I2C_SW_STATUS); + + RHDDebugVerb(I2CPtr->scrnIndex, 1, "SW_STATUS: 0x%x %i\n", + (unsigned int) val, i); + + if (val & RS69_DC_I2C_SW_DONE) + break; + } + + RHDRegMask(I2CPtr, RS69_DC_I2C_INTERRUPT_CONTROL, RS69_DC_I2C_SW_DONE_ACK, + RS69_DC_I2C_SW_DONE_ACK); + + if ((i == RHD_I2C_STATUS_LOOPS) || + (val & (RS69_DC_I2C_SW_ABORTED | RS69_DC_I2C_SW_TIMEOUT | + RS69_DC_I2C_SW_INTERRUPTED | RS69_DC_I2C_SW_BUFFER_OVERFLOW | + RS69_DC_I2C_SW_STOPPED_ON_NACK | + RS69_DC_I2C_SW_NACK0 | RS69_DC_I2C_SW_NACK1 | 0x3))) + return FALSE; /* 2 */ + + return TRUE; /* 1 */ +} + +static Bool +rhdRS69I2CSetupStatus(I2CBusPtr I2CPtr, enum rhdDDClines sda, enum rhdDDClines scl, int prescale) +{ + CARD32 clk_pin, data_pin; + + RHDFUNC(I2CPtr); + + switch (sda) { + case rhdDdc1data: + data_pin = 0; + break; + case rhdDdc2data: + data_pin = 1; + break; + case rhdDdc3data: + data_pin = 2; + break; + default: + return FALSE; + } + switch (scl) { + case rhdDdc1data: + clk_pin = 4; + break; + case rhdDdc2data: + clk_pin = 5; + break; + case rhdDdc3data: + clk_pin = 6; + break; + case rhdDdc1clk: + clk_pin = 0; + break; + case rhdDdc2clk: + clk_pin = 1; + break; + case rhdDdc3clk: + clk_pin = 2; + break; + default: + return FALSE; + } + + RHDRegMask(I2CPtr, 0x28, 0x200, 0x200); + RHDRegMask(I2CPtr, RS69_DC_I2C_UNKNOWN_1, prescale << 16 | 0x2, 0xffff00ff); + RHDRegWrite(I2CPtr, RS69_DC_I2C_DDC_SETUP_Q, 0x30000000); + RHDRegMask(I2CPtr, RS69_DC_I2C_CONTROL, ((data_pin & 0x3) << 16) | (clk_pin << 8), 0xffff00); + RHDRegMask(I2CPtr, RS69_DC_I2C_INTERRUPT_CONTROL, 0x2, 0x2); + RHDRegMask(I2CPtr, RS69_DC_I2C_UNKNOWN_2, 0x2, 0xff); + + return TRUE; +} + +static Bool +rhdRS69WriteRead(I2CDevPtr i2cDevPtr, I2CByte *WriteBuffer, + int nWrite, I2CByte *ReadBuffer, int nRead) +{ + Bool ret = FALSE; + CARD32 data = 0; + I2CBusPtr I2CPtr = i2cDevPtr->pI2CBus; + I2CSlaveAddr slave = i2cDevPtr->SlaveAddr; + rhdI2CPtr I2C = (rhdI2CPtr)I2CPtr->DriverPrivate.ptr; + int prescale = I2C->prescale; + int idx = 1; + + enum { + TRANS_WRITE_READ, + TRANS_WRITE, + TRANS_READ + } trans; + + RHDFUNC(i2cDevPtr->pI2CBus); + + if (nWrite > 0 && nRead > 0) { + trans = TRANS_WRITE_READ; + } else if (nWrite > 0) { + trans = TRANS_WRITE; + } else if (nRead > 0) { + trans = TRANS_READ; + } else { + /* for bus probing */ + trans = TRANS_WRITE; + } + if (slave & 0xff00) { + xf86DrvMsg(I2CPtr->scrnIndex,X_ERROR, + "%s: 10 bit I2C slave addresses not supported\n",__func__); + return FALSE; + } + + if (!rhdRS69I2CSetupStatus(I2CPtr, I2C->u.Gpio.Sda, I2C->u.Gpio.Scl, prescale)) + return FALSE; + + RHDRegMask(I2CPtr, RS69_DC_I2C_CONTROL, (trans == TRANS_WRITE_READ) + ? (1 << 20) : 0, RS69_DC_I2C_TRANSACTION_COUNT); /* 2 or 1 Transaction */ + RHDRegMask(I2CPtr, RS69_DC_I2C_TRANSACTION0, + RS69_DC_I2C_STOP_ON_NACK0 + | (trans == TRANS_READ ? RS69_DC_I2C_RW0 : 0) + | RS69_DC_I2C_START0 + | (trans == TRANS_WRITE_READ ? 0 : RS69_DC_I2C_STOP0 ) + | ((trans == TRANS_READ ? nRead : nWrite) << 16), + 0xffffff); + if (trans == TRANS_WRITE_READ) + RHDRegMask(I2CPtr, RS69_DC_I2C_TRANSACTION1, + nRead << 16 + | RS69_DC_I2C_RW1 + | RS69_DC_I2C_START1 + | RS69_DC_I2C_STOP1, + 0xffffff); /* read */ + + data = RS69_DC_I2C_INDEX_WRITE + | (((slave & 0xfe) | (trans == TRANS_READ ? 1 : 0)) << 8 ) + | (0 << 16); + RHDRegWrite(I2CPtr, RS69_DC_I2C_DATA, data); + if (trans != TRANS_READ) { /* we have bytes to write */ + while (nWrite--) { + data = RS69_DC_I2C_INDEX_WRITE | ( *(WriteBuffer++) << 8 ) + | (idx++ << 16); + RHDRegWrite(I2CPtr, RS69_DC_I2C_DATA, data); + } + } + if (trans == TRANS_WRITE_READ) { /* we have bytes to read after write */ + data = RS69_DC_I2C_INDEX_WRITE | ((slave | 0x1) << 8) | (idx++ << 16); + RHDRegWrite(I2CPtr, RS69_DC_I2C_DATA, data); + } + /* Go! */ + RHDRegMask(I2CPtr, RS69_DC_I2C_CONTROL, RS69_DC_I2C_GO, RS69_DC_I2C_GO); + if (rhdRS69I2CStatus(I2CPtr)) { + /* Hopefully this doesn't write data to index */ + RHDRegWrite(I2CPtr, RS69_DC_I2C_DATA, RS69_DC_I2C_INDEX_WRITE + | RS69_DC_I2C_DATA_RW | /* idx++ */3 << 16); + while (nRead--) { + data = RHDRegRead(I2CPtr, RS69_DC_I2C_DATA); + *(ReadBuffer++) = (data >> 8) & 0xff; + } + ret = TRUE; + } + + RHDRegMask(I2CPtr, RS69_DC_I2C_CONTROL, 0x2, 0xff); + usleep(10); + RHDRegWrite(I2CPtr, RS69_DC_I2C_CONTROL, 0); + + return ret; +} + + +/* R6xx */ +static Bool +rhdR6xxI2CStatus(I2CBusPtr I2CPtr) +{ + volatile CARD32 val; + int i; + + RHDFUNC(I2CPtr); + + for (i = 0; i < RHD_I2C_STATUS_LOOPS; i++) { + usleep(10); + + val = RHDRegRead(I2CPtr, R6_DC_I2C_SW_STATUS); + + RHDDebugVerb(I2CPtr->scrnIndex, 1, "SW_STATUS: 0x%x %i\n", + (unsigned int) val, i); + + if (val & R6_DC_I2C_SW_DONE) + break; + } + + RHDRegMask(I2CPtr, R6_DC_I2C_INTERRUPT_CONTROL, R6_DC_I2C_SW_DONE_ACK, + R6_DC_I2C_SW_DONE_ACK); + + if ((i == RHD_I2C_STATUS_LOOPS) || + (val & (R6_DC_I2C_SW_ABORTED | R6_DC_I2C_SW_TIMEOUT | + R6_DC_I2C_SW_INTERRUPTED | R6_DC_I2C_SW_BUFFER_OVERFLOW | + R6_DC_I2C_SW_STOPPED_ON_NACK | + R6_DC_I2C_SW_NACK0 | R6_DC_I2C_SW_NACK1 | 0x3))) + return FALSE; /* 2 */ + + return TRUE; /* 1 */ +} + +static Bool +rhd6xxI2CSetupStatus(I2CBusPtr I2CPtr, int line, int prescale) +{ + line &= 0xf; + + RHDFUNC(I2CPtr); + + switch (line) { + case 0: + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC1_MASK, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC1_A, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC1_EN, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_I2C_DDC1_SPEED, (prescale << 16) | 2, + 0xffff00ff); + RHDRegWrite(I2CPtr, R6_DC_I2C_DDC1_SETUP, 0x30000000); + break; + case 1: + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC2_MASK, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC2_A, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC2_EN, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_I2C_DDC2_SPEED, (prescale << 16) | 2, + 0xffff00ff); + RHDRegWrite(I2CPtr, R6_DC_I2C_DDC2_SETUP, 0x30000000); + break; + case 2: + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC3_MASK, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC3_A, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC3_EN, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_I2C_DDC3_SPEED, (prescale << 16) | 2, + 0xffff00ff); + RHDRegWrite(I2CPtr, R6_DC_I2C_DDC3_SETUP, 0x30000000); + break; + case 3: + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC4_MASK, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC4_A, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_GPIO_DDC4_EN, 0x0, 0xffff); + RHDRegMask(I2CPtr, R6_DC_I2C_DDC4_SPEED, (prescale << 16) | 2, + 0xffff00ff); + RHDRegWrite(I2CPtr, R6_DC_I2C_DDC4_SETUP, 0x30000000); + break; + default: + xf86DrvMsg(I2CPtr->scrnIndex,X_ERROR, + "%s: Trying to initialize non-existent I2C line: %i\n", + __func__,line); + return FALSE; + } + RHDRegWrite(I2CPtr, R6_DC_I2C_CONTROL, line << 8); + RHDRegMask(I2CPtr, R6_DC_I2C_INTERRUPT_CONTROL, 0x2, 0x2); + RHDRegMask(I2CPtr, R6_DC_I2C_ARBITRATION, 0, 0xff); + return TRUE; +} + +static Bool +rhd6xxWriteRead(I2CDevPtr i2cDevPtr, I2CByte *WriteBuffer, int nWrite, I2CByte *ReadBuffer, int nRead) +{ + Bool ret = FALSE; + CARD32 data = 0; + I2CBusPtr I2CPtr = i2cDevPtr->pI2CBus; + I2CSlaveAddr slave = i2cDevPtr->SlaveAddr; + rhdI2CPtr I2C = (rhdI2CPtr)I2CPtr->DriverPrivate.ptr; + CARD32 ddc_line = I2C->u.line; + int prescale = I2C->prescale; + int idx = 1; + enum { + TRANS_WRITE_READ, + TRANS_WRITE, + TRANS_READ + } trans; + + RHDFUNC(i2cDevPtr->pI2CBus); + + if (nWrite > 0 && nRead > 0) { + trans = TRANS_WRITE_READ; + } else if (nWrite > 0) { + trans = TRANS_WRITE; + } else if (nRead > 0) { + trans = TRANS_READ; + } else { + /* for bus probing */ + trans = TRANS_WRITE; + } + if (slave & 0xff00) { + xf86DrvMsg(I2CPtr->scrnIndex,X_ERROR, + "%s: 10 bit I2C slave addresses not supported\n",__func__); + return FALSE; + } + + if (!rhd6xxI2CSetupStatus(I2CPtr, ddc_line, prescale)) + return FALSE; + + RHDRegMask(I2CPtr, R6_DC_I2C_CONTROL, (trans == TRANS_WRITE_READ) + ? (1 << 20) : 0, R6_DC_I2C_TRANSACTION_COUNT); /* 2 or 1 Transaction */ + RHDRegMask(I2CPtr, R6_DC_I2C_TRANSACTION0, + R6_DC_I2C_STOP_ON_NACK0 + | (trans == TRANS_READ ? R6_DC_I2C_RW0 : 0) + | R6_DC_I2C_START0 + | (trans == TRANS_WRITE_READ ? 0 : R6_DC_I2C_STOP0 ) + | ((trans == TRANS_READ ? nRead : nWrite) << 16), + 0xffffff); + if (trans == TRANS_WRITE_READ) + RHDRegMask(I2CPtr, R6_DC_I2C_TRANSACTION1, + nRead << 16 + | R6_DC_I2C_RW1 + | R6_DC_I2C_START1 + | R6_DC_I2C_STOP1, + 0xffffff); /* read */ + + data = R6_DC_I2C_INDEX_WRITE + | (((slave & 0xfe) | (trans == TRANS_READ ? 1 : 0)) << 8 ) + | (0 << 16); + RHDRegWrite(I2CPtr, R6_DC_I2C_DATA, data); + if (trans != TRANS_READ) { /* we have bytes to write */ + while (nWrite--) { + data = R6_DC_I2C_INDEX_WRITE | ( *(WriteBuffer++) << 8 ) + | (idx++ << 16); + RHDRegWrite(I2CPtr, R6_DC_I2C_DATA, data); + } + } + if (trans == TRANS_WRITE_READ) { /* we have bytes to read after write */ + data = R6_DC_I2C_INDEX_WRITE | ((slave | 0x1) << 8) | (idx++ << 16); + RHDRegWrite(I2CPtr, R6_DC_I2C_DATA, data); + } + /* Go! */ + RHDRegMask(I2CPtr, R6_DC_I2C_CONTROL, R6_DC_I2C_GO, R6_DC_I2C_GO); + if (rhdR6xxI2CStatus(I2CPtr)) { + /* Hopefully this doesn't write data to index */ + RHDRegWrite(I2CPtr, R6_DC_I2C_DATA, R6_DC_I2C_INDEX_WRITE + | R6_DC_I2C_DATA_RW | /* idx++ */3 << 16); + while (nRead--) { + data = RHDRegRead(I2CPtr, R6_DC_I2C_DATA); + *(ReadBuffer++) = (data >> 8) & 0xff; + } + ret = TRUE; + } + + RHDRegMask(I2CPtr, R6_DC_I2C_CONTROL, 0x2, 0xff); + usleep(10); + RHDRegWrite(I2CPtr, R6_DC_I2C_CONTROL, 0); + + return ret; +} + +/* RV620 */ +static Bool +rhdRV620I2CStatus(I2CBusPtr I2CPtr) +{ + volatile CARD32 val; + int i; + + RHDFUNC(I2CPtr); + + for (i = 0; i < RHD_I2C_STATUS_LOOPS; i++) { + usleep(10); + + val = RHDRegRead(I2CPtr, RV62_GENERIC_I2C_STATUS); + + RHDDebugVerb(I2CPtr->scrnIndex, 1, + "SW_STATUS: 0x%x %i\n", (unsigned int) val, i); + if (val & RV62_GENERIC_I2C_DONE) + break; + } + + RHDRegMask(I2CPtr, RV62_GENERIC_I2C_INTERRUPT_CONTROL, 0x2, 0xff); + + if ((i == RHD_I2C_STATUS_LOOPS) || + (val & (RV62_GENERIC_I2C_STOPPED_ON_NACK | RV62_GENERIC_I2C_NACK | + RV62_GENERIC_I2C_ABORTED | RV62_GENERIC_I2C_TIMEOUT))) + return FALSE; /* 2 */ + + return TRUE; /* 1 */ +} + +/* + * + */ +static Bool +rhdRV620I2CSetupStatus(I2CBusPtr I2CPtr, struct i2cGpio *Gpio, int prescale) +{ + CARD32 reg_7d9c = 0; /* 0 is invalid */ + CARD32 scl_reg; + + RHDFUNC(I2CPtr); + + scl_reg = Gpio->SclReg; + reg_7d9c = (Gpio->Scl << RV62_GENERIC_I2C_SCL_PIN_SEL_SHIFT) + | (Gpio->Sda << RV62_GENERIC_I2C_SDA_PIN_SEL_SHIFT); + + scl_reg = Gpio->SclReg; + /* Don't understand this yet */ + if (scl_reg == 0x1fda) + scl_reg = 0x1f90; + + RHDRegWrite(I2CPtr, scl_reg << 2, 0); + + RHDRegWrite(I2CPtr, RV62_GENERIC_I2C_PIN_SELECTION, reg_7d9c); + RHDRegMask(I2CPtr, RV62_GENERIC_I2C_SPEED, + (prescale & 0xffff) << 16 | 0x02, 0xffff00ff); + RHDRegWrite(I2CPtr, RV62_GENERIC_I2C_SETUP, 0x30000000); + RHDRegMask(I2CPtr, RV62_GENERIC_I2C_INTERRUPT_CONTROL, + RV62_GENERIC_I2C_DONE_ACK, RV62_GENERIC_I2C_DONE_ACK); + + return TRUE; +} + +static Bool +rhdRV620Transaction(I2CDevPtr i2cDevPtr, Bool Write, I2CByte *Buffer, int count) +{ + I2CBusPtr I2CPtr = i2cDevPtr->pI2CBus; + I2CSlaveAddr slave = i2cDevPtr->SlaveAddr; + Bool Start = TRUE; + + RHDFUNC(I2CPtr); + +#define MAX 8 + + while (count > 0 || (Write && Start)) { + int num; + int idx = 0; + CARD32 data = 0; + + if (count > MAX) { + num = MAX; + RHDRegMask(I2CPtr, RV62_GENERIC_I2C_TRANSACTION, + (MAX - (((Start) ? 0 : 1))) << 16 + | RV62_GENERIC_I2C_STOP_ON_NACK + | RV62_GENERIC_I2C_ACK_ON_READ + | (Start ? RV62_GENERIC_I2C_START : 0) + | (!Write ? RV62_GENERIC_I2C_RW : 0 ), + 0xFFFFFF); + } else { + num = count; + data = ( count - (((Start) ? 0 : 1)) ) << 16 + | RV62_GENERIC_I2C_STOP_ON_NACK + | RV62_GENERIC_I2C_STOP + | (Start ? RV62_GENERIC_I2C_START : 0) + | (!Write ? RV62_GENERIC_I2C_RW : 0); + RHDRegMask(I2CPtr, RV62_GENERIC_I2C_TRANSACTION, + data, + 0xFFFFFF); + } + + if (Start) { + data = RV62_GENERIC_I2C_INDEX_WRITE + | (((slave & 0xfe) | ( Write ? 0 : 1)) << 8) + | (idx++ << 16); + RHDRegWrite(I2CPtr, RV62_GENERIC_I2C_DATA, data); + } + + if (Write) { + while (num--) { + data = RV62_GENERIC_I2C_INDEX_WRITE + | (idx++ << 16) + | *(Buffer++) << 8; + RHDRegWrite(I2CPtr, RV62_GENERIC_I2C_DATA, data); + } + + RHDRegMask(I2CPtr, RV62_GENERIC_I2C_CONTROL, + RV62_GENERIC_I2C_GO, RV62_GENERIC_I2C_GO); + if (!rhdRV620I2CStatus(I2CPtr)) + return FALSE; + } else { + + RHDRegMask(I2CPtr, RV62_GENERIC_I2C_CONTROL, + RV62_GENERIC_I2C_GO, RV62_GENERIC_I2C_GO); + if (!rhdRV620I2CStatus(I2CPtr)) + return FALSE; + + RHDRegWrite(I2CPtr, RV62_GENERIC_I2C_DATA, + RV62_GENERIC_I2C_INDEX_WRITE + | (idx++ << 16) + | RV62_GENERIC_I2C_RW); + + while (num--) { + data = RHDRegRead(I2CPtr, RV62_GENERIC_I2C_DATA); + *(Buffer++) = (CARD8)((data >> 8) & 0xff); + } + } + Start = FALSE; + count -= MAX; + } + + return TRUE; +} + +static Bool +rhdRV620WriteRead(I2CDevPtr i2cDevPtr, I2CByte *WriteBuffer, int nWrite, I2CByte *ReadBuffer, int nRead) +{ + I2CBusPtr I2CPtr = i2cDevPtr->pI2CBus; + rhdI2CPtr I2C = (rhdI2CPtr)I2CPtr->DriverPrivate.ptr; + int prescale = I2C->prescale; + + RHDFUNC(I2C); + + rhdRV620I2CSetupStatus(I2CPtr, &I2C->u.Gpio, prescale); + + if (nWrite || !nRead) + if (!rhdRV620Transaction(i2cDevPtr, TRUE, WriteBuffer, nWrite)) + return FALSE; + if (nRead) + if (!rhdRV620Transaction(i2cDevPtr, FALSE, ReadBuffer, nRead)) + return FALSE; + + return TRUE; +} + +static void +rhdTearDownI2C(I2CBusPtr *I2C) +{ + int i; + + /* + * xf86I2CGetScreenBuses() is + * broken in older server versions. + * So we cannot use it. How bad! + */ + for (i = 0; i < MAX_I2C_LINES; i++) { + char *name; + if (!I2C[i]) + break; + name = I2C[i]->BusName; + xfree(I2C[i]->DriverPrivate.ptr); + xf86DestroyI2CBusRec(I2C[i], TRUE, TRUE); + xfree(name); + } + xfree(I2C); +} + +#define TARGET_HW_I2C_CLOCK 25 /* kHz */ +#define DEFAULT_ENGINE_CLOCK 453000 /* kHz (guessed) */ +#define DEFAULT_REF_CLOCK 27000 + +static CARD32 +rhdGetI2CPrescale(RHDPtr rhdPtr) +{ +#ifdef ATOM_BIOS + AtomBiosArgRec atomBiosArg; + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) { + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_DEFAULT_ENGINE_CLOCK, &atomBiosArg) + == ATOM_SUCCESS) + return (0x7f << 8) + + (atomBiosArg.val / (4 * 0x7f * TARGET_HW_I2C_CLOCK)); + else + return (0x7f << 8) + + (DEFAULT_ENGINE_CLOCK / (4 * 0x7f * TARGET_HW_I2C_CLOCK)); + } else if (rhdPtr->ChipSet < RHD_RV620) { + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_REF_CLOCK, &atomBiosArg) == ATOM_SUCCESS) + return (atomBiosArg.val / TARGET_HW_I2C_CLOCK); + else + return (DEFAULT_REF_CLOCK / TARGET_HW_I2C_CLOCK); + } else { + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_REF_CLOCK, &atomBiosArg) == ATOM_SUCCESS) + return (atomBiosArg.val / (4 * TARGET_HW_I2C_CLOCK)); + else + return (DEFAULT_REF_CLOCK / (4 * TARGET_HW_I2C_CLOCK)); + } +#else + RHDFUNC(rhdPtr); + + if (rhdPtr->ChipSet < RHD_R600) { + return (0x7f << 8) + + (DEFAULT_ENGINE_CLOCK) / (4 * 0x7f * TARGET_HW_I2C_CLOCK); + } else if (rhdPtr->ChipSet < RHD_RV620) { + return (DEFAULT_REF_CLOCK / TARGET_HW_I2C_CLOCK); + } else + return (DEFAULT_REF_CLOCK / (4 * TARGET_HW_I2C_CLOCK)); +#endif +} + +static Bool +rhdI2CAddress(I2CDevPtr d, I2CSlaveAddr addr) +{ + d->SlaveAddr = addr; + return xf86I2CWriteRead(d, NULL, 0, NULL, 0); +} + +/* + * This stub is needed to keep xf86I2CProbeAddress() happy. + */ +static void +rhdI2CStop(I2CDevPtr d) +{ +} + +static I2CBusPtr * +rhdInitI2C(int scrnIndex) +{ + int i; + rhdI2CPtr I2C; + I2CBusPtr I2CPtr = NULL; + RHDPtr rhdPtr = RHDPTR(xf86Screens[scrnIndex]); + I2CBusPtr *I2CList; + int numLines; + CARD16 prescale = rhdGetI2CPrescale(rhdPtr); + enum rhdDDClines sda = 0, scl = 0; + CARD32 scl_reg = 0, sda_reg = 0; + Bool valid; + + RHDFUNCI(scrnIndex); + + if (rhdPtr->ChipSet < RHD_RS600) + numLines = 3; + else if (rhdPtr->ChipSet < RHD_R600) + numLines = 4; + else if (rhdPtr->ChipSet < RHD_RV730) + numLines = 4; + else + numLines = MAX_I2C_LINES; + + if (!(I2CList = xcalloc(MAX_I2C_LINES, sizeof(I2CBusPtr)))) { + xf86DrvMsg(scrnIndex, X_ERROR, + "%s: Out of memory.\n",__func__); + } + /* We have 4 I2C lines */ + for (i = 0; i < numLines; i++) { + if (!(I2C = xcalloc(sizeof(rhdI2CRec),1))) { + xf86DrvMsg(scrnIndex, X_ERROR, + "%s: Out of memory.\n",__func__); + goto error; + } + I2C->scrnIndex = scrnIndex; + + valid = rhdI2CGetDataClkLines(rhdPtr, i, &scl, &sda, &sda_reg, &scl_reg); + if (rhdPtr->ChipSet < RHD_RS600 + || (rhdPtr->ChipSet > RHD_RS740 && rhdPtr->ChipSet < RHD_RV620)) { + + if (valid) { + if (sda == rhdDdc1data && scl == rhdDdc1clk) + I2C->u.line = 0; + else if (sda == rhdDdc2data && scl == rhdDdc2clk) + I2C->u.line = 1; + else if (sda == rhdDdc3data && scl == rhdDdc3clk) + I2C->u.line = 2; + else if (rhdPtr->ChipSet > RHD_RS740 && sda == rhdDdc4data && scl == rhdDdc4clk) + I2C->u.line = 3; /* R6XX only */ + else { + xf86DrvMsg(scrnIndex, X_ERROR, "No DDC line found for index %i: scl=0x%2.2x sda=0x%2.2x\n", + i, scl, sda); + xfree(I2C); + continue; + } + + } else + I2C->u.line = i; + + } else if (rhdPtr->ChipSet <= RHD_RS740) { + + if (valid) { + if (sda != rhdDdc1data && sda != rhdDdc2data && sda != rhdDdc3data) { + xf86DrvMsg(scrnIndex, X_ERROR, "Invalid DDC CLK pin found: %i\n", + sda); + xfree(I2C); + continue; + } + if (scl != rhdDdc1data && scl != rhdDdc2data && scl != rhdDdc3data + && scl != rhdDdc1clk && scl != rhdDdc2clk && scl != rhdDdc3clk) { + xf86DrvMsg(scrnIndex, X_ERROR, "Invalid DDC CLK pin found: %i\n", + scl); + xfree(I2C); + continue; + } + I2C->u.Gpio.Sda = sda; + I2C->u.Gpio.Scl = scl; + I2C->u.Gpio.SdaReg = sda_reg; + I2C->u.Gpio.SclReg = scl_reg; + + } else { + xf86DrvMsg(scrnIndex, X_ERROR, "Invalid ClkLine for DDC. " + "AtomBIOS reported wrong or AtomBIOS unavailable\n"); + xfree(I2C); + goto error; + } + + } else { + + if (valid) { + I2C->u.Gpio.Sda = sda; + I2C->u.Gpio.Scl = scl; + I2C->u.Gpio.SdaReg = sda_reg; + I2C->u.Gpio.SclReg = scl_reg; + } else { + CARD32 gpioReg[] = { 0x1f90, 0x1f94, 0x1f98 }; + enum rhdDDClines sdaList[] = { rhdDdc1data, rhdDdc2data, rhdDdc3data }; + enum rhdDDClines sclList[] = { rhdDdc1clk, rhdDdc2clk, rhdDdc3clk }; + if (i > 2) { + xfree(I2C); + continue; + } + I2C->u.Gpio.Sda = sdaList[i]; + I2C->u.Gpio.Scl = sclList[i]; + I2C->u.Gpio.SclReg = I2C->u.Gpio.SdaReg = gpioReg[i]; + } + + } + + /* + * This is a value that has been found to work on many cards. + * It nees to be replaced by the proper calculation formula + * once this is available. + */ + I2C->prescale = prescale; + xf86DrvMsgVerb(scrnIndex, X_INFO, 5, "I2C clock prescale value: %x\n",I2C->prescale); + + if (!(I2CPtr = xf86CreateI2CBusRec())) { + xf86DrvMsg(scrnIndex, X_ERROR, + "Cannot allocate I2C BusRec.\n"); + xfree(I2C); + goto error; + } + I2CPtr->DriverPrivate.ptr = I2C; + if (!(I2CPtr->BusName = xalloc(18))) { + xf86DrvMsg(scrnIndex, X_ERROR, + "%s: Cannot allocate memory.\n",__func__); + xfree(I2C); + xf86DestroyI2CBusRec(I2CPtr, TRUE, FALSE); + goto error; + } + snprintf(I2CPtr->BusName,17,"RHD I2C line %1.1i",i); + I2CPtr->scrnIndex = scrnIndex; + if (rhdPtr->ChipSet < RHD_RS600) + I2CPtr->I2CWriteRead = rhd5xxWriteRead; + else if (rhdPtr->ChipSet >= RHD_RS600 && rhdPtr->ChipSet <= RHD_RS740) + I2CPtr->I2CWriteRead = rhdRS69WriteRead; + else if (rhdPtr->ChipSet < RHD_RV620) + I2CPtr->I2CWriteRead = rhd6xxWriteRead; + else + I2CPtr->I2CWriteRead = rhdRV620WriteRead; + I2CPtr->I2CAddress = rhdI2CAddress; + I2CPtr->I2CStop = rhdI2CStop; + + if (!(xf86I2CBusInit(I2CPtr))) { + xf86DrvMsg(scrnIndex, X_ERROR, + "I2C BusInit failed for bus %i\n",i); + xfree(I2CPtr->BusName); + xfree(I2C); + xf86DestroyI2CBusRec(I2CPtr, TRUE, FALSE); + goto error; + } + I2CList[i] = I2CPtr; + } + return I2CList; + error: + rhdTearDownI2C(I2CList); + return NULL; +} + +RHDI2CResult +rhdI2CProbeAddress(int scrnIndex, I2CBusPtr I2CBusPtr, CARD8 slave) +{ + I2CDevPtr dev; + char *name = "I2CProbe"; + + if ((dev = xf86CreateI2CDevRec())) { + dev->DevName = name; + dev->pI2CBus = I2CBusPtr; + + if (xf86I2CDevInit(dev)) { + Bool ret; + + dev->SlaveAddr = slave & 0xFE; + + ret = xf86I2CWriteRead(dev, NULL, 0, NULL, 0); + + if (ret) { + unsigned char offset = 0; + unsigned char buf[2]; + + /* + ASUS M2A-VM (R690) motherboards ACK all I2C slaves on the + HDMI line when the HDMI riser card is not installed. + We therefore need to read the first two bytes and check + if they are part of an I2C header. + */ + ret = xf86I2CWriteRead(dev, &offset, 1, buf, 2); + if (ret && (buf[0] != 0 || buf[1] != 0xff)) + ret = FALSE; + } + xf86DestroyI2CDevRec(dev, TRUE); + + return ret ? RHD_I2C_SUCCESS : RHD_I2C_FAILED; + } + } + + return RHD_I2C_FAILED; +} + +RHDI2CResult +RHDI2CFunc(int scrnIndex, I2CBusPtr *I2CList, RHDi2cFunc func, + RHDI2CDataArgPtr datap) +{ + RHDFUNCI(scrnIndex); + + if (func == RHD_I2C_INIT) { + if (!(datap->I2CBusList = rhdInitI2C(scrnIndex))) + return RHD_I2C_FAILED; + else + return RHD_I2C_SUCCESS; + } + if (func == RHD_I2C_DDC) { + if (datap->i >= MAX_I2C_LINES || !I2CList[datap->i]) + return RHD_I2C_NOLINE; + + datap->monitor = xf86DoEDID_DDC2(scrnIndex, I2CList[datap->i]); + return RHD_I2C_SUCCESS; + } + if (func == RHD_I2C_PROBE_ADDR_LINE) { + + if (datap->target.line >= MAX_I2C_LINES || !I2CList[datap->target.line]) + return RHD_I2C_NOLINE; + return rhdI2CProbeAddress(scrnIndex, I2CList[datap->target.line], datap->target.slave); + } + if (func == RHD_I2C_PROBE_ADDR) { + return rhdI2CProbeAddress(scrnIndex, datap->probe.i2cBusPtr, datap->probe.slave); + } + if (func == RHD_I2C_GETBUS) { + if (datap->i >= MAX_I2C_LINES || !I2CList[datap->i]) + return RHD_I2C_NOLINE; + + datap->i2cBusPtr = I2CList[datap->i]; + return RHD_I2C_SUCCESS; + } + if (func == RHD_I2C_TEARDOWN) { + if (I2CList) + rhdTearDownI2C(I2CList); + return RHD_I2C_SUCCESS; + } + return RHD_I2C_FAILED; +} + diff --git a/driver/xf86-video-radeonhd/src/rhd_i2c.h b/driver/xf86-video-radeonhd/src/rhd_i2c.h new file mode 100644 index 000000000..cfc274708 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_i2c.h @@ -0,0 +1,70 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ +#ifndef RHD_I2C_H_ +# define RHD_I2C_H_ + +#include "xf86DDC.h" +#include "rhd.h" + +typedef enum { + RHD_I2C_INIT, + RHD_I2C_DDC, + RHD_I2C_PROBE_ADDR_LINE, + RHD_I2C_PROBE_ADDR, + RHD_I2C_GETBUS, + RHD_I2C_TEARDOWN +} RHDi2cFunc; + +typedef union RHDI2CDataArg +{ + I2CBusPtr *I2CBusList; + int i; + struct { + int line; + CARD8 slave; + } target; + struct { + CARD8 slave; + I2CBusPtr i2cBusPtr; + } probe; + struct + { + int line; + CARD32 slaves[4]; + } scanbus; + xf86MonPtr monitor; + I2CBusPtr i2cBusPtr; +} RHDI2CDataArg, *RHDI2CDataArgPtr; + +typedef enum { + RHD_I2C_SUCCESS, + RHD_I2C_NOLINE, + RHD_I2C_FAILED +} RHDI2CResult; + +RHDI2CResult +RHDI2CFunc(int scrnIndex, I2CBusPtr *I2CList, RHDi2cFunc func, + RHDI2CDataArgPtr data); +#endif diff --git a/driver/xf86-video-radeonhd/src/rhd_id.c b/driver/xf86-video-radeonhd/src/rhd_id.c new file mode 100644 index 000000000..6dfaa295d --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_id.c @@ -0,0 +1,1055 @@ +/* + * Copyright 2007-2009 Luc Verhaegen + * Copyright 2007-2009 Matthias Hopf + * Copyright 2007-2009 Egbert Eich + * Copyright 2007-2009 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include "git_version.h" + +#include "xf86.h" +#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) < 6 +#include "xf86Resources.h" +#endif + +#include "rhd.h" +#ifdef ATOM_BIOS +#include "rhd_atombios.h" +#endif +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_card.h" + +SymTabRec RHDChipsets[] = { + /* R500 */ + { RHD_RV505, "RV505" }, + { RHD_RV515, "RV515" }, + { RHD_RV516, "RV516" }, + { RHD_R520, "R520" }, + { RHD_RV530, "RV530" }, + { RHD_RV535, "RV535" }, + { RHD_RV550, "RV550" }, + { RHD_RV560, "RV560" }, + { RHD_RV570, "RV570" }, + { RHD_R580, "R580" }, + /* R500 Mobility */ + { RHD_M52, "M52" }, + { RHD_M54, "M54" }, + { RHD_M56, "M56" }, + { RHD_M58, "M58" }, + { RHD_M62, "M62" }, + { RHD_M64, "M64" }, + { RHD_M66, "M66" }, + { RHD_M68, "M68" }, + { RHD_M71, "M71" }, + /* R500 integrated */ + { RHD_RS600, "RS600" }, + { RHD_RS690, "RS690" }, + { RHD_RS740, "RS740" }, + /* R600 */ + { RHD_R600, "R600" }, + { RHD_RV610, "RV610" }, + { RHD_RV630, "RV630" }, + /* R600 Mobility */ + { RHD_M72, "M72" }, + { RHD_M74, "M74" }, + { RHD_M76, "M76" }, + /* R600 second batch */ + { RHD_RV620, "RV620" }, + { RHD_RV635, "RV635" }, + { RHD_RV670, "RV670" }, + { RHD_R680, "R680" }, + /* R700 Mobility */ + { RHD_M82, "M82" }, + { RHD_M88, "M88" }, + { RHD_M86, "M86" }, + /* R600 integrated */ + { RHD_RS780, "RS780" }, + { RHD_RS880, "RS880" }, + /* R700 */ + { RHD_R700, "R700" }, + { RHD_RV710, "RV710" }, + { RHD_RV730, "RV730" }, + { RHD_RV740, "RV740" }, + { RHD_RV770, "RV770" }, + { RHD_RV790, "RV790" }, + /* R700 Mobility */ + { RHD_M92, "M92" }, + { RHD_M93, "M93" }, + { RHD_M96, "M96" }, + { RHD_M97, "M97" }, + { RHD_M98, "M98" }, + { -1, NULL } +}; + + +/* + * This is what people would refer to as "Petite". + */ + +#ifdef XSERVER_LIBPCIACCESS +# define RHD_DEVICE_MATCH(d, i) \ + { 0x1002, (d), PCI_MATCH_ANY, PCI_MATCH_ANY, 0, 0, (i) } +# define PCI_ID_LIST struct pci_id_match RHDDeviceMatch[] +# define LIST_END { 0, 0, (~0), (~0), 0, 0, 0 } +#else +resRange res_none[] = { _END }; + +# define RHD_DEVICE_ENTRY(d, i, r) \ + { (i), (d), r } +# define RHD_DEVICE_MATCH(d, i) \ + RHD_DEVICE_ENTRY((d), (i), res_none) +# define PCI_ID_LIST PciChipsets RHDPCIchipsets[] +# define LIST_END { -1, -1, RES_UNDEFINED } +#endif + +const PCI_ID_LIST = { + RHD_DEVICE_MATCH( 0x7100, RHD_R520 ), /* Radeon X1800 */ + RHD_DEVICE_MATCH( 0x7101, RHD_M58 ), /* Mobility Radeon X1800 XT */ + RHD_DEVICE_MATCH( 0x7102, RHD_M58 ), /* Mobility Radeon X1800 */ + RHD_DEVICE_MATCH( 0x7103, RHD_M58 ), /* Mobility FireGL V7200 */ + RHD_DEVICE_MATCH( 0x7104, RHD_R520 ), /* FireGL V7200 */ + RHD_DEVICE_MATCH( 0x7105, RHD_R520 ), /* FireGL V5300 */ + RHD_DEVICE_MATCH( 0x7106, RHD_M58 ), /* Mobility FireGL V7100 */ + RHD_DEVICE_MATCH( 0x7108, RHD_R520 ), /* Radeon X1800 */ + RHD_DEVICE_MATCH( 0x7109, RHD_R520 ), /* Radeon X1800 */ + RHD_DEVICE_MATCH( 0x710A, RHD_R520 ), /* Radeon X1800 */ + RHD_DEVICE_MATCH( 0x710B, RHD_R520 ), /* Radeon X1800 */ + RHD_DEVICE_MATCH( 0x710C, RHD_R520 ), /* Radeon X1800 */ + RHD_DEVICE_MATCH( 0x710E, RHD_R520 ), /* FireGL V7300 */ + RHD_DEVICE_MATCH( 0x710F, RHD_R520 ), /* FireGL V7350 */ + RHD_DEVICE_MATCH( 0x7140, RHD_RV515 ), /* Radeon X1600/X1550 */ + RHD_DEVICE_MATCH( 0x7141, RHD_RV505 ), /* RV505 */ + RHD_DEVICE_MATCH( 0x7142, RHD_RV515 ), /* Radeon X1300/X1550 */ + RHD_DEVICE_MATCH( 0x7143, RHD_RV505 ), /* Radeon X1550 */ + RHD_DEVICE_MATCH( 0x7144, RHD_M54 ), /* M54-GL */ + RHD_DEVICE_MATCH( 0x7145, RHD_M54 ), /* Mobility Radeon X1400 */ + RHD_DEVICE_MATCH( 0x7146, RHD_RV515 ), /* Radeon X1300/X1550 */ + RHD_DEVICE_MATCH( 0x7147, RHD_RV505 ), /* Radeon X1550 64-bit */ + RHD_DEVICE_MATCH( 0x7149, RHD_M52 ), /* Mobility Radeon X1300 */ + RHD_DEVICE_MATCH( 0x714A, RHD_M52 ), /* Mobility Radeon X1300 */ + RHD_DEVICE_MATCH( 0x714B, RHD_M52 ), /* Mobility Radeon X1300 */ + RHD_DEVICE_MATCH( 0x714C, RHD_M52 ), /* Mobility Radeon X1300 */ + RHD_DEVICE_MATCH( 0x714D, RHD_RV515 ), /* Radeon X1300 */ + RHD_DEVICE_MATCH( 0x714E, RHD_RV515 ), /* Radeon X1300 */ + RHD_DEVICE_MATCH( 0x714F, RHD_RV505 ), /* RV505 */ + RHD_DEVICE_MATCH( 0x7151, RHD_RV505 ), /* RV505 */ + RHD_DEVICE_MATCH( 0x7152, RHD_RV515 ), /* FireGL V3300 */ + RHD_DEVICE_MATCH( 0x7153, RHD_RV515 ), /* FireGL V3350 */ + RHD_DEVICE_MATCH( 0x715E, RHD_RV515 ), /* Radeon X1300 */ + RHD_DEVICE_MATCH( 0x715F, RHD_RV505 ), /* Radeon X1550 64-bit */ + RHD_DEVICE_MATCH( 0x7180, RHD_RV516 ), /* Radeon X1300/X1550 */ + RHD_DEVICE_MATCH( 0x7181, RHD_RV516 ), /* Radeon X1600 */ + RHD_DEVICE_MATCH( 0x7183, RHD_RV516 ), /* Radeon X1300/X1550 */ + RHD_DEVICE_MATCH( 0x7186, RHD_M64 ), /* Mobility Radeon X1450 */ + RHD_DEVICE_MATCH( 0x7187, RHD_RV516 ), /* Radeon X1300/X1550 */ + RHD_DEVICE_MATCH( 0x7188, RHD_M64 ), /* Mobility Radeon X2300 */ + RHD_DEVICE_MATCH( 0x718A, RHD_M64 ), /* Mobility Radeon X2300 */ + RHD_DEVICE_MATCH( 0x718B, RHD_M62 ), /* Mobility Radeon X1350 */ + RHD_DEVICE_MATCH( 0x718C, RHD_M62 ), /* Mobility Radeon X1350 */ + RHD_DEVICE_MATCH( 0x718D, RHD_M64 ), /* Mobility Radeon X1450 */ + RHD_DEVICE_MATCH( 0x718F, RHD_RV516 ), /* Radeon X1300 */ + RHD_DEVICE_MATCH( 0x7193, RHD_RV516 ), /* Radeon X1550 */ + RHD_DEVICE_MATCH( 0x7196, RHD_M62 ), /* Mobility Radeon X1350 */ + RHD_DEVICE_MATCH( 0x719B, RHD_RV516 ), /* FireMV 2250 */ + RHD_DEVICE_MATCH( 0x719F, RHD_RV516 ), /* Radeon X1550 64-bit */ + RHD_DEVICE_MATCH( 0x71C0, RHD_RV530 ), /* Radeon X1600 */ + RHD_DEVICE_MATCH( 0x71C1, RHD_RV535 ), /* Radeon X1650 */ + RHD_DEVICE_MATCH( 0x71C2, RHD_RV530 ), /* Radeon X1600 */ + RHD_DEVICE_MATCH( 0x71C3, RHD_RV535 ), /* Radeon X1600 */ + RHD_DEVICE_MATCH( 0x71C4, RHD_M56 ), /* Mobility FireGL V5200 */ + RHD_DEVICE_MATCH( 0x71C5, RHD_M56 ), /* Mobility Radeon X1600 */ + RHD_DEVICE_MATCH( 0x71C6, RHD_RV530 ), /* Radeon X1650 */ + RHD_DEVICE_MATCH( 0x71C7, RHD_RV535 ), /* Radeon X1650 */ + RHD_DEVICE_MATCH( 0x71CD, RHD_RV530 ), /* Radeon X1600 */ + RHD_DEVICE_MATCH( 0x71CE, RHD_RV530 ), /* Radeon X1300 XT/X1600 Pro */ + RHD_DEVICE_MATCH( 0x71D2, RHD_RV530 ), /* FireGL V3400 */ + RHD_DEVICE_MATCH( 0x71D4, RHD_M66 ), /* Mobility FireGL V5250 */ + RHD_DEVICE_MATCH( 0x71D5, RHD_M66 ), /* Mobility Radeon X1700 */ + RHD_DEVICE_MATCH( 0x71D6, RHD_M66 ), /* Mobility Radeon X1700 XT */ + RHD_DEVICE_MATCH( 0x71DA, RHD_RV530 ), /* FireGL V5200 */ + RHD_DEVICE_MATCH( 0x71DE, RHD_M66 ), /* Mobility Radeon X1700 */ + RHD_DEVICE_MATCH( 0x7200, RHD_RV550 ), /* Radeon X2300HD */ + RHD_DEVICE_MATCH( 0x7210, RHD_M71 ), /* Mobility Radeon HD 2300 */ + RHD_DEVICE_MATCH( 0x7211, RHD_M71 ), /* Mobility Radeon HD 2300 */ + RHD_DEVICE_MATCH( 0x7240, RHD_R580 ), /* Radeon X1950 */ + RHD_DEVICE_MATCH( 0x7243, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x7244, RHD_R580 ), /* Radeon X1950 */ + RHD_DEVICE_MATCH( 0x7245, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x7246, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x7247, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x7248, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x7249, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x724A, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x724B, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x724C, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x724D, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x724E, RHD_R580 ), /* AMD Stream Processor */ + RHD_DEVICE_MATCH( 0x724F, RHD_R580 ), /* Radeon X1900 */ + RHD_DEVICE_MATCH( 0x7280, RHD_RV570 ), /* Radeon X1950 */ + RHD_DEVICE_MATCH( 0x7281, RHD_RV560 ), /* RV560 */ + RHD_DEVICE_MATCH( 0x7283, RHD_RV560 ), /* RV560 */ + RHD_DEVICE_MATCH( 0x7284, RHD_M68 ), /* Mobility Radeon X1900 */ + RHD_DEVICE_MATCH( 0x7287, RHD_RV560 ), /* RV560 */ + RHD_DEVICE_MATCH( 0x7288, RHD_RV570 ), /* Radeon X1950 GT */ + RHD_DEVICE_MATCH( 0x7289, RHD_RV570 ), /* RV570 */ + RHD_DEVICE_MATCH( 0x728B, RHD_RV570 ), /* RV570 */ + RHD_DEVICE_MATCH( 0x728C, RHD_RV570 ), /* ATI FireGL V7400 */ + RHD_DEVICE_MATCH( 0x7290, RHD_RV560 ), /* RV560 */ + RHD_DEVICE_MATCH( 0x7291, RHD_RV560 ), /* Radeon X1650 */ + RHD_DEVICE_MATCH( 0x7293, RHD_RV560 ), /* Radeon X1650 */ + RHD_DEVICE_MATCH( 0x7297, RHD_RV560 ), /* RV560 */ + RHD_DEVICE_MATCH( 0x791E, RHD_RS690 ), /* Radeon X1200 */ + RHD_DEVICE_MATCH( 0x791F, RHD_RS690 ), /* Radeon X1200 */ + RHD_DEVICE_MATCH( 0x793F, RHD_RS600 ), /* Radeon Xpress 1200 */ + RHD_DEVICE_MATCH( 0x7941, RHD_RS600 ), /* Radeon Xpress 1200 */ + RHD_DEVICE_MATCH( 0x7942, RHD_RS600 ), /* Radeon Xpress 1200 (M) */ + RHD_DEVICE_MATCH( 0x796C, RHD_RS740 ), /* RS740 */ + RHD_DEVICE_MATCH( 0x796D, RHD_RS740 ), /* RS740M */ + RHD_DEVICE_MATCH( 0x796E, RHD_RS740 ), /* ATI Radeon 2100 RS740 */ + RHD_DEVICE_MATCH( 0x796F, RHD_RS740 ), /* RS740M */ + RHD_DEVICE_MATCH( 0x9400, RHD_R600 ), /* Radeon HD 2900 XT */ + RHD_DEVICE_MATCH( 0x9401, RHD_R600 ), /* Radeon HD 2900 XT */ + RHD_DEVICE_MATCH( 0x9402, RHD_R600 ), /* Radeon HD 2900 XT */ + RHD_DEVICE_MATCH( 0x9403, RHD_R600 ), /* Radeon HD 2900 Pro */ + RHD_DEVICE_MATCH( 0x9405, RHD_R600 ), /* Radeon HD 2900 GT */ + RHD_DEVICE_MATCH( 0x940A, RHD_R600 ), /* FireGL V8650 */ + RHD_DEVICE_MATCH( 0x940B, RHD_R600 ), /* FireGL V8600 */ + RHD_DEVICE_MATCH( 0x940F, RHD_R600 ), /* FireGL V7600 */ + RHD_DEVICE_MATCH( 0x9440, RHD_RV770 ), /* ATI Radeon 4800 Series */ + RHD_DEVICE_MATCH( 0x9441, RHD_RV770 ), /* ATI Radeon 4870 X2 */ + RHD_DEVICE_MATCH( 0x9442, RHD_RV770 ), /* ATI Radeon 4800 Series */ + RHD_DEVICE_MATCH( 0x9443, RHD_RV770 ), /* ATI Radeon 4850 X2 */ + RHD_DEVICE_MATCH( 0x9444, RHD_RV770 ), /* Everest ATI FirePro Graphics Accelerator */ + RHD_DEVICE_MATCH( 0x9446, RHD_RV770 ), /* K2 ATI FirePro Graphics Accelerator */ + RHD_DEVICE_MATCH( 0x9447, RHD_R700 ), /* ATI FirePro V8700 Duo */ + RHD_DEVICE_MATCH( 0x944A, RHD_M98 ), /* ATI MOBILITY RADEON HD 4850 */ + RHD_DEVICE_MATCH( 0x944B, RHD_M98 ), /* ATI MOBILITY RADEON HD 4850 X2 */ + RHD_DEVICE_MATCH( 0x944C, RHD_RV770 ), /* ATI RADEON HD 4800 Series */ + RHD_DEVICE_MATCH( 0x944E, RHD_RV770 ), /* RV770 */ +/* RHD_DEVICE_MATCH( 0x944F, RHD_R700 ), *//* R700 */ + RHD_DEVICE_MATCH( 0x9450, RHD_RV770 ), /* AMD FireStream 9270 */ + RHD_DEVICE_MATCH( 0x9452, RHD_RV770 ), /* AMD FireStream 9250 */ + RHD_DEVICE_MATCH( 0x9456, RHD_RV770 ), /* Denali ATI FirePro Graphics Accelerator */ + RHD_DEVICE_MATCH( 0x945A, RHD_M98 ), /* ATI MOBILITY RADEON HD 4870 */ + RHD_DEVICE_MATCH( 0x945B, RHD_M98 ), /* M98 */ + RHD_DEVICE_MATCH( 0x9460, RHD_RV790 ), /* RV790 */ + RHD_DEVICE_MATCH( 0x9462, RHD_RV790 ), /* RV790 */ + RHD_DEVICE_MATCH( 0x946A, RHD_M98 ), /* M98 */ + RHD_DEVICE_MATCH( 0x946B, RHD_M98 ), /* M98 */ + RHD_DEVICE_MATCH( 0x947A, RHD_M98 ), /* M98 */ + RHD_DEVICE_MATCH( 0x947B, RHD_M98 ), /* M98 */ + RHD_DEVICE_MATCH( 0x9480, RHD_M96 ), /* ATI MOBILITY RADEON HD 4650 */ + RHD_DEVICE_MATCH( 0x9487, RHD_RV730 ), /* RV730 */ + RHD_DEVICE_MATCH( 0x9488, RHD_M96 ), /* ATI MOBILITY RADEON HD 4670 */ + RHD_DEVICE_MATCH( 0x9489, RHD_M96 ), /* M96M GL */ + RHD_DEVICE_MATCH( 0x948F, RHD_RV730 ), /* RV730 */ + RHD_DEVICE_MATCH( 0x9490, RHD_RV730 ), /* ATI RADEON HD 4670 */ + RHD_DEVICE_MATCH( 0x9491, RHD_RV730 ), /* ATI RADEON E4600 */ + RHD_DEVICE_MATCH( 0x9495, RHD_RV730 ), /* ATI Radeon HD 4600 Series */ + RHD_DEVICE_MATCH( 0x9498, RHD_RV730 ), /* ATI RADEON HD 4650 */ + RHD_DEVICE_MATCH( 0x949C, RHD_RV730 ), /* ATI FirePro V7750 */ + RHD_DEVICE_MATCH( 0x949E, RHD_RV730 ), /* ATI FirePro V5700 */ + RHD_DEVICE_MATCH( 0x949F, RHD_RV730 ), /* ATI FirePro V3750 */ + RHD_DEVICE_MATCH( 0x94A0, RHD_M97 ), /* Mobility Radeon HD 4830 */ + RHD_DEVICE_MATCH( 0x94A1, RHD_M97 ), /* Mobility Radeon HD 4850 */ + RHD_DEVICE_MATCH( 0x94A3, RHD_M97 ), /* ATI FirePro M7740 */ + RHD_DEVICE_MATCH( 0x94B1, RHD_RV740 ), /* RV740 */ + RHD_DEVICE_MATCH( 0x94B3, RHD_RV740 ), /* Radeon HD 4770 */ + RHD_DEVICE_MATCH( 0x94B4, RHD_RV740 ), /* Radeon HD 4700 Series */ + RHD_DEVICE_MATCH( 0x94B5, RHD_RV740 ), /* Radeon HD 4770 */ + RHD_DEVICE_MATCH( 0x94B9, RHD_M97 ), /* ATI FirePro M5750 */ + RHD_DEVICE_MATCH( 0x94C0, RHD_RV610 ), /* RV610 */ + RHD_DEVICE_MATCH( 0x94C1, RHD_RV610 ), /* Radeon HD 2400 XT */ + RHD_DEVICE_MATCH( 0x94C3, RHD_RV610 ), /* Radeon HD 2400 Pro */ + RHD_DEVICE_MATCH( 0x94C4, RHD_RV610 ), /* ATI Radeon HD 2400 PRO AGP */ + RHD_DEVICE_MATCH( 0x94C5, RHD_RV610 ), /* FireGL V4000 */ + RHD_DEVICE_MATCH( 0x94C6, RHD_RV610 ), /* RV610 */ + RHD_DEVICE_MATCH( 0x94C7, RHD_RV610 ), /* ATI Radeon HD 2350 */ + RHD_DEVICE_MATCH( 0x94C8, RHD_M74 ), /* Mobility Radeon HD 2400 XT */ + RHD_DEVICE_MATCH( 0x94C9, RHD_M72 ), /* Mobility Radeon HD 2400 */ + RHD_DEVICE_MATCH( 0x94CB, RHD_M72 ), /* ATI RADEON E2400 */ + RHD_DEVICE_MATCH( 0x94CC, RHD_RV610 ), /* ATI Radeon HD 2400 */ + RHD_DEVICE_MATCH( 0x94CD, RHD_RV610 ), /* ATI FireMV 2260 */ + RHD_DEVICE_MATCH( 0x9500, RHD_RV670 ), /* RV670 */ + RHD_DEVICE_MATCH( 0x9501, RHD_RV670 ), /* ATI Radeon HD3870 */ + RHD_DEVICE_MATCH( 0x9504, RHD_M88 ), /* ATI Mobility Radeon HD 3850 */ + RHD_DEVICE_MATCH( 0x9505, RHD_RV670 ), /* ATI Radeon HD3850 */ + RHD_DEVICE_MATCH( 0x9506, RHD_M88 ), /* ATI Mobility Radeon HD 3850 X2 */ + RHD_DEVICE_MATCH( 0x9507, RHD_RV670 ), /* ATI RADEON HD 3830 */ + RHD_DEVICE_MATCH( 0x9508, RHD_M88 ), /* ATI Mobility Radeon HD 3870 */ + RHD_DEVICE_MATCH( 0x9509, RHD_M88 ), /* ATI Mobility Radeon HD 3870 X2 */ + RHD_DEVICE_MATCH( 0x950F, RHD_R680 ), /* ATI Radeon HD3870 X2 */ + RHD_DEVICE_MATCH( 0x9511, RHD_RV670 ), /* ATI FireGL V7700 */ + RHD_DEVICE_MATCH( 0x9513, RHD_R680 ), /* ATI RADEON HD 3850 X2 */ + RHD_DEVICE_MATCH( 0x9515, RHD_RV670 ), /* ATI Radeon HD 3850 AGP */ + RHD_DEVICE_MATCH( 0x9517, RHD_RV670 ), /* ATI Radeon HD 3960 */ + RHD_DEVICE_MATCH( 0x9519, RHD_RV670 ), /* FireStream 9170 */ + RHD_DEVICE_MATCH( 0x9540, RHD_RV710 ), /* ATI RADEON HD 4550 */ + RHD_DEVICE_MATCH( 0x9541, RHD_RV710 ), /* */ + RHD_DEVICE_MATCH( 0x9542, RHD_RV710 ), /* */ + RHD_DEVICE_MATCH( 0x954E, RHD_RV710 ), /* */ + RHD_DEVICE_MATCH( 0x954F, RHD_RV710 ), /* ATI RADEON HD 4350 */ + RHD_DEVICE_MATCH( 0x9552, RHD_M92 ), /* Mobility Radeon HD 4300 Series */ + RHD_DEVICE_MATCH( 0x9553, RHD_M92 ), /* Mobility Radeon HD 4500 Series */ + RHD_DEVICE_MATCH( 0x9555, RHD_M93 ), /* Mobility Radeon M93 */ + RHD_DEVICE_MATCH( 0x9557, RHD_M93 ), /* ATI FirePro RG220 */ + RHD_DEVICE_MATCH( 0x9580, RHD_RV630 ), /* RV630 */ + RHD_DEVICE_MATCH( 0x9581, RHD_M76 ), /* Mobility Radeon HD 2600 */ + RHD_DEVICE_MATCH( 0x9583, RHD_M76 ), /* Mobility Radeon HD 2600 XT */ + RHD_DEVICE_MATCH( 0x9586, RHD_RV630 ), /* ATI Radeon HD 2600 XT AGP */ + RHD_DEVICE_MATCH( 0x9587, RHD_RV630 ), /* ATI Radeon HD 2600 Pro AGP */ + RHD_DEVICE_MATCH( 0x9588, RHD_RV630 ), /* Radeon HD 2600 XT */ + RHD_DEVICE_MATCH( 0x9589, RHD_RV630 ), /* Radeon HD 2600 Pro */ + RHD_DEVICE_MATCH( 0x958A, RHD_RV630 ), /* Gemini RV630 */ + RHD_DEVICE_MATCH( 0x958B, RHD_M76 ), /* Gemini ATI Mobility Radeon HD 2600 XT */ + RHD_DEVICE_MATCH( 0x958C, RHD_RV630 ), /* FireGL V5600 */ + RHD_DEVICE_MATCH( 0x958D, RHD_RV630 ), /* FireGL V3600 */ + RHD_DEVICE_MATCH( 0x958E, RHD_RV630 ), /* ATI Radeon HD 2600 LE */ + RHD_DEVICE_MATCH( 0x958F, RHD_M76 ), /* ATI Mobility FireGL Graphics Processor */ + RHD_DEVICE_MATCH( 0x9590, RHD_RV635 ), /* ATI Radeon HD 3600 Series */ + RHD_DEVICE_MATCH( 0x9591, RHD_M86 ), /* Mobility Radeon HD 3650 */ + RHD_DEVICE_MATCH( 0x9592, RHD_RV710 ), /* */ + RHD_DEVICE_MATCH( 0x9593, RHD_M86 ), /* Mobility Radeon HD 3670 */ + RHD_DEVICE_MATCH( 0x9595, RHD_M86 ), /* Mobility FireGL V5700 */ + RHD_DEVICE_MATCH( 0x9596, RHD_RV635 ), /* ATI Radeon HD 3650 AGP */ + RHD_DEVICE_MATCH( 0x9597, RHD_RV635 ), /* ATI Radeon HD 3600 Series */ + RHD_DEVICE_MATCH( 0x9598, RHD_RV635 ), /* ATI Radeon HD 3670 */ + RHD_DEVICE_MATCH( 0x9599, RHD_RV635 ), /* ATI Radeon HD 3600 Series */ + RHD_DEVICE_MATCH( 0x959B, RHD_M86 ), /* ATI Mobility FireGL V5725 */ + RHD_DEVICE_MATCH( 0x95C0, RHD_RV620 ), /* ATI Radeon HD 3470 */ + RHD_DEVICE_MATCH( 0x95C2, RHD_M82 ), /* ATI Mobility Radeon HD 3430 (M82) */ + RHD_DEVICE_MATCH( 0x95C4, RHD_M82 ), /* Mobility Radeon HD 3400 Series (M82) */ + RHD_DEVICE_MATCH( 0x95C5, RHD_RV620 ), /* ATI Radeon HD 3450 */ + RHD_DEVICE_MATCH( 0x95C6, RHD_RV620 ), /* ATI Radeon HD 3450 */ + RHD_DEVICE_MATCH( 0x95C7, RHD_RV620 ), /* ATI Radeon HD 3430 */ + RHD_DEVICE_MATCH( 0x95C9, RHD_RV620 ), /* ATI Radeon HD 3450 */ + RHD_DEVICE_MATCH( 0x95CC, RHD_RV620 ), /* Fire PRO Professional Graphics ASIC */ + RHD_DEVICE_MATCH( 0x95CD, RHD_RV620 ), /* ATI FireMV 2450 */ + RHD_DEVICE_MATCH( 0x95CE, RHD_RV620 ), /* ATI FireMV 2260 */ + RHD_DEVICE_MATCH( 0x95CF, RHD_RV620 ), /* ATI FireMV 2260 */ + RHD_DEVICE_MATCH( 0x9610, RHD_RS780 ), /* ATI Radeon HD 3200 Graphics */ + RHD_DEVICE_MATCH( 0x9611, RHD_RS780 ), /* ATI Radeon 3100 Graphics */ + RHD_DEVICE_MATCH( 0x9612, RHD_RS780 ), /* ATI Radeon HD 3200 Graphics */ + RHD_DEVICE_MATCH( 0x9613, RHD_RS780 ), /* ATI Radeon 3100 Graphics */ + RHD_DEVICE_MATCH( 0x9614, RHD_RS780 ), /* ATI Radeon HD 3300 Graphics */ + RHD_DEVICE_MATCH( 0x9615, RHD_RS780 ), /* ATI Radeon HD 3200 Graphics */ + RHD_DEVICE_MATCH( 0x9616, RHD_RS780 ), /* ATI Radeon HD 3000 Graphics */ + RHD_DEVICE_MATCH( 0x9710, RHD_RS880 ), /* ATI Radeon HD Graphics */ + RHD_DEVICE_MATCH( 0x9711, RHD_RS880 ), /* ATI Radeon Graphics */ + RHD_DEVICE_MATCH( 0x9712, RHD_RS880 ), /* ATI Mobility Radeon HD Graphics */ + RHD_DEVICE_MATCH( 0x9713, RHD_RS880 ), /* ATI Mobility Radeon Graphics */ + RHD_DEVICE_MATCH( 0x9714, RHD_RS880 ), /* ATI Radeon Graphics */ + LIST_END +}; + +static enum RHD_CHIPSETS rhdIGPChipsetList[] = { + RHD_RS690, + RHD_RS690, + RHD_RS690, + RHD_RS780, + RHD_RS880, + RHD_UNKNOWN /* end marker */ +}; + +/* + * + */ +void +RHDIdentify(int flags) +{ + xf86Msg(X_INFO, "%s: X driver for the following AMD GPG (ATI) graphics devices:\n", RHD_NAME); + /* START_DEVICE_LIST marker - do not delete */ + xf86Msg(X_NONE, + "\tRV505 : Radeon X1550, X1550 64bit.\n" + "\tRV515 : Radeon X1300, X1550, X1600; FireGL V3300, V3350.\n" + "\tRV516 : Radeon X1300, X1550, X1550 64-bit, X1600; FireMV 2250.\n" + "\tR520 : Radeon X1800; FireGL V5300, V7200, V7300, V7350.\n" + "\tRV530 : Radeon X1300 XT, X1600, X1600 Pro, X1650; FireGL V3400, V5200.\n" + "\tRV535 : Radeon X1300, X1650.\n" + "\tRV550 : Radeon X2300 HD.\n" + "\tRV560 : Radeon X1650.\n" + "\tRV570 : Radeon X1950, X1950 GT; FireGL V7400.\n" + "\tR580 : Radeon X1900, X1950; AMD Stream Processor.\n"); + xf86Msg(X_NONE, + "\tR600 : Radeon HD 2900 GT/Pro/XT; FireGL V7600/V8600/V8650.\n" + "\tRV610 : Radeon HD 2350, HD 2400 Pro/XT, HD 2400 Pro AGP; FireGL V4000.\n" + "\tRV620 : Radeon HD 3450, HD 3470.\n" + "\tRV630 : Radeon HD 2600 LE/Pro/XT, HD 2600 Pro/XT AGP; Gemini RV630;\n" + "\t\tFireGL V3600/V5600.\n" + "\tRV635 : Radeon HD 3650, HD 3670.\n" + "\tRV670 : Radeon HD 3690, 3850, HD 3870, FireGL V7700, FireStream 9170.\n" + "\tR680 : Radeon HD 3870 X2.\n"); + xf86Msg(X_NONE, + "\tM52 : Mobility Radeon X1300.\n" + "\tM54 : Mobility Radeon X1400; M54-GL.\n" + "\tM56 : Mobility Radeon X1600; Mobility FireGL V5200.\n" + "\tM58 : Mobility Radeon X1800, X1800 XT; Mobility FireGL V7100, V7200.\n" + "\tM62 : Mobility Radeon X1350.\n" + "\tM64 : Mobility Radeon X1450, X2300.\n" + "\tM66 : Mobility Radeon X1700, X1700 XT; FireGL V5250.\n" + "\tM68 : Mobility Radeon X1900.\n"); + xf86Msg(X_NONE, + "\tM71 : Mobility Radeon HD 2300.\n" + "\tM72 : Mobility Radeon HD 2400; Radeon E2400.\n" + "\tM74 : Mobility Radeon HD 2400 XT.\n" + "\tM76 : Mobility Radeon HD 2600;\n" + "\t\t(Gemini ATI) Mobility Radeon HD 2600 XT.\n"); + xf86Msg(X_NONE, + "\tM82 : Mobility Radeon HD 3400.\n" + "\tM86 : Mobility Radeon HD 3650, HD 3670, Mobility FireGL V5700.\n" + "\tM88 : Mobility Radeon HD 3850, HD 3850 X2, HD 3870, HD3870 X2.\n"); + xf86Msg(X_NONE, + "\tRS600 : Radeon Xpress 1200, Xpress 1250.\n" + "\tRS690 : Radeon X1200, X1250, X1270.\n" + "\tRS740 : RS740, RS740M.\n" + "\tRS780 : Radeon HD 3100/3200/3300 Series.\n"); + xf86Msg(X_NONE, + "\tR700 : Radeon R700.\n" + "\tRV710 : Radeon HD4570, HD4350.\n" + "\tRV730 : Radeon HD4670, HD4650.\n" + "\tRV740 : Radeon HD4770. EXPERIMENTAL AND UNTESTED.\n" + "\tRV770 : Radeon HD 4800 Series; Everest, K2, Denali ATI FirePro.\n" + "\tRV790 : Radeon HD 4890.\n"); + xf86Msg(X_NONE, + "\tM92 : Mobility Radeon HD4330, HD4530, HD4570. EXPERIMENTAL.\n" + "\tM93 : Mobility Radeon M93. EXPERIMENTAL AND UNTESTED.\n" + "\tM96 : Mobility Radeon HD4600.\n" + "\tM97 : Mobility Radeon HD4860. EXPERIMENTAL AND UNTESTED.\n" + "\tM98 : Mobility Radeon HD4850, HD4870.\n"); + /* END_DEVICE_LIST marker - do not delete */ + xf86Msg(X_NONE, "\n"); + + xf86Msg(X_INFO, "%s: version %s, built from %s\n\n", + RHD_NAME, PACKAGE_VERSION, GIT_MESSAGE); +} + +/* + * + */ +Bool +RHDIsIGP(enum RHD_CHIPSETS chipset) +{ + int i = 0; + while (rhdIGPChipsetList[i] != RHD_UNKNOWN) { + if (chipset == (rhdIGPChipsetList[i])) + return TRUE; + i++; + } + return FALSE; +} + +/* + * Some macros to help us make connector tables less messy. + * There are, after all, a limited number of possibilities at the moment. + */ +#define ID_CONNECTORINFO_EMPTY \ + { {RHD_CONNECTOR_NONE, "NULL", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_NONE, RHD_OUTPUT_NONE}}} + +#ifdef ATOM_BIOS +# define DEVINFO_EMPTY { { atomNone, atomNone } } +#else +# define DEVINFO_EMPTY +#endif + +/* Radeon RV610 0x94C3 0x0000 0x0000 */ +#define VGA_B1_TV_B0_DVI_AB00 \ +{{ RHD_CONNECTOR_DVI_SINGLE, "VGA CRT2", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_NONE, RHD_OUTPUT_DACB }}, \ + {RHD_CONNECTOR_TV, "7PIN_DIN TV1 CV", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, \ + {RHD_CONNECTOR_DVI_SINGLE, "SINGLE_LINK_DVI CRT1 DFP2", RHD_DDC_0, RHD_HPD_0, \ + {RHD_OUTPUT_LVTMA, RHD_OUTPUT_DACA }}} + + +/* Radeon X1300 0x7187:0x1545:0x1930 */ +#define VGA_A0_TV_B_DVI_XB11 \ + { { RHD_CONNECTOR_VGA, "VGA CRT1", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE }}, \ + { RHD_CONNECTOR_TV, "SVIDEO TV1", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, \ + { RHD_CONNECTOR_DVI, "DVI-D DFP3", RHD_DDC_1, RHD_HPD_1, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE }}} + +/* Sapphire X1550 reports 2x DVI-I but has only 1 VGA and 1 DVI */ +#define VGA_A0_DVI_BB11 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_1, RHD_HPD_1, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_LVTMA}}} + +/* 0x7249:0x1043:0x0168 */ +#define DVI_BA10_DVI_XB01_TV_B \ + { { RHD_CONNECTOR_DVI, "DVI-I DFP1 CRT2", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_TMDSA, RHD_OUTPUT_DACB }}, \ + { RHD_CONNECTOR_DVI, "DVI-I DFP2", RHD_DDC_0, RHD_HPD_1, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE }}, \ + { RHD_CONNECTOR_TV, "SVIDEO TV1", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}} + +/* Visiontek C1550 */ +#define VGA_A0_TV_B_DVI_BB10 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE } }, \ + {RHD_CONNECTOR_TV, "SVIDEO", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE } }, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_DACB } } } + +/* MacBook Pro */ +#define PANEL_B2_DVI_BA00 \ + { {RHD_CONNECTOR_PANEL, "Panel", RHD_DDC_2, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_0, RHD_HPD_0, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_TMDSA}}} + +#ifdef ATOM_BIOS +# define DEVINFO_MACBOOKPRO \ + { { atomLCD1, atomNone }, { atomCRT2, atomDFP1 } } +#else +# define DEVINFO_MACBOOKPRO +#endif + +/* GeCube HD 2400PRO AGP (GC-RX24PGA2-D3) specifies 2 DVI again.*/ +#define DVI_AB00_VGA_B1 \ + { {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_0, RHD_HPD_0, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_LVTMA}}, \ + {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE}}} + +/* Fujitsu Siemens Amilo PI1536 has no HPD on its DVI connector. */ +#define PANEL_B_DVI_AA1 \ + { {RHD_CONNECTOR_PANEL, "Panel", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_TMDSA}}} + +/* Sapphire Radeon HD 2600 PRO AGP reports VGA output as DVI */ +#define DVI_BA10_TV_B0_VGA_A0 \ + { { RHD_CONNECTOR_DVI, "DUAL_LINK_DVI_I", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_TMDSA, RHD_OUTPUT_DACB }}, \ + { RHD_CONNECTOR_TV, "7PIN_DIN TV1 CV", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, \ + { RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_NONE, RHD_OUTPUT_DACA }}} + +/* MSI RX2600PRO-T2D512Z/D2 */ +#define DVI_BA12_TV_B_DVI_AB01 \ + { { RHD_CONNECTOR_DVI, "DUAL_LINK_DVI_I DFP1 CRT2", RHD_DDC_1, RHD_HPD_2, \ + { RHD_OUTPUT_TMDSA, RHD_OUTPUT_DACB }}, \ + { RHD_CONNECTOR_TV, "7PIN_DIN TV1 CV", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, \ + { RHD_CONNECTOR_DVI, "DUAL_LINK_DVI_I CRT1 DFP2", RHD_DDC_0, RHD_HPD_1, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_DACA }}} + +/* HIS Radeon X1550 PCI claims to have two DVI ports where it has only one */ +#define VGA_A0_TV_B_DVI_BA10 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE } }, \ + {RHD_CONNECTOR_TV, "SVIDEO", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE } }, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_TMDSA, RHD_OUTPUT_DACB } } } + +/* Wyse R-Class broke connector table info (DDC) in later BIOSes */ +#define DVI_AB2_DVI_C3 \ + { {RHD_CONNECTOR_DVI, "DVI-I DFP3 CRT1", RHD_DDC_2, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_DACA }}, \ + {RHD_CONNECTOR_DVI, "DVI-D DFP2", RHD_DDC_3, RHD_HPD_NONE, \ + { RHD_OUTPUT_DVO, RHD_OUTPUT_NONE }}} + +/* HIS Excalibur Radeon XT1650 Pro IceQ 256 */ +#define VGA_A0_DVI_AB1 \ +{ {RHD_CONNECTOR_DVI, "DVI-I DFP3 CRT1", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_NONE, RHD_OUTPUT_DACA }}, \ + {RHD_CONNECTOR_TV, "COMPOSITE TV1", RHD_DDC_NONE, RHD_HPD_NONE, \ + {RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, \ + {RHD_CONNECTOR_DVI, "VGA DFP1 CRT2", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_TMDSA, RHD_OUTPUT_DACB }} } + + + +#if defined(USE_ID_CONNECTORS) || !defined(ATOM_BIOS) + +#define VGA_A0_TVB_DVI_BB12 \ + { { RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE }}, \ + { RHD_CONNECTOR_TV, "SVIDEO", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE }}, \ + { RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_1, RHD_HPD_2, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_LVTMA }}} + +#define VGA_A0_DVI_BA10 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_TMDSA}}} + +#define VGA_A0_DVI_BB10 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_LVTMA}}} + +#define VGA_B1_DVI_AA00 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_0, RHD_HPD_0, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_TMDSA}}} + +#define VGA_B1_DVI_AB01 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_0, RHD_HPD_1, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_LVTMA}}} + +#define VGA_B1_DVI_AB00 \ + { {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-I", RHD_DDC_0, RHD_HPD_0, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_LVTMA}}} + +#define DVI_AA00_DVI_BB11 \ + { {RHD_CONNECTOR_DVI, "DVI-I 1", RHD_DDC_0, RHD_HPD_0, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_TMDSA}}, \ + {RHD_CONNECTOR_DVI, "DVI-I 2", RHD_DDC_1, RHD_HPD_1, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_LVTMA}}} + +#define DVI_BA10_DVI_AB01 \ + { {RHD_CONNECTOR_DVI, "DVI-I 1", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_TMDSA}}, \ + {RHD_CONNECTOR_DVI, "DVI-I 2", RHD_DDC_0, RHD_HPD_1, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_LVTMA}}} + +#define DVI_BB11_DVI_AA00 \ + { {RHD_CONNECTOR_DVI, "DVI-I 1", RHD_DDC_1, RHD_HPD_1, \ + { RHD_OUTPUT_DACB, RHD_OUTPUT_LVTMA}}, \ + {RHD_CONNECTOR_DVI, "DVI-I 2", RHD_DDC_0, RHD_HPD_0, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_TMDSA}}} + +#define PANEL_B_VGA_A0 \ + { {RHD_CONNECTOR_PANEL, "Panel", RHD_DDC_NONE, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}} + +#define PANEL_B1_VGA_A0 \ + { {RHD_CONNECTOR_PANEL, "Panel", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}} + +#define PANEL_B1_VGA_A2 \ + { {RHD_CONNECTOR_PANEL, "Panel", RHD_DDC_1, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_2, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}} + +#define PANEL_B2_VGA_A0 \ + { {RHD_CONNECTOR_PANEL, "Panel", RHD_DDC_2, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}} + +#define PANEL_B2_VGA_A0_DVI_A10 \ + { {RHD_CONNECTOR_PANEL, "Panel", RHD_DDC_2, RHD_HPD_NONE, \ + { RHD_OUTPUT_LVTMA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_VGA, "VGA", RHD_DDC_0, RHD_HPD_NONE, \ + { RHD_OUTPUT_DACA, RHD_OUTPUT_NONE}}, \ + {RHD_CONNECTOR_DVI, "DVI-D", RHD_DDC_1, RHD_HPD_0, \ + { RHD_OUTPUT_TMDSA, RHD_OUTPUT_NONE}}} + +#else /* if !defined(USE_ID_CONNECTORS) && defined(ATOM_BIOS) */ + +#define VGA_A0_TVB_DVI_BB12 ID_CONNECTORINFO_EMPTY +#define VGA_A0_DVI_BA10 ID_CONNECTORINFO_EMPTY +#define VGA_A0_DVI_BB10 ID_CONNECTORINFO_EMPTY +#define VGA_B1_DVI_AA00 ID_CONNECTORINFO_EMPTY +#define VGA_B1_DVI_AB01 ID_CONNECTORINFO_EMPTY +#define VGA_B1_DVI_AB00 ID_CONNECTORINFO_EMPTY +#define DVI_AA00_DVI_BB11 ID_CONNECTORINFO_EMPTY +#define DVI_BA10_DVI_AB01 ID_CONNECTORINFO_EMPTY +#define DVI_BB11_DVI_AA00 ID_CONNECTORINFO_EMPTY +#define PANEL_B_VGA_A0 ID_CONNECTORINFO_EMPTY +#define PANEL_B1_VGA_A0 ID_CONNECTORINFO_EMPTY +#define PANEL_B1_VGA_A2 ID_CONNECTORINFO_EMPTY +#define PANEL_B2_VGA_A0 ID_CONNECTORINFO_EMPTY +#define PANEL_B2_VGA_A0_DVI_A10 ID_CONNECTORINFO_EMPTY + +#endif /* if defined(USE_ID_CONNECTORS) || !defined(ATOM_BIOS) */ + +/* + * List of pci subsystem / card ids. + * + * Used for: + * - printing card name. + * - connector mapping. + * + */ +static struct rhdCard +rhdCards[] = +{ + /* 0x7100 : R520 : Radeon X1800 */ + { 0x7100, 0x1002, 0x0B12, "Powercolor X1800XT", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + /* 0x7101 : M58 : Mobility Radeon X1800 XT */ + /* 0x7102 : M58 : Mobility Radeon X1800 */ + /* 0x7103 : M58 : Mobility FireGL V7200 */ + /* 0x7104 : R520 : FireGL V7200 */ + { 0x7104, 0x1002, 0x0B32, "ATI FireGL V7200 RH", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + /* 0x7105 : R520 : FireGL V5300 */ + /* 0x7106 : M58 : Mobility FireGL V7100 */ + /* 0x7108 : R520 : Radeon X1800 */ + /* 0x7109 : R520 : Radeon X1800 */ + /* 0x710A : R520 : Radeon X1800 */ + /* 0x710B : R520 : Radeon X1800 */ + /* 0x710C : R520 : Radeon X1800 */ + /* 0x710E : R520 : FireGL V7300 */ + /* 0x710F : R520 : FireGL V7350 */ + /* 0x7140 : RV515 : Radeon X1600 */ + { 0x7140, 0x1787, 0x3000, "PowerColor X1550", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x7141 : RV505 : RV505 */ + /* 0x7142 : RV515 : Radeon X1300/X1550 */ + { 0x7142, 0x1787, 0x3000, "ATI Radeon X1550", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x7143 : RV505 : Radeon X1550 */ + { 0x7143, 0x17AF, 0x204E, "HIS Radeon X1550 PCI", RHD_CARD_FLAG_NONE, VGA_A0_TV_B_DVI_BA10, DEVINFO_EMPTY }, + /* 0x7144 : M54 : M54-GL */ + /* 0x7145 : M54 : Mobility Radeon X1400 */ + { 0x7145, 0x1028, 0x2002, "Dell Inspiron 9400", RHD_CARD_FLAG_NONE, PANEL_B2_VGA_A0_DVI_A10, DEVINFO_EMPTY }, + { 0x7145, 0x1028, 0x2003, "Dell Inspiron 6400", RHD_CARD_FLAG_NONE, PANEL_B_VGA_A0, DEVINFO_EMPTY }, + { 0x7145, 0x1179, 0xFF10, "Toshiba Satellite A100-773", RHD_CARD_FLAG_NONE, PANEL_B1_VGA_A2, DEVINFO_EMPTY }, + { 0x7145, 0x1297, 0x3058, "M54P X1440", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x7145, 0x1734, 0x10B0, "Fujitsu Siemens Amilo PI1536", RHD_CARD_FLAG_NONE, PANEL_B_DVI_AA1, DEVINFO_EMPTY }, + { 0x7145, 0x17AA, 0x2006, "Lenovo Thinkpad T60 (2007)", RHD_CARD_FLAG_NONE, PANEL_B2_VGA_A0_DVI_A10, DEVINFO_EMPTY }, + { 0x7145, 0x17AA, 0x202A, "Lenovo Thinkpad Z61m", RHD_CARD_FLAG_NONE, PANEL_B2_VGA_A0, DEVINFO_EMPTY }, + /* 0x7146 : RV515 : Radeon X1300/X1550 */ + { 0x7146, 0x174B, 0x0470, "Sapphire X1300", RHD_CARD_FLAG_NONE, VGA_B1_DVI_AB01, DEVINFO_EMPTY }, + { 0x7146, 0x174B, 0x0920, "Sapphire X1300", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x7146, 0x174B, 0x0940, "X1300 HM", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x7146, 0x1545, 0x2350, "Visiontek C1550", RHD_CARD_FLAG_NONE, VGA_A0_TV_B_DVI_BB10, DEVINFO_EMPTY }, + /* 0x7147 : RV505 : Radeon X1550 64-bit */ + { 0x7147, 0x174B, 0x0840, "Sapphire X1550", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x7149 : M52 : Mobility Radeon X1300 */ + { 0x7149, 0x1028, 0x2003, "Dell Inspiron E1505", RHD_CARD_FLAG_NONE, PANEL_B_VGA_A0, DEVINFO_EMPTY }, + { 0x7149, 0x17AA, 0x2005, "Lenovo Thinkpad T60 (2008)", RHD_CARD_FLAG_NONE, PANEL_B2_VGA_A0_DVI_A10, DEVINFO_EMPTY }, + /* 0x714A : M52 : Mobility Radeon X1300 */ + /* 0x714B : M52 : Mobility Radeon X1300 */ + /* 0x714C : M52 : Mobility Radeon X1300 */ + /* 0x714D : RV515 : Radeon X1300 */ + /* 0x714E : RV515 : Radeon X1300 */ + /* 0x714F : RV505 : RV505 */ + /* 0x7151 : RV505 : RV505 */ + /* 0x7152 : RV515 : FireGL V3300 */ + { 0x7152, 0x1002, 0x0B02, "ATI FireGL V3300", RHD_CARD_FLAG_NONE, DVI_BB11_DVI_AA00, DEVINFO_EMPTY }, + /* 0x7153 : RV515 : FireGL V3350 */ + /* 0x715E : RV515 : Radeon X1300 */ + /* 0x715F : RV505 : Radeon X1550 64-bit */ + /* 0x7180 : RV516 : Radeon X1300/X1550 */ + /* 0x7181 : RV516 : Radeon X1600 */ + /* 0x7183 : RV516 : Radeon X1300/X1550 */ + { 0x7183, 0x1028, 0x0D02, "Dell ATI Radeon X1300", RHD_CARD_FLAG_DMS59, DVI_AA00_DVI_BB11, DEVINFO_EMPTY }, + { 0x7183, 0x1092, 0x3000, "RX155PCI", RHD_CARD_FLAG_NONE, VGA_A0_TVB_DVI_BB12, DEVINFO_EMPTY }, + /* 0x7186 : M64 : Mobility Radeon X1450 */ + /* 0x7187 : RV516 : Radeon X1300/X1550 */ + { 0x7187, 0x174B, 0x3000, "RV516 : Radeon X1300/X1550", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x7187, 0x1458, 0x215C, "RV516 : Radeon X1300/X1550", RHD_CARD_FLAG_DMS59, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x7187, 0x1545, 0x1930, "RV516 : Radeon X1300", RHD_CARD_FLAG_NONE, VGA_A0_TV_B_DVI_XB11, DEVINFO_EMPTY }, + /* 0x7188 : M64 : Mobility Radeon X2300 */ + /* 0x718A : M64 : Mobility Radeon X2300 */ + { 0x718A, 0x1043, 0x1449, "Asus F3JR", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x718B : M62 : Mobility Radeon X1350 */ + /* 0x718C : M62 : Mobility Radeon X1350 */ + /* 0x718D : M64 : Mobility Radeon X1450 */ + /* 0x718F : RV516 : Radeon X1300 */ + /* 0x7193 : RV516 : Radeon X1550 */ + /* 0x7196 : M62 : Mobility Radeon X1350 */ + /* 0x719B : RV516 : FireMV 2250 */ + /* 0x719F : RV516 : Radeon X1550 64-bit */ + /* 0x71C0 : RV530 : Radeon X1600 */ + /* 0x71C1 : RV535 : Radeon X1650 */ + { 0x71C1, 0x174B, 0x0840, "Sapphire X1650 Pro", RHD_CARD_FLAG_NONE, DVI_AA00_DVI_BB11, DEVINFO_EMPTY }, + /* 0x71C2 : RV530 : Radeon X1600 */ + { 0x71C2, 0x1458, 0x2146, "Gigabyte GV-RX16P256DE-RH", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x71C2, 0x17EE, 0x71C0, "Connect3D Radeon X1600 Pro", RHD_CARD_FLAG_NONE, VGA_B1_DVI_AA00, DEVINFO_EMPTY }, + /* 0x71C3 : RV535 : Radeon X1600 */ + /* 0x71C4 : M56 : Mobility FireGL V5200 */ + { 0x71C4, 0x17AA, 0x2007, "Lenovo Thinkpad T60p V5200", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x71C5 : M56 : Mobility Radeon X1600 */ + { 0x71C5, 0x103C, 0x30A3, "HP/Compaq nc8430", RHD_CARD_FLAG_NONE, PANEL_B1_VGA_A0, DEVINFO_EMPTY }, + { 0x71C5, 0x103C, 0x30B4, "HP/Compaq nw8440", RHD_CARD_FLAG_NONE, PANEL_B1_VGA_A0, DEVINFO_EMPTY }, + { 0x71C5, 0x1043, 0x10B2, "Asus W3J/Z96", RHD_CARD_FLAG_NONE, PANEL_B_VGA_A0, DEVINFO_EMPTY }, + { 0x71C5, 0x106B, 0x0080, "Macbook Pro", RHD_CARD_FLAG_NONE, PANEL_B2_DVI_BA00, DEVINFO_MACBOOKPRO }, + { 0x71C5, 0x1179, 0xFF10, "Toshiba Satellite A100-237", RHD_CARD_FLAG_NONE, PANEL_B1_VGA_A2, DEVINFO_EMPTY }, + /* 0x71C6 : RV530 : Radeon X1650 */ + { 0x71C6, 0x174B, 0x0850, "Sapphire X1650 Pro AGP", RHD_CARD_FLAG_NONE, VGA_A0_DVI_BA10, DEVINFO_EMPTY }, + { 0x71C6, 0x1462, 0x0400, "MSI RX1650 Pro", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + { 0x71C6, 0x17AF, 0x206A, "HIS Excalibur Radeon XT1650 Pro IceQ 256M", RHD_CARD_FLAG_NONE, VGA_A0_DVI_AB1, DEVINFO_EMPTY }, + /* 0x71C7 : RV535 : Radeon X1650 */ + { 0x71C7, 0x1043, 0x01B6, "Asus EAX1650 Silent", RHD_CARD_FLAG_NONE, VGA_A0_DVI_BB10, DEVINFO_EMPTY }, + { 0x71C7, 0x1787, 0x2227, "Diamond Viper X1650 Pro", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x71CD : RV530 : Radeon X1600 */ + { 0x71CD, 0x174B, 0x0840, "PCP X1600 400M/500E", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x71CE : RV530 : Radeon X1300 XT/X1600 Pro */ + { 0x71CE, 0x18BC, 0x2770, "Radeon X1300 XT/X1600 Pro", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x71D2 : RV530 : FireGL V3400 */ + { 0x71D2, 0x1002, 0x2B02, "ATI FireGL V3400", RHD_CARD_FLAG_NONE, DVI_BB11_DVI_AA00, DEVINFO_EMPTY }, + /* 0x71D4 : M66 : Mobility FireGL V5250 */ + { 0x71D4, 0x17AA, 0x20A4, "Lenovo Thinkpad T60p V5250", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x71D5 : M66 : Mobility Radeon X1700 */ + /* 0x71D6 : M66 : Mobility Radeon X1700 XT */ + /* 0x71DA : RV530 : FireGL V5200 */ + /* 0x71DE : M66 : Mobility Radeon X1700 */ + /* 0x7200 : RV550 : Radeon X2300HD */ + /* 0x7210 : M71 : Mobility Radeon HD 2300 */ + /* 0x7211 : M71 : Mobility Radeon HD 2300 */ + /* 0x7240 : R580 : Radeon X1950 */ + /* 0x7243 : R580 : Radeon X1900 */ + /* 0x7244 : R580 : Radeon X1950 */ + /* 0x7245 : R580 : Radeon X1900 */ + /* 0x7246 : R580 : Radeon X1900 */ + /* 0x7247 : R580 : Radeon X1900 */ + /* 0x7248 : R580 : Radeon X1900 */ + /* 0x7249 : R580 : Radeon X1900 */ + { 0x7249, 0x1002, 0x0B12, "ATI Radeon X1900 XTX", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + /* { 0x7249, 0x1043, 0x016B, "ATI Radeon X1900 XTX", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_XB01_TV_B, DEVINFO_EMPTY }, */ + /* 0x724A : R580 : Radeon X1900 */ + /* 0x724B : R580 : Radeon X1900 */ + { 0x724B, 0x1002, 0x0B12, "Sapphire Radeon X1900 GT", RHD_CARD_FLAG_NONE, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x724C : R580 : Radeon X1900 */ + /* 0x724D : R580 : Radeon X1900 */ + /* 0x724E : R580 : AMD Stream Processor */ + /* 0x724F : R580 : Radeon X1900 */ + /* 0x7280 : RV570 : Radeon X1950 */ + { 0x7280, 0x174B, 0xE190, "Sapphire X1950 Pro", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + { 0x7280, 0x18BC, 0x2870, "GeCube X1950 Pro", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + /* 0x7281 : RV560 : RV560 */ + /* 0x7283 : RV560 : RV560 */ + /* 0x7284 : M68 : Mobility Radeon X1900 */ + /* 0x7287 : RV560 : RV560 */ + /* 0x7288 : RV570 : Radeon X1950 GT */ + { 0x7288, 0x174B, 0xE190, "Sapphire X1950 GT", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + /* 0x7289 : RV570 : RV570 */ + /* 0x728B : RV570 : RV570 */ + /* 0x728C : RV570 : ATI FireGL V7400 */ + /* 0x7290 : RV560 : RV560 */ + /* 0x7291 : RV560 : Radeon X1650 */ + /* 0x7293 : RV560 : Radeon X1650 */ + /* 0x7297 : RV560 : RV560 */ + /* 0x791E : RS690 : Radeon X1200 */ + { 0x791E, 0x1043, 0x826D, "Asus M2A-VM", RHD_CARD_FLAG_NONE, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x791F : RS690 : Radeon X1200 */ + { 0x791F, 0x1002, 0x053A, "Wyse R-Class", RHD_CARD_FLAG_NONE, DVI_AB2_DVI_C3, DEVINFO_EMPTY }, + { 0x791F, 0x103C, 0x30C2, "HP/Compaq 6715b", RHD_CARD_FLAG_NONE, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + /* 0x793F : RS600 : Radeon Xpress 1200 */ + /* 0x7941 : RS600 : Radeon Xpress 1200 */ + /* 0x7942 : RS600 : Radeon Xpress 1200 (M) */ + /* 0x796C : RS740 : RS740 */ + /* 0x796D : RS740 : RS740M */ + /* 0x796E : RS740 : RS740 */ + /* 0x796F : RS740 : RS740M */ + /* 0x9400 : R600 : Radeon HD 2900 XT */ + { 0x9400, 0x1002, 0x3142, "Sapphire HD 2900 XT", RHD_CARD_FLAG_NONE, DVI_BB11_DVI_AA00, DEVINFO_EMPTY }, + /* 0x9401 : R600 : Radeon HD 2900 XT */ + /* 0x9402 : R600 : Radeon HD 2900 XT */ + /* 0x9403 : R600 : Radeon HD 2900 Pro */ + /* 0x9405 : R600 : ATI Radeon HD 2900 GT */ + /* 0x940A : R600 : ATI FireGL V8650 */ + /* 0x940B : R600 : ATI FireGL V8600 */ + /* 0x940F : R600 : ATI FireGL V7600 */ + /* 0x94C0 : RV610 : RV610 */ + /* 0x94C1 : RV610 : Radeon HD 2400 XT */ + { 0x94C1, 0x1002, 0x0D02, "ATI Radeon HD 2400 XT", RHD_CARD_FLAG_DMS59, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x94C1, 0x1028, 0x0D02, "Dell Radeon HD 2400 XT", RHD_CARD_FLAG_DMS59, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x94C1, 0x174B, 0xE390, "Sapphire HD 2400 XT", RHD_CARD_FLAG_NONE, VGA_B1_DVI_AB00, DEVINFO_EMPTY }, + { 0x94C3, 0x0000, 0x0000, "ATI Radeon 2400 HD GENERIC", RHD_CARD_FLAG_NONE, VGA_B1_TV_B0_DVI_AB00, DEVINFO_EMPTY }, + /* 0x94C3 : RV610 : Radeon HD 2400 Pro */ + { 0x94C3, 0x1545, 0x3210, "ATI Radeon 2400HD Pro", RHD_CARD_FLAG_HPDSWAP, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x94C3, 0x174B, 0xE370, "Sapphire HD 2400 Pro", RHD_CARD_FLAG_NONE, VGA_A0_DVI_BB10, DEVINFO_EMPTY }, + { 0x94C3, 0x18BC, 0x3550, "GeCube Radeon HD 2400PRO", RHD_CARD_FLAG_NONE, DVI_AB00_VGA_B1, DEVINFO_EMPTY }, + /* 0x94C4 : RV610 : ATI Radeon HD 2400 PRO AGP */ + { 0x94C4, 0x18BC, 0x0028, "GeCube Radeon HD 2400PRO AGP", RHD_CARD_FLAG_NONE, DVI_AB00_VGA_B1, DEVINFO_EMPTY }, + /* 0x94C5 : RV610 : ATI FireGL V4000 */ + /* 0x94C6 : RV610 : RV610 */ + /* 0x94C7 : RV610 : ATI Radeon HD 2350 */ + /* 0x94C8 : M74 : Mobility Radeon HD 2400 XT */ + /* 0x94C9 : M72 : Mobility Radeon HD 2400 */ + /* 0x94CB : M72 : ATI RADEON E2400 */ + /* 0x94CC : RV610 : RV610 */ + /* 0x9505 : RV670 : ATI Radeon HD 3850 */ + /* 0x9580 : RV630 : RV630 */ + /* 0x9581 : M76 : Mobility Radeon HD 2600 */ + /* 0x9583 : M76 : Mobility Radeon HD 2600 XT */ + /* 0x9586 : RV630 : ATI Radeon HD 2600 XT AGP */ + /* 0x9587 : RV630 : ATI Radeon HD 2600 Pro AGP */ + { 0x9587, 0x1002, 0x0028, "Sapphire Radeon HD 2600 PRO AGP", RHD_CARD_FLAG_NONE, DVI_BA10_TV_B0_VGA_A0, DEVINFO_EMPTY }, + { 0x9587, 0x1462, 0x0028, "MSI HD2600PRO AGP", RHD_CARD_FLAG_NONE, DVI_BA12_TV_B_DVI_AB01, DEVINFO_EMPTY }, + /* 0x9588 : RV630 : Radeon HD 2600 XT */ + { 0x9588, 0x1002, 0x2542, "ATI Radeon HD 2600XT DDR4", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + { 0x9588, 0x1448, 0x216C, "Gigabyte HD 2600 XT 256MB DDR3", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + { 0x9588, 0x174B, 0x2E42, "Sapphire HD 2600 XT", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + /* 0x9589 : RV630 : Radeon HD 2600 Pro */ + { 0x9589, 0x174B, 0xE410, "Sapphire HD 2600 Pro", RHD_CARD_FLAG_NONE, DVI_BA10_DVI_AB01, DEVINFO_EMPTY }, + /* 0x958A : RV630 : Gemini RV630 */ + /* 0x958B : M76 : Gemini ATI Mobility Radeon HD 2600 XT */ + /* 0x958C : RV630 : ATI FireGL V5600 */ + /* 0x958D : RV630 : ATI FireGL V3600 */ + /* 0x958E : RV630 : ATI Radeon HD 2600 LE */ + { 0x95C5, 0x1043, 0x01F4, "ASUS EAH3450", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x95C5, 0x1787, 0x2252, "PowerColor HD 3450", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0x9610, 0x105B, 0x0E0F, "Foxconn A7GM-S (RS780)", RHD_CARD_FLAG_HPDOFF, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY }, + { 0, 0, 0, NULL, 0, ID_CONNECTORINFO_EMPTY, DEVINFO_EMPTY } /* KEEP THIS: End marker. */ +}; + +/* + * + */ +struct rhdCard * +RHDCardIdentify(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + unsigned int deviceID, subVendorID, subDeviceID; + int i; + +#if XSERVER_LIBPCIACCESS + deviceID = (unsigned int) rhdPtr->PciInfo->device_id; + subVendorID = (unsigned int)rhdPtr->PciInfo->subvendor_id; + subDeviceID = (unsigned int)rhdPtr->PciInfo->subdevice_id; +#else + deviceID = rhdPtr->PciInfo->chipType; + subVendorID = rhdPtr->PciInfo->subsysVendor; + subDeviceID = rhdPtr->PciInfo->subsysCard; +#endif + + rhdPtr->PciDeviceID = deviceID; + + for (i = 0; rhdCards[i].name; i++) + if ((rhdCards[i].device == deviceID) && + (rhdCards[i].card_vendor == subVendorID) && + (rhdCards[i].card_device == subDeviceID)) + return rhdCards + i; + +#ifdef ATOM_BIOS + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Card not in database: 0x%04X:0x%04X:0x%04X; using generic modesetting.\n", + deviceID, subVendorID, subDeviceID); + xf86Msg(X_NONE, "\t" + "If - and only if - your card does not work or does not work optimally\n\t" + "please contact radeonhd@opensuse.org to help rectify this.\n\t" + "Use the subject: 0x%04X:0x%04X:0x%04X: \n\t" + "and *please* describe the problems you are seeing\n\t" + "in your message.\n", + deviceID, subVendorID, subDeviceID); +#else + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Unknown card detected: 0x%04X:0x%04X:0x%04X.\n", + deviceID, subVendorID, subDeviceID); + xf86Msg(X_NONE, "\t" + "Your card might not work or might not work optimally.\n\t" + "To rectify this, please contact radeonhd@opensuse.org.\n\t" + "Include your X log, the full name of the device\n\t" + "and the rhd_conntest (found in utils/conntest) output.\n"); +#endif + return NULL; +} + +#define USE_ATOMBIOS RHD_RV770 +#define USE_ATOM_CRTC USE_ATOMBIOS +#define USE_ATOM_PLL USE_ATOMBIOS +#define USE_ATOM_OUTPUT USE_ATOMBIOS + +/* + * + */ +Bool +RHDUseAtom(RHDPtr rhdPtr, enum RHD_CHIPSETS *BlackList, + enum atomSubSystem subsys) +{ +#ifdef ATOM_BIOS + Bool FromSys = FALSE, ret = FALSE; + CARD32 FromUser = 0; + int i = 0; + char *message = NULL; + enum RHD_CHIPSETS AtomChip; + MessageType from = X_CONFIG; + + switch (subsys) { + case atomUsageCrtc: + AtomChip = USE_ATOM_CRTC; + message = "Crtcs"; + FromUser = (rhdPtr->UseAtomFlags >> RHD_ATOMBIOS_CRTC) & 0x7; + break; + case atomUsagePLL: + AtomChip = USE_ATOM_PLL; + message = "PLLs"; + FromUser = (rhdPtr->UseAtomFlags >> RHD_ATOMBIOS_PLL) & 0x7; + break; + case atomUsageOutput: + AtomChip = USE_ATOM_OUTPUT; + message = "Outputs"; + FromUser = (rhdPtr->UseAtomFlags >> RHD_ATOMBIOS_OUTPUT) & 0x7; + break; + case atomUsageAny: + AtomChip = min(USE_ATOM_OUTPUT,min(USE_ATOM_PLL, USE_ATOM_CRTC)); + message = "All"; + FromUser = ((rhdPtr->UseAtomFlags >> RHD_ATOMBIOS_OUTPUT) + | (rhdPtr->UseAtomFlags >> RHD_ATOMBIOS_PLL) + | (rhdPtr->UseAtomFlags >> RHD_ATOMBIOS_CRTC)) & 0x7; + break; + } + + if (rhdPtr->ChipSet >= AtomChip) + FromSys = TRUE; + + if (!FromSys && BlackList) { + while (BlackList[i] != RHD_CHIP_END) { + if (BlackList[i++] == rhdPtr->ChipSet) { + FromSys = TRUE; + } + } + } + if (!FromSys) { + if (rhdPtr->UseAtomBIOS.set) { + from = X_CONFIG; + ret = rhdPtr->UseAtomBIOS.val.bool; + } + if (FromUser & RHD_ATOMBIOS_ON) + ret = TRUE; + if (FromUser & RHD_ATOMBIOS_OFF) + ret = FALSE; + } else { + ret = TRUE; + if ((FromUser & RHD_ATOMBIOS_FORCE) && (FromUser & RHD_ATOMBIOS_OFF)) { + from = X_CONFIG; + ret = FALSE; + } + } + if (ret) + xf86DrvMsg(rhdPtr->scrnIndex, from, "Using AtomBIOS for %s\n", + message); + + return ret; +#else + return 0; +#endif /* ATOM_BIOS */ +} diff --git a/driver/xf86-video-radeonhd/src/rhd_lut.c b/driver/xf86-video-radeonhd/src/rhd_lut.c new file mode 100644 index 000000000..ea5596201 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_lut.c @@ -0,0 +1,340 @@ +/* + * Copyright 2007-2008 Luc Verhaegen + * Copyright 2007-2008 Matthias Hopf + * Copyright 2007-2008 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_lut.h" +#include "rhd_regs.h" + +#include + +#define RHD_REGOFFSET_LUTA 0x000 +#define RHD_REGOFFSET_LUTB 0x800 + +/* + * + */ +static void +LUTxSave(struct rhdLUT *LUT) +{ + CARD16 RegOff; + int i; + RHDFUNC(LUT); + + if (LUT->Id == RHD_LUT_A) + RegOff = RHD_REGOFFSET_LUTA; + else + RegOff = RHD_REGOFFSET_LUTB; + + LUT->StoreControl = RHDRegRead(LUT, RegOff + DC_LUTA_CONTROL); + + LUT->StoreBlackBlue = RHDRegRead(LUT, RegOff + DC_LUTA_BLACK_OFFSET_BLUE); + LUT->StoreBlackGreen = RHDRegRead(LUT, RegOff + DC_LUTA_BLACK_OFFSET_GREEN); + LUT->StoreBlackRed = RHDRegRead(LUT, RegOff + DC_LUTA_BLACK_OFFSET_RED); + + LUT->StoreWhiteBlue = RHDRegRead(LUT, RegOff + DC_LUTA_WHITE_OFFSET_BLUE); + LUT->StoreWhiteGreen = RHDRegRead(LUT, RegOff + DC_LUTA_WHITE_OFFSET_GREEN); + LUT->StoreWhiteRed = RHDRegRead(LUT, RegOff + DC_LUTA_WHITE_OFFSET_RED); + + RHDRegWrite(LUT, DC_LUT_RW_MODE, 0); /* Table */ + if (LUT->Id == RHD_LUT_A) + RHDRegWrite(LUT, DC_LUT_READ_PIPE_SELECT, 0); + else + RHDRegWrite(LUT, DC_LUT_READ_PIPE_SELECT, 1); + + RHDRegWrite(LUT, DC_LUT_RW_INDEX, 0); + for (i = 0; i < 256; i++) + LUT->StoreEntry[i] = RHDRegRead(LUT, DC_LUT_30_COLOR); + + LUT->Stored = TRUE; +} + +/* + * + */ +static void +LUTxRestore(struct rhdLUT *LUT) +{ + CARD16 RegOff; + int i; + RHDFUNC(LUT); + + if (!LUT->Stored) { + xf86DrvMsg(LUT->scrnIndex, X_ERROR, "%s: %s: nothing stored!\n", + __func__, LUT->Name); + return; + } + + if (LUT->Id == RHD_LUT_A) + RegOff = RHD_REGOFFSET_LUTA; + else + RegOff = RHD_REGOFFSET_LUTB; + + RHDRegWrite(LUT, RegOff + DC_LUTA_BLACK_OFFSET_BLUE, LUT->StoreBlackBlue); + RHDRegWrite(LUT, RegOff + DC_LUTA_BLACK_OFFSET_GREEN, LUT->StoreBlackGreen); + RHDRegWrite(LUT, RegOff + DC_LUTA_BLACK_OFFSET_RED, LUT->StoreBlackRed); + + RHDRegWrite(LUT, RegOff + DC_LUTA_WHITE_OFFSET_BLUE, LUT->StoreWhiteBlue); + RHDRegWrite(LUT, RegOff + DC_LUTA_WHITE_OFFSET_GREEN, LUT->StoreWhiteGreen); + RHDRegWrite(LUT, RegOff + DC_LUTA_WHITE_OFFSET_RED, LUT->StoreWhiteRed); + + if (LUT->Id == RHD_LUT_A) + RHDRegWrite(LUT, DC_LUT_RW_SELECT, 0); + else + RHDRegWrite(LUT, DC_LUT_RW_SELECT, 1); + + RHDRegWrite(LUT, DC_LUT_RW_MODE, 0); /* Table */ + RHDRegWrite(LUT, DC_LUT_WRITE_EN_MASK, 0x0000003F); + RHDRegWrite(LUT, DC_LUT_RW_INDEX, 0); + for (i = 0; i < 256; i++) + RHDRegWrite(LUT, DC_LUT_30_COLOR, LUT->StoreEntry[i]); + + RHDRegWrite(LUT, RegOff + DC_LUTA_CONTROL, LUT->StoreControl); +} + +/* + * Load a new LUT + * + * Assumes 256 rows of input. It's up to the caller to ensure there are exactly + * 256 rows of data, as that's what the hardware exepcts. + */ +static void +rhdLUTSet(struct rhdLUT *LUT, CARD16 *red, CARD16 *green, CARD16 *blue) +{ + CARD16 RegOff; + int i; + + LUT->Initialised = TRUE; /* thank you RandR */ + + if (LUT->Id == RHD_LUT_A) + RegOff = RHD_REGOFFSET_LUTA; + else + RegOff = RHD_REGOFFSET_LUTB; + + RHDRegWrite(LUT, RegOff + DC_LUTA_CONTROL, 0); + + RHDRegWrite(LUT, RegOff + DC_LUTA_BLACK_OFFSET_BLUE, 0); + RHDRegWrite(LUT, RegOff + DC_LUTA_BLACK_OFFSET_GREEN, 0); + RHDRegWrite(LUT, RegOff + DC_LUTA_BLACK_OFFSET_RED, 0); + + RHDRegWrite(LUT, RegOff + DC_LUTA_WHITE_OFFSET_BLUE, 0x0000FFFF); + RHDRegWrite(LUT, RegOff + DC_LUTA_WHITE_OFFSET_GREEN, 0x0000FFFF); + RHDRegWrite(LUT, RegOff + DC_LUTA_WHITE_OFFSET_RED, 0x0000FFFF); + + if (LUT->Id == RHD_LUT_A) + RHDRegWrite(LUT, DC_LUT_RW_SELECT, 0); + else + RHDRegWrite(LUT, DC_LUT_RW_SELECT, 1); + + RHDRegWrite(LUT, DC_LUT_RW_MODE, 0); /* table */ + RHDRegWrite(LUT, DC_LUT_WRITE_EN_MASK, 0x0000003F); + + RHDRegWrite(LUT, DC_LUT_RW_INDEX, 0); + for (i = 0; i < 256; i++) { + RHDRegWrite(LUT, DC_LUT_30_COLOR, + ((red[i] & 0xFFC0) << 14) | ((green[i] & 0xFFC0) << 4) | (blue[i] >> 6)); + } +} + +/* + * Set specific rows of the LUT + * + * Assumes LUTs are already initialized to a sane state, and will only update + * specific rows. Use ONLY when just specific rows need to be updated. + */ +static void +rhdLUTSetRows(struct rhdLUT *LUT, int numColors, int *indices, LOCO *colors) +{ + CARD16 RegOff; + int i, index; + + if (LUT->Id == RHD_LUT_A) + RegOff = RHD_REGOFFSET_LUTA; + else + RegOff = RHD_REGOFFSET_LUTB; + + if (LUT->Id == RHD_LUT_A) + RHDRegWrite(LUT, DC_LUT_RW_SELECT, 0); + else + RHDRegWrite(LUT, DC_LUT_RW_SELECT, 1); + + RHDRegWrite(LUT, DC_LUT_RW_MODE, 0); /* table */ + RHDRegWrite(LUT, DC_LUT_WRITE_EN_MASK, 0x0000003F); + + for (i = 0; i < numColors; i++) { + index = indices[i]; + RHDRegWrite(LUT, DC_LUT_RW_INDEX, index); + RHDRegWrite(LUT, DC_LUT_30_COLOR, + (colors[index].red << 20) | (colors[index].green << 10) | (colors[index].blue)); + } +} + +/* + * + */ +void +RHDLUTsInit(RHDPtr rhdPtr) +{ + struct rhdLUT *LUT; + + RHDFUNC(rhdPtr); + + LUT = xnfcalloc(sizeof(struct rhdLUT), 1); + + LUT->scrnIndex = rhdPtr->scrnIndex; + LUT->Name = "LUT A"; + LUT->Id = RHD_LUT_A; + + LUT->Save = LUTxSave; + LUT->Restore = LUTxRestore; + LUT->Set = rhdLUTSet; + LUT->SetRows = rhdLUTSetRows; + + rhdPtr->LUT[0] = LUT; + + LUT = xnfcalloc(sizeof(struct rhdLUT), 1); + + LUT->scrnIndex = rhdPtr->scrnIndex; + LUT->Name = "LUT B"; + LUT->Id = RHD_LUT_B; + + LUT->Save = LUTxSave; + LUT->Restore = LUTxRestore; + LUT->Set = rhdLUTSet; + LUT->SetRows = rhdLUTSetRows; + + rhdPtr->LUT[1] = LUT; +} + +/* + * + */ +struct rhdLUTStore { + CARD32 Select; + CARD32 Mode; + CARD32 Index; + CARD32 Color; + CARD32 ReadPipe; + CARD32 WriteMask; +}; + +/* + * + */ +void +RHDLUTsSave(RHDPtr rhdPtr) +{ + struct rhdLUTStore *Store = rhdPtr->LUTStore; + + RHDFUNC(rhdPtr); + + if (!Store) { + Store = xnfcalloc(sizeof(struct rhdLUTStore), 1); + rhdPtr->LUTStore = Store; + } + + Store->Select = RHDRegRead(rhdPtr, DC_LUT_RW_SELECT); + Store->Mode = RHDRegRead(rhdPtr, DC_LUT_RW_MODE); + Store->Index = RHDRegRead(rhdPtr, DC_LUT_RW_INDEX); + Store->Color = RHDRegRead(rhdPtr, DC_LUT_30_COLOR); + Store->ReadPipe = RHDRegRead(rhdPtr, DC_LUT_READ_PIPE_SELECT); + Store->WriteMask = RHDRegRead(rhdPtr, DC_LUT_WRITE_EN_MASK); + + rhdPtr->LUT[0]->Save(rhdPtr->LUT[0]); + rhdPtr->LUT[1]->Save(rhdPtr->LUT[1]); +} + +/* + * + */ +void +RHDLUTsRestore(RHDPtr rhdPtr) +{ + struct rhdLUTStore *Store = rhdPtr->LUTStore; + + RHDFUNC(rhdPtr); + + rhdPtr->LUT[0]->Restore(rhdPtr->LUT[0]); + rhdPtr->LUT[1]->Restore(rhdPtr->LUT[1]); + + if (!Store) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: nothing stored!\n", __func__); + return; + } + + RHDRegWrite(rhdPtr, DC_LUT_RW_SELECT, Store->Select); + RHDRegWrite(rhdPtr, DC_LUT_RW_MODE, Store->Mode); + RHDRegWrite(rhdPtr, DC_LUT_RW_INDEX, Store->Index); + RHDRegWrite(rhdPtr, DC_LUT_30_COLOR, Store->Color); + RHDRegWrite(rhdPtr, DC_LUT_READ_PIPE_SELECT, Store->ReadPipe); + RHDRegWrite(rhdPtr, DC_LUT_WRITE_EN_MASK, Store->WriteMask); +} + +/* + * + */ +void +RHDLUTsDestroy(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + xfree(rhdPtr->LUT[0]); + xfree(rhdPtr->LUT[1]); + xfree(rhdPtr->LUTStore); +} + +/* + * Workaround for missing RandR functionality. Initialise this + * LUT with the content of the other LUT. + */ +void +RHDLUTCopyForRR(struct rhdLUT *LUT) +{ + CARD16 red[256], green[256], blue[256]; + CARD32 entry; + int i; + + RHDDebug(LUT->scrnIndex, "%s: %s\n", __func__, LUT->Name); + + RHDRegWrite(LUT, DC_LUT_RW_MODE, 0); /* Table */ + + if (LUT->Id == RHD_LUT_A) + RHDRegWrite(LUT, DC_LUT_READ_PIPE_SELECT, 1); + else + RHDRegWrite(LUT, DC_LUT_READ_PIPE_SELECT, 0); + + for (i = 0; i < 256; i++) { + entry = RHDRegRead(LUT, DC_LUT_30_COLOR); + red[i] = (entry >> 14) & 0xFFC0; + green[i] = (entry >> 4) & 0xFFC0; + blue[i] = (entry << 6) & 0xFFC0; + } + + rhdLUTSet(LUT, red, green, blue); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_lut.h b/driver/xf86-video-radeonhd/src/rhd_lut.h new file mode 100644 index 000000000..640ee6321 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_lut.h @@ -0,0 +1,69 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_LUT_H +#define _RHD_LUT_H + +struct rhdLUT { + int scrnIndex; + + char *Name; +#define RHD_LUT_A 0 +#define RHD_LUT_B 1 + int Id; + + void (*Save) (struct rhdLUT *LUT); + void (*Restore) (struct rhdLUT *LUT); + void (*Set) (struct rhdLUT *LUT, CARD16 *red, CARD16 *green, CARD16 *blue); + void (*SetRows) (struct rhdLUT *LUT, int numColors, int *indices, LOCO *colors); + + /* because RandR does not specifically initialise a gamma ramp when + setting up a CRTC */ + Bool Initialised; + + Bool Stored; + + CARD32 StoreControl; + + CARD32 StoreBlackRed; + CARD32 StoreBlackGreen; + CARD32 StoreBlackBlue; + + CARD32 StoreWhiteRed; + CARD32 StoreWhiteGreen; + CARD32 StoreWhiteBlue; + + CARD32 StoreEntry[256]; +}; + +void RHDLUTsInit(RHDPtr rhdPtr); +void RHDLUTsSave(RHDPtr rhdPtr); +void RHDLUTsRestore(RHDPtr rhdPtr); +void RHDLUTsDestroy(RHDPtr rhdPtr); + +/* For missing RandR functionality */ +void RHDLUTCopyForRR(struct rhdLUT *LUT); + +#endif /* _RHD_LUT_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_lvtma.c b/driver/xf86-video-radeonhd/src/rhd_lvtma.c new file mode 100644 index 000000000..a4aeb9e41 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_lvtma.c @@ -0,0 +1,1448 @@ +/* + * Copyright 2007-2009 Luc Verhaegen + * Copyright 2007-2009 Matthias Hopf + * Copyright 2007-2009 Egbert Eich + * Copyright 2007-2009 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ +/* for backlight control testing */ +#define DEBUG +/* + * Deals with the Shared LVDS/TMDS encoder. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_regs.h" +#include "rhd_hdmi.h" +#include "rhd_acpi.h" +#ifdef ATOM_BIOS +#include "rhd_atombios.h" +#include "rhd_atomout.h" +#endif + +/* + * First of all, make it more managable to code for both R500 and R600, as + * there was a 1 register shift, right in the middle of the register block. + * There are of course much nicer ways to do the workaround i am doing here, + * but speed is not an issue here. + */ +static inline CARD16 +LVTMAChipGenerationSelect(int ChipSet, CARD32 R500, CARD32 R600) +{ + if (ChipSet >= RHD_RS600) + return R600; + else + return R500; +} + +#define LVTMAGENSEL(r500, r600) LVTMAChipGenerationSelect(rhdPtr->ChipSet, (r500), (r600)) +#define LVTMA_DATA_SYNCHRONIZATION \ + LVTMAGENSEL(LVTMA_R500_DATA_SYNCHRONIZATION, LVTMA_R600_DATA_SYNCHRONIZATION) +#define LVTMA_PWRSEQ_REF_DIV \ + LVTMAGENSEL(LVTMA_R500_PWRSEQ_REF_DIV, LVTMA_R600_PWRSEQ_REF_DIV) +#define LVTMA_PWRSEQ_DELAY1 \ + LVTMAGENSEL(LVTMA_R500_PWRSEQ_DELAY1, LVTMA_R600_PWRSEQ_DELAY1) +#define LVTMA_PWRSEQ_DELAY2 \ + LVTMAGENSEL(LVTMA_R500_PWRSEQ_DELAY2, LVTMA_R600_PWRSEQ_DELAY2) +#define LVTMA_PWRSEQ_CNTL \ + LVTMAGENSEL(LVTMA_R500_PWRSEQ_CNTL, LVTMA_R600_PWRSEQ_CNTL) +#define LVTMA_PWRSEQ_STATE \ + LVTMAGENSEL(LVTMA_R500_PWRSEQ_STATE, LVTMA_R600_PWRSEQ_STATE) +#define LVTMA_LVDS_DATA_CNTL \ + LVTMAGENSEL(LVTMA_R500_LVDS_DATA_CNTL, LVTMA_R600_LVDS_DATA_CNTL) +#define LVTMA_MODE LVTMAGENSEL(LVTMA_R500_MODE, LVTMA_R600_MODE) +#define LVTMA_TRANSMITTER_ENABLE \ + LVTMAGENSEL(LVTMA_R500_TRANSMITTER_ENABLE, LVTMA_R600_TRANSMITTER_ENABLE) +#define LVTMA_MACRO_CONTROL \ + LVTMAGENSEL(LVTMA_R500_MACRO_CONTROL, LVTMA_R600_MACRO_CONTROL) +#define LVTMA_TRANSMITTER_CONTROL \ + LVTMAGENSEL(LVTMA_R500_TRANSMITTER_CONTROL, LVTMA_R600_TRANSMITTER_CONTROL) +#define LVTMA_REG_TEST_OUTPUT \ + LVTMAGENSEL(LVTMA_R500_REG_TEST_OUTPUT, LVTMA_R600_REG_TEST_OUTPUT) +#define LVTMA_BL_MOD_CNTL \ + LVTMAGENSEL(LVTMA_R500_BL_MOD_CNTL, LVTMA_R600_BL_MOD_CNTL) + +#define LVTMA_DITHER_RESET_BIT LVTMAGENSEL(0x04000000, 0x02000000) + +/* + * + * Handling for LVTMA block as LVDS. + * + */ + +struct LVDSPrivate { + Bool DualLink; + Bool LVDS24Bit; + Bool FPDI; /* LDI otherwise */ + CARD16 TXClockPattern; + int BlLevel; + CARD32 MacroControl; + + /* Power timing for LVDS */ + CARD16 PowerRefDiv; + CARD16 BlonRefDiv; + CARD16 PowerDigToDE; + CARD16 PowerDEToBL; + CARD16 OffDelay; + Bool TemporalDither; + Bool SpatialDither; + int GreyLevel; + + Bool Stored; + + CARD32 StoreControl; + CARD32 StoreSourceSelect; + CARD32 StoreBitDepthControl; + CARD32 StoreDataSynchronisation; + CARD32 StorePWRSEQRefDiv; + CARD32 StorePWRSEQDelay1; + CARD32 StorePWRSEQDelay2; + CARD32 StorePWRSEQControl; + CARD32 StorePWRSEQState; + CARD32 StoreLVDSDataControl; + CARD32 StoreMode; + CARD32 StoreTxEnable; + CARD32 StoreMacroControl; + CARD32 StoreTXControl; + CARD32 StoreBlModCntl; + + void (*SetBacklight)(struct rhdOutput *Output, int val); + int (*GetBacklight)(struct rhdOutput *Output); + /* to hook in AtomBIOS property callback */ + Bool (*WrappedPropertyCallback) (struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val); + void *PropertyPrivate; +}; + +/* + * + */ +static ModeStatus +LVDSModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + if (Mode->Flags & V_INTERLACE) + return MODE_NO_INTERLACE; + + return MODE_OK; +} + +/* + * + */ +static void +LVDSDebugBacklight(struct rhdOutput *Output) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 tmp; + Bool Blon, BlonOvrd, BlonPol, BlModEn; + int BlModLevel, BlModRes = 0; + + if (rhdPtr->verbosity < 7) + return; + + tmp = (RHDRegRead(Output, LVTMA_PWRSEQ_STATE) >> 3) & 0x01; + RHDDebug(rhdPtr->scrnIndex, "%s: PWRSEQ BLON State: %s\n", + __func__, tmp ? "on" : "off"); + tmp = RHDRegRead(rhdPtr, LVTMA_PWRSEQ_CNTL); + Blon = (tmp >> 24) & 0x1; + BlonOvrd = (tmp >> 25) & 0x1; + BlonPol = (tmp >> 26) & 0x1; + + RHDDebug(rhdPtr->scrnIndex, "%s: BLON: %s BLON_OVRD: %s BLON_POL: %s\n", + __func__, Blon ? "on" : "off", + BlonOvrd ? "enabled" : "disabled", + BlonPol ? "invert" : "non-invert"); + + tmp = RHDRegRead(rhdPtr, LVTMA_BL_MOD_CNTL); + BlModEn = tmp & 0x1; + BlModLevel = (tmp >> 8) & 0xFF; + if (rhdPtr->ChipSet >= RHD_RS600) + BlModRes = (tmp >> 16) & 0xFF; + + xf86DrvMsgVerb(rhdPtr->scrnIndex, X_INFO, 3, + "%s: BL_MOD: %s BL_MOD_LEVEL: %d BL_MOD_RES: %d\n", + __func__, BlModEn ? "enable" : "disable", + BlModLevel, BlModRes); +} + +/* + * + */ +static void +LVDSSetBacklight(struct rhdOutput *Output, int level) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "%s: trying to set BL_MOD_LEVEL to: %d\n", + __func__, level); + + if (rhdPtr->ChipSet >= RHD_RS600) + RHDRegMask(rhdPtr, LVTMA_BL_MOD_CNTL, + 0xFF << 16 | (level << 8) | 0x1, + 0xFFFF01); + else + RHDRegMask(rhdPtr, LVTMA_BL_MOD_CNTL, + (level << 8) | 0x1, + 0xFF01); + + /* + * Poor man's debug + */ + LVDSDebugBacklight(Output); +} + +/* + * + */ +static int +LVDSGetBacklight(struct rhdOutput *Output) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 level; + + if (rhdPtr->ChipSet >= RHD_RS600) + level = RHDRegRead(rhdPtr, LVTMA_BL_MOD_CNTL); + else + level = RHDRegRead(rhdPtr, LVTMA_BL_MOD_CNTL); + + if ((level & 0x01) != 0x01) + return -1; + + RHDDebug(Output->scrnIndex, "%s: Backlight %i\n",__func__,(level >> 8) & 0xFF); + + return (level >> 8) & 0xFF; +} + +/* + * + */ +static Bool +LVDSPropertyControl(struct rhdOutput *Output, enum rhdPropertyAction Action, + enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + + switch (Action) { + case rhdPropertyCheck: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + if (Private->BlLevel < 0) + return FALSE; + return TRUE; + default: + return FALSE; + } + case rhdPropertyGet: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + Private->BlLevel = Private->GetBacklight(Output); + if (Private->BlLevel < 0) + return FALSE; + val->integer = Private->BlLevel; + break; + default: + return FALSE; + } + break; + case rhdPropertySet: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + if (Private->BlLevel < 0) + return FALSE; + Private->BlLevel = val->integer; + break; + default: + return FALSE; + } + break; + case rhdPropertyCommit: + switch (Property) { + case RHD_OUTPUT_BACKLIGHT: + if (Private->BlLevel < 0) + return FALSE; + Private->SetBacklight(Output, Private->BlLevel); + break; + default: + return FALSE; + } + break; + } + return TRUE; +} + +/* + * + */ +static void +LVDSSet(struct rhdOutput *Output, DisplayModePtr Mode) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + + RHDFUNC(Output); + + RHDRegMask(Output, LVTMA_CNTL, 0x00000001, 0x00000001); /* enable */ + usleep(20); + + RHDRegWrite(Output, LVTMA_MODE, 0); /* set to LVDS */ + + /* Select CRTC, select syncA, no stereosync */ + RHDRegMask(Output, LVTMA_SOURCE_SELECT, Output->Crtc->Id, 0x00010101); + + if (Private->LVDS24Bit) { /* 24bits */ + RHDRegMask(Output, LVTMA_LVDS_DATA_CNTL, 0x00000001, 0x00000001); /* enable 24bits */ + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, 0x00101010, 0x00101010); /* dithering bit depth = 24 */ + + if (Private->FPDI) /* FPDI? */ + RHDRegMask(Output, LVTMA_LVDS_DATA_CNTL, 0x00000010, 0x00000010); /* 24 bit format: FPDI or LDI? */ + else + RHDRegMask(Output, LVTMA_LVDS_DATA_CNTL, 0, 0x00000010); + } else { + RHDRegMask(Output, LVTMA_LVDS_DATA_CNTL, 0, 0x00000001); /* disable 24bits */ + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, 0, 0x00101010); /* dithering bit depth != 24 */ + } + + /* enable temporal dithering, disable spatial dithering and disable truncation */ + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, + Private->TemporalDither ? 1 << 16 : 0 + | Private->SpatialDither ? 1 << 8 : 0 + | (Private->GreyLevel > 2) ? 1 << 24 : 0, + 0x01010101); + + /* reset the temporal dithering */ + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, LVTMA_DITHER_RESET_BIT, LVTMA_DITHER_RESET_BIT); + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, 0, LVTMA_DITHER_RESET_BIT); + + /* go for RGB 4:4:4 RGB/YCbCr */ + RHDRegMask(Output, LVTMA_CNTL, 0, 0x00010000); + + if (Private->DualLink) + RHDRegMask(Output, LVTMA_CNTL, 0x01000000, 0x01000000); + else + RHDRegMask(Output, LVTMA_CNTL, 0, 0x01000000); + + /* PLL and TX voltages */ + RHDRegWrite(Output, LVTMA_MACRO_CONTROL, Private->MacroControl); + + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000010, 0x00000010); /* use pclk_lvtma_direct */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0xCC000000); + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, Private->TXClockPattern << 16, 0x03FF0000); + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001); /* enable PLL */ + usleep(20); + + /* reset transmitter */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); + usleep(2); + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x00000002); + usleep(20); + + /* start data synchronisation */ + RHDRegMask(Output, LVTMA_DATA_SYNCHRONIZATION, 0x00000001, 0x00000001); + RHDRegMask(Output, LVTMA_DATA_SYNCHRONIZATION, 0x00000100, 0x00000100); /* reset */ + usleep(2); + RHDRegMask(Output, LVTMA_DATA_SYNCHRONIZATION, 0, 0x00000100); +} + +/* + * + */ +static void +LVDSPWRSEQInit(struct rhdOutput *Output) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + + CARD32 tmp = 0; + + tmp = Private->PowerDigToDE >> 2; + RHDRegMask(Output, LVTMA_PWRSEQ_DELAY1, tmp, 0x000000FF); + RHDRegMask(Output, LVTMA_PWRSEQ_DELAY1, tmp << 24, 0xFF000000); + + tmp = Private->PowerDEToBL >> 2; + RHDRegMask(Output, LVTMA_PWRSEQ_DELAY1, tmp << 8, 0x0000FF00); + RHDRegMask(Output, LVTMA_PWRSEQ_DELAY1, tmp << 16, 0x00FF0000); + + RHDRegWrite(Output, LVTMA_PWRSEQ_DELAY2, Private->OffDelay >> 2); + RHDRegWrite(Output, LVTMA_PWRSEQ_REF_DIV, + Private->PowerRefDiv | (Private->BlonRefDiv << 16)); + + /* Enable power sequencer and allow it to override everything */ + RHDRegMask(Output, LVTMA_PWRSEQ_CNTL, 0x0000000D, 0x0000000D); + + /* give full control to the sequencer */ + RHDRegMask(Output, LVTMA_PWRSEQ_CNTL, 0, 0x02020200); +} + +/* + * + */ +static void +LVDSEnable(struct rhdOutput *Output) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 tmp = 0; + int i; + + RHDFUNC(Output); + + LVDSPWRSEQInit(Output); + + /* set up the transmitter */ + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0x0000001E, 0x0000001E); + if (Private->LVDS24Bit) /* 24bit ? */ + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0x00000020, 0x00000020); + + if (Private->DualLink) { + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0x00001E00, 0x00001E00); + + if (Private->LVDS24Bit) + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0x00002000, 0x00002000); + } + + RHDRegMask(Output, LVTMA_PWRSEQ_CNTL, 0x00000010, 0x00000010); + + for (i = 0; i <= Private->OffDelay; i++) { + usleep(1000); + + tmp = (RHDRegRead(Output, LVTMA_PWRSEQ_STATE) >> 8) & 0x0F; + if (tmp == 4) + break; + } + + if (i == Private->OffDelay) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: failed to reach " + "POWERUP_DONE state after %d loops (%d)\n", + __func__, i, (int) tmp); + } + if (Private->BlLevel >= 0) { + Private->SetBacklight(Output, Private->BlLevel); + } +} + +/* + * + */ +static void +LVDSDisable(struct rhdOutput *Output) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 tmp = 0; + int i; + + RHDFUNC(Output); + + if (!(RHDRegRead(Output, LVTMA_PWRSEQ_CNTL) & 0x00000010)) + return; + + LVDSPWRSEQInit(Output); + + RHDRegMask(Output, LVTMA_PWRSEQ_CNTL, 0, 0x00000010); + + for (i = 0; i <= Private->OffDelay; i++) { + usleep(1000); + + tmp = (RHDRegRead(Output, LVTMA_PWRSEQ_STATE) >> 8) & 0x0F; + if (tmp == 9) + break; + } + + if (i == Private->OffDelay) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: failed to reach " + "POWERDOWN_DONE state after %d loops (%d)\n", + __func__, i, (int) tmp); + } + + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0, 0x0000FFFF); +} + +#if 0 +/* + * + */ +static void +LVDSShutdown(struct rhdOutput *Output) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + RHDFUNC(Output); + + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); /* PLL in reset */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x00000001); /* disable LVDS */ + RHDRegMask(Output, LVTMA_DATA_SYNCHRONIZATION, 0, 0x00000001); + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, LVTMA_DITHER_RESET_BIT, LVTMA_DITHER_RESET_BIT); /* reset temp dithering */ + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, 0, 0x00111111); /* disable all dithering */ + RHDRegWrite(Output, LVTMA_CNTL, 0); /* disable */ +} +#endif + +/* + * + */ +static void +LVDSPower(struct rhdOutput *Output, int Power) +{ + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); + + switch (Power) { + case RHD_POWER_ON: + LVDSEnable(Output); + break; + case RHD_POWER_RESET: + /* LVDSDisable(Output); + break;*/ + case RHD_POWER_SHUTDOWN: + default: + LVDSDisable(Output); + /* LVDSShutdown(Output); */ + break; + } + return; +} + +/* + * + */ +static void +LVDSSave(struct rhdOutput *Output) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + + RHDFUNC(Output); + + Private->StoreControl = RHDRegRead(Output, LVTMA_CNTL); + Private->StoreSourceSelect = RHDRegRead(Output, LVTMA_SOURCE_SELECT); + Private->StoreBitDepthControl = RHDRegRead(Output, LVTMA_BIT_DEPTH_CONTROL); + Private->StoreDataSynchronisation = RHDRegRead(Output, LVTMA_DATA_SYNCHRONIZATION); + Private->StorePWRSEQRefDiv = RHDRegRead(Output, LVTMA_PWRSEQ_REF_DIV); + Private->StorePWRSEQDelay1 = RHDRegRead(Output, LVTMA_PWRSEQ_DELAY1); + Private->StorePWRSEQDelay2 = RHDRegRead(Output, LVTMA_PWRSEQ_DELAY2); + Private->StorePWRSEQControl = RHDRegRead(Output, LVTMA_PWRSEQ_CNTL); + Private->StorePWRSEQState = RHDRegRead(Output, LVTMA_PWRSEQ_STATE); + Private->StoreLVDSDataControl = RHDRegRead(Output, LVTMA_LVDS_DATA_CNTL); + Private->StoreMode = RHDRegRead(Output, LVTMA_MODE); + Private->StoreTxEnable = RHDRegRead(Output, LVTMA_TRANSMITTER_ENABLE); + Private->StoreMacroControl = RHDRegRead(Output, LVTMA_MACRO_CONTROL); + Private->StoreTXControl = RHDRegRead(Output, LVTMA_TRANSMITTER_CONTROL); + Private->StoreBlModCntl = RHDRegRead(Output, LVTMA_BL_MOD_CNTL); + + Private->Stored = TRUE; +} + +/* + * This needs to reset things like the temporal dithering and the TX appropriately. + * Currently it's a dumb register dump. + */ +static void +LVDSRestore(struct rhdOutput *Output) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + + RHDFUNC(Output); + + if (!Private->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + RHDRegWrite(Output, LVTMA_CNTL, Private->StoreControl); + RHDRegWrite(Output, LVTMA_SOURCE_SELECT, Private->StoreSourceSelect); + RHDRegWrite(Output, LVTMA_BIT_DEPTH_CONTROL, Private->StoreBitDepthControl); + RHDRegWrite(Output, LVTMA_DATA_SYNCHRONIZATION, Private->StoreDataSynchronisation); + RHDRegWrite(Output, LVTMA_PWRSEQ_REF_DIV, Private->StorePWRSEQRefDiv); + RHDRegWrite(Output, LVTMA_PWRSEQ_DELAY1, Private->StorePWRSEQDelay1); + RHDRegWrite(Output, LVTMA_PWRSEQ_DELAY2, Private->StorePWRSEQDelay2); + RHDRegWrite(Output, LVTMA_PWRSEQ_CNTL, Private->StorePWRSEQControl); + RHDRegWrite(Output, LVTMA_PWRSEQ_STATE, Private->StorePWRSEQState); + RHDRegWrite(Output, LVTMA_LVDS_DATA_CNTL, Private->StoreLVDSDataControl); + RHDRegWrite(Output, LVTMA_MODE, Private->StoreMode); + RHDRegWrite(Output, LVTMA_TRANSMITTER_ENABLE, Private->StoreTxEnable); + RHDRegWrite(Output, LVTMA_MACRO_CONTROL, Private->StoreMacroControl); + RHDRegWrite(Output, LVTMA_TRANSMITTER_CONTROL, Private->StoreTXControl); + RHDRegWrite(Output, LVTMA_BL_MOD_CNTL, Private->StoreBlModCntl); + + /* + * Poor man's debug + */ + LVDSDebugBacklight(Output); +} + +/* + * Here we pretty much assume that ATOM has either initialised the panel already + * or that we can find information from ATOM BIOS data tables. We know that the + * latter assumption is false for some values, but there is no getting around + * ATI clinging desperately to a broken concept. + */ +static struct LVDSPrivate * +LVDSInfoRetrieve(RHDPtr rhdPtr) +{ + struct LVDSPrivate *Private = xnfcalloc(sizeof(struct LVDSPrivate), 1); + CARD32 tmp; + + /* These values are not available from atombios data tables at all. */ + Private->MacroControl = RHDRegRead(rhdPtr, LVTMA_MACRO_CONTROL); + Private->TXClockPattern = + (RHDRegRead(rhdPtr, LVTMA_TRANSMITTER_CONTROL) >> 16) & 0x3FF; + + /* For these values, we try to retrieve them from register space first, + and later override with atombios data table information */ + Private->PowerDigToDE = + (RHDRegRead(rhdPtr, LVTMA_PWRSEQ_DELAY1) & 0x000000FF) << 2; + + Private->PowerDEToBL = + (RHDRegRead(rhdPtr, LVTMA_PWRSEQ_DELAY1) & 0x0000FF00) >> 6; + + Private->OffDelay = (RHDRegRead(rhdPtr, LVTMA_PWRSEQ_DELAY2) & 0xFF) << 2; + + tmp = RHDRegRead(rhdPtr, LVTMA_PWRSEQ_REF_DIV); + Private->PowerRefDiv = tmp & 0x0FFF; + Private->BlonRefDiv = (tmp >> 16) & 0x0FFF; + tmp = RHDRegRead(rhdPtr, LVTMA_BL_MOD_CNTL); + if (tmp & 0x1) + Private->BlLevel = (tmp >> 8) & 0xff; + else + Private->BlLevel = -1; /* Backlight control seems to be done some other way */ + + Private->DualLink = (RHDRegRead(rhdPtr, LVTMA_CNTL) >> 24) & 0x00000001; + Private->LVDS24Bit = RHDRegRead(rhdPtr, LVTMA_LVDS_DATA_CNTL) & 0x00000001; + Private->FPDI = RHDRegRead(rhdPtr, LVTMA_LVDS_DATA_CNTL) & 0x00000010; + + tmp = RHDRegRead(rhdPtr, LVTMA_BIT_DEPTH_CONTROL); + Private->TemporalDither = ((tmp & (1 << 16)) != 0); + Private->SpatialDither = ((tmp & (1 << 8)) != 0); + Private->GreyLevel = (tmp & (1 << 24)) ? 4 : 2; + +#ifdef ATOM_BIOS + { + AtomBiosArgRec data; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SEQ_DIG_ONTO_DE, &data) == ATOM_SUCCESS) + Private->PowerDigToDE = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SEQ_DE_TO_BL, &data) == ATOM_SUCCESS) + Private->PowerDEToBL = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_OFF_DELAY, &data) == ATOM_SUCCESS) + Private->OffDelay = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_DUALLINK, &data) == ATOM_SUCCESS) + Private->DualLink = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_24BIT, &data) == ATOM_SUCCESS) + Private->LVDS24Bit = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_FPDI, &data) == ATOM_SUCCESS) + Private->FPDI = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_TEMPORAL_DITHER, &data) == ATOM_SUCCESS) + Private->TemporalDither = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_SPATIAL_DITHER, &data) == ATOM_SUCCESS) + Private->SpatialDither = data.val; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_LVDS_GREYLVL, &data) == ATOM_SUCCESS) { + Private->GreyLevel = data.val; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "AtomBIOS returned %i Grey Levels\n", + Private->GreyLevel); + } + } +#endif + + if (Private->LVDS24Bit) + xf86DrvMsg(rhdPtr->scrnIndex, X_PROBED, + "Detected a 24bit %s, %s link panel.\n", + Private->DualLink ? "dual" : "single", + Private->FPDI ? "FPDI": "LDI"); + else + xf86DrvMsg(rhdPtr->scrnIndex, X_PROBED, + "Detected a 18bit %s link panel.\n", + Private->DualLink ? "dual" : "single"); + + /* extra noise */ + RHDDebug(rhdPtr->scrnIndex, "Printing LVDS paramaters:\n"); + xf86MsgVerb(X_NONE, LOG_DEBUG, "\tMacroControl: 0x%08X\n", + (unsigned int) Private->MacroControl); + xf86MsgVerb(X_NONE, LOG_DEBUG, "\tTXClockPattern: 0x%04X\n", + Private->TXClockPattern); + xf86MsgVerb(X_NONE, LOG_DEBUG, "\tPowerDigToDE: 0x%04X\n", + Private->PowerDigToDE); + xf86MsgVerb(X_NONE, LOG_DEBUG, "\tPowerDEToBL: 0x%04X\n", + Private->PowerDEToBL); + xf86MsgVerb(X_NONE, LOG_DEBUG, "\tOffDelay: 0x%04X\n", + Private->OffDelay); + xf86MsgVerb(X_NONE, LOG_DEBUG, "\tPowerRefDiv: 0x%04X\n", + Private->PowerRefDiv); + xf86MsgVerb(X_NONE, LOG_DEBUG, "\tBlonRefDiv: 0x%04X\n", + Private->BlonRefDiv); + + return Private; +} + +/* + * + */ +static void +LVDSDestroy(struct rhdOutput *Output) +{ + + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + + RHDFUNC(Output); + + if (!Private) + return; + + if (Private->PropertyPrivate) + RhdAtomDestroyBacklightControlProperty(Output, Private->PropertyPrivate); + xfree(Private); + Output->Private = NULL; +} + +/* + * + * Handling for LVTMA block as TMDS. + * + */ +struct rhdTMDSBPrivate { + Bool RunsDualLink; + Bool Coherent; + Bool HdmiEnabled; + DisplayModePtr Mode; + + struct rhdHdmi *Hdmi; + + Bool Stored; + + CARD32 StoreControl; + CARD32 StoreSource; + CARD32 StoreFormat; + CARD32 StoreForce; + CARD32 StoreReduction; + CARD32 StoreDCBalancer; + CARD32 StoreDataSynchro; + CARD32 StoreMode; + CARD32 StoreTXEnable; + CARD32 StoreMacro; + CARD32 StoreTXControl; + CARD32 StoreTXAdjust; + CARD32 StoreTestOutput; + + CARD32 StoreRs690Unknown; + CARD32 StoreRv600TXAdjust; + CARD32 StoreRv600PreEmphasis; +}; + +/* + * + */ +static ModeStatus +TMDSBModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + if (Mode->Clock < 25000) + return MODE_CLOCK_LOW; + + if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE) { + if (Mode->Clock > 165000) + return MODE_CLOCK_HIGH; + } else if (Output->Connector->Type == RHD_CONNECTOR_DVI) { + if (Mode->Clock > 330000) /* could go higher still */ + return MODE_CLOCK_HIGH; + } + + return MODE_OK; +} + +/* + * + */ +static void +RS600VoltageControl(struct rhdOutput *Output, DisplayModePtr Mode) +{ + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + + RHDFUNC(Output); +#ifdef NOTYET + if (Output->Connector == RHD_CONNECTOR_HDMI || Output->Connector == RHD_CONNECTOR_HDMI_DUAL) { + int clock = Mode->SynthClock; + + if (Private->RunsDualLink) + clock >>= 1; + if (clock <= 75000) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x00010213); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x000a0000); + } else { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x00000213); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x00100000); + } + } else +#endif + { + if (Private->RunsDualLink) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0000020f); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x00100000); + } else { + if (Mode->SynthClock < 39000) + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0002020f); + else + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0000020f); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x00100000); + } + } +} + +/* + * + */ +static void +RS690VoltageControl(struct rhdOutput *Output, DisplayModePtr Mode) +{ + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + CARD32 rev = (RHDRegRead(Output, CONFIG_CNTL) && RS69_CFG_ATI_REV_ID_MASK) >> RS69_CFG_ATI_REV_ID_SHIFT; + + if (rev < 3) { +#ifdef NOTYET + if (Output->Connector == RHD_CONNECTOR_HDMI || Output->Connector == RHD_CONNECTOR_HDMI_DUAL) { + if (Mode->SynthClock > 75000) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0xa001632f); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x05120000); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x10000000, 0x10000000); + } else if (Mode->SynthClock > 41000) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0000632f); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x05120000); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x10000000, 0x10000000); + } else { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0003632f); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x050b000); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x0, 0x10000000); + } + } else +#endif + { + int clock = Mode->SynthClock; + + if (Private->RunsDualLink) + clock >>= 1; + + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x05120000); + + if (clock > 75000) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0xa001631f); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x10000000, 0x10000000); + } else if (clock > 41000) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0000631f); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x10000000, 0x10000000); + } else { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0003631f); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x0, 0x10000000); + } + } + } else { +#ifdef NOTYET + if (Output->Connector == RHD_CONNECTOR_HDMI || Output->Connector == RHD_CONNECTOR_HDMI_DUAL) { + if (Mode->SynthClock <= 75000) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0002612f); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x010b0000); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x0, 0x10000000); + } else { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x0000642f); + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x01120000); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x10000000, 0x10000000); + } + } else +#endif + { + int clock = Mode->SynthClock; + + if (Private->RunsDualLink) + clock >>= 1; + + RHDRegWrite(Output, LVTMA_R600_REG_TEST_OUTPUT, 0x01120000); + RHDRegMask(Output, LVTMA_R600_TRANSMITTER_CONTROL, 0x10000000, 0x10000000); + + if (Mode->SynthClock > 75000) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x00016318); + } else { + { +#ifdef ATOM_BIOS + RHDPtr rhdPtr = RHDPTRI(Output); + AtomBiosArgRec data; + + if (RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CAPABILITY_FLAG, &data) == ATOM_SUCCESS) { + if (((data.val & 0x60) == 0x20 || (data.val & 0x80))) { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x00016318); + } else { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x00006318); + } + } else +#endif + { + RHDRegWrite(Output, LVTMA_R600_MACRO_CONTROL, 0x00006318); + } + } + } + } + } +} + +/* + * This information is not provided in an atombios data table. + */ +static struct R5xxTMDSBMacro { + CARD16 Device; + CARD32 MacroSingle; + CARD32 MacroDual; +} R5xxTMDSBMacro[] = { + /* + * this list isn't complete yet. + * Some more values for dual need to be dug up + */ + { 0x7104, 0x00F20616, 0x00F20616 }, /* R520 */ + { 0x7142, 0x00F2061C, 0x00F2061C }, /* RV515 */ + { 0x7145, 0x00F1061D, 0x00F2061D }, /**/ + { 0x7146, 0x00F1061D, 0x00F1061D }, /* RV515 */ + { 0x7147, 0x0082041D, 0x0082041D }, /* RV505 */ + { 0x7149, 0x00F1061D, 0x00D2061D }, /**/ + { 0x7152, 0x00F2061C, 0x00F2061C }, /* RV515 */ + { 0x7183, 0x00B2050C, 0x00B2050C }, /* RV530 */ + { 0x71C0, 0x00F1061F, 0x00f2061D }, /**/ + { 0x71C1, 0x0062041D, 0x0062041D }, /* RV535 *//**/ + { 0x71C2, 0x00F1061D, 0x00F2061D }, /* RV530 *//**/ + { 0x71C5, 0x00D1061D, 0x00D2061D }, /**/ + { 0x71C6, 0x00F2061D, 0x00F2061D }, /* RV530 */ + { 0x71D2, 0x00F10610, 0x00F20610 }, /* RV530: atombios uses 0x00F1061D *//**/ + { 0x7249, 0x00F1061D, 0x00F1061D }, /* R580 */ + { 0x724B, 0x00F10610, 0x00F10610 }, /* R580: atombios uses 0x00F1061D */ + { 0x7280, 0x0042041F, 0x0042041F }, /* RV570 *//**/ + { 0x7288, 0x0042041F, 0x0042041F }, /* RV570 */ + { 0x791E, 0x0001642F, 0x0001642F }, /* RS690 */ + { 0x791F, 0x0001642F, 0x0001642F }, /* RS690 */ + { 0x9400, 0x00020213, 0x00020213 }, /* R600 */ + { 0x9401, 0x00020213, 0x00020213 }, /* R600 */ + { 0x9402, 0x00020213, 0x00020213 }, /* R600 */ + { 0x9403, 0x00020213, 0x00020213 }, /* R600 */ + { 0x9405, 0x00020213, 0x00020213 }, /* R600 */ + { 0x940A, 0x00020213, 0x00020213 }, /* R600 */ + { 0x940B, 0x00020213, 0x00020213 }, /* R600 */ + { 0x940F, 0x00020213, 0x00020213 }, /* R600 */ + { 0, 0, 0 } /* End marker */ +}; + +static struct RV6xxTMDSBMacro { + CARD16 Device; + CARD32 Macro; + CARD32 TX; + CARD32 PreEmphasis; +} RV6xxTMDSBMacro[] = { + { 0x94C1, 0x01030311, 0x10001A00, 0x01801015}, /* RV610 */ + { 0x94C3, 0x01030311, 0x10001A00, 0x01801015}, /* RV610 */ + { 0x9501, 0x0533041A, 0x020010A0, 0x41002045}, /* RV670 */ + { 0x9505, 0x0533041A, 0x020010A0, 0x41002045}, /* RV670 */ + { 0x950F, 0x0533041A, 0x020010A0, 0x41002045}, /* R680 */ + { 0x9587, 0x01030311, 0x10001C00, 0x01C01011}, /* RV630 */ + { 0x9588, 0x01030311, 0x10001C00, 0x01C01011}, /* RV630 */ + { 0x9589, 0x01030311, 0x10001C00, 0x01C01011}, /* RV630 */ + { 0, 0, 0, 0} /* End marker */ +}; + +static void +TMDSBVoltageControl(struct rhdOutput *Output, DisplayModePtr Mode) +{ + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + int i; + + /* IGP chipsets are rather special */ + if (rhdPtr->ChipSet == RHD_RS690) { + RS690VoltageControl(Output, Mode); + return; + } else if (rhdPtr->ChipSet == RHD_RS600) { + RS600VoltageControl(Output, Mode); + return; + } + + /* TEST_OUTPUT register - IGPs are handled above */ + if (rhdPtr->ChipSet < RHD_RS600) /* r5xx */ + RHDRegMask(Output, LVTMA_REG_TEST_OUTPUT, 0x00200000, 0x00200000); + else if (rhdPtr->ChipSet < RHD_RV670) + RHDRegMask(Output, LVTMA_REG_TEST_OUTPUT, 0x00100000, 0x00100000); + + /* macro control values */ + if (rhdPtr->ChipSet < RHD_RV610) { /* R5xx and R600 */ + for (i = 0; R5xxTMDSBMacro[i].Device; i++) + if (R5xxTMDSBMacro[i].Device == rhdPtr->PciDeviceID) { + if (!Private->RunsDualLink) + RHDRegWrite(Output, LVTMA_MACRO_CONTROL, R5xxTMDSBMacro[i].MacroSingle); + else + RHDRegWrite(Output, LVTMA_MACRO_CONTROL, R5xxTMDSBMacro[i].MacroDual); + return; + } + + xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: unhandled chipset: 0x%04X.\n", + __func__, rhdPtr->PciDeviceID); + xf86DrvMsg(Output->scrnIndex, X_INFO, "LVTMA_MACRO_CONTROL: 0x%08X\n", + (unsigned int) RHDRegRead(Output, LVTMA_MACRO_CONTROL)); + } else { /* RV6x0 and up */ + for (i = 0; RV6xxTMDSBMacro[i].Device; i++) + if (RV6xxTMDSBMacro[i].Device == rhdPtr->PciDeviceID) { + RHDRegWrite(Output, LVTMA_MACRO_CONTROL, RV6xxTMDSBMacro[i].Macro); + RHDRegWrite(Output, LVTMA_TRANSMITTER_ADJUST, RV6xxTMDSBMacro[i].TX); + RHDRegWrite(Output, LVTMA_PREEMPHASIS_CONTROL, RV6xxTMDSBMacro[i].PreEmphasis); + return; + } + + xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: unhandled chipset: 0x%04X.\n", + __func__, rhdPtr->PciDeviceID); + xf86DrvMsg(Output->scrnIndex, X_INFO, "LVTMA_MACRO_CONTROL: 0x%08X\n", + (unsigned int) RHDRegRead(Output, LVTMA_MACRO_CONTROL)); + xf86DrvMsg(Output->scrnIndex, X_INFO, "LVTMA_TRANSMITTER_ADJUST: 0x%08X\n", + (unsigned int) RHDRegRead(Output, LVTMA_TRANSMITTER_ADJUST)); + xf86DrvMsg(Output->scrnIndex, X_INFO, "LVTMA_PREEMPHASIS_CONTROL: 0x%08X\n", + (unsigned int) RHDRegRead(Output, LVTMA_PREEMPHASIS_CONTROL)); + } +} + +/* + * + */ +static Bool +TMDSBPropertyControl(struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + + RHDFUNC(Output); + switch (Action) { + case rhdPropertyCheck: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + case RHD_OUTPUT_AUDIO_WORKAROUND: + return TRUE; + default: + return FALSE; + } + case rhdPropertyGet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + val->Bool = Private->Coherent; + return TRUE; + case RHD_OUTPUT_HDMI: + val->Bool = Private->HdmiEnabled; + return TRUE; + case RHD_OUTPUT_AUDIO_WORKAROUND: + val->Bool = RHDHdmiGetAudioWorkaround(Private->Hdmi); + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertySet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + Private->Coherent = val->Bool; + break; + case RHD_OUTPUT_HDMI: + Private->HdmiEnabled = val->Bool; + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiSetAudioWorkaround(Private->Hdmi, val->Bool); + break; + default: + return FALSE; + } + break; + case rhdPropertyCommit: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + Output->Mode(Output, Private->Mode); + Output->Power(Output, RHD_POWER_ON); + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiCommitAudioWorkaround(Private->Hdmi); + break; + default: + return FALSE; + } + break; + } + return TRUE; +} + +/* + * + */ +static void +TMDSBSet(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + + RHDFUNC(Output); + + RHDRegMask(Output, LVTMA_MODE, 0x00000001, 0x00000001); /* select TMDS */ + + /* Clear out some HPD events first: this should be under driver control. */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x0000000C); + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0, 0x00070000); + RHDRegMask(Output, LVTMA_CNTL, 0, 0x00000010); + + /* Disable the transmitter */ + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0, 0x00003E3E); + + /* Disable bit reduction and reset temporal dither */ + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, 0, 0x00010101); + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, LVTMA_DITHER_RESET_BIT, LVTMA_DITHER_RESET_BIT); + usleep(2); + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, 0, LVTMA_DITHER_RESET_BIT); + RHDRegMask(Output, LVTMA_BIT_DEPTH_CONTROL, 0, 0xF0000000); /* not documented */ + + /* reset phase on vsync and use RGB */ + RHDRegMask(Output, LVTMA_CNTL, 0x00001000, 0x00011000); + + /* Select CRTC, select syncA, no stereosync */ + RHDRegMask(Output, LVTMA_SOURCE_SELECT, Output->Crtc->Id, 0x00010101); + + RHDRegWrite(Output, LVTMA_COLOR_FORMAT, 0); + + Private->Mode = Mode; + if (Mode->SynthClock > 165000) { + RHDRegMask(Output, LVTMA_CNTL, 0x01000000, 0x01000000); + Private->RunsDualLink = TRUE; /* for TRANSMITTER_ENABLE in TMDSBPower */ + } else { + RHDRegMask(Output, LVTMA_CNTL, 0, 0x01000000); + Private->RunsDualLink = FALSE; + } + + if (rhdPtr->ChipSet > RHD_R600) /* Rv6xx: disable split mode */ + RHDRegMask(Output, LVTMA_CNTL, 0, 0x20000000); + + /* Disable force data */ + RHDRegMask(Output, LVTMA_FORCE_OUTPUT_CNTL, 0, 0x00000001); + + /* DC balancer enable */ + RHDRegMask(Output, LVTMA_DCBALANCER_CONTROL, 0x00000001, 0x00000001); + + TMDSBVoltageControl(Output, Mode); + + /* use IDCLK */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000010, 0x00000010); + /* LVTMA only: use clock selected by next write */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x20000000, 0x20000000); + /* coherent mode */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, + Private->Coherent ? 0 : 0x10000000, 0x10000000); + /* clear LVDS clock pattern */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x03FF0000); + + /* reset transmitter pll */ + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); + usleep(2); + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x00000002); + usleep(20); + + /* restart data synchronisation */ + RHDRegMask(Output, LVTMA_DATA_SYNCHRONIZATION, 0x00000001, 0x00000001); + RHDRegMask(Output, LVTMA_DATA_SYNCHRONIZATION, 0x00000100, 0x00000100); + usleep(2); + RHDRegMask(Output, LVTMA_DATA_SYNCHRONIZATION, 0, 0x00000001); + + RHDHdmiSetMode(Private->Hdmi, Mode); +} + +/* + * + */ +static void +TMDSBPower(struct rhdOutput *Output, int Power) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); + + RHDRegMask(Output, LVTMA_MODE, 0x00000001, 0x00000001); /* select TMDS */ + + switch (Power) { + case RHD_POWER_ON: + RHDRegMask(Output, LVTMA_CNTL, 0x1, 0x00000001); + + if (Private->RunsDualLink) + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0x00003E3E,0x00003E3E); + else + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0x0000003E, 0x00003E3E); + + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001); + usleep(2); + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x00000002); + RHDHdmiEnable(Private->Hdmi, Private->HdmiEnabled); + return; + case RHD_POWER_RESET: + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0, 0x00003E3E); + return; + case RHD_POWER_SHUTDOWN: + default: + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); + usleep(2); + RHDRegMask(Output, LVTMA_TRANSMITTER_CONTROL, 0, 0x00000001); + RHDRegMask(Output, LVTMA_TRANSMITTER_ENABLE, 0, 0x00003E3E); + RHDRegMask(Output, LVTMA_CNTL, 0, 0x00000001); + RHDHdmiEnable(Private->Hdmi, FALSE); + return; + } +} + +/* + * + */ +static void +TMDSBSave(struct rhdOutput *Output) +{ + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + + RHDFUNC(Output); + + Private->StoreControl = RHDRegRead(Output, LVTMA_CNTL); + Private->StoreSource = RHDRegRead(Output, LVTMA_SOURCE_SELECT); + Private->StoreFormat = RHDRegRead(Output, LVTMA_COLOR_FORMAT); + Private->StoreForce = RHDRegRead(Output, LVTMA_FORCE_OUTPUT_CNTL); + Private->StoreReduction = RHDRegRead(Output, LVTMA_BIT_DEPTH_CONTROL); + Private->StoreDCBalancer = RHDRegRead(Output, LVTMA_DCBALANCER_CONTROL); + + Private->StoreDataSynchro = RHDRegRead(Output, LVTMA_DATA_SYNCHRONIZATION); + Private->StoreMode = RHDRegRead(Output, LVTMA_MODE); + Private->StoreTXEnable = RHDRegRead(Output, LVTMA_TRANSMITTER_ENABLE); + Private->StoreMacro = RHDRegRead(Output, LVTMA_MACRO_CONTROL); + Private->StoreTXControl = RHDRegRead(Output, LVTMA_TRANSMITTER_CONTROL); + Private->StoreTestOutput = RHDRegRead(Output, LVTMA_REG_TEST_OUTPUT); + + if (rhdPtr->ChipSet > RHD_R600) { /* Rv6x0 */ + Private->StoreRv600TXAdjust = RHDRegRead(Output, LVTMA_TRANSMITTER_ADJUST); + Private->StoreRv600PreEmphasis = RHDRegRead(Output, LVTMA_PREEMPHASIS_CONTROL); + } + + RHDHdmiSave(Private->Hdmi); + + Private->Stored = TRUE; +} + +/* + * + */ +static void +TMDSBRestore(struct rhdOutput *Output) +{ + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + RHDPtr rhdPtr = RHDPTRI(Output); + + RHDFUNC(Output); + + if (!Private->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + RHDRegWrite(Output, LVTMA_CNTL, Private->StoreControl); + RHDRegWrite(Output, LVTMA_SOURCE_SELECT, Private->StoreSource); + RHDRegWrite(Output, LVTMA_COLOR_FORMAT, Private->StoreFormat); + RHDRegWrite(Output, LVTMA_FORCE_OUTPUT_CNTL, Private->StoreForce); + RHDRegWrite(Output, LVTMA_BIT_DEPTH_CONTROL, Private->StoreReduction); + RHDRegWrite(Output, LVTMA_DCBALANCER_CONTROL, Private->StoreDCBalancer); + + RHDRegWrite(Output, LVTMA_DATA_SYNCHRONIZATION, Private->StoreDataSynchro); + RHDRegWrite(Output, LVTMA_MODE, Private->StoreMode); + RHDRegWrite(Output, LVTMA_TRANSMITTER_ENABLE, Private->StoreTXEnable); + RHDRegWrite(Output, LVTMA_MACRO_CONTROL, Private->StoreMacro); + RHDRegWrite(Output, LVTMA_TRANSMITTER_CONTROL, Private->StoreTXControl); + RHDRegWrite(Output, LVTMA_REG_TEST_OUTPUT, Private->StoreTestOutput); + + if (rhdPtr->ChipSet > RHD_R600) { /* Rv6x0 */ + RHDRegWrite(Output, LVTMA_TRANSMITTER_ADJUST, Private->StoreRv600TXAdjust); + RHDRegWrite(Output, LVTMA_PREEMPHASIS_CONTROL, Private->StoreRv600PreEmphasis); + } + + RHDHdmiRestore(Private->Hdmi); +} + + +/* + * + */ +static void +TMDSBDestroy(struct rhdOutput *Output) +{ + struct rhdTMDSBPrivate *Private = (struct rhdTMDSBPrivate *) Output->Private; + RHDFUNC(Output); + + if (!Private) + return; + + RHDHdmiDestroy(Private->Hdmi); + + xfree(Private); + Output->Private = NULL; +} + +static Bool +LVDSPropertyWrapper(struct rhdOutput *Output, + enum rhdPropertyAction Action, + enum rhdOutputProperty Property, + union rhdPropertyData *val) +{ + struct LVDSPrivate *Private = (struct LVDSPrivate *) Output->Private; + void *storePrivate = Output->Private; + Bool (*func)(struct rhdOutput *,enum rhdPropertyAction, enum rhdOutputProperty, + union rhdPropertyData *) = Private->WrappedPropertyCallback; + Bool ret; + + Output->Private = Private->PropertyPrivate; + ret = func(Output, Action, Property, val); + Output->Private = storePrivate; + + return ret; +} + +/* + * + */ +struct rhdOutput * +RHDLVTMAInit(RHDPtr rhdPtr, CARD8 Type) +{ + struct rhdOutput *Output; + RHDFUNC(rhdPtr); + + /* Stop weird connector types */ + if ((Type != RHD_CONNECTOR_PANEL) + && (Type != RHD_CONNECTOR_DVI) + && (Type != RHD_CONNECTOR_DVI_SINGLE)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: unhandled connector type:" + " %d\n", __func__, Type); + return NULL; + } + + Output = xnfcalloc(sizeof(struct rhdOutput), 1); + + Output->scrnIndex = rhdPtr->scrnIndex; + Output->Id = RHD_OUTPUT_LVTMA; + + Output->Sense = NULL; /* not implemented in hw */ + + if (Type == RHD_CONNECTOR_PANEL) { + struct LVDSPrivate *Private; + + Output->Name = "LVDS"; + + Output->ModeValid = LVDSModeValid; + Output->Mode = LVDSSet; + Output->Power = LVDSPower; + Output->Save = LVDSSave; + Output->Restore = LVDSRestore; + Output->Property = LVDSPropertyControl; + Output->Destroy = LVDSDestroy; + Output->Private = Private = LVDSInfoRetrieve(rhdPtr); + + if (Private->BlLevel >= 0) { + Private->SetBacklight = LVDSSetBacklight; + Private->GetBacklight = LVDSGetBacklight; + LVDSDebugBacklight(Output); + xf86DrvMsg(Output->scrnIndex,X_INFO, "Native Backlight Control found.\n"); + } else { + Private->BlLevel = RhdACPIGetBacklightControl(Output); + if (Private->BlLevel >= 0) { + xf86DrvMsg(Output->scrnIndex,X_INFO, "ACPI Backlight Control found.\n"); + Private->SetBacklight = RhdACPISetBacklightControl; + Private->GetBacklight = RhdACPIGetBacklightControl; + } +#ifdef ATOM_BIOS + else { + Private->BlLevel = RhdAtomSetupBacklightControlProperty( + Output, + &Private->WrappedPropertyCallback, + &Private->PropertyPrivate); + if (Private->PropertyPrivate) + Output->Property = LVDSPropertyWrapper; + xf86DrvMsg(Output->scrnIndex,X_INFO, + "Falling back to AtomBIOS controlled Backlight.\n"); + } +#endif + } + + + } else { + struct rhdTMDSBPrivate *Private = xnfcalloc(sizeof(struct rhdTMDSBPrivate), 1); + + Output->Name = "TMDS B"; + + Output->ModeValid = TMDSBModeValid; + Output->Mode = TMDSBSet; + Output->Power = TMDSBPower; + Output->Save = TMDSBSave; + Output->Restore = TMDSBRestore; + Output->Property = TMDSBPropertyControl; + Output->Destroy = TMDSBDestroy; + + Private->Hdmi = RHDHdmiInit(rhdPtr, Output); + Output->Private = Private; + + Private->RunsDualLink = FALSE; + Private->Coherent = FALSE; + } + + return Output; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_mc.c b/driver/xf86-video-radeonhd/src/rhd_mc.c new file mode 100644 index 000000000..def871b96 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_mc.c @@ -0,0 +1,807 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * MC idling: + * + * For SetupFBLocation and Restore, we require a fully idle MC as we might lock up + * otherwise. Both calls now check whether the MC is Idle before attempting + * to set up the MC, and complain loudly when this fails. + * + * Likely suspect registers for when the Idle fails: + * DxVGA_CONTROL & D1VGA_MODE_ENABLE (run RHDVGADisable beforehand) + * DxCRTC_CONTROL & 0x1 (run DxCRTCDisable beforehand) + * (... Add more here...) + * + * + * MC addressing: + * + * On R600 and up the MC can use a larger than 32bit card internal address for + * its framebuffer. This is why the Address used inside the MC code is a + * CARD64. + * + * rhdPtr->FbIntAddress is kept as a CARD32 for the time being. This is still + * valid, as this makes the R500 code simpler, and since we pick FbIntAddress + * from a 32bit register anyway on R600. FbIntAddress will also correctly cast + * to a CARD64 when passed to the likes of the SetupFBLocation callback. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_mc.h" +#include "rhd_regs.h" +#include "rhd_crtc.h" /* for definition of Crtc->Id */ + +#include "r600_reg_auto_r6xx.h" +#include "r600_reg_r6xx.h" + +struct rhdMC { + int scrnIndex; + + CARD32 FbLocation; + CARD32 HdpFbAddress; + CARD32 MiscLatencyTimer; + + Bool Stored; + + void (*Save)(struct rhdMC *MC); + void (*Restore)(struct rhdMC *MC); + Bool (*Idle)(struct rhdMC *MC); + CARD64 (*GetFBLocation)(struct rhdMC *MC, CARD32 *size); + void (*SetupFBLocation)(struct rhdMC *MC, CARD64 Address, CARD32 Size); + void (*TuneAccessForDisplay)(struct rhdMC *MC, int crtc, + DisplayModePtr Mode, DisplayModePtr ScaledToMode); +}; + +/* + * Some common FB location calculations. + */ +/* + * Applicable for all R5xx and RS600, RS690, RS740 + */ +static CARD64 +R5xxMCGetFBLocation(CARD32 Value, CARD32 *Size) +{ + *Size = (Value & 0xFFFF0000) - ((Value & 0xFFFF) << 16); + return (Value & 0xFFFF) << 16; +} + +#define R5XX_FB_LOCATION(address, size) \ + ((((address) + (size)) & 0xFFFF0000) | (((address) >> 16) & 0xFFFF)) +#define R5XX_HDP_LOCATION(address) \ + (((address) >> 16) & 0xFFFF) + +/* + * Applicable for all R6xx and R7xx, and RS780/RS790 + */ +static CARD64 +R6xxMCGetFBLocation(CARD32 Value, CARD32 *Size) +{ + *Size = (((Value & 0xFFFF0000) - ((Value & 0xFFFF) << 16))) << 8; + return (Value & 0xFFFF) << 24; +} + +#define R6XX_FB_LOCATION(address, size) \ + (((((address) + (size)) >> 8) & 0xFFFF0000) | (((address) >> 24) & 0xFFFF)) +#define R6XX_HDP_LOCATION(address) \ + ((((address) >> 8) & 0x00FF0000)) + +/* + * + */ +static void +RV515MCSave(struct rhdMC *MC) +{ + MC->FbLocation = RHDReadMC(MC, MC_IND_ALL | RV515_MC_FB_LOCATION); + MC->MiscLatencyTimer = RHDReadMC(MC, MC_IND_ALL | RV515_MC_MISC_LAT_TIMER); + MC->HdpFbAddress = RHDRegRead(MC, HDP_FB_LOCATION); +} + +/* + * + */ +static void +RV515MCRestore(struct rhdMC *MC) +{ + RHDWriteMC(MC, MC_IND_ALL | RV515_MC_FB_LOCATION, MC->FbLocation); + RHDWriteMC(MC, MC_IND_ALL | RV515_MC_MISC_LAT_TIMER, MC->MiscLatencyTimer); + RHDRegWrite(MC, HDP_FB_LOCATION, MC->HdpFbAddress); +} + +/* + * + */ +static Bool +RV515MCWaitIdle(struct rhdMC *MC) +{ + if (RHDReadMC(MC, MC_IND_ALL | RV515_MC_STATUS) & RV515_MC_IDLE) + return TRUE; + return FALSE; +} + +/* + * + */ +static CARD64 +RV515MCGetFBLocation(struct rhdMC *MC, CARD32 *Size) +{ + return R5xxMCGetFBLocation(RHDReadMC(MC, RV515_MC_FB_LOCATION | MC_IND_ALL), Size); +} + +/* + * + */ +static void +RV515MCSetupFBLocation(struct rhdMC *MC, CARD64 Address, CARD32 Size) +{ + RHDWriteMC(MC, RV515_MC_FB_LOCATION | MC_IND_ALL, + R5XX_FB_LOCATION(Address, Size)); + RHDRegWrite(MC, HDP_FB_LOCATION, R5XX_HDP_LOCATION(Address)); +} + +/* + * + */ +static void +RV515MCTuneMCAccessForDisplay(struct rhdMC *MC, int Crtc, + DisplayModePtr Mode, DisplayModePtr ScaledToMode) +{ + CARD32 value, setting = 0x1; + + value = RHDReadMC(MC, RV515_MC_MISC_LAT_TIMER); + + if (Crtc == RHD_CRTC_1) { + value &= ~(0x0F << MC_DISP0R_INIT_LAT_SHIFT); + value |= setting << MC_DISP0R_INIT_LAT_SHIFT; + } else { /* RHD_CRTC_2 */ + value &= ~(0x0F << MC_DISP1R_INIT_LAT_SHIFT); + value |= setting << MC_DISP1R_INIT_LAT_SHIFT; + } + + RHDWriteMC(MC, RV515_MC_MISC_LAT_TIMER, value); +} + +/* + * + */ +static void +R500MCSave(struct rhdMC *MC) +{ + MC->FbLocation = RHDReadMC(MC, MC_IND_ALL | R5XX_MC_FB_LOCATION); + MC->HdpFbAddress = RHDRegRead(MC, HDP_FB_LOCATION); +} + +/* + * + */ +static void +R500MCRestore(struct rhdMC *MC) +{ + RHDWriteMC(MC, MC_IND_ALL | R5XX_MC_FB_LOCATION, MC->FbLocation); + RHDRegWrite(MC, HDP_FB_LOCATION, MC->HdpFbAddress); +} + +/* + * + */ +static Bool +R500MCWaitIdle(struct rhdMC *MC) +{ + if (RHDReadMC(MC, MC_IND_ALL | R5XX_MC_STATUS) & R5XX_MC_IDLE) + return TRUE; + return FALSE; +} + +/* + * + */ +static CARD64 +R500MCGetFBLocation(struct rhdMC *MC, CARD32 *Size) +{ + return R5xxMCGetFBLocation(RHDReadMC(MC, R5XX_MC_FB_LOCATION | MC_IND_ALL), Size); +} + +/* + * + */ +static void +R500MCSetupFBLocation(struct rhdMC *MC, CARD64 Address, CARD32 Size) +{ + RHDWriteMC(MC, R5XX_MC_FB_LOCATION | MC_IND_ALL, + R5XX_FB_LOCATION(Address, Size)); + RHDRegWrite(MC, HDP_FB_LOCATION, R5XX_HDP_LOCATION(Address)); +} + +/* + * + */ +static void +RS600MCSave(struct rhdMC *MC) +{ + MC->FbLocation = RHDReadMC(MC, RS60_NB_FB_LOCATION); + MC->HdpFbAddress = RHDRegRead(MC, HDP_FB_LOCATION); +} + +/* + * + */ +static void +RS600MCRestore(struct rhdMC *MC) +{ + RHDWriteMC(MC, RS60_NB_FB_LOCATION, MC->FbLocation); + RHDRegWrite(MC, HDP_FB_LOCATION, MC->HdpFbAddress); +} + +/* + * + */ +static Bool +RS600MCWaitIdle(struct rhdMC *MC) +{ + if (RHDReadMC(MC, RS60_MC_SYSTEM_STATUS) & RS6X_MC_SEQUENCER_IDLE) + return TRUE; + return FALSE; +} + +/* + * + */ +static CARD64 +RS600MCGetFBLocation(struct rhdMC *MC, CARD32 *Size) +{ + return R5xxMCGetFBLocation(RHDReadMC(MC, RS60_NB_FB_LOCATION), Size); +} + +/* + * + */ +static void +RS600MCSetupFBLocation(struct rhdMC *MC, CARD64 Address, CARD32 Size) +{ + RHDWriteMC(MC, RS60_NB_FB_LOCATION, R5XX_FB_LOCATION(Address, Size)); + RHDRegWrite(MC, HDP_FB_LOCATION, R5XX_HDP_LOCATION(Address)); +} + +/* + * + */ +static void +RS690MCSave(struct rhdMC *MC) +{ + MC->FbLocation = RHDReadMC(MC, RS69_MCCFG_FB_LOCATION); + MC->HdpFbAddress = RHDRegRead(MC, HDP_FB_LOCATION); + MC->MiscLatencyTimer = RHDReadMC(MC, RS69_MC_INIT_MISC_LAT_TIMER); +} + +/* + * + */ +static void +RS690MCRestore(struct rhdMC *MC) +{ + RHDWriteMC(MC, RS69_MCCFG_FB_LOCATION, MC->FbLocation); + RHDRegWrite(MC, HDP_FB_LOCATION, MC->HdpFbAddress); + RHDWriteMC(MC, RS69_MC_INIT_MISC_LAT_TIMER, MC->MiscLatencyTimer); +} + +/* + * + */ +static Bool +RS690MCWaitIdle(struct rhdMC *MC) +{ + if (RHDReadMC(MC, RS69_MC_SYSTEM_STATUS) & RS6X_MC_SYSTEM_IDLE) + return TRUE; + return FALSE; +} + +/* + * + */ +static CARD64 +RS690MCGetFBLocation(struct rhdMC *MC, CARD32 *Size) +{ + return R5xxMCGetFBLocation(RHDReadMC(MC, RS69_MCCFG_FB_LOCATION), Size); +} + +/* + * + */ +static void +RS690MCSetupFBLocation(struct rhdMC *MC, CARD64 Address, CARD32 Size) +{ + RHDWriteMC(MC, RS69_MCCFG_FB_LOCATION, R5XX_FB_LOCATION(Address, Size)); + RHDRegWrite(MC, HDP_FB_LOCATION, R5XX_HDP_LOCATION(Address)); +} + +/* + * + */ +static void +RS690MCTuneMCAccessForDisplay(struct rhdMC *MC, int Crtc, + DisplayModePtr Mode, DisplayModePtr ScaledToMode) +{ + CARD32 value, setting = 0x1; + + value = RHDReadMC(MC, RS69_MC_INIT_MISC_LAT_TIMER); + + if (Crtc == RHD_CRTC_1) { + value &= ~(0x0F << MC_DISP0R_INIT_LAT_SHIFT); + value |= setting << MC_DISP0R_INIT_LAT_SHIFT; + } else { /* RHD_CRTC_2 */ + value &= ~(0x0F << MC_DISP1R_INIT_LAT_SHIFT); + value |= setting << MC_DISP1R_INIT_LAT_SHIFT; + } + + RHDWriteMC(MC, RS69_MC_INIT_MISC_LAT_TIMER, value); +} + +/* + * + */ +static void +R600MCSave(struct rhdMC *MC) +{ + MC->FbLocation = RHDRegRead(MC, R6XX_MC_VM_FB_LOCATION); + MC->HdpFbAddress = RHDRegRead(MC, R6XX_HDP_NONSURFACE_BASE); +} + +/* + * + */ +static void +R600MCRestore(struct rhdMC *MC) +{ + RHDRegWrite(MC, R6XX_MC_VM_FB_LOCATION, MC->FbLocation); + RHDRegWrite(MC, R6XX_HDP_NONSURFACE_BASE, MC->HdpFbAddress); +} + +/* + * + */ +static Bool +R600MCWaitIdle(struct rhdMC *MC) +{ + if (!(RHDRegRead(MC, SRBM_STATUS) & + (VMC_BUSY_bit | MCB_BUSY_bit | + MCDZ_BUSY_bit | MCDY_BUSY_bit | MCDX_BUSY_bit | MCDW_BUSY_bit))) + return TRUE; + return FALSE; +} + +/* + * + */ +static CARD64 +R600MCGetFBLocation(struct rhdMC *MC, CARD32 *Size) +{ + return R6xxMCGetFBLocation(RHDRegRead(MC, R6XX_MC_VM_FB_LOCATION), Size); +} + +/* + * + */ +static void +R600MCSetupFBLocation(struct rhdMC *MC, CARD64 Address, CARD32 Size) +{ + RHDRegWrite(MC, R6XX_MC_VM_FB_LOCATION, R6XX_FB_LOCATION(Address, Size)); + RHDRegWrite(MC, R6XX_HDP_NONSURFACE_BASE, R6XX_HDP_LOCATION(Address)); +} + +/* + * + */ +#ifdef NOTYET + +/* + * + */ +static void +RS780MCSave(struct rhdMC *MC) +{ + MC->FbLocation = RHDReadMC(MC, RS78_MC_FB_LOCATION); + MC->HdpFbAddress = RHDRegRead(MC, R6XX_HDP_NONSURFACE_BASE); +} + +/* + * + */ +static void +RS780MCRestore(struct rhdMC *MC) +{ + RHDWriteMC(MC, RS78_MC_FB_LOCATION, MC->FbLocation); + RHDRegWrite(MC, R6XX_HDP_NONSURFACE_BASE, MC->HdpFbAddress); +} + +/* + * + */ +static Bool +RS780MCWaitIdle(struct rhdMC *MC) +{ + if (RHDReadMC(MC, RS78_MC_SYSTEM_STATUS) & RS78_MC_SEQUENCER_IDLE) + return TRUE; + return FALSE; +} + +/* + * + */ +static CARD64 +RS780MCGetFBLocation(struct rhdMC *MC, CARD32 *Size) +{ + /* is this correct? */ + return R5xxMCGetFBLocation(RHDReadMC(MC, RS78_MC_FB_LOCATION), Size); +} + +/* + * + */ +static void +RS780MCSetupFBLocation(struct rhdMC *MC, CARD64 Address, CARD32 Size) +{ + /* is this correct? */ + RHDWriteMC(MC, RS78_MC_FB_LOCATION, R5XX_FB_LOCATION(Address, Size)); + RHDRegWrite(MC, R6XX_HDP_NONSURFACE_BASE, R6XX_HDP_LOCATION(Address)); +} +#endif /* NOTYET */ + +/* + * + */ +static void +R700MCSave(struct rhdMC *MC) +{ + MC->FbLocation = RHDRegRead(MC, R7XX_MC_VM_FB_LOCATION); + MC->HdpFbAddress = RHDRegRead(MC, R6XX_HDP_NONSURFACE_BASE); +} + +/* + * + */ +static void +R700MCRestore(struct rhdMC *MC) +{ + RHDFUNC(MC); + + RHDRegWrite(MC, R7XX_MC_VM_FB_LOCATION, MC->FbLocation); + RHDRegWrite(MC, R6XX_HDP_NONSURFACE_BASE, MC->HdpFbAddress); +} + +/* + * Idle is the R600 one... + */ + +/* + * + */ +static CARD64 +R700MCGetFBLocation(struct rhdMC *MC, CARD32 *Size) +{ + return R6xxMCGetFBLocation(RHDRegRead(MC, R7XX_MC_VM_FB_LOCATION), Size); +} + +/* + * + */ +static void +R700MCSetupFBLocation(struct rhdMC *MC, CARD64 Address, CARD32 Size) +{ + RHDRegWrite(MC, R7XX_MC_VM_FB_LOCATION, R6XX_FB_LOCATION(Address, Size)); + RHDRegWrite(MC, R6XX_HDP_NONSURFACE_BASE, R6XX_HDP_LOCATION(Address)); +} + + +/* + * + */ +void +RHDMCInit(RHDPtr rhdPtr) +{ + struct rhdMC *MC; + + RHDFUNC(rhdPtr); + + /* These devices have an internal address reference, which some other + * address registers in there also use. This can be different from the + * address in the BAR. + * + * We read out the address here from some known location. This address + * is as good a guess as any, we just need to pick one, but then make + * sure that it is made consistent in MCSetupFBLocation and the various MC + * accessing subsystems. + */ + + RHDDebug(rhdPtr->scrnIndex, "MC FB Address: 0x%08X.\n", + rhdPtr->FbIntAddress); + + MC = xnfcalloc(1, sizeof(struct rhdMC)); + MC->scrnIndex = rhdPtr->scrnIndex; + + if (rhdPtr->ChipSet < RHD_RS600) { + switch(rhdPtr->ChipSet) { + case RHD_RV515: + case RHD_RV505: + case RHD_RV516: + case RHD_RV550: + case RHD_M52: + case RHD_M54: + case RHD_M62: + case RHD_M64: + case RHD_M71: + MC->Save = RV515MCSave; + MC->Restore = RV515MCRestore; + MC->SetupFBLocation = RV515MCSetupFBLocation; + MC->GetFBLocation = RV515MCGetFBLocation; + MC->Idle = RV515MCWaitIdle; + MC->TuneAccessForDisplay = RV515MCTuneMCAccessForDisplay; + break; + default: + MC->Save = R500MCSave; + MC->Restore = R500MCRestore; + MC->SetupFBLocation = R500MCSetupFBLocation; + MC->GetFBLocation = R500MCGetFBLocation; + MC->Idle = R500MCWaitIdle; + break; + } + } else if (rhdPtr->ChipSet == RHD_RS600) { + MC->Save = RS600MCSave; + MC->Restore = RS600MCRestore; + MC->SetupFBLocation = RS600MCSetupFBLocation; + MC->Idle = RS600MCWaitIdle; + MC->GetFBLocation = RS600MCGetFBLocation; + } else if (rhdPtr->ChipSet < RHD_R600) { + MC->Save = RS690MCSave; + MC->Restore = RS690MCRestore; + MC->SetupFBLocation = RS690MCSetupFBLocation; + MC->Idle = RS690MCWaitIdle; + MC->GetFBLocation = RS690MCGetFBLocation; + MC->TuneAccessForDisplay = RS690MCTuneMCAccessForDisplay; + } else if (rhdPtr->ChipSet <= RHD_RS880) { + MC->Save = R600MCSave; + MC->Restore = R600MCRestore; + MC->SetupFBLocation = R600MCSetupFBLocation; + MC->Idle = R600MCWaitIdle; + MC->GetFBLocation = R600MCGetFBLocation; + } +#ifdef NOTYET + else if (rhdPtr->ChipSet == RHD_RS880) { + MC->Save = RS780MCSave; + MC->Restore = RS780MCRestore; + MC->SetupFBLocation = RS780MCSetupFBLocation; + MC->Idle = RS780MCWaitIdle; + MC->GetFBLocation = RS780MCGetFBLocation; + } +#endif /* NOTYET */ + else if (rhdPtr->ChipSet >= RHD_RV770) { + MC->Save = R700MCSave; + MC->Restore = R700MCRestore; + MC->SetupFBLocation = R700MCSetupFBLocation; + MC->Idle = R600MCWaitIdle; + MC->GetFBLocation = R700MCGetFBLocation; + } else { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "I don't know anything about MC on this chipset\n"); + xfree(MC); + return; + } + if (rhdPtr->ChipSet < RHD_R600) + rhdPtr->FbIntAddress = RHDRegRead(rhdPtr, HDP_FB_LOCATION) << 16; + else + rhdPtr->FbIntAddress = RHDRegRead(rhdPtr, R6XX_CONFIG_FB_BASE); + MC->GetFBLocation(MC, &rhdPtr->FbIntSize); + + rhdPtr->MC = MC; + +} + +/* + * Free structure. + */ +void +RHDMCDestroy(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + if (!rhdPtr->MC) + return; + + xfree(rhdPtr->MC); + rhdPtr->MC = NULL; +} + +/* + * + */ +void +RHDMCSave(RHDPtr rhdPtr) +{ + struct rhdMC *MC = rhdPtr->MC; + + ASSERT(MC); + + RHDFUNC(rhdPtr); + + MC->Save(MC); + + MC->Stored = TRUE; +} + +/* + * Make sure that nothing is accessing memory anymore before calling this. + */ +void +RHDMCRestore(RHDPtr rhdPtr) +{ + struct rhdMC *MC = rhdPtr->MC; + + ASSERT(MC); + RHD_UNSETDEBUGFLAG(rhdPtr, MC_SETUP); + + RHDFUNC(rhdPtr); + + if (!MC->Stored) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: trying to restore uninitialized values.\n",__func__); + return; + } + + if (MC->Idle(MC)) + MC->Restore(MC); + else + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: MC is still not idle!!!\n", __func__); +} + +/* + * + */ +Bool +RHDMCIdleWait(RHDPtr rhdPtr, CARD32 count) +{ + struct rhdMC *MC = rhdPtr->MC; + + RHDFUNC(rhdPtr); + + ASSERT(MC); + + do { + if (MC->Idle(MC)) + return TRUE; + usleep(1000); + } while (count--); + + RHDDebug(rhdPtr->scrnIndex, "%s: MC not idle\n",__func__); + + return FALSE; +} + +/* + * Get FB location and size. + */ +CARD64 +RHDMCGetFBLocation(RHDPtr rhdPtr, CARD32 *size) +{ + struct rhdMC *MC = rhdPtr->MC; + + ASSERT(MC); + ASSERT(size); + + RHDFUNC(rhdPtr); + + return MC->GetFBLocation(MC, size); +} + +/* + * Make sure that nothing is accessing memory anymore before calling this. + */ +Bool +RHDMCSetupFBLocation(RHDPtr rhdPtr, CARD64 Address, CARD32 Size) +{ + struct rhdMC *MC = rhdPtr->MC; + CARD64 OldAddress; + CARD32 OldSize; + + ASSERT(MC); + RHD_SETDEBUGFLAG(rhdPtr, MC_SETUP); + + RHDFUNC(rhdPtr); + + if (!MC->Idle(MC)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: Cannot setup MC: not idle!!!\n", __func__); + return FALSE; + } + + OldAddress = MC->GetFBLocation(MC, &OldSize); + if (OldAddress == Address && OldSize == Size) + return TRUE; + + /* If this ever occurs, we might have issues */ + if (OldAddress >> 32) + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "%s: Board claims to use a " + "higher than 32bit address for its FB\n", __func__); + + RHDDebug(rhdPtr->scrnIndex, + "Setting MC from 0x%08X to 0x%08X [Size 0x%08X]\n", + OldAddress, rhdPtr->FbIntAddress, Size); + + MC->SetupFBLocation(MC, Address, Size); + + return TRUE; +} + +/* + * + */ +void +RHDMCTuneAccessForDisplay(RHDPtr rhdPtr, int Crtc, + DisplayModePtr Mode, DisplayModePtr ScaledToMode) +{ + struct rhdMC *MC = rhdPtr->MC; + + ASSERT(MC); + + RHDFUNC(rhdPtr); + + if (MC->TuneAccessForDisplay) + MC->TuneAccessForDisplay(MC, Crtc, Mode, ScaledToMode); +} + +/* + * + */ +Bool +RHD_MC_IGP_SideportMemoryPresent(RHDPtr rhdPtr) +{ + Bool Present = FALSE; + + RHDFUNC(rhdPtr); + + switch (rhdPtr->ChipSet) { + case RHD_RS690: + case RHD_RS740: + Present = (RHDReadMC(rhdPtr, RS69_MC_MISC_UMA_CNTL) & RS69_SIDE_PORT_PRESENT_R) != 0; + break; + case RHD_RS780: + Present = (RHDReadMC(rhdPtr, RS78_MC_MISC_UMA_CNTL) & RS78_SIDE_PORT_PRESENT_R) != 0; + break; + default: + break; + } + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "IGP sideport memory %s present.\n", Present ? "" : "not"); + + return Present; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_mc.h b/driver/xf86-video-radeonhd/src/rhd_mc.h new file mode 100644 index 000000000..b66aa4ad5 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_mc.h @@ -0,0 +1,44 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ +#ifndef RHD_MC_H +# define RHD_MC_H + +/* to be fixed for good !@#$ */ +#include +#define CARD64 uint64_t + +extern void RHDMCInit(RHDPtr rhdPtr); +extern void RHDMCDestroy(RHDPtr rhdPtr); +extern void RHDMCSave(RHDPtr rhdPtr); +extern void RHDMCRestore(RHDPtr rhdPtr); +extern Bool RHDMCSetupFBLocation(RHDPtr rhdPtr, CARD64 Address, CARD32 Size); +extern Bool RHDMCIdleWait(RHDPtr rhdPtr, CARD32 count); +extern void RHDMCTuneAccessForDisplay(RHDPtr rhdPtr, int Crtc, DisplayModePtr Mode, + DisplayModePtr ScaledToMode); +extern CARD64 RHDMCGetFBLocation(RHDPtr rhdPtr, CARD32 *size); + +extern Bool RHD_MC_IGP_SideportMemoryPresent(RHDPtr rhdPtr); + +#endif /* RHD_MC_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_modes.c b/driver/xf86-video-radeonhd/src/rhd_modes.c new file mode 100644 index 000000000..192f3fd9f --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_modes.c @@ -0,0 +1,1846 @@ +/* + * Copyright 2004-2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "xf86DDC.h" +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_pll.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_modes.h" +#include "rhd_monitor.h" + +/* For Acceleration FB validation */ +#include "r5xx_accel.h" + +/* + * Don't bother with checking whether X offers this. Just use the internal one + * I'm the author of the X side one anyway. + */ + +/* + * Generate a CVT standard mode from HDisplay, VDisplay and VRefresh. + * + * These calculations are stolen from the CVT calculation spreadsheet written + * by Graham Loveridge. He seems to be claiming no copyright and there seems to + * be no license attached to this. He apparently just wants to see his name + * mentioned. + * + * This file can be found at http://www.vesa.org/Public/CVT/CVTd6r1.xls + * + * Comments and structure corresponds to the comments and structure of the xls. + * This should ease importing of future changes to the standard (not very + * likely though). + * + * About margins; i'm sure that they are to be the bit between HDisplay and + * HBlankStart, HBlankEnd and HTotal, VDisplay and VBlankStart, VBlankEnd and + * VTotal, where the overscan colour is shown. FB seems to call _all_ blanking + * outside sync "margin" for some reason. Since we prefer seeing proper + * blanking instead of the overscan colour, and since the Crtc* values will + * probably get altered after us, we will disable margins altogether. With + * these calculations, Margins will plainly expand H/VDisplay, and we don't + * want that. -- libv + * + */ +DisplayModePtr +RHDCVTMode(int HDisplay, int VDisplay, float VRefresh, Bool Reduced, + Bool Interlaced) +{ + DisplayModeRec *Mode = xnfalloc(sizeof(DisplayModeRec)); + + /* 1) top/bottom margin size (% of height) - default: 1.8 */ +#define CVT_MARGIN_PERCENTAGE 1.8 + + /* 2) character cell horizontal granularity (pixels) - default 8 */ +#define CVT_H_GRANULARITY 1 + + /* 4) Minimum vertical porch (lines) - default 3 */ +#define CVT_MIN_V_PORCH 3 + + /* 4) Minimum number of vertical back porch lines - default 6 */ +#define CVT_MIN_V_BPORCH 6 + + /* Pixel Clock step (kHz) */ +#define CVT_CLOCK_STEP 250 + + Bool Margins = FALSE; + float VFieldRate, HPeriod; + int HDisplayRnd, HMargin; + int VDisplayRnd, VMargin, VSync; + float Interlace; /* Please rename this */ + + memset(Mode, 0, sizeof(DisplayModeRec)); + + /* CVT default is 60.0Hz */ + if (!VRefresh) + VRefresh = 60.0; + + /* 1. Required field rate */ + if (Interlaced) + VFieldRate = VRefresh * 2; + else + VFieldRate = VRefresh; + + /* 2. Horizontal pixels */ + HDisplayRnd = HDisplay - (HDisplay % CVT_H_GRANULARITY); + + /* 3. Determine left and right borders */ + if (Margins) { + /* right margin is actually exactly the same as left */ + HMargin = (((float) HDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0); + HMargin -= HMargin % CVT_H_GRANULARITY; + } else + HMargin = 0; + + /* 4. Find total active pixels */ + Mode->HDisplay = HDisplayRnd + 2*HMargin; + + /* 5. Find number of lines per field */ + if (Interlaced) + VDisplayRnd = VDisplay / 2; + else + VDisplayRnd = VDisplay; + + /* 6. Find top and bottom margins */ + /* nope. */ + if (Margins) + /* top and bottom margins are equal again. */ + VMargin = (((float) VDisplayRnd) * CVT_MARGIN_PERCENTAGE / 100.0); + else + VMargin = 0; + + Mode->VDisplay = VDisplay + 2*VMargin; + + /* 7. Interlace */ + if (Interlaced) + Interlace = 0.5; + else + Interlace = 0.0; + + /* Determine VSync Width from aspect ratio */ + if (!(VDisplay % 3) && ((VDisplay * 4 / 3) == HDisplay)) + VSync = 4; + else if (!(VDisplay % 9) && ((VDisplay * 16 / 9) == HDisplay)) + VSync = 5; + else if (!(VDisplay % 10) && ((VDisplay * 16 / 10) == HDisplay)) + VSync = 6; + else if (!(VDisplay % 4) && ((VDisplay * 5 / 4) == HDisplay)) + VSync = 7; + else if (!(VDisplay % 9) && ((VDisplay * 15 / 9) == HDisplay)) + VSync = 7; + else /* Custom */ + VSync = 10; + + if (!Reduced) { /* simplified GTF calculation */ + + /* 4) Minimum time of vertical sync + back porch interval (µs) + * default 550.0 */ +#define CVT_MIN_VSYNC_BP 550.0 + + /* 3) Nominal HSync width (% of line period) - default 8 */ +#define CVT_HSYNC_PERCENTAGE 8 + + float HBlankPercentage; + int VSyncAndBackPorch, VBackPorch; + int HBlank; + + /* 8. Estimated Horizontal period */ + HPeriod = ((float) (1000000.0 / VFieldRate - CVT_MIN_VSYNC_BP)) / + (VDisplayRnd + 2 * VMargin + CVT_MIN_V_PORCH + Interlace); + + /* 9. Find number of lines in sync + backporch */ + if (((int)(CVT_MIN_VSYNC_BP / HPeriod) + 1) < (VSync + CVT_MIN_V_PORCH)) + VSyncAndBackPorch = VSync + CVT_MIN_V_PORCH; + else + VSyncAndBackPorch = (int)(CVT_MIN_VSYNC_BP / HPeriod) + 1; + + /* 10. Find number of lines in back porch */ + VBackPorch = VSyncAndBackPorch - VSync; + + /* 11. Find total number of lines in vertical field */ + Mode->VTotal = VDisplayRnd + 2 * VMargin + VSyncAndBackPorch + Interlace + + CVT_MIN_V_PORCH; + + /* 5) Definition of Horizontal blanking time limitation */ + /* Gradient (%/kHz) - default 600 */ +#define CVT_M_FACTOR 600 + + /* Offset (%) - default 40 */ +#define CVT_C_FACTOR 40 + + /* Blanking time scaling factor - default 128 */ +#define CVT_K_FACTOR 128 + + /* Scaling factor weighting - default 20 */ +#define CVT_J_FACTOR 20 + +#define CVT_M_PRIME CVT_M_FACTOR * CVT_K_FACTOR / 256 +#define CVT_C_PRIME (CVT_C_FACTOR - CVT_J_FACTOR) * CVT_K_FACTOR / 256 + \ + CVT_J_FACTOR + + /* 12. Find ideal blanking duty cycle from formula */ + HBlankPercentage = CVT_C_PRIME - CVT_M_PRIME * HPeriod/1000.0; + + /* 13. Blanking time */ + if (HBlankPercentage < 20) + HBlankPercentage = 20; + + HBlank = Mode->HDisplay * HBlankPercentage/(100.0 - HBlankPercentage); + HBlank -= HBlank % (2*CVT_H_GRANULARITY); + + /* 14. Find total number of pixels in a line. */ + Mode->HTotal = Mode->HDisplay + HBlank; + + /* Fill in HSync values */ + Mode->HSyncEnd = Mode->HDisplay + HBlank / 2; + + Mode->HSyncStart = Mode->HSyncEnd - + (Mode->HTotal * CVT_HSYNC_PERCENTAGE) / 100; + Mode->HSyncStart += CVT_H_GRANULARITY - + Mode->HSyncStart % CVT_H_GRANULARITY; + + /* Fill in VSync values */ + Mode->VSyncStart = Mode->VDisplay + CVT_MIN_V_PORCH; + Mode->VSyncEnd = Mode->VSyncStart + VSync; + + } else { /* Reduced blanking */ + /* Minimum vertical blanking interval time (µs) - default 460 */ +#define CVT_RB_MIN_VBLANK 460.0 + + /* Fixed number of clocks for horizontal sync */ +#define CVT_RB_H_SYNC 32.0 + + /* Fixed number of clocks for horizontal blanking */ +#define CVT_RB_H_BLANK 160.0 + + /* Fixed number of lines for vertical front porch - default 3 */ +#define CVT_RB_VFPORCH 3 + + int VBILines; + + /* 8. Estimate Horizontal period. */ + HPeriod = ((float) (1000000.0 / VFieldRate - CVT_RB_MIN_VBLANK)) / + (VDisplayRnd + 2*VMargin); + + /* 9. Find number of lines in vertical blanking */ + VBILines = ((float) CVT_RB_MIN_VBLANK) / HPeriod + 1; + + /* 10. Check if vertical blanking is sufficient */ + if (VBILines < (CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH)) + VBILines = CVT_RB_VFPORCH + VSync + CVT_MIN_V_BPORCH; + + /* 11. Find total number of lines in vertical field */ + Mode->VTotal = VDisplayRnd + 2 * VMargin + Interlace + VBILines; + + /* 12. Find total number of pixels in a line */ + Mode->HTotal = Mode->HDisplay + CVT_RB_H_BLANK; + + /* Fill in HSync values */ + Mode->HSyncEnd = Mode->HDisplay + CVT_RB_H_BLANK / 2; + Mode->HSyncStart = Mode->HSyncEnd - CVT_RB_H_SYNC; + + /* Fill in VSync values */ + Mode->VSyncStart = Mode->VDisplay + CVT_RB_VFPORCH; + Mode->VSyncEnd = Mode->VSyncStart + VSync; + } + + /* 15/13. Find pixel clock frequency (kHz for xf86) */ + Mode->Clock = Mode->HTotal * 1000.0 / HPeriod; + Mode->Clock -= Mode->Clock % CVT_CLOCK_STEP; + + /* 16/14. Find actual Horizontal Frequency (kHz) */ + Mode->HSync = ((float) Mode->Clock) / ((float) Mode->HTotal); + + /* 17/15. Find actual Field rate */ + Mode->VRefresh = (1000.0 * ((float) Mode->Clock)) / + ((float) (Mode->HTotal * Mode->VTotal)); + + /* 18/16. Find actual vertical frame frequency */ + /* ignore - just set the mode flag for interlaced */ + if (Interlaced) + Mode->VTotal *= 2; + + { + char Name[256]; + Name[0] = 0; + + snprintf(Name, 256, "%dx%d", HDisplay, VDisplay); + Mode->name = xnfstrdup(Name); + } + + if (Reduced) + Mode->Flags |= V_PHSYNC | V_NVSYNC; + else + Mode->Flags |= V_NHSYNC | V_PVSYNC; + + if (Interlaced) + Mode->Flags |= V_INTERLACE; + + return Mode; +} + +/* + * Temporary. + */ +static void +add(char **p, char *new) +{ + *p = xnfrealloc(*p, strlen(*p) + strlen(new) + 2); + strcat(*p, " "); + strcat(*p, new); +} + +/* + * + */ +Bool +rhdModesEqual(DisplayModePtr mode1, DisplayModePtr mode2) +{ + if (mode1->Clock == mode2->Clock + && mode1->HDisplay == mode2->HDisplay + && mode1->HSyncStart == mode2->HSyncStart + && mode1->HSyncEnd == mode2->HSyncEnd + && mode1->HTotal == mode2->HTotal + && mode1->HSkew == mode2->HSkew + && mode1->VDisplay == mode2->VDisplay + && mode1->VSyncStart == mode2->VSyncStart + && mode1->VSyncEnd == mode2->VSyncEnd + && mode1->VTotal == mode2->VTotal + && mode1->VScan == mode2->VScan + && mode1->Flags == mode2->Flags) + return TRUE; + + return FALSE; +} + +/* + * + */ +void +RHDPrintModeline(DisplayModePtr mode) +{ + char tmp[256]; + char *flags = xnfcalloc(1, 1); + + if (mode->HSkew) { + snprintf(tmp, 256, "hskew %i", mode->HSkew); + add(&flags, tmp); + } + if (mode->VScan) { + snprintf(tmp, 256, "vscan %i", mode->VScan); + add(&flags, tmp); + } + if (mode->Flags & V_INTERLACE) add(&flags, "interlace"); + if (mode->Flags & V_CSYNC) add(&flags, "composite"); + if (mode->Flags & V_DBLSCAN) add(&flags, "doublescan"); + if (mode->Flags & V_BCAST) add(&flags, "bcast"); + if (mode->Flags & V_PHSYNC) add(&flags, "+hsync"); + if (mode->Flags & V_NHSYNC) add(&flags, "-hsync"); + if (mode->Flags & V_PVSYNC) add(&flags, "+vsync"); + if (mode->Flags & V_NVSYNC) add(&flags, "-vsync"); + if (mode->Flags & V_PCSYNC) add(&flags, "+csync"); + if (mode->Flags & V_NCSYNC) add(&flags, "-csync"); +#if 0 + if (mode->Flags & V_CLKDIV2) add(&flags, "vclk/2"); +#endif + xf86Msg(X_NONE, "Modeline \"%s\" %6.2f %i %i %i %i %i %i %i %i%s\n", + mode->name, mode->Clock/1000., + mode->HDisplay, mode->HSyncStart, mode->HSyncEnd, mode->HTotal, + mode->VDisplay, mode->VSyncStart, mode->VSyncEnd, mode->VTotal, + flags); + xfree(flags); +} + +/* + * xf86Mode.c should have a some more DisplayModePtr list handling. + */ +DisplayModePtr +RHDModesAdd(DisplayModePtr Modes, DisplayModePtr Additions) +{ + if (!Modes) { + if (Additions) + return Additions; + else + return NULL; + } + + if (Additions) { + DisplayModePtr Mode = Modes; + + while (Mode->next) + Mode = Mode->next; + + Mode->next = Additions; + Additions->prev = Mode; + } + + return Modes; +} + +/* + * + */ +static DisplayModePtr +rhdModeDelete(DisplayModePtr Modes, DisplayModePtr Delete) +{ + DisplayModePtr Next, Previous; + + if (!Delete) + return Modes; + + if (Modes == Delete) + Modes = NULL; + + if (Delete->next == Delete) + Delete->next = NULL; + + if (Delete->prev == Delete) + Delete->next = NULL; + + Next = Delete->next; + Previous = Delete->prev; + + if (Next) + Next->prev = Previous; + + if (Previous) + Previous->next = Next; + + xfree(Delete->name); + xfree(Delete); + + if (Modes) + return Modes; + + if (Next) + return Next; + + if (Previous) + while (Previous->prev) + Previous = Previous->prev; + + return Previous; +} + +/* + * + */ +DisplayModePtr +RHDModeCopy(DisplayModePtr Mode) +{ + DisplayModePtr New; + + if (!Mode) + return NULL; + + New = xnfalloc(sizeof(DisplayModeRec)); + memcpy(New, Mode, sizeof(DisplayModeRec)); /* re-use private */ + New->name = xnfstrdup(Mode->name); + New->prev = NULL; + New->next = NULL; + New->Private = Mode->Private; + New->PrivSize = Mode->PrivSize; + + return New; +} + +/* + * + */ +static void +rhdModesDestroy(DisplayModePtr Modes) +{ + DisplayModePtr mode = Modes, next; + + while (mode) { + next = mode->next; + xfree(mode->name); + xfree(mode); + mode = next; + } +} + +/* + * Basic sanity checks. + */ +static int +rhdModeSanity(RHDPtr rhdPtr, DisplayModePtr Mode) +{ + /* do we need to bother at all? */ + if (Mode->status != MODE_OK) + return Mode->status; + + if (!Mode->name) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "Validation found mode without name.\n"); + return MODE_ERROR; + } + + if (Mode->Clock <= 0) + return MODE_NOCLOCK; + + if ((Mode->HDisplay <= 0) || (Mode->HSyncStart <= 0) || + (Mode->HSyncEnd <= 0) || (Mode->HTotal <= 0)) + return MODE_H_ILLEGAL; + + if ((Mode->HTotal <= Mode->HSyncEnd) || + (Mode->HSyncEnd <= Mode->HSyncStart) || + (Mode->HSyncStart < Mode->HDisplay)) + return MODE_H_ILLEGAL; + + /* HSkew? */ + + if ((Mode->VDisplay <= 0) || (Mode->VSyncStart <= 0) || + (Mode->VSyncEnd <= 0) || (Mode->VTotal <= 0)) + return MODE_V_ILLEGAL; + + if ((Mode->VTotal <= Mode->VSyncEnd) || + (Mode->VSyncEnd <= Mode->VSyncStart) || + (Mode->VSyncStart < Mode->VDisplay)) + return MODE_V_ILLEGAL; + + if ((Mode->VScan != 0) && (Mode->VScan != 1)) + return MODE_NO_VSCAN; + + if (Mode->Flags & V_DBLSCAN) + return MODE_NO_DBLESCAN; + + /* Flags */ + return MODE_OK; +} + +/* + * After we passed the initial sanity check, we need to fill out the CRTC + * values. + */ +static void +rhdModeFillOutCrtcValues(DisplayModePtr Mode) +{ + /* do we need to bother at all? */ + if (Mode->status != MODE_OK) + return; + + Mode->ClockIndex = -1; /* Always! direct non-programmable support must die. */ + + if (!Mode->SynthClock) + Mode->SynthClock = Mode->Clock; + + if (!Mode->CrtcHDisplay) + Mode->CrtcHDisplay = Mode->HDisplay; + + if (!Mode->CrtcHBlankStart) + Mode->CrtcHBlankStart = Mode->HDisplay; + + if (!Mode->CrtcHSyncStart) + Mode->CrtcHSyncStart = Mode->HSyncStart; + + if (!Mode->CrtcHSyncEnd) + Mode->CrtcHSyncEnd = Mode->HSyncEnd; + + if (!Mode->CrtcHBlankEnd) + Mode->CrtcHBlankEnd = Mode->HTotal; + + if (!Mode->CrtcHTotal) + Mode->CrtcHTotal = Mode->HTotal; + + if (!Mode->CrtcHSkew) + Mode->CrtcHSkew = Mode->HSkew; + + if (!Mode->CrtcVDisplay) + Mode->CrtcVDisplay = Mode->VDisplay; + + if (!Mode->CrtcVBlankStart) + Mode->CrtcVBlankStart = Mode->VDisplay; + + if (!Mode->CrtcVSyncStart) + Mode->CrtcVSyncStart = Mode->VSyncStart; + + if (!Mode->CrtcVSyncEnd) + Mode->CrtcVSyncEnd = Mode->VSyncEnd; + + if (!Mode->CrtcVBlankEnd) + Mode->CrtcVBlankEnd = Mode->VTotal; + + if (!Mode->CrtcVTotal) + Mode->CrtcVTotal = Mode->VTotal; + + /* Always change these */ + Mode->HSync = ((float) Mode->SynthClock) / Mode->CrtcHTotal; + Mode->VRefresh = (Mode->SynthClock * 1000.0) / + (Mode->CrtcHTotal * Mode->CrtcVTotal); + if (Mode->Flags & V_INTERLACE) + Mode->VRefresh *= 2.0; + if (Mode->Flags & V_DBLSCAN) + Mode->VRefresh /= 2.0; + + /* We're usually first in the chain, right after rhdModeSanity. */ + Mode->CrtcHAdjusted = FALSE; + Mode->CrtcVAdjusted = FALSE; + + /* Steer clear of PrivSize, Private and PrivFlags */ +} + +/* + * Basic sanity checks. + */ +static int +rhdModeCrtcSanity(DisplayModePtr Mode) +{ + if (Mode->SynthClock <= 0) + return MODE_NOCLOCK; + + if ((Mode->CrtcHDisplay <= 0) || (Mode->CrtcHBlankStart <= 0) || + (Mode->CrtcHSyncStart <= 0) || (Mode->CrtcHSyncEnd <= 0) || + (Mode->CrtcHBlankEnd <= 0) || (Mode->CrtcHTotal <= 0)) + return MODE_H_ILLEGAL; + + /* there seem to be no alignment constraints on horizontal timing on our + hardware here */ + + if ((Mode->CrtcHTotal < Mode->CrtcHBlankEnd) || + (Mode->CrtcHBlankEnd <= Mode->CrtcHSyncEnd) || + (Mode->CrtcHSyncEnd <= Mode->CrtcHSyncStart) || + (Mode->CrtcHSyncStart < Mode->CrtcHBlankStart) || + (Mode->CrtcHBlankStart < Mode->CrtcHDisplay)) + return MODE_H_ILLEGAL; + + /* CrtcHSkew? */ + + if ((Mode->CrtcVDisplay <= 0) || (Mode->CrtcVBlankStart <= 0) || + (Mode->CrtcVSyncStart <= 0) || (Mode->CrtcVSyncEnd <= 0) || + (Mode->CrtcVBlankEnd <= 0) || (Mode->CrtcVTotal <= 0)) + return MODE_V_ILLEGAL; + + if ((Mode->CrtcVTotal < Mode->CrtcVBlankEnd) || + (Mode->CrtcVBlankEnd <= Mode->CrtcVSyncEnd) || + (Mode->CrtcVSyncEnd <= Mode->CrtcVSyncStart) || + (Mode->CrtcVSyncStart < Mode->CrtcVBlankStart) || + (Mode->CrtcVBlankStart < Mode->CrtcVDisplay)) + return MODE_V_ILLEGAL; + + return MODE_OK; +} + +/* + * + */ +static Bool +rhdMonitorFixedValid(struct rhdMonitor *Monitor, DisplayModePtr Mode) +{ + DisplayModePtr Fixed; + + for (Fixed = Monitor->Modes; Fixed; Fixed = Fixed->next) { + if ((Mode->Flags != Fixed->Flags) || + (Mode->Clock != Fixed->Clock) || + (Mode->SynthClock != Fixed->Clock)) + continue; + + if ((Mode->HDisplay > Fixed->HDisplay) || + (Mode->VDisplay > Fixed->VDisplay)) + continue; + + if ((Mode->HSyncStart != Fixed->HSyncStart) || + (Mode->HSyncEnd != Fixed->HSyncEnd)) + continue; + + if ((Mode->VSyncStart != Fixed->VSyncStart) || + (Mode->VSyncEnd != Fixed->VSyncEnd)) + continue; + + if ((Mode->CrtcHDisplay > Fixed->HDisplay) || + (Mode->CrtcVDisplay > Fixed->VDisplay)) + continue; + + if ((Mode->CrtcHBlankStart != Fixed->HDisplay) || + (Mode->CrtcHSyncStart != Fixed->HSyncStart) || + (Mode->CrtcHSyncEnd != Fixed->HSyncEnd) || + (Mode->CrtcHBlankEnd != Fixed->HTotal)) + continue; + + if ((Mode->CrtcVBlankStart != Fixed->VDisplay) || + (Mode->CrtcVSyncStart != Fixed->VSyncStart) || + (Mode->CrtcVSyncEnd != Fixed->VSyncEnd) || + (Mode->CrtcVBlankEnd != Fixed->VTotal)) + continue; + + return TRUE; + } + + return FALSE; +} +/* + * TODO: review fixed modes when doing different modes on both crtcs. + */ +static int +rhdMonitorValid(struct rhdMonitor *Monitor, DisplayModePtr Mode) +{ + int i; + Bool isNative = FALSE; + + if (Monitor->NativeMode && rhdModesEqual(Mode, Monitor->NativeMode)) + isNative = TRUE; + + for (i = 0; i < Monitor->numHSync; i++) + if ((Mode->HSync >= (Monitor->HSync[i].lo * (1.0 - SYNC_TOLERANCE))) && + (Mode->HSync <= (Monitor->HSync[i].hi * (1.0 + SYNC_TOLERANCE)))) + break; + if (Monitor->numHSync && (i == Monitor->numHSync)) + return MODE_HSYNC; + + for (i = 0; i < Monitor->numVRefresh; i++) + if ((Mode->VRefresh >= (Monitor->VRefresh[i].lo * (1.0 - SYNC_TOLERANCE))) && + (Mode->VRefresh <= (Monitor->VRefresh[i].hi * (1.0 + SYNC_TOLERANCE)))) + break; + if (Monitor->numVRefresh && (i == Monitor->numVRefresh)) + return MODE_VSYNC; + + if (Monitor->Bandwidth && + (Mode->SynthClock > (Monitor->Bandwidth * (1 + SYNC_TOLERANCE)))) + return MODE_CLOCK_HIGH; + + if (isNative) { /* if it's this monitor's native mode be less strict on validation */ + if (Monitor->ReducedAllowed) { + if ((Mode->CrtcHDisplay * 101) > (Mode->CrtcHTotal * 100)) /* 1% */ + return MODE_HBLANK_NARROW; + } else { /* no reduced blanking */ + if ((Mode->CrtcHDisplay * 23) > (Mode->CrtcHTotal * 20)) /* 15% */ + return MODE_HBLANK_NARROW; + } + } else { + if (((Mode->CrtcHDisplay * 5 / 4) & ~0x07) > Mode->CrtcHTotal) { + /* is this a cvt -r Mode, and only a cvt -r Mode? */ + if (((Mode->CrtcHTotal - Mode->CrtcHDisplay) == 160) && + ((Mode->CrtcHSyncEnd - Mode->CrtcHDisplay) == 80) && + ((Mode->CrtcHSyncEnd - Mode->CrtcHSyncStart) == 32) && + ((Mode->CrtcVSyncStart - Mode->CrtcVDisplay) == 3)) { + if (!Monitor->ReducedAllowed) + return MODE_NO_REDUCED; + } else if ((Mode->CrtcHDisplay * 11) > (Mode->CrtcHTotal * 10)) + return MODE_HSYNC_NARROW; + } + } + + if (Monitor->UseFixedModes && !rhdMonitorFixedValid(Monitor, Mode)) + return MODE_FIXED; + + return MODE_OK; +} + +#define RHD_MODE_VALIDATION_LOOPS 10 + +enum ValidationKind { + VALIDATE_SCALE_NONE, + VALIDATE_SCALE_FROM, + VALIDATE_SCALE_TO +}; + +/* + * + */ +static int +rhdModeValidateCrtc(struct rhdCrtc *Crtc, DisplayModePtr Mode, enum ValidationKind ValidateScaleModeKind) +{ + ScrnInfoPtr pScrn = xf86Screens[Crtc->scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + int Status, i; + + RHDFUNC(Crtc); + + Status = rhdModeSanity(rhdPtr, Mode); + if (Status != MODE_OK) + return Status; + + rhdModeFillOutCrtcValues(Mode); + + /* We don't want to loop around this forever */ + for (i = 0; i < RHD_MODE_VALIDATION_LOOPS; i++) { + struct rhdOutput *Output; + + Mode->CrtcHAdjusted = FALSE; + Mode->CrtcVAdjusted = FALSE; + + Status = rhdModeCrtcSanity(Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + if (ValidateScaleModeKind != VALIDATE_SCALE_TO) { + + Status = Crtc->FBValid(Crtc, Mode->CrtcHDisplay, Mode->CrtcVDisplay, + pScrn->bitsPerPixel, rhdPtr->FbScanoutStart, + rhdPtr->FbScanoutSize, NULL); + if (Status != MODE_OK) + return Status; + + if (Crtc->ScaleValid) { + if (ValidateScaleModeKind == VALIDATE_SCALE_NONE) + Status = Crtc->ScaleValid(Crtc, RHD_CRTC_SCALE_TYPE_NONE, Mode, NULL); + else + Status = Crtc->ScaleValid(Crtc, Crtc->ScaleType, Mode, Crtc->ScaledToMode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + } + } + + if (ValidateScaleModeKind != VALIDATE_SCALE_FROM) { + Status = Crtc->ModeValid(Crtc, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + if (Crtc->PLL && Crtc->PLL->Valid) { /* RandR may not have PLL filled out. oh well... */ + Status = Crtc->PLL->Valid(Crtc->PLL, Mode->Clock); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + } + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) + if (Output->Active && (Output->Crtc == Crtc)) { + /* Check the output */ + Status = Output->ModeValid(Output, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + break; /* restart. */ + + /* Check the monitor attached to this output */ + if (Output->Connector && Output->Connector->Monitor) + Status = rhdMonitorValid(Output->Connector->Monitor, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + break; /* restart. */ + } + + if (Output) /* We're done. This must be a good mode. */ + continue; + } + + return MODE_OK; + } + + /* Mode has been bouncing around for ages, on adjustments */ + xf86DrvMsg(Crtc->scrnIndex, X_ERROR, "%s: Mode \"%s\" (%dx%d:%3.1fMhz) was" + " thrown around for too long.\n", __func__, Mode->name, + Mode->HDisplay, Mode->VDisplay, Mode->Clock/1000.0); + return MODE_ERROR; +} + +/* + * + */ +int +RHDValidateScaledToMode(struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTRI(Crtc); + int Status; + + RHDFUNC(Crtc); + + Status = rhdModeSanity(rhdPtr, Mode); + if (Status != MODE_OK) + return Status; + + rhdModeFillOutCrtcValues(Mode); + + Status = rhdModeValidateCrtc(Crtc, Mode, VALIDATE_SCALE_TO); + if (Status != MODE_OK) + return Status; + + /* Do we want to also validate against a configured monitor? */ + if (rhdPtr->ConfigMonitor) { + Status = rhdMonitorValid(rhdPtr->ConfigMonitor, Mode); + if (Status != MODE_OK) + return Status; + } + + return MODE_OK; +} + +/* + * + */ +static int +rhdModeValidate(ScrnInfoPtr pScrn, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdCrtc *Crtc; + int Status; + int i; + + Status = rhdModeSanity(rhdPtr, Mode); + if (Status != MODE_OK) + return Status; + + rhdModeFillOutCrtcValues(Mode); + + /* now let our modesetting tree have its say */ + for (i = 0; i < 2; i++) { + Crtc = rhdPtr->Crtc[i]; + if (!Crtc->Active) + continue; + + if (!Crtc->ScaledToMode) { + + Status = rhdModeValidateCrtc(Crtc, Mode, VALIDATE_SCALE_NONE); + if (Status != MODE_OK) + return Status; + + } else { + Status = rhdModeValidateCrtc(Crtc, Mode, VALIDATE_SCALE_FROM); + if (Status != MODE_OK) + return Status; + } + } + + /* throw them at the configured monitor, so that the inadequate + * conf file at least has some influence. */ + if (rhdPtr->ConfigMonitor) { + Status = rhdMonitorValid(rhdPtr->ConfigMonitor, Mode); + if (Status != MODE_OK) + return Status; + } + + /* Did we set up virtual resolution already? */ + if ((pScrn->virtualX > 0) && (pScrn->virtualY > 0)) { + if (pScrn->virtualX < Mode->CrtcHDisplay) + return MODE_VIRTUAL_X; + if (pScrn->virtualY < Mode->CrtcVDisplay) + return MODE_VIRTUAL_Y; + } + + return MODE_OK; +} + +/* + * Wrap the limited xf86 Mode statusses with our own message. + */ +struct { + int Status; + char *Message; +} rhdModeStatusMessages[] = { + { MODE_NO_REDUCED, "Reduced blanking is not supported."}, + { MODE_MEM_BW, "Memory bandwidth exceeded."}, + { MODE_OUTPUT_UNDEF, "Mode not defined by output device."}, + { MODE_NOT_PAL, "This is not a PAL TV mode."}, + { MODE_NOT_NTSC, "This is not an NTSC TV mode."}, + { MODE_HTOTAL_WIDE, "Horizontal Total is out of range."}, + { MODE_HDISPLAY_WIDE, "Mode is too wide."}, + { MODE_HSYNC_RANGE, "Horizontal Sync Start is out of range."}, + { MODE_HBLANK_RANGE, "Horizontal Blanking Start is out of range."}, + { MODE_VTOTAL_WIDE, "Vertical Total is out of range.\n"}, + { MODE_VDISPLAY_WIDE, "Mode is too high."}, + { MODE_VSYNC_RANGE, "Vertical Sync Start is out of range.\n"}, + { MODE_VBLANK_RANGE, "Vertical Blanking Start is out of range."}, + { MODE_PITCH, "Scanout buffer Pitch too wide."}, + { MODE_OFFSET, "Scanout buffer offset too high in FB."}, + { MODE_MINHEIGHT, "Height too low."}, + { MODE_FIXED, "Mode not compatible with fixed mode."}, + { MODE_SCALE, "Mode cannot be scaled to fixed mode."}, + { MODE_NO_ENCODER, "No encoder available for this output."}, + { 0, NULL} +}; + +const char * +RHDModeStatusToString(int Status) +{ + if ((Status & 0xFFF00) == RHD_MODE_STATUS) { + int i; + + for (i = 0; rhdModeStatusMessages[i].Message; i++) + if (rhdModeStatusMessages[i].Status == Status) + return rhdModeStatusMessages[i].Message; + ErrorF("%s: unhandled Status type: 0x%X\n", __func__, Status); + return "Unknown status."; + + } else + return xf86ModeStatusToString(Status); +} + +/* + * + */ +static DisplayModePtr +rhdModesGrabOnNameAll(DisplayModePtr *Modes, char *name) +{ + DisplayModePtr Mode, Matched = NULL, Temp; + + for (Mode = *Modes; Mode; ) { + if (!strcmp(Mode->name, name)) { + Temp = Mode; + Mode = Mode->next; + + if (Temp->prev) + Temp->prev->next = Mode; + else + *Modes = Mode; + + if (Mode) + Mode->prev = Temp->prev; + + Temp->prev = NULL; + Temp->next = Matched; + if (Matched) + Matched->prev = Temp; + Matched = Temp; + } else + Mode = Mode->next; + } + + return Matched; +} + +/* + * + */ +static DisplayModePtr +rhdModesGrabOnTypeAll(DisplayModePtr *Modes, int Type, int Mask) +{ + DisplayModePtr Mode, Matched = NULL, Temp; + + for (Mode = *Modes; Mode; ) { + if ((Mode->type & Mask) == (Type & Mask)) { + Temp = Mode; + Mode = Mode->next; + + if (Temp->prev) + Temp->prev->next = Mode; + else + *Modes = Mode; + + if (Mode) + Mode->prev = Temp->prev; + + Temp->next = Matched; + if (Matched) + Matched->prev = Temp; + Temp->prev = NULL; + Matched = Temp; + } else + Mode = Mode->next; + } + + return Matched; +} + +/* + * + */ +static DisplayModePtr +rhdModesGrabBestRefresh(DisplayModePtr *Modes) +{ + DisplayModePtr Mode, Best = NULL; + + if (!*Modes) + return NULL; + + Best = *Modes; + + for (Mode = Best->next; Mode; Mode = Mode->next) + if (Best->VRefresh < Mode->VRefresh) + Best = Mode; + else if (Best->VRefresh == Mode->VRefresh) { + /* Same name != same resolution */ + if ((Best->HDisplay * Best->VDisplay) < + (Mode->HDisplay * Mode->VDisplay)) + Best = Mode; + else if ((Best->HDisplay * Best->VDisplay) == + (Mode->HDisplay * Mode->VDisplay)) { + /* Lower bandwidth == better! */ + if (Best->Clock > Mode->Clock) + Best = Mode; + } + } + + if (Best->next) + Best->next->prev = Best->prev; + if (Best->prev) + Best->prev->next = Best->next; + if (Best == *Modes) + *Modes = (*Modes)->next; + + Best->next = NULL; + Best->prev = NULL; + + return Best; +} + +/* + * + */ +static DisplayModePtr +rhdModesGrabOnHighestType(DisplayModePtr *Modes) +{ + DisplayModePtr Mode; + + /* User provided, but can also have another source. */ + Mode = rhdModesGrabOnTypeAll(Modes, M_T_USERDEF, 0xF0); + if (Mode) + return Mode; + + /* Often EDID provided, but can also have another source. */ + Mode = rhdModesGrabOnTypeAll(Modes, M_T_DRIVER, 0xF0); + if (Mode) + return Mode; + + /* No reason why we should treat built-in and vesa separately */ + Mode = *Modes; + *Modes = NULL; + return Mode; +} + +/* + * + */ +static DisplayModePtr +rhdModesSortOnSize(DisplayModePtr Modes) +{ + DisplayModePtr Sorted, Mode, Temp, Next; + + if (!Modes) + return NULL; + + Sorted = Modes; + Modes = Modes->next; + + Sorted->next = NULL; + Sorted->prev = NULL; + + for (Next = Modes; Next; ) { + /* since we're taking modelines from in between */ + Mode = Next; + Next = Next->next; + + for (Temp = Sorted; Temp; Temp = Temp->next) { + /* nasty ! */ + if (((Temp->CrtcHDisplay * Temp->CrtcVDisplay) < + (Mode->CrtcHDisplay * Mode->CrtcVDisplay)) || + (((Temp->CrtcHDisplay * Temp->CrtcVDisplay) == + (Mode->CrtcHDisplay * Mode->CrtcVDisplay)) && + ((Temp->VRefresh < Mode->VRefresh) || + ((Temp->VRefresh < Mode->VRefresh) && + (Temp->SynthClock < Mode->SynthClock))))) { + Mode->next = Temp; + Mode->prev = Temp->prev; + Temp->prev = Mode; + if (Mode->prev) + Mode->prev->next = Mode; + else + Sorted = Mode; + break; + } + + if (!Temp->next) { + Temp->next = Mode; + Mode->prev = Temp; + Mode->next = NULL; + break; + } + } + } + + return Sorted; +} + +/* + * take a modename, try to parse it, if that works, generate the CVT modeline. + */ +static DisplayModePtr +rhdModeCreateFromName(ScrnInfoPtr pScrn, char *name, Bool Silent) +{ + DisplayModePtr Mode; + int HDisplay = 0, VDisplay = 0, tmp; + float VRefresh = 0; + Bool Reduced; + int Status; + + sscanf(name, "%dx%d@%f", &HDisplay, &VDisplay, &VRefresh); + if (!HDisplay || !VDisplay) { + if (!Silent) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s: Unable to generate " + "Modeline for Mode \"%s\"\n", __func__, name); + return NULL; + } + + tmp = strlen(name) - 1; + if ((name[tmp] == 'r') || (name[tmp] == 'R')) + Reduced = TRUE; + else + Reduced = FALSE; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "Generating Modeline for \"%s\"\n", name); + + /* First, try a plain CVT mode */ + Mode = RHDCVTMode(HDisplay, VDisplay, VRefresh, Reduced, FALSE); + xfree(Mode->name); + Mode->name = xnfstrdup(name); + Mode->type = M_T_USERDEF; + + Status = rhdModeValidate(pScrn, Mode); + if (Status == MODE_OK) + return Mode; + rhdModesDestroy(Mode); + +#if 0 /* noscale mode */ + /* Now see if we have fixed modes */ + for (i = 0; i < 2; i++) { + Crtc = rhdPtr->Crtc[i]; + + if (!Crtc->Active || !Crtc->FixedMode) + continue; + + Mode = RHDModeCopy(Crtc->FixedMode); + xfree(Mode->name); + Mode->name = xnfstrdup(name); + Mode->type = M_T_USERDEF; + + Mode->HDisplay = HDisplay; + Mode->CrtcHDisplay = 0; /* set by validation code */ + Mode->VDisplay = VDisplay; + Mode->CrtcVDisplay = 0; + + Status = rhdModeValidate(pScrn, Mode); + if (Status == MODE_OK) + return Mode; + rhdModesDestroy(Mode); + } +#endif + + if (!Silent) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rejected mode \"%s\" " + "(%dx%d):\n\t %s\n", name, HDisplay, VDisplay, + RHDModeStatusToString(Status)); + return NULL; +} + +/* + * + */ +static DisplayModePtr +rhdModesListValidateAndCopy(ScrnInfoPtr pScrn, DisplayModePtr Modes, Bool Silent) +{ + DisplayModePtr Keepers = NULL, Check, Mode; + int Status; + + for (Check = Modes; Check; Check = Check->next) { + Mode = RHDModeCopy(Check); + + Status = rhdModeValidate(pScrn, Mode); + if (Status == MODE_OK) + Keepers = RHDModesAdd(Keepers, Mode); + else { + if (!Silent) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Rejected mode \"%s\" " + "(%dx%d:%3.1fMhz): %s\n", Mode->name, + Mode->HDisplay, Mode->VDisplay, + Mode->Clock / 1000.0, RHDModeStatusToString(Status)); + xfree(Mode->name); + xfree(Mode); + } + } + + return Keepers; +} + +/* + * Create the list of all modes that are currently valid + */ +static DisplayModePtr +rhdCreateModesListAndValidate(ScrnInfoPtr pScrn, Bool Silent) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + DisplayModePtr Keepers = NULL, Modes; + struct rhdCrtc *Crtc; + struct rhdOutput *Output; + int i; + + RHDFUNC(pScrn); + + /* Cycle through our monitors list, and find a fixed mode one */ + for (i = 0; i < 2; i++) { + Crtc = rhdPtr->Crtc[i]; + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) { + if (Output->Active && (Output->Crtc == Crtc)) { + if (Output->Connector && Output->Connector->Monitor + && Output->Connector->Monitor->UseFixedModes + && !Crtc->ScaledToMode) { + Modes = Output->Connector->Monitor->Modes; + if (!Silent && Modes) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Validating Fixed" + " Modes from Monitor \"%s\"\n\t on Connector" + " \"%s\"\n", Output->Connector->Monitor->Name, + Output->Connector->Name); + + Modes = rhdModesListValidateAndCopy(pScrn, Modes, Silent); + Keepers = RHDModesAdd(Keepers, Modes); + return Keepers; + } + } + } + } + + if (rhdPtr->ConfigMonitor) { + /* First Pass, X's own Modes. */ + Modes = rhdPtr->ConfigMonitor->Modes; + if (!Silent && Modes) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Validating Modes from the " + "configured Monitor: \"%s\"\n", + pScrn->confScreen->monitor->id); + Modes = rhdModesListValidateAndCopy(pScrn, Modes, Silent); + Keepers = RHDModesAdd(Keepers, Modes); + } + + /* Cycle through our actual monitors list */ + for (i = 0; i < 2; i++) { + Crtc = rhdPtr->Crtc[i]; + + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) { + if (Output->Active && (Output->Crtc == Crtc)) { + if (Output->Connector && Output->Connector->Monitor) { + Modes = Output->Connector->Monitor->Modes; + if (!Silent && Modes) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Validating Modes " + "from Monitor \"%s\" on \"%s\"\n", + Output->Connector->Monitor->Name, + Output->Connector->Name); + + Modes = rhdModesListValidateAndCopy(pScrn, Modes, Silent); + Keepers = RHDModesAdd(Keepers, Modes); + } + } + } + } + + return Keepers; +} + +/* + * + */ +DisplayModePtr +RHDModesPoolCreate(ScrnInfoPtr pScrn, Bool Silent) +{ + DisplayModePtr Pool = NULL, List, TempList, Temp; + char **ModeNames = pScrn->display->modes; + int i; + + RHDFUNC(pScrn); + + List = rhdCreateModesListAndValidate(pScrn, Silent); + if (!List) + return List; + + /* Reduce our list */ + if (ModeNames && ModeNames[0]) { /* Find the best matching mode for each name */ + for (i = 0; ModeNames[i]; i++) { + TempList = rhdModesGrabOnNameAll(&List, ModeNames[i]); + if (TempList) { + Temp = rhdModesGrabOnHighestType(&TempList); + rhdModesDestroy(TempList); + + TempList = Temp; + Temp = rhdModesGrabOnTypeAll(&TempList, M_T_PREFERRED, M_T_PREFERRED); + if (Temp) { + rhdModesDestroy(TempList); + TempList = Temp; + } + + Temp = rhdModesGrabBestRefresh(&TempList); + + rhdModesDestroy(TempList); + } else /* No matching modes found, generate */ + Temp = rhdModeCreateFromName(pScrn, ModeNames[i], Silent); + + if (Temp) + Pool = RHDModesAdd(Pool, Temp); + } + + rhdModesDestroy(List); + } else { /* No names, just work the list directly */ + Temp = rhdModesGrabOnHighestType(&List); + rhdModesDestroy(List); + List = Temp; + + while (List) { + TempList = rhdModesGrabOnNameAll(&List, List->name); + + Temp = rhdModesGrabOnTypeAll(&TempList, M_T_PREFERRED, M_T_PREFERRED); + if (Temp) { + rhdModesDestroy(TempList); + TempList = Temp; + } + + Temp = rhdModesGrabBestRefresh(&TempList); + rhdModesDestroy(TempList); + + Pool = RHDModesAdd(Pool, Temp); + } + + /* Sort our list */ + TempList = Pool; + + /* Sort higher priority modes separately */ + Pool = rhdModesGrabOnTypeAll(&TempList, M_T_PREFERRED, M_T_PREFERRED); + Pool = rhdModesSortOnSize(Pool); + + TempList = rhdModesSortOnSize(TempList); + + Pool = RHDModesAdd(Pool, TempList); + } + + return Pool; +} + +/* + * + */ +void +RHDModesAttach(ScrnInfoPtr pScrn, DisplayModePtr Modes) +{ + DisplayModePtr Mode = Modes; + + pScrn->modes = Modes; + pScrn->currentMode = Modes; + + while (Mode->next) { + Mode->type = M_T_USERDEF; /* satisfy xf86ZoomViewport */ + Mode = Mode->next; + } + + Mode->type = M_T_USERDEF; + + /* Make our list circular */ + Mode->next = pScrn->modes; + pScrn->modes->prev = Mode; +} + +/* + * + */ +Bool +RHDGetVirtualFromConfig(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdCrtc *Crtc1 = rhdPtr->Crtc[0], *Crtc2 = rhdPtr->Crtc[1]; + CARD32 VirtualX = pScrn->display->virtualX; + CARD32 VirtualY = pScrn->display->virtualY; + CARD32 Pitch1, Pitch2; + float Ratio = (float) pScrn->display->virtualY / pScrn->display->virtualX; + int ret = FALSE; + + RHDFUNC(pScrn); + + while (VirtualX && VirtualY) { + ret = Crtc1->FBValid(Crtc1, VirtualX, VirtualY, pScrn->bitsPerPixel, + rhdPtr->FbScanoutStart, rhdPtr->FbScanoutSize, &Pitch1); + if (ret != MODE_OK) + goto shrink; + ret = Crtc2->FBValid(Crtc2, VirtualX, VirtualY, pScrn->bitsPerPixel, + rhdPtr->FbScanoutStart, rhdPtr->FbScanoutSize, &Pitch2); + if (ret != MODE_OK) + goto shrink; + + if (Pitch1 != Pitch2) + goto shrink; + + /* let 2d acceleration have a say as well */ + if (rhdPtr->AccelMethod >= RHD_ACCEL_XAA) + if (rhdPtr->ChipSet < RHD_R600) /* badly abstracted, i know */ + if (!R5xx2DFBValid(rhdPtr, VirtualX, VirtualY, pScrn->bitsPerPixel, + rhdPtr->FbScanoutStart, rhdPtr->FbScanoutSize, Pitch1)) + goto shrink; + + break; /* must be good then. */ + shrink: + VirtualX--; + VirtualY = Ratio * VirtualX; + } + + if (VirtualX && VirtualY) { + pScrn->virtualX = VirtualX; + pScrn->virtualY = VirtualY; + pScrn->displayWidth = Pitch1; + return TRUE; + } else + return FALSE; +} + +/* + * + */ +void +RHDGetVirtualFromModesAndFilter(ScrnInfoPtr pScrn, DisplayModePtr Modes, Bool Silent) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdCrtc *Crtc1 = rhdPtr->Crtc[0], *Crtc2 = rhdPtr->Crtc[1]; + DisplayModePtr Mode, Next; + CARD32 VirtualX = 0; + CARD32 VirtualY = 0; + CARD32 Pitch1, Pitch2; + int ret = FALSE; + + RHDFUNC(pScrn); + + /* assert */ + if (!Modes) + return; + + Mode = Modes; + + while (Mode) { + if ((Mode->CrtcHDisplay > pScrn->virtualX) || + (Mode->CrtcVDisplay > pScrn->virtualY)) { + if (Mode->CrtcHDisplay > pScrn->virtualX) + VirtualX = Mode->CrtcHDisplay; + else + VirtualX = pScrn->virtualX; + + if (Mode->CrtcVDisplay > pScrn->virtualY) + VirtualY = Mode->CrtcVDisplay; + else + VirtualY = pScrn->virtualY; + + /* Check what Crtc1 thinks this should be. */ + ret = Crtc1->FBValid(Crtc1, VirtualX, VirtualY, pScrn->bitsPerPixel, + rhdPtr->FbScanoutStart, rhdPtr->FbScanoutSize, &Pitch1); + if (ret != MODE_OK) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s rejected mode \"%s\" " + "(%dx%d): %s\n", Crtc1->Name, Mode->name, + Mode->HDisplay, Mode->VDisplay, + RHDModeStatusToString(ret)); + goto rejected; + } + + /* Check what Crtc2 thinks this should be. */ + ret = Crtc2->FBValid(Crtc2, VirtualX, VirtualY, pScrn->bitsPerPixel, + rhdPtr->FbScanoutStart, rhdPtr->FbScanoutSize, &Pitch2); + if (ret != MODE_OK) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "%s rejected mode \"%s\" " + "(%dx%d): %s\n", Crtc2->Name, Mode->name, + Mode->HDisplay, Mode->VDisplay, + RHDModeStatusToString(ret)); + goto rejected; + } + + /* when needed, check whether this matches our 2D engine as well. */ + if (rhdPtr->AccelMethod >= RHD_ACCEL_XAA) + if (rhdPtr->ChipSet < RHD_R600) /* badly abstracted, i know */ + if (!R5xx2DFBValid(rhdPtr, VirtualX, VirtualY, + pScrn->bitsPerPixel, rhdPtr->FbScanoutStart, + rhdPtr->FbScanoutSize, Pitch1)) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "2D acceleration " + "rejected mode \"%s\" (%dx%d).\n", + Mode->name, Mode->HDisplay, Mode->VDisplay); + goto rejected; + } + + /* mode is perfectly valid FB wise */ + Mode = Mode->next; + pScrn->virtualX = VirtualX; + pScrn->virtualY = VirtualY; + pScrn->displayWidth = Pitch1; + continue; + + rejected: + Next = Mode->next; + Modes = rhdModeDelete(Modes, Mode); + Mode = Next; + } else + Mode = Mode->next; + } +} + +/* + * RandR entry point: fixup per Crtc and Output (in RandR speech) + * Due to misconceptions we might end up fixing *everything* here. + */ +int +RHDRRModeFixup(ScrnInfoPtr pScrn, DisplayModePtr Mode, struct rhdCrtc *Crtc, + struct rhdConnector *Connector, struct rhdOutput *Output, + struct rhdMonitor *Monitor, Bool ScaledMode) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int i, Status; + + ASSERT(Connector); + ASSERT(Output); + RHDFUNC(Output); + + Status = rhdModeSanity(rhdPtr, Mode); + if (Status != MODE_OK) + return Status; + + rhdModeFillOutCrtcValues(Mode); + + if (!ScaledMode) { + /* We don't want to loop around this forever */ + for (i = 0; i < RHD_MODE_VALIDATION_LOOPS; i++) { + Mode->CrtcHAdjusted = FALSE; + Mode->CrtcVAdjusted = FALSE; + + /* Sanitize */ + Status = rhdModeCrtcSanity(Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + if (Crtc) { + /* Check FB */ + Status = Crtc->FBValid(Crtc, Mode->CrtcHDisplay, Mode->CrtcVDisplay, + pScrn->bitsPerPixel, rhdPtr->FbScanoutStart, + rhdPtr->FbScanoutSize, NULL); + if (Status != MODE_OK) + return Status; + + if (Crtc->ScaleValid) { + Status = Crtc->ScaleValid(Crtc, RHD_CRTC_SCALE_TYPE_NONE, Mode, NULL); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + } + + /* Check Crtc */ + Status = Crtc->ModeValid(Crtc, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + /* Check PLL */ + if (Crtc->PLL->Valid) { + Status = Crtc->PLL->Valid(Crtc->PLL, Mode->Clock); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + } + } + + /* Check Output */ + Status = Output->ModeValid(Output, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + /* Check the monitor attached to this output */ + if (Connector->Monitor) + Status = rhdMonitorValid(Connector->Monitor, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + /* Seems to be good */ + break; + } + + if (i == RHD_MODE_VALIDATION_LOOPS) { + /* Mode has been bouncing around for ages, on adjustments */ + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: Mode \"%s\" (%dx%d:%3.1fMhz) was thrown around" + " for too long.\n", __func__, Mode->name, + Mode->HDisplay, Mode->VDisplay, Mode->Clock/1000.0); + return MODE_ERROR; + } + + /* throw them at the configured monitor */ + if (Monitor) { + Status = rhdMonitorValid(Monitor, Mode); + if (Status != MODE_OK) + return Status; + } + + } else { + if (Crtc) { + Status = rhdModeValidateCrtc(Crtc, Mode, VALIDATE_SCALE_FROM); + if (Status != MODE_OK) + return Status; + } + } + + /* Did we set up virtual resolution already? */ + if ((pScrn->virtualX > 0) && (pScrn->virtualY > 0)) { + if (pScrn->virtualX < Mode->CrtcHDisplay) + return MODE_VIRTUAL_X; + if (pScrn->virtualY < Mode->CrtcVDisplay) + return MODE_VIRTUAL_Y; + } + + return MODE_OK; +} + +/* + * RHDRRValidateScaledToMode(): like RHDValidateScaledMode() - but we cannot validate against a CRTC + * as this isn't known when this function is called. So at least validate against the 'output' here. + */ +int +RHDRRValidateScaledToMode(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + int Status; + int i; + + RHDFUNC(Output); + + Status = rhdModeSanity(rhdPtr, Mode); + if (Status != MODE_OK) + return Status; + + rhdModeFillOutCrtcValues(Mode); + + for (i = 0; i < RHD_MODE_VALIDATION_LOOPS; i++) { + + Mode->CrtcHAdjusted = FALSE; + Mode->CrtcVAdjusted = FALSE; + + Status = rhdModeCrtcSanity(Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + /* Check the output */ + Status = Output->ModeValid(Output, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; /* restart. */ + + /* Check the monitor attached to this output */ + if (Output->Connector && Output->Connector->Monitor) + Status = rhdMonitorValid(Output->Connector->Monitor, Mode); + if (Status != MODE_OK) + return Status; + if (Mode->CrtcHAdjusted || Mode->CrtcVAdjusted) + continue; + + break; + } + + if (i == RHD_MODE_VALIDATION_LOOPS) { + /* Mode has been bouncing around for ages, on adjustments */ + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: Mode \"%s\" (%dx%d:%3.1fMhz) was thrown around" + " for too long.\n", __func__, Mode->name, + Mode->HDisplay, Mode->VDisplay, Mode->Clock/1000.0); + return MODE_ERROR; + } + + /* Do we want to also validate against a configured monitor? */ + if (rhdPtr->ConfigMonitor) { + Status = rhdMonitorValid(rhdPtr->ConfigMonitor, Mode); + if (Status != MODE_OK) + return Status; + } + + return MODE_OK; +} + +/* + * RHDSynthModes(): synthesize CVT modes for well known resolutions. + * For now we assume we want reduced modes only. + */ +void +RHDSynthModes(int scrnIndex, DisplayModePtr Mode) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + DisplayModePtr Tmp; + unsigned int i; + + struct resolution{ + int x; + int y; + } resolution_list[] = { + { 320, 200 }, /* CGA */ + { 320, 240 }, /* QVGA */ + { 640, 480 }, /* VGA */ + { 720, 480 }, /* NTSC */ + { 854, 480 }, /* WVGA */ + { 768, 576 }, /* PAL */ + { 800, 600 }, /* SVGA */ + { 1024, 768 }, /* XGA */ + { 1152, 768 }, + { 1280, 720 }, /* HD720 */ + { 1280, 960 }, + { 1280, 854 }, + { 1280, 960 }, + { 1280, 1024 }, /* SXGA */ + { 1440, 960 }, + { 1400, 1050 }, /* SXGA+ */ + { 1680, 1050 }, /* WSXGA+ */ + { 1600, 1200 }, /* UXGA */ + { 1920, 1080 }, /* HD1080 */ + { 1920, 1200 }, /* WUXGA */ + { 2048, 1536 }, /* QXGA */ + { 2560, 1600 }, /* WQXGA */ + { 2560, 2048 } /* QSXGA */ + }; + + RHDFUNC(pScrn); + + for (i = 0; i < (sizeof(resolution_list) / sizeof(struct resolution)); i++) { + /* + * chances are that the native mode of a display is a CVT mode with 60 Hz. + * This will make RandR share the CRTC which is undesireable for scaling. + * This we 'tweak' the frequency to be slightly higher. + * Don't tell me it's ugly - I know this already. + */ + Tmp = RHDCVTMode(resolution_list[i].x, resolution_list[i].y, 60.5, TRUE, FALSE); + Tmp->status = MODE_OK; + rhdModeFillOutCrtcValues(Tmp); + xfree(Tmp->name); + Tmp->name = xnfalloc(20); + snprintf(Tmp->name, 20, "%ix%iScaled",resolution_list[i].x,resolution_list[i].y); + Tmp->type = M_T_BUILTIN; + if (rhdPtr->verbosity > 6) { + xf86DrvMsg(scrnIndex, X_INFO, "%s: Adding Modeline ",__func__); + RHDPrintModeline(Tmp); + } + RHDModesAdd(Mode, Tmp); + } +} diff --git a/driver/xf86-video-radeonhd/src/rhd_modes.h b/driver/xf86-video-radeonhd/src/rhd_modes.h new file mode 100644 index 000000000..be8aaa471 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_modes.h @@ -0,0 +1,85 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_MODES_H +#define _RHD_MODES_H + +/* + * Define a set of own mode errors. + */ +#define RHD_MODE_STATUS 0x51B00 +#ifndef MONREC_HAS_REDUCED +#define MODE_NO_REDUCED 0x01 + RHD_MODE_STATUS +#endif +#define MODE_MEM_BW 0x02 + RHD_MODE_STATUS +#define MODE_OUTPUT_UNDEF 0x03 + RHD_MODE_STATUS +#define MODE_NOT_PAL 0x04 + RHD_MODE_STATUS +#define MODE_NOT_NTSC 0x05 + RHD_MODE_STATUS +#define MODE_HTOTAL_WIDE 0x06 + RHD_MODE_STATUS +#define MODE_HDISPLAY_WIDE 0x07 + RHD_MODE_STATUS +#define MODE_HSYNC_RANGE 0x08 + RHD_MODE_STATUS +#define MODE_HBLANK_RANGE 0x09 + RHD_MODE_STATUS +#define MODE_VTOTAL_WIDE 0x0A + RHD_MODE_STATUS +#define MODE_VDISPLAY_WIDE 0x0B + RHD_MODE_STATUS +#define MODE_VSYNC_RANGE 0x0C + RHD_MODE_STATUS +#define MODE_VBLANK_RANGE 0x0D + RHD_MODE_STATUS +#define MODE_PITCH 0x0E + RHD_MODE_STATUS +#define MODE_OFFSET 0x0F + RHD_MODE_STATUS +#define MODE_MINHEIGHT 0x10 + RHD_MODE_STATUS +#define MODE_FIXED 0x11 + RHD_MODE_STATUS +#define MODE_SCALE 0x12 + RHD_MODE_STATUS +#define MODE_NO_ENCODER 0x13 + RHD_MODE_STATUS + +/* + * In case this isn't in xf86str.h yet. + */ +#ifndef M_T_PREFERRED +#define M_T_PREFERRED 0x08 +#endif +#ifndef M_T_DRIVER +#define M_T_DRIVER 0x40 +#endif + +DisplayModePtr RHDCVTMode(int HDisplay, int VDisplay, float VRefresh, + Bool Reduced, Bool Interlaced); +void RHDPrintModeline(DisplayModePtr mode); +DisplayModePtr RHDModesAdd(DisplayModePtr Modes, DisplayModePtr Additions); +const char *RHDModeStatusToString(int Status); + +DisplayModePtr RHDModesPoolCreate(ScrnInfoPtr pScrn, Bool Silent); +void RHDModesAttach(ScrnInfoPtr pScrn, DisplayModePtr Modes); +DisplayModePtr RHDModeCopy(DisplayModePtr Mode); + +Bool RHDGetVirtualFromConfig(ScrnInfoPtr pScrn); +void RHDGetVirtualFromModesAndFilter(ScrnInfoPtr pScrn, DisplayModePtr Modes, Bool Silent); + +int RHDRRModeFixup(ScrnInfoPtr pScrn, DisplayModePtr Mode, struct rhdCrtc *Crtc, + struct rhdConnector *Connector, struct rhdOutput *Output, + struct rhdMonitor *Monitor, Bool ScaledMode); +int RHDValidateScaledToMode(struct rhdCrtc *Crtc, DisplayModePtr Mode); +int RHDRRValidateScaledToMode(struct rhdOutput *Output, DisplayModePtr Mode); +void RHDSynthModes(int scrnIndex, DisplayModePtr Mode); + +#endif /* _RHD_MODES_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_monitor.c b/driver/xf86-video-radeonhd/src/rhd_monitor.c new file mode 100644 index 000000000..03448e857 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_monitor.c @@ -0,0 +1,514 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_XORG_CONFIG_H +#include +#endif +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#include "xf86DDC.h" +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_connector.h" +#include "rhd_modes.h" +#include "rhd_monitor.h" +#ifdef ATOM_BIOS +# include "rhd_atombios.h" +#endif + +/* From rhd_edid.c */ +void RHDMonitorEDIDSet(struct rhdMonitor *Monitor, xf86MonPtr EDID); + +/* + * + */ +void +RHDMonitorPrint(struct rhdMonitor *Monitor) +{ + int i; + + xf86Msg(X_NONE, " Bandwidth: %dMHz\n", Monitor->Bandwidth / 1000); + xf86Msg(X_NONE, " Horizontal timing:\n"); + for (i = 0; i < Monitor->numHSync; i++) + xf86Msg(X_NONE, " %3.1f - %3.1fkHz\n", Monitor->HSync[i].lo, + Monitor->HSync[i].hi); + xf86Msg(X_NONE, " Vertical timing:\n"); + for (i = 0; i < Monitor->numVRefresh; i++) + xf86Msg(X_NONE, " %3.1f - %3.1fHz\n", Monitor->VRefresh[i].lo, + Monitor->VRefresh[i].hi); + xf86Msg(X_NONE, " DPI: %dx%d\n", Monitor->xDpi, Monitor->yDpi); + if (Monitor->ReducedAllowed) + xf86Msg(X_NONE, " Allows reduced blanking.\n"); + if (Monitor->UseFixedModes) + xf86Msg(X_NONE, " Uses Fixed Modes.\n"); + + if (!Monitor->Modes) + xf86Msg(X_NONE, " No modes are provided.\n"); + else { + DisplayModePtr Mode; + + xf86Msg(X_NONE, " Attached modes:\n"); + for (Mode = Monitor->Modes; Mode; Mode = Mode->next) { + xf86Msg(X_NONE, " "); + RHDPrintModeline(Mode); + } + } +} + +/* + * + */ +static struct rhdMonitor * +rhdMonitorFromConfig(int scrnIndex, MonPtr Config) +{ + struct rhdMonitor *Monitor; + DisplayModePtr Mode; + int i; + + Monitor = xnfcalloc(sizeof(struct rhdMonitor), 1); + + Monitor->Name = xnfstrdup(Config->id); + Monitor->scrnIndex = scrnIndex; + + if (Config->nHsync) { + Monitor->numHSync = Config->nHsync; + for (i = 0; i < Config->nHsync; i++) { + Monitor->HSync[i].lo = Config->hsync[i].lo; + Monitor->HSync[i].hi = Config->hsync[i].hi; + } + } else if (!Monitor->numHSync) { + Monitor->numHSync = 3; + Monitor->HSync[0].lo = 31.5; + Monitor->HSync[0].hi = 31.5; + Monitor->HSync[1].lo = 35.15; + Monitor->HSync[1].hi = 35.15; + Monitor->HSync[2].lo = 35.5; + Monitor->HSync[2].hi = 35.5; + } + + if (Config->nVrefresh) { + Monitor->numVRefresh = Config->nVrefresh; + for (i = 0; i < Config->nVrefresh; i++) { + Monitor->VRefresh[i].lo = Config->vrefresh[i].lo; + Monitor->VRefresh[i].hi = Config->vrefresh[i].hi; + } + } else if (!Monitor->numVRefresh) { + Monitor->numVRefresh = 1; + Monitor->VRefresh[0].lo = 50; + Monitor->VRefresh[0].hi = 61; + } + +#ifdef MONREC_HAS_REDUCED + if (Config->reducedblanking) + Monitor->ReducedAllowed = TRUE; +#endif + + /* allow user to override settings globally */ + if (RHDPTRI(Monitor)->forceReduced.set) + Monitor->ReducedAllowed = RHDPTRI(Monitor)->forceReduced.val.bool; + +#ifdef MONREC_HAS_BANDWIDTH + if (Config->maxPixClock) + Monitor->Bandwidth = Config->maxPixClock; +#endif + + for (Mode = Config->Modes; Mode; Mode = Mode->next) + Monitor->Modes = RHDModesAdd(Monitor->Modes, RHDModeCopy(Mode)); + + return Monitor; +} + +/* + * + */ +static struct rhdMonitor * +rhdMonitorFromDefault(int scrnIndex, MonPtr Config) +{ + struct rhdMonitor *Monitor; + DisplayModePtr Mode; + + Monitor = xnfcalloc(sizeof(struct rhdMonitor), 1); + + Monitor->Name = xnfstrdup("Default (SVGA)"); + Monitor->scrnIndex = scrnIndex; + + /* timing for pathetic 14" svga monitors */ + Monitor->numHSync = 3; + Monitor->HSync[0].lo = 31.5; + Monitor->HSync[0].hi = 31.5; + Monitor->HSync[1].lo = 35.15; + Monitor->HSync[1].hi = 35.15; + Monitor->HSync[2].lo = 35.5; + Monitor->HSync[2].hi = 35.5; + + Monitor->numVRefresh = 1; + Monitor->VRefresh[0].lo = 50; + Monitor->VRefresh[0].hi = 61; + + /* Try to add configged modes anyway */ + if (Config) + for (Mode = Config->Modes; Mode; Mode = Mode->next) + Monitor->Modes = RHDModesAdd(Monitor->Modes, RHDModeCopy(Mode)); + + /* allow user to override settings globally */ + if (RHDPTRI(Monitor)->forceReduced.set) + Monitor->ReducedAllowed = RHDPTRI(Monitor)->forceReduced.val.bool; + + return Monitor; +} + +/* + * This function tries to handle a configured monitor correctly. + * + * This either can be forced through the option, or is used when + * no monitors are autodetected. + */ +void +RHDConfigMonitorSet(int scrnIndex, Bool UseConfig) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + MonPtr Config = pScrn->confScreen->monitor; + Bool HasConfig; + + int i; + + if (Config && Config->id && strcasecmp(Config->id, "")) + HasConfig = TRUE; + else + HasConfig = FALSE; + + for (i = 0; i < RHD_CONNECTORS_MAX; i++) + if (rhdPtr->Connector[i] && rhdPtr->Connector[i]->Monitor) + break; + + if (i == RHD_CONNECTORS_MAX) + xf86DrvMsg(scrnIndex, X_INFO, "No monitors autodetected; " + "attempting to work around this.\n"); + else if (HasConfig) { + xf86DrvMsg(scrnIndex, X_WARNING, "A Monitor section has been specified" + " in the config file.\n"); + xf86Msg(X_NONE, " This might badly affect mode validation, and might " + "make X fail.\n"); + xf86Msg(X_NONE, " Unless this section is absolutely necessary, comment" + " out the line\n" "\t\tMonitor \"%s\"\n" + " from the Screen section in your config file.\n", Config->id); + } + + if ((i == RHD_CONNECTORS_MAX) || UseConfig) { + if (HasConfig) + rhdPtr->ConfigMonitor = rhdMonitorFromConfig(scrnIndex, Config); + else + rhdPtr->ConfigMonitor = rhdMonitorFromDefault(scrnIndex, Config); + + xf86DrvMsg(scrnIndex, X_INFO, "Created monitor from %s: \"%s\":\n", + HasConfig ? "config" : "default", + rhdPtr->ConfigMonitor->Name); + + RHDMonitorPrint(rhdPtr->ConfigMonitor); + } +} + +/* + * Make sure that we keep only a single mode in our list. This mode should + * hopefully match our panel at native resolution correctly. + */ +static void +rhdPanelEDIDModesFilter(struct rhdMonitor *Monitor) +{ + DisplayModeRec *Best = Monitor->Modes, *Mode, *Temp; + + RHDFUNC(Monitor); + + if (!Best || !Best->next) + return; /* don't bother */ + + /* don't go for preferred, just take the biggest */ + for (Mode = Best->next; Mode; Mode = Mode->next) { + if (((Best->HDisplay <= Mode->HDisplay) && + (Best->VDisplay < Mode->VDisplay)) || + ((Best->HDisplay < Mode->HDisplay) && + (Best->VDisplay <= Mode->VDisplay))) + Best = Mode; + } + + xf86DrvMsg(Monitor->scrnIndex, X_INFO, "Monitor \"%s\": Using Mode \"%s\"" + " for native resolution.\n", Monitor->Name, Best->name); + + /* kill all other modes */ + Mode = Monitor->Modes; + while (Mode) { + Temp = Mode->next; + + if (Mode != Best) { + RHDDebug(Monitor->scrnIndex, "Monitor \"%s\": Discarding Mode \"%s\"\n", + Monitor->Name, Mode->name); + + xfree(Mode->name); + xfree(Mode); + } + + Mode = Temp; + } + + Best->next = NULL; + Best->prev = NULL; + Best->type |= M_T_PREFERRED; + Monitor->NativeMode = Best; + Monitor->Modes = Monitor->NativeMode; + Monitor->numHSync = 1; + Monitor->HSync[0].lo = Best->HSync; + Monitor->HSync[0].hi = Best->HSync; + Monitor->numVRefresh = 1; + Monitor->VRefresh[0].lo = Best->VRefresh; + Monitor->VRefresh[0].hi = Best->VRefresh; + Monitor->Bandwidth = Best->Clock; +} + +/* + * + */ +void +rhdMonitorPrintEDID(struct rhdMonitor *Monitor, xf86MonPtr EDID) +{ + xf86DrvMsg(EDID->scrnIndex, X_INFO, "EDID data for %s\n", + Monitor->Name); + xf86PrintEDID(EDID); +} + +/* + * Panels are the most complicated case we need to handle here. + * Information can come from several places, and we need to make sure + * that we end up with only the native resolution in our table. + */ +static struct rhdMonitor * +rhdMonitorPanel(struct rhdConnector *Connector) +{ + struct rhdMonitor *Monitor; + DisplayModeRec *Mode = NULL; + xf86MonPtr EDID = NULL; + + RHDFUNC(Connector); + + /* has priority over AtomBIOS EDID */ + if (Connector->DDC) + EDID = xf86DoEDID_DDC2(Connector->scrnIndex, Connector->DDC); + +#ifdef ATOM_BIOS + { + RHDPtr rhdPtr = RHDPTR(xf86Screens[Connector->scrnIndex]); + AtomBiosArgRec data; + AtomBiosResult Result; + + Result = RHDAtomBiosFunc(Connector->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_PANEL_MODE, &data); + if (Result == ATOM_SUCCESS) { + Mode = data.mode; + Mode->type |= M_T_PREFERRED; + } + if (!EDID) { + Result = RHDAtomBiosFunc(Connector->scrnIndex, + rhdPtr->atomBIOS, + ATOM_GET_PANEL_EDID, &data); + if (Result == ATOM_SUCCESS) + EDID = xf86InterpretEDID(Connector->scrnIndex, + data.EDIDBlock); + } + } +#endif + + Monitor = xnfcalloc(sizeof(struct rhdMonitor), 1); + + Monitor->scrnIndex = Connector->scrnIndex; + Monitor->EDID = EDID; + + if (Mode) { + Monitor->Name = xstrdup("LVDS Panel"); + Monitor->Modes = RHDModesAdd(Monitor->Modes, Mode); + Monitor->NativeMode = Mode; + Monitor->numHSync = 1; + Monitor->HSync[0].lo = Mode->HSync; + Monitor->HSync[0].hi = Mode->HSync; + Monitor->numVRefresh = 1; + Monitor->VRefresh[0].lo = Mode->VRefresh; + Monitor->VRefresh[0].hi = Mode->VRefresh; + Monitor->Bandwidth = Mode->SynthClock; + + /* Clueless atombios does give us a mode, but doesn't give us a + * DPI or a size. It is just perfect, right? */ + if (EDID) { + if (EDID->features.hsize) + Monitor->xDpi = (Mode->HDisplay * 2.54) / ((float) EDID->features.hsize) + 0.5; + if (EDID->features.vsize) + Monitor->yDpi = (Mode->VDisplay * 2.54) / ((float) EDID->features.vsize) + 0.5; + } + } else if (EDID) { + RHDMonitorEDIDSet(Monitor, EDID); + rhdPanelEDIDModesFilter(Monitor); + } else { + xf86DrvMsg(Connector->scrnIndex, X_ERROR, + "%s: No panel mode information found.\n", __func__); + xfree(Monitor); + return NULL; + } + + /* Fixup some broken modes - if we can do so, otherwise we might have no + * chance of driving the panel at all */ + if (Monitor->NativeMode) { + + /* Some Panels have H or VSyncEnd values greater than H or VTotal. */ + if (Monitor->NativeMode->HTotal <= Monitor->NativeMode->HSyncEnd) + Monitor->NativeMode->HTotal = Monitor->NativeMode->CrtcHTotal = Monitor->NativeMode->HSyncEnd + 1; + if (Monitor->NativeMode->VTotal <= Monitor->NativeMode->VSyncEnd) + Monitor->NativeMode->VTotal = Monitor->NativeMode->CrtcVTotal = Monitor->NativeMode->VSyncEnd + 1; + if (Monitor->NativeMode->CrtcHBlankEnd <= Monitor->NativeMode->CrtcHSyncEnd) + Monitor->NativeMode->CrtcHBlankEnd = Monitor->NativeMode->CrtcHSyncEnd + 1; + if (Monitor->NativeMode->CrtcVBlankEnd <= Monitor->NativeMode->CrtcVSyncEnd) + Monitor->NativeMode->CrtcVBlankEnd = Monitor->NativeMode->CrtcVSyncEnd + 1; + } + + /* panel should be driven at native resolution only. */ + Monitor->UseFixedModes = TRUE; + Monitor->ReducedAllowed = TRUE; + + if (EDID) + rhdMonitorPrintEDID(Monitor, EDID); + + return Monitor; +} + +/* + * rhdMonitorTV(): get TV modes. Currently we can only get this from AtomBIOS. + */ +static struct rhdMonitor * +rhdMonitorTV(struct rhdConnector *Connector) +{ + struct rhdMonitor *Monitor = NULL; +#ifdef ATOM_BIOS + ScrnInfoPtr pScrn = xf86Screens[Connector->scrnIndex]; + RHDPtr rhdPtr = RHDPTR(pScrn); + DisplayModeRec *Mode = NULL; + AtomBiosArgRec arg; + + RHDFUNC(Connector); + + arg.tvMode = rhdPtr->tvMode; + if (RHDAtomBiosFunc(Connector->scrnIndex, rhdPtr->atomBIOS, + ATOM_ANALOG_TV_MODE, &arg) + != ATOM_SUCCESS) + return NULL; + + Mode = arg.mode; + Mode->type |= M_T_PREFERRED; + + Monitor = xnfcalloc(sizeof(struct rhdMonitor), 1); + + Monitor->scrnIndex = Connector->scrnIndex; + Monitor->EDID = NULL; + + Monitor->Name = xstrdup("TV"); + Monitor->Modes = RHDModesAdd(Monitor->Modes, Mode); + Monitor->NativeMode= Mode; + Monitor->numHSync = 1; + Monitor->HSync[0].lo = Mode->HSync; + Monitor->HSync[0].hi = Mode->HSync; + Monitor->numVRefresh = 1; + Monitor->VRefresh[0].lo = Mode->VRefresh; + Monitor->VRefresh[0].hi = Mode->VRefresh; + Monitor->Bandwidth = Mode->SynthClock; + + /* TV should be driven at native resolution only. */ + Monitor->UseFixedModes = TRUE; + Monitor->ReducedAllowed = FALSE; + /* + * hack: the TV encoder takes care of that. + * The mode that goes in isn't what comes out. + */ + Mode->Flags &= ~(V_INTERLACE); +#endif + return Monitor; +} + +/* + * + */ +struct rhdMonitor * +RHDMonitorInit(struct rhdConnector *Connector) +{ + struct rhdMonitor *Monitor = NULL; + + RHDFUNC(Connector); + + if (Connector->Type == RHD_CONNECTOR_PANEL) + Monitor = rhdMonitorPanel(Connector); + else if (Connector->Type == RHD_CONNECTOR_TV) + Monitor = rhdMonitorTV(Connector); + else if (Connector->DDC) { + xf86MonPtr EDID = xf86DoEDID_DDC2(Connector->scrnIndex, Connector->DDC); + if (EDID) { + Monitor = xnfcalloc(sizeof(struct rhdMonitor), 1); + Monitor->scrnIndex = Connector->scrnIndex; + Monitor->EDID = EDID; + Monitor->NativeMode = NULL; + + RHDMonitorEDIDSet(Monitor, EDID); + rhdMonitorPrintEDID(Monitor, EDID); + } + } + + return Monitor; +} + +/* + * + */ +void +RHDMonitorDestroy(struct rhdMonitor *Monitor) +{ + DisplayModePtr Mode, Next; + + for (Mode = Monitor->Modes; Mode;) { + Next = Mode->next; + + xfree(Mode->name); + xfree(Mode); + + Mode = Next; + } + + if (Monitor->EDID) + xfree(Monitor->EDID->rawData); + xfree(Monitor->EDID); + xfree(Monitor->Name); + xfree(Monitor); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_monitor.h b/driver/xf86-video-radeonhd/src/rhd_monitor.h new file mode 100644 index 000000000..3a83d0d8a --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_monitor.h @@ -0,0 +1,62 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_MONITOR_H +#define _RHD_MONITOR_H + +struct rhdMonitor { + int scrnIndex; + + char *Name; + + int xDpi; + int yDpi; + + int numHSync; /* default: 0 */ + range HSync[MAX_HSYNC]; + int numVRefresh; /* default: 0 */ + range VRefresh[MAX_VREFRESH]; + int Bandwidth; /* default 0 */ + + Bool ReducedAllowed; + + Bool UseFixedModes; + DisplayModePtr Modes; /* default: NULL */ + DisplayModePtr NativeMode; + + xf86MonPtr EDID; +}; + + +void RHDConfigMonitorSet(int scrnIndex, Bool UseConfig); + +#ifdef _RHD_CONNECTOR_H +struct rhdMonitor *RHDMonitorInit(struct rhdConnector *Connector); +#endif + +void RHDMonitorDestroy(struct rhdMonitor *Monitor); +void RHDMonitorPrint(struct rhdMonitor *Monitor); + +#endif /* _RHD_MONITOR_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_output.c b/driver/xf86-video-radeonhd/src/rhd_output.c new file mode 100644 index 000000000..0e33d4e87 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_output.c @@ -0,0 +1,320 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_crtc.h" + +char *rhdPowerString[] = { + "POWER_ON", + "POWER_RESET", + "POWER_SHUTDOWN", + "POWER_UNKNOWN" +}; + +void +RHDOutputAdd(RHDPtr rhdPtr, struct rhdOutput *New) +{ + struct rhdOutput *Last = rhdPtr->Outputs; + + RHDFUNC(rhdPtr); + + if (!New) + return; + + if (Last) { + while (Last->Next) + Last = Last->Next; + + Last->Next = New; + } else + rhdPtr->Outputs = New; +} + +/* + * + */ +void +RHDOutputsMode(RHDPtr rhdPtr, struct rhdCrtc *Crtc, DisplayModePtr Mode) +{ + struct rhdOutput *Output = rhdPtr->Outputs; + + RHDFUNC(rhdPtr); + + while (Output) { + if (Output->Active && Output->Mode && (Output->Crtc == Crtc)) + Output->Mode(Output, Mode); + + Output = Output->Next; + } +} + +/* + * + */ +void +RHDOutputsPower(RHDPtr rhdPtr, int Power) +{ + struct rhdOutput *Output = rhdPtr->Outputs; + + RHDFUNC(rhdPtr); + + while (Output) { + if (Output->Active && Output->Power) + Output->Power(Output, Power); + + Output = Output->Next; + } +} + +/* + * + */ +void +RHDOutputsShutdownInactive(RHDPtr rhdPtr) +{ + struct rhdOutput *Output = rhdPtr->Outputs; + + RHDFUNC(rhdPtr); + + while (Output) { + if (!Output->Active && Output->Power) { + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Shutting down %s\n", Output->Name); + Output->Power(Output, RHD_POWER_SHUTDOWN); + } + + Output = Output->Next; + } +} + +/* + * + */ +void +RHDOutputsSave(RHDPtr rhdPtr) +{ + struct rhdOutput *Output = rhdPtr->Outputs; + + RHDFUNC(rhdPtr); + + while (Output) { + if (Output->Save) + Output->Save(Output); + + Output = Output->Next; + } +} + +/* + * + */ +void +RHDOutputsRestore(RHDPtr rhdPtr) +{ + struct rhdOutput *Output = rhdPtr->Outputs; + + RHDFUNC(rhdPtr); + + while (Output) { + if (Output->Restore) + Output->Restore(Output); + + Output = Output->Next; + } +} + +/* + * + */ +void +RHDOutputsDestroy(RHDPtr rhdPtr) +{ + struct rhdOutput *Output = rhdPtr->Outputs, *Next; + + RHDFUNC(rhdPtr); + + while (Output) { + Next = Output->Next; + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Destroying %s\n", Output->Name); + + if (Output->Destroy) + Output->Destroy(Output); + + if (Output->OutputDriverPrivate) + xfree(Output->OutputDriverPrivate); + xfree(Output); + + Output = Next; + } +} + +/* + * + */ +void +RHDOutputPrintSensedType(struct rhdOutput *Output) +{ + struct { enum rhdSensedOutput type; char *name; } + list[] = { { RHD_SENSED_NONE, "none" }, + { RHD_SENSED_VGA, "VGA" }, + { RHD_SENSED_DVI, "DVI" }, + { RHD_SENSED_TV_SVIDEO, "TV_SVIDEO"}, + { RHD_SENSED_TV_COMPOSITE, "TV_COMPOSITE" }, + { RHD_SENSED_TV_COMPONENT, "TV_COMPONENT" }, + { 0, NULL } + }; + int i = 0; + + while (list[i].name) { + if (list[i].type == Output->SensedType) { + xf86DrvMsgVerb(Output->scrnIndex, X_INFO, 3, + "%s: Sensed Output: %s\n",Output->Name, + list[i].name); + return; + } + i++; + } +} + +/* + * Attach an connector to the specified output and set output properties depending on the connector + */ +void +RHDOutputAttachConnector(struct rhdOutput *Output, struct rhdConnector *Connector) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + + if(Output->Connector == Connector) + return; /* output is already attached to this connector -> nothing todo */ + + Output->Connector = Connector; + + if(!Output->Property) /* property control available? */ + return; /* no -> we are done here */ + + /* yes -> check if we need to set any properties */ + if (Output->Property(Output, rhdPropertyCheck, RHD_OUTPUT_COHERENT, NULL)) { + union rhdPropertyData val; + switch(RhdParseBooleanOption(&rhdPtr->coherent, Connector->Name)) { + case RHD_OPTION_NOT_SET: + /* for compatibility with old implementation, test also output name */ + switch(RhdParseBooleanOption(&rhdPtr->coherent, Output->Name)) { + case RHD_OPTION_NOT_SET: + case RHD_OPTION_DEFAULT: + case RHD_OPTION_OFF: + val.Bool = FALSE; + break; + case RHD_OPTION_ON: + val.Bool = TRUE; + break; + } + break; + case RHD_OPTION_DEFAULT: + case RHD_OPTION_OFF: + val.Bool = FALSE; + break; + case RHD_OPTION_ON: + val.Bool = TRUE; + break; + } + if(Output->Property(Output, rhdPropertySet, RHD_OUTPUT_COHERENT, &val)) + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Setting %s to %scoherent\n", Output->Name, val.Bool ? "" : "in"); + else + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Failed to set %s to %scoherent\n", Output->Name, val.Bool ? "" : "in"); + } + + /* ask attached connector if EEDID or config options say we should enable HDMI */ + if (Output->Property(Output, rhdPropertyCheck, RHD_OUTPUT_HDMI, NULL)) { + union rhdPropertyData val; + val.Bool = RHDConnectorEnableHDMI(Connector); + if(!Output->Property(Output, rhdPropertySet, RHD_OUTPUT_HDMI, &val)) + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "Failed to %s HDMI on %s\n", val.Bool ? "disable" : "enable", Output->Name); + } + + /* check config option if we should enable audio workaround */ + if (Output->Property(Output, rhdPropertyCheck, RHD_OUTPUT_AUDIO_WORKAROUND, NULL)) { + union rhdPropertyData val; + switch(RhdParseBooleanOption(&rhdPtr->audioWorkaround, Connector->Name)) { + case RHD_OPTION_NOT_SET: + case RHD_OPTION_OFF: + val.Bool = FALSE; + break; + case RHD_OPTION_ON: + case RHD_OPTION_DEFAULT: + val.Bool = TRUE; + break; + } + if(!Output->Property(Output, rhdPropertySet, RHD_OUTPUT_AUDIO_WORKAROUND, &val)) + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "Failed to %s audio workaorund on %s\n", + val.Bool ? "disable" : "enable", Output->Name); + } +} + +/* + * Returns the TMDS index of the given output, important for HDMI/Audio setup + */ +int +RHDOutputTmdsIndex(struct rhdOutput *Output) +{ + struct rhdOutput *i = RHDPTRI(Output)->Outputs; + int index; + + switch(Output->Id) { + case RHD_OUTPUT_TMDSA: + case RHD_OUTPUT_UNIPHYA: + index=0; + break; + + case RHD_OUTPUT_LVTMA: + /* special case check if an TMDSA is present */ + index=0; + while(i) { + if(i->Id==RHD_OUTPUT_TMDSA) + index++; + i = i->Next; + } + break; + + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_KLDSKP_LVTMA: + index=1; + break; + + default: + xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: unsupported output type\n", __func__); + index=-1; + break; + } + return index; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_output.h b/driver/xf86-video-radeonhd/src/rhd_output.h new file mode 100644 index 000000000..4862478f7 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_output.h @@ -0,0 +1,130 @@ +/* + * Copyright 2004-2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_OUTPUT_H +#define _RHD_OUTPUT_H + +/* Also needed for connector -> output mapping */ +typedef enum rhdOutputType { + RHD_OUTPUT_NONE = 0, + RHD_OUTPUT_DAC_EXTERNAL = RHD_OUTPUT_NONE, + RHD_OUTPUT_DACA, + RHD_OUTPUT_DACB, + RHD_OUTPUT_TMDSA, + RHD_OUTPUT_LVTMA, + RHD_OUTPUT_DVO, + RHD_OUTPUT_KLDSKP_LVTMA, + RHD_OUTPUT_UNIPHYA, + RHD_OUTPUT_UNIPHYB, + RHD_OUTPUT_UNIPHYC, + RHD_OUTPUT_UNIPHYD, + RHD_OUTPUT_UNIPHYE, + RHD_OUTPUT_UNIPHYF, + RHD_OUTPUT_TMDSB = RHD_OUTPUT_NONE, + RHD_OUTPUT_LVDS = RHD_OUTPUT_NONE, + RHD_OUTPUT_LVTMB = RHD_OUTPUT_NONE +} rhdOutputType; + +typedef enum rhdSensedOutput { + RHD_SENSED_NONE = 0, + RHD_SENSED_VGA, + RHD_SENSED_DVI, + RHD_SENSED_TV_SVIDEO, + RHD_SENSED_TV_COMPOSITE, + RHD_SENSED_TV_COMPONENT +} rhdSensedOutput; + +enum rhdOutputProperty { + RHD_OUTPUT_BACKLIGHT, + RHD_OUTPUT_COHERENT, + RHD_OUTPUT_HDMI, + RHD_OUTPUT_AUDIO_WORKAROUND +}; + +enum rhdOutputAllocation { + RHD_OUTPUT_ALLOC, + RHD_OUTPUT_FREE +}; + +char *rhdPowerString[4]; + +/* + * + * This structure should deal with everything output related. + * + */ +struct rhdOutput { + struct rhdOutput *Next; + + int scrnIndex; + + char *Name; + enum rhdOutputType Id; + + Bool Active; + + struct rhdCrtc *Crtc; + struct rhdConnector *Connector; + + enum rhdSensedOutput SensedType; + + enum rhdSensedOutput (*Sense) (struct rhdOutput *Output, + struct rhdConnector *Connector); + ModeStatus (*ModeValid) (struct rhdOutput *Output, DisplayModePtr Mode); + void (*Mode) (struct rhdOutput *Output, DisplayModePtr Mode); + void (*Power) (struct rhdOutput *Output, int Power); + void (*Save) (struct rhdOutput *Output); + void (*Restore) (struct rhdOutput *Output); + void (*Destroy) (struct rhdOutput *Output); + Bool (*Property) (struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val); + Bool (*AllocFree) (struct rhdOutput *Output, enum rhdOutputAllocation Alloc); + /* Driver Private data */ + rhdOutputDriverPrivate *OutputDriverPrivate; + /* Output Private data */ + void *Private; +}; + +void RHDOutputAdd(RHDPtr rhdPtr, struct rhdOutput *Output); +void RHDOutputsMode(RHDPtr rhdPtr, struct rhdCrtc *Crtc, DisplayModePtr Mode); +void RHDOutputsPower(RHDPtr rhdPtr, int Power); +void RHDOutputsShutdownInactive(RHDPtr rhdPtr); +void RHDOutputsSave(RHDPtr rhdPtr); +void RHDOutputsRestore(RHDPtr rhdPtr); +void RHDOutputsDestroy(RHDPtr rhdPtr); +void RHDOutputPrintSensedType(struct rhdOutput *Output); +void RHDOutputAttachConnector(struct rhdOutput *Output, struct rhdConnector *Connector); +int RHDOutputTmdsIndex(struct rhdOutput *Output); + +/* output local functions. */ +struct rhdOutput *RHDDACAInit(RHDPtr rhdPtr); +struct rhdOutput *RHDDACBInit(RHDPtr rhdPtr); +struct rhdOutput *RHDTMDSAInit(RHDPtr rhdPtr); +struct rhdOutput *RHDLVTMAInit(RHDPtr rhdPtr, CARD8 Type); +struct rhdOutput *RHDDIGInit(RHDPtr rhdPtr, enum rhdOutputType outputType, CARD8 ConnectorType); +struct rhdOutput *RHDDDIAInit(RHDPtr rhdPtr); +struct rhdOutput *RHDAtomOutputInit(RHDPtr rhdPtr, enum rhdConnectorType ConnectorType, enum rhdOutputType OutputType); + +#endif /* _RHD_OUTPUT_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_pll.c b/driver/xf86-video-radeonhd/src/rhd_pll.c new file mode 100644 index 000000000..6200dda0d --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_pll.c @@ -0,0 +1,1559 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_pll.h" +#include "rhd_regs.h" +#include "rhd_atombios.h" + + +#define PLL_CALIBRATE_WAIT 0x100000 + +/* + * Get gain, charge pump, loop filter and current bias. + * For R500, this is done in atombios by ASIC_RegistersInit + * Some data table in atom should've provided this information. + */ + +struct PLL_Control { + CARD16 FeedbackDivider; /* 0xFFFF/-1 is the endmarker here */ + CARD32 Control; +}; + +/* From hardcoded values. */ +static struct PLL_Control RV610PLLControl[] = +{ + { 0x0049, 0x159F8704 }, + { 0x006C, 0x159B8704 }, + { 0xFFFF, 0x159EC704 } +}; + +/* Some tables are provided by atombios, + * it's just that they are hidden away deliberately and not exposed */ +static struct PLL_Control RV670PLLControl[] = +{ + { 0x004A, 0x159FC704 }, + { 0x0067, 0x159BC704 }, + { 0x00C4, 0x159EC704 }, + { 0x00F4, 0x1593A704 }, + { 0x0136, 0x1595A704 }, + { 0x01A4, 0x1596A704 }, + { 0x022C, 0x159CE504 }, + { 0xFFFF, 0x1591E404 } +}; + +/* + * Used by PLLElectrical() for r5xx+ and by rv620/35 code. + */ +static CARD32 +PLLControlTableRetrieve(struct PLL_Control *Table, CARD16 FeedbackDivider) +{ + int i; + + for (i = 0; Table[i].FeedbackDivider < 0xFFFF ; i++) + if (Table[i].FeedbackDivider >= FeedbackDivider) + break; + + return Table[i].Control; +} + +/* + * Not used by rv620/35 code. + */ +static CARD32 +PLLElectrical(RHDPtr rhdPtr, CARD16 FeedbackDivider) +{ + switch (rhdPtr->ChipSet) { + case RHD_RV515: + if (rhdPtr->PciDeviceID == 0x7146) + return 0x00120704; + else + return 0; + case RHD_RV535: + if (rhdPtr->PciDeviceID == 0x71C1) + return 0x00230704; + else + return 0; + case RHD_RS600: + case RHD_RS690: + case RHD_RS740: + /* depending on MiscInfo also 0x00120004 */ + return 0x00120704; + case RHD_R600: + return 0x01130704; + case RHD_RV610: + case RHD_RV630: + case RHD_M72: + case RHD_M74: + case RHD_M76: + return PLLControlTableRetrieve(RV610PLLControl, FeedbackDivider); + case RHD_RV670: + case RHD_R680: + return PLLControlTableRetrieve(RV670PLLControl, FeedbackDivider); + default: + return 0; + } +} + +/* + * All R500s, RS6x0, R600, RV610 and RV630. + */ + +/* + * + */ +static void +PLL1Calibrate(struct rhdPLL *PLL) +{ + int i; + + RHDFUNC(PLL); + + RHDRegMask(PLL, P1PLL_CNTL, 1, 0x01); /* Reset */ + usleep(2); + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x01); /* Set */ + for (i = 0; i < PLL_CALIBRATE_WAIT; i++) + if (((RHDRegRead(PLL, P1PLL_CNTL) >> 20) & 0x03) == 0x03) + break; + + if (i == PLL_CALIBRATE_WAIT) { + if (RHDRegRead(PLL, P1PLL_CNTL) & 0x00100000) /* Calibration done? */ + xf86DrvMsg(PLL->scrnIndex, X_ERROR, + "%s: Calibration failed.\n", __func__); + if (RHDRegRead(PLL, P1PLL_CNTL) & 0x00200000) /* PLL locked? */ + xf86DrvMsg(PLL->scrnIndex, X_ERROR, + "%s: Locking failed.\n", __func__); + } else + RHDDebug(PLL->scrnIndex, "%s: lock in %d loops\n", __func__, i); +} + +/* + * + */ +static void +PLL2Calibrate(struct rhdPLL *PLL) +{ + int i; + + RHDFUNC(PLL); + + RHDRegMask(PLL, P2PLL_CNTL, 1, 0x01); /* Reset */ + usleep(2); + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x01); /* Set */ + + for (i = 0; i < PLL_CALIBRATE_WAIT; i++) + if (((RHDRegRead(PLL, P2PLL_CNTL) >> 20) & 0x03) == 0x03) + break; + + if (i == PLL_CALIBRATE_WAIT) { + if (RHDRegRead(PLL, P2PLL_CNTL) & 0x00100000) /* Calibration done? */ + xf86DrvMsg(PLL->scrnIndex, X_ERROR, + "%s: Calibration failed.\n", __func__); + if (RHDRegRead(PLL, P2PLL_CNTL) & 0x00200000) /* PLL locked? */ + xf86DrvMsg(PLL->scrnIndex, X_ERROR, + "%s: Locking failed.\n", __func__); + } else + RHDDebug(PLL->scrnIndex, "%s: lock in %d loops\n", __func__, i); +} + +/* + * + */ +static void +R500PLL1Power(struct rhdPLL *PLL, int Power) +{ + RHDFUNC(PLL); + + switch (Power) { + case RHD_POWER_ON: + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + PLL1Calibrate(PLL); + + return; + case RHD_POWER_RESET: + RHDRegMask(PLL, P1PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + return; + case RHD_POWER_SHUTDOWN: + default: + RHDRegMask(PLL, P1PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + RHDRegMask(PLL, P1PLL_CNTL, 0x02, 0x02); /* Power down */ + usleep(200); + + return; + } +} + +/* + * + */ +static void +R500PLL2Power(struct rhdPLL *PLL, int Power) +{ + RHDFUNC(PLL); + + switch (Power) { + case RHD_POWER_ON: + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + PLL2Calibrate(PLL); + + return; + case RHD_POWER_RESET: + RHDRegMask(PLL, P2PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + return; + case RHD_POWER_SHUTDOWN: + default: + RHDRegMask(PLL, P2PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + RHDRegMask(PLL, P2PLL_CNTL, 0x02, 0x02); /* Power down */ + usleep(200); + + return; + } +} + +/* + * + */ +static void +R500PLL1SetLow(struct rhdPLL *PLL, CARD32 RefDiv, CARD32 FBDiv, CARD32 PostDiv, + CARD32 Control) +{ + RHDFUNC(PLL); + RHDRegWrite(PLL, EXT1_PPLL_REF_DIV_SRC, 0x01); /* XTAL */ + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV_SRC, 0x00); /* source = reference */ + + RHDRegWrite(PLL, EXT1_PPLL_UPDATE_LOCK, 0x01); /* lock */ + + RHDRegWrite(PLL, EXT1_PPLL_REF_DIV, RefDiv); + RHDRegWrite(PLL, EXT1_PPLL_FB_DIV, FBDiv); + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV, PostDiv); + RHDRegWrite(PLL, EXT1_PPLL_CNTL, Control); + + RHDRegMask(PLL, EXT1_PPLL_UPDATE_CNTL, 0x00010000, 0x00010000); /* no autoreset */ + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x04); /* don't bypass calibration */ + + /* We need to reset the anti glitch logic */ + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x00000002); /* power up */ + + /* reset anti glitch logic */ + RHDRegMask(PLL, P1PLL_CNTL, 0x00002000, 0x00002000); + usleep(2); + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x00002000); + + /* powerdown and reset */ + RHDRegMask(PLL, P1PLL_CNTL, 0x00000003, 0x00000003); + usleep(2); + + RHDRegWrite(PLL, EXT1_PPLL_UPDATE_LOCK, 0); /* unlock */ + RHDRegMask(PLL, EXT1_PPLL_UPDATE_CNTL, 0, 0x01); /* we're done updating! */ + + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + PLL1Calibrate(PLL); + + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV_SRC, 0x01); /* source is PLL itself */ +} + +/* + * + */ +static void +R500PLL2SetLow(struct rhdPLL *PLL, CARD32 RefDiv, CARD32 FBDiv, CARD32 PostDiv, + CARD32 Control) +{ + RHDRegWrite(PLL, EXT2_PPLL_REF_DIV_SRC, 0x01); /* XTAL */ + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV_SRC, 0x00); /* source = reference */ + + RHDRegWrite(PLL, EXT2_PPLL_UPDATE_LOCK, 0x01); /* lock */ + + RHDRegWrite(PLL, EXT2_PPLL_REF_DIV, RefDiv); + RHDRegWrite(PLL, EXT2_PPLL_FB_DIV, FBDiv); + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV, PostDiv); + RHDRegWrite(PLL, EXT2_PPLL_CNTL, Control); + + RHDRegMask(PLL, EXT2_PPLL_UPDATE_CNTL, 0x00010000, 0x00010000); /* no autoreset */ + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x04); /* don't bypass calibration */ + + /* We need to reset the anti glitch logic */ + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x00000002); /* power up */ + + /* reset anti glitch logic */ + RHDRegMask(PLL, P2PLL_CNTL, 0x00002000, 0x00002000); + usleep(2); + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x00002000); + + /* powerdown and reset */ + RHDRegMask(PLL, P2PLL_CNTL, 0x00000003, 0x00000003); + usleep(2); + + RHDRegWrite(PLL, EXT2_PPLL_UPDATE_LOCK, 0); /* unlock */ + RHDRegMask(PLL, EXT2_PPLL_UPDATE_CNTL, 0, 0x01); /* we're done updating! */ + + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + PLL2Calibrate(PLL); + + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV_SRC, 0x01); /* source is PLL itself */ +} + +/* + * The CRTC ownership of each PLL is multiplexed on the PLL blocks, and the + * ownership can only be switched when the currently referenced PLL is active. + * This makes handling a slight bit more complex. + */ +static void +R500PLLCRTCGrab(struct rhdPLL *PLL, Bool Crtc2) +{ + CARD32 Stored; + Bool PLL2IsCurrent; + + if (!Crtc2) { + PLL2IsCurrent = RHDRegRead(PLL, PCLK_CRTC1_CNTL) & 0x00010000; + + if (PLL->Id == PLL_ID_PLL1) + RHDRegMask(PLL, PCLK_CRTC1_CNTL, 0, 0x00010000); + else + RHDRegMask(PLL, PCLK_CRTC1_CNTL, 0x00010000, 0x00010000); + } else { + PLL2IsCurrent = RHDRegRead(PLL, PCLK_CRTC2_CNTL) & 0x00010000; + + if (PLL->Id == PLL_ID_PLL1) + RHDRegMask(PLL, PCLK_CRTC2_CNTL, 0, 0x00010000); + else + RHDRegMask(PLL, PCLK_CRTC2_CNTL, 0x00010000, 0x00010000); + } + + /* if the current pll is not active, then poke it just enough to flip + * owners */ + if (!PLL2IsCurrent) { + Stored = RHDRegRead(PLL, P1PLL_CNTL); + + if (Stored & 0x03) { + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x03); + usleep(10); + RHDRegMask(PLL, P1PLL_CNTL, Stored, 0x03); + } + } else { + Stored = RHDRegRead(PLL, P2PLL_CNTL); + + if (Stored & 0x03) { + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x03); + usleep(10); + RHDRegMask(PLL, P2PLL_CNTL, Stored, 0x03); + } + } +} + +/* + * + */ +static void +R500PLL1Set(struct rhdPLL *PLL, int PixelClock, CARD16 ReferenceDivider, + CARD16 FeedbackDivider, CARD8 PostDivider) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + CARD32 RefDiv, FBDiv, PostDiv, Control; + + RHDFUNC(PLL); + + RefDiv = ReferenceDivider; + + FBDiv = FeedbackDivider << 16; + + if (rhdPtr->ChipSet > RHD_R600) { /* set up Feedbackdivider slip */ + if (FeedbackDivider <= 0x24) + FBDiv |= 0x00000030; + else if (FeedbackDivider <= 0x3F) + FBDiv |= 0x00000020; + } else if (rhdPtr->ChipSet >= RHD_RS600) /* RS600, RS690, R600 */ + FBDiv |= 0x00000030; + else + FBDiv |= RHDRegRead(PLL, EXT1_PPLL_FB_DIV) & 0x00000030; + + PostDiv = RHDRegRead(PLL, EXT1_PPLL_POST_DIV) & ~0x0000007F; + PostDiv |= PostDivider & 0x0000007F; + + Control = PLLElectrical(rhdPtr, FeedbackDivider); + if (!Control) + Control = RHDRegRead(PLL, EXT1_PPLL_CNTL); + + /* Disable Spread Spectrum */ + RHDRegMask(PLL, P1PLL_INT_SS_CNTL, 0, 0x00000001); + + R500PLL1SetLow(PLL, RefDiv, FBDiv, PostDiv, Control); + + if (rhdPtr->Crtc[0]->PLL == PLL) + R500PLLCRTCGrab(PLL, FALSE); + if (rhdPtr->Crtc[1]->PLL == PLL) + R500PLLCRTCGrab(PLL, TRUE); +} + +/* + * + */ +static void +R500PLL2Set(struct rhdPLL *PLL, int PixelClock, CARD16 ReferenceDivider, + CARD16 FeedbackDivider, CARD8 PostDivider) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + CARD32 RefDiv, FBDiv, PostDiv, Control; + + RHDFUNC(PLL); + + RefDiv = ReferenceDivider; + + FBDiv = FeedbackDivider << 16; + + if (rhdPtr->ChipSet > RHD_R600) { /* set up Feedbackdivider slip */ + if (FeedbackDivider <= 0x24) + FBDiv |= 0x00000030; + else if (FeedbackDivider <= 0x3F) + FBDiv |= 0x00000020; + } else if (rhdPtr->ChipSet >= RHD_RS600) /* RS600, RS690, R600 */ + FBDiv |= 0x00000030; + else + FBDiv |= RHDRegRead(PLL, EXT2_PPLL_FB_DIV) & 0x00000030; + + PostDiv = RHDRegRead(PLL, EXT2_PPLL_POST_DIV) & ~0x0000007F; + PostDiv |= PostDivider & 0x0000007F; + + Control = PLLElectrical(rhdPtr, FeedbackDivider); + if (!Control) + Control = RHDRegRead(PLL, EXT2_PPLL_CNTL); + + /* Disable Spread Spectrum */ + RHDRegMask(PLL, P2PLL_INT_SS_CNTL, 0, 0x00000001); + + R500PLL2SetLow(PLL, RefDiv, FBDiv, PostDiv, Control); + + if (rhdPtr->Crtc[0]->PLL == PLL) + R500PLLCRTCGrab(PLL, FALSE); + if (rhdPtr->Crtc[1]->PLL == PLL) + R500PLLCRTCGrab(PLL, TRUE); +} + +/* + * + */ +static void +R500PLL1Save(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + PLL->StoreActive = !(RHDRegRead(PLL, P1PLL_CNTL) & 0x03); + PLL->StoreRefDiv = RHDRegRead(PLL, EXT1_PPLL_REF_DIV); + PLL->StoreFBDiv = RHDRegRead(PLL, EXT1_PPLL_FB_DIV); + PLL->StorePostDiv = RHDRegRead(PLL, EXT1_PPLL_POST_DIV); + PLL->StoreControl = RHDRegRead(PLL, EXT1_PPLL_CNTL); + PLL->StoreSpreadSpectrum = RHDRegRead(PLL, P1PLL_INT_SS_CNTL); + PLL->StoreCrtc1Owner = !(RHDRegRead(PLL, PCLK_CRTC1_CNTL) & 0x00010000); + PLL->StoreCrtc2Owner = !(RHDRegRead(PLL, PCLK_CRTC2_CNTL) & 0x00010000); + + PLL->Stored = TRUE; +} + +/* + * + */ +static void +R500PLL2Save(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + PLL->StoreActive = !(RHDRegRead(PLL, P2PLL_CNTL) & 0x03); + PLL->StoreRefDiv = RHDRegRead(PLL, EXT2_PPLL_REF_DIV); + PLL->StoreFBDiv = RHDRegRead(PLL, EXT2_PPLL_FB_DIV); + PLL->StorePostDiv = RHDRegRead(PLL, EXT2_PPLL_POST_DIV); + PLL->StoreControl = RHDRegRead(PLL, EXT2_PPLL_CNTL); + PLL->StoreSpreadSpectrum = RHDRegRead(PLL, P2PLL_INT_SS_CNTL); + PLL->StoreCrtc1Owner = RHDRegRead(PLL, PCLK_CRTC1_CNTL) & 0x00010000; + PLL->StoreCrtc2Owner = RHDRegRead(PLL, PCLK_CRTC2_CNTL) & 0x00010000; + + PLL->Stored = TRUE; +} + +/* + * + */ +static void +R500PLL1Restore(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + if (!PLL->Stored) { + xf86DrvMsg(PLL->scrnIndex, X_ERROR, "%s: %s: trying to restore " + "uninitialized values.\n", __func__, PLL->Name); + return; + } + + if (PLL->StoreActive) { + R500PLL1SetLow(PLL, PLL->StoreRefDiv, PLL->StoreFBDiv, + PLL->StorePostDiv, PLL->StoreControl); + + /* HotFix: always keep spread spectrum disabled on restore */ + if (0 && RHDPTRI(PLL)->ChipSet != RHD_M54) + RHDRegMask(PLL, P1PLL_INT_SS_CNTL, + PLL->StoreSpreadSpectrum, 0x00000001); + } else { + PLL->Power(PLL, RHD_POWER_SHUTDOWN); + + /* lame attempt at at least restoring the old values */ + RHDRegWrite(PLL, EXT1_PPLL_REF_DIV, PLL->StoreRefDiv); + RHDRegWrite(PLL, EXT1_PPLL_FB_DIV, PLL->StoreFBDiv); + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV, PLL->StorePostDiv); + RHDRegWrite(PLL, EXT1_PPLL_CNTL, PLL->StoreControl); + RHDRegWrite(PLL, P1PLL_INT_SS_CNTL, PLL->StoreSpreadSpectrum); + } + + if (PLL->StoreCrtc1Owner) + R500PLLCRTCGrab(PLL, FALSE); + if (PLL->StoreCrtc2Owner) + R500PLLCRTCGrab(PLL, TRUE); +} + +/* + * + */ +static void +R500PLL2Restore(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + if (!PLL->Stored) { + xf86DrvMsg(PLL->scrnIndex, X_ERROR, "%s: %s: trying to restore " + "uninitialized values.\n", __func__, PLL->Name); + return; + } + + if (PLL->StoreActive) { + R500PLL2SetLow(PLL, PLL->StoreRefDiv, PLL->StoreFBDiv, + PLL->StorePostDiv, PLL->StoreControl); + + if (RHDPTRI(PLL)->ChipSet != RHD_M54) + RHDRegMask(PLL, P2PLL_INT_SS_CNTL, + PLL->StoreSpreadSpectrum, 0x00000001); + } else { + PLL->Power(PLL, RHD_POWER_SHUTDOWN); + + /* lame attempt at at least restoring the old values */ + RHDRegWrite(PLL, EXT2_PPLL_REF_DIV, PLL->StoreRefDiv); + RHDRegWrite(PLL, EXT2_PPLL_FB_DIV, PLL->StoreFBDiv); + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV, PLL->StorePostDiv); + RHDRegWrite(PLL, EXT2_PPLL_CNTL, PLL->StoreControl); + RHDRegWrite(PLL, P2PLL_INT_SS_CNTL, PLL->StoreSpreadSpectrum); + } + + if (PLL->StoreCrtc1Owner) + R500PLLCRTCGrab(PLL, FALSE); + if (PLL->StoreCrtc2Owner) + R500PLLCRTCGrab(PLL, TRUE); +} + +/* + * RV620 and up + */ + +/* + * + */ +#define RV620_DCCGCLK_RESET 0 +#define RV620_DCCGCLK_GRAB 1 +#define RV620_DCCGCLK_RELEASE 2 + +/* + * I still have no idea what DCCG stands for and why it needs to hook off some + * pixelclock... + */ +static void +RV620DCCGCLKSet(struct rhdPLL *PLL, int set) +{ + CARD32 tmp; + + RHDFUNC(PLL); + + switch(set) { + case RV620_DCCGCLK_GRAB: + if (PLL->Id == PLL_ID_PLL1) + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 0, 0x00000003); + else if (PLL->Id == PLL_ID_PLL2) + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 1, 0x00000003); + else + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 3, 0x00000003); + break; + case RV620_DCCGCLK_RELEASE: + tmp = RHDRegRead(PLL, DCCG_DISP_CLK_SRCSEL) & 0x03; + + if ((PLL->Id == PLL_ID_PLL1) && (tmp == 0)) { + /* set to other PLL or external */ + tmp = RHDRegRead(PLL, P2PLL_CNTL); + if (!(tmp & 0x03) && /* powered and not in reset */ + ((tmp & 0x00300000) == 0x00300000)) /* calibrated and locked */ + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 1, 0x00000003); + else + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 3, 0x00000003); + } else if ((PLL->Id == PLL_ID_PLL2) && (tmp == 1)) { + /* set to other PLL or external */ + tmp = RHDRegRead(PLL, P1PLL_CNTL); + if (!(tmp & 0x03) && /* powered and not in reset */ + ((tmp & 0x00300000) == 0x00300000)) /* calibrated and locked */ + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 0, 0x00000003); + else + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 3, 0x00000003); + + } /* no other action needs to be taken */ + break; + case RV620_DCCGCLK_RESET: + tmp = RHDRegRead(PLL, DCCG_DISP_CLK_SRCSEL) & 0x03; + + if (((PLL->Id == PLL_ID_PLL1) && (tmp == 0)) || + ((PLL->Id == PLL_ID_PLL2) && (tmp == 1))) + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 3, 0x00000003); + break; + default: + break; + } +} + +/* + * + */ +static Bool +RV620DCCGCLKAvailable(struct rhdPLL *PLL) +{ + CARD32 Dccg = RHDRegRead(PLL, DCCG_DISP_CLK_SRCSEL) & 0x03; + + RHDFUNC(PLL); + + if (Dccg & 0x02) + return TRUE; + + if ((PLL->Id == PLL_ID_PLL1) && (Dccg == 0)) + return TRUE; + if ((PLL->Id == PLL_ID_PLL2) && (Dccg == 1)) + return TRUE; + + return FALSE; +} + +/* + * + */ +static void +RV620PLL1Power(struct rhdPLL *PLL, int Power) +{ + RHDFUNC(PLL); + + switch (Power) { + case RHD_POWER_ON: + { + Bool HasDccg = RV620DCCGCLKAvailable(PLL); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RESET); + + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + PLL1Calibrate(PLL); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_GRAB); + return; + } + case RHD_POWER_RESET: + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RELEASE); + + RHDRegMask(PLL, P1PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + return; + case RHD_POWER_SHUTDOWN: + default: + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RELEASE); + + RHDRegMask(PLL, P1PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + /* Sometimes we have to keep unused PLL running, see bug #18016 */ + if ((RHDRegRead(PLL, RV620_EXT1_DIFF_POST_DIV_CNTL) & RV62_EXT1_DIFF_DRIVER_ENABLE) == 0) + RHDRegMask(PLL, P1PLL_CNTL, 0x02, 0x02); /* Power down */ + else + xf86DrvMsg(PLL->scrnIndex, X_WARNING, "PHYA differential clock driver not disabled\n"); + usleep(200); + + RHDRegMask(PLL, P1PLL_CNTL, 0x2000, 0x2000); /* reset anti-glitch */ + + return; + } +} + +/* + * + */ +static void +RV620PLL2Power(struct rhdPLL *PLL, int Power) +{ + RHDFUNC(PLL); + + switch (Power) { + case RHD_POWER_ON: + { + Bool HasDccg = RV620DCCGCLKAvailable(PLL); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RESET); + + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + PLL2Calibrate(PLL); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_GRAB); + return; + } + case RHD_POWER_RESET: + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RELEASE); + + RHDRegMask(PLL, P2PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x02); /* Powah */ + usleep(2); + + return; + case RHD_POWER_SHUTDOWN: + default: + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RELEASE); + + RHDRegMask(PLL, P2PLL_CNTL, 0x01, 0x01); /* Reset */ + usleep(2); + + /* Sometimes we have to keep unused PLL running, see bug #18016 */ + if ((RHDRegRead(PLL, RV620_EXT2_DIFF_POST_DIV_CNTL) & RV62_EXT2_DIFF_DRIVER_ENABLE) == 0) + RHDRegMask(PLL, P2PLL_CNTL, 0x02, 0x02); /* Power down */ + else + xf86DrvMsg(PLL->scrnIndex, X_WARNING, "PHYB differential clock driver not disabled\n"); + usleep(200); + + RHDRegMask(PLL, P2PLL_CNTL, 0x2000, 0x2000); /* reset anti-glitch */ + + return; + } +} + +/* + * + */ +static void +RV620PLL1SetLow(struct rhdPLL *PLL, CARD32 RefDiv, CARD32 FBDiv, CARD32 PostDiv, + CARD8 ScalerDiv, CARD8 SymPostDiv, CARD32 Control) +{ + RHDFUNC(PLL); + + /* switch to external */ + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV_SRC, 0); + RHDRegMask(PLL, P1PLL_DISP_CLK_CNTL, 0x00000200, 0x00000300); + RHDRegMask(PLL, EXT1_SYM_PPLL_POST_DIV, 0, 0x00000100); + + RHDRegMask(PLL, P1PLL_CNTL, 0x00000001, 0x00000001); /* reset */ + usleep(2); + RHDRegMask(PLL, P1PLL_CNTL, 0x00000002, 0x00000002); /* power down */ + usleep(10); + RHDRegMask(PLL, P1PLL_CNTL, 0x00002000, 0x00002000); /* reset anti-glitch */ + + RHDRegWrite(PLL, EXT1_PPLL_CNTL, Control); + + RHDRegMask(PLL, P1PLL_DISP_CLK_CNTL, ScalerDiv, 0x0000003F); + + RHDRegWrite(PLL, EXT1_PPLL_UPDATE_LOCK, 1); /* lock */ + + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV_SRC, 0x00000001); + + RHDRegWrite(PLL, EXT1_PPLL_REF_DIV, RefDiv); + RHDRegWrite(PLL, EXT1_PPLL_FB_DIV, FBDiv); + RHDRegMask(PLL, EXT1_PPLL_POST_DIV, PostDiv, 0x0000007F); + RHDRegMask(PLL, EXT1_SYM_PPLL_POST_DIV, SymPostDiv, 0x0000007F); + + usleep(10); + RHDRegWrite(PLL, EXT1_PPLL_UPDATE_LOCK, 0); /* unlock */ + + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x00000002); /* power up */ + usleep(10); + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x00002000); /* undo reset anti-glitch */ + + PLL1Calibrate(PLL); + + /* switch back to the pll */ + RHDRegMask(PLL, P1PLL_DISP_CLK_CNTL, 0, 0x00000300); + RHDRegMask(PLL, EXT1_SYM_PPLL_POST_DIV, 0x00000100, 0x00000100); + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV_SRC, 0x00000001); + + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x80000000); /* new and undocumented */ +} + +/* + * + */ +static void +RV620PLL2SetLow(struct rhdPLL *PLL, CARD32 RefDiv, CARD32 FBDiv, CARD32 PostDiv, + CARD8 ScalerDiv, CARD8 SymPostDiv, CARD32 Control) +{ + RHDFUNC(PLL); + + /* switch to external */ + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV_SRC, 0); + RHDRegMask(PLL, P2PLL_DISP_CLK_CNTL, 0x00000200, 0x00000300); + RHDRegMask(PLL, EXT2_SYM_PPLL_POST_DIV, 0, 0x00000100); + + RHDRegMask(PLL, P2PLL_CNTL, 0x00000001, 0x00000001); /* reset */ + usleep(2); + RHDRegMask(PLL, P2PLL_CNTL, 0x00000002, 0x00000002); /* power down */ + usleep(10); + RHDRegMask(PLL, P2PLL_CNTL, 0x00002000, 0x00002000); /* reset anti-glitch */ + + RHDRegWrite(PLL, EXT2_PPLL_CNTL, Control); + + RHDRegMask(PLL, P2PLL_DISP_CLK_CNTL, ScalerDiv, 0x0000003F); + + RHDRegWrite(PLL, EXT2_PPLL_UPDATE_LOCK, 1); /* lock */ + + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV_SRC, 0x00000001); + + RHDRegWrite(PLL, EXT2_PPLL_REF_DIV, RefDiv); + RHDRegWrite(PLL, EXT2_PPLL_FB_DIV, FBDiv); + RHDRegMask(PLL, EXT2_PPLL_POST_DIV, PostDiv, 0x0000007F); + RHDRegMask(PLL, EXT2_SYM_PPLL_POST_DIV, SymPostDiv, 0x0000007F); + + usleep(10); + RHDRegWrite(PLL, EXT2_PPLL_UPDATE_LOCK, 0); /* unlock */ + + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x00000002); /* power up */ + usleep(10); + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x00002000); /* undo reset anti-glitch */ + + PLL2Calibrate(PLL); + + /* switch back to the pll */ + RHDRegMask(PLL, P2PLL_DISP_CLK_CNTL, 0, 0x00000300); + RHDRegMask(PLL, EXT2_SYM_PPLL_POST_DIV, 0x00000100, 0x00000100); + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV_SRC, 0x00000001); + + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x80000000); /* new and undocumented */ +} + +/* + * + */ +static void +RV620PLL1Set(struct rhdPLL *PLL, int PixelClock, CARD16 ReferenceDivider, + CARD16 FeedbackDivider, CARD8 PostDivider) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + Bool HasDccg = RV620DCCGCLKAvailable(PLL); + CARD32 RefDiv, FBDiv, PostDiv, Control; + CARD8 ScalerDiv, SymPostDiv; + + RHDFUNC(PLL); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RESET); + + /* Disable Spread Spectrum */ + RHDRegMask(PLL, P1PLL_INT_SS_CNTL, 0, 0x00000001); + + RefDiv = ReferenceDivider; + + FBDiv = RHDRegRead(PLL, EXT1_PPLL_FB_DIV) & ~0x07FF003F; + FBDiv |= ((FeedbackDivider << 16) | 0x0030) & 0x07FF003F; + + PostDiv = RHDRegRead(PLL, EXT1_PPLL_POST_DIV) & ~0x0000007F; + PostDiv |= PostDivider & 0x0000007F; + + /* introduce flags for this, like on unichrome */ + ScalerDiv = 2; /* scaler post divider, 4 for UPDP */ + + SymPostDiv = PostDivider & 0x0000007F; + + Control = PLLControlTableRetrieve(RV670PLLControl, FeedbackDivider); + + RV620PLL1SetLow(PLL, RefDiv, FBDiv, PostDiv, ScalerDiv, SymPostDiv, + Control); + + if (rhdPtr->Crtc[0]->PLL == PLL) + R500PLLCRTCGrab(PLL, FALSE); + if (rhdPtr->Crtc[1]->PLL == PLL) + R500PLLCRTCGrab(PLL, TRUE); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_GRAB); +} + +/* + * + */ +static void +RV620PLL2Set(struct rhdPLL *PLL, int PixelClock, CARD16 ReferenceDivider, + CARD16 FeedbackDivider, CARD8 PostDivider) +{ + RHDPtr rhdPtr = RHDPTRI(PLL); + Bool HasDccg = RV620DCCGCLKAvailable(PLL); + CARD32 RefDiv, FBDiv, PostDiv, Control; + CARD8 ScalerDiv, SymPostDiv; + + RHDFUNC(PLL); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_RESET); + + /* Disable Spread Spectrum */ + RHDRegMask(PLL, P2PLL_INT_SS_CNTL, 0, 0x00000001); + + RefDiv = ReferenceDivider; + + FBDiv = RHDRegRead(PLL, EXT2_PPLL_FB_DIV) & ~0x07FF003F; + FBDiv |= ((FeedbackDivider << 16) | 0x0030) & 0x07FF003F; + + PostDiv = RHDRegRead(PLL, EXT2_PPLL_POST_DIV) & ~0x0000007F; + PostDiv |= PostDivider & 0x0000007F; + + /* introduce flags for this, like on unichrome */ + ScalerDiv = 2; /* scaler post divider, 4 for UPDP */ + + SymPostDiv = PostDivider & 0x0000007F; + + Control = PLLControlTableRetrieve(RV670PLLControl, FeedbackDivider); + + RV620PLL2SetLow(PLL, RefDiv, FBDiv, PostDiv, ScalerDiv, SymPostDiv, + Control); + + if (rhdPtr->Crtc[0]->PLL == PLL) + R500PLLCRTCGrab(PLL, FALSE); + if (rhdPtr->Crtc[1]->PLL == PLL) + R500PLLCRTCGrab(PLL, TRUE); + + if (HasDccg) + RV620DCCGCLKSet(PLL, RV620_DCCGCLK_GRAB); +} + +/* + * + */ +static void +RV620PLL1Save(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + PLL->StoreActive = !(RHDRegRead(PLL, P1PLL_CNTL) & 0x03); + PLL->StoreRefDiv = RHDRegRead(PLL, EXT1_PPLL_REF_DIV); + PLL->StoreFBDiv = RHDRegRead(PLL, EXT1_PPLL_FB_DIV); + PLL->StorePostDiv = RHDRegRead(PLL, EXT1_PPLL_POST_DIV); + PLL->StorePostDivSrc = RHDRegRead(PLL, EXT1_PPLL_POST_DIV_SRC); + PLL->StoreControl = RHDRegRead(PLL, EXT1_PPLL_CNTL); + PLL->StoreSpreadSpectrum = RHDRegRead(PLL, P1PLL_INT_SS_CNTL); + + PLL->StoreGlitchReset = RHDRegRead(PLL, P1PLL_CNTL) & 0x00002000; + + PLL->StoreScalerPostDiv = RHDRegRead(PLL, P1PLL_DISP_CLK_CNTL) & 0x003F; + PLL->StoreSymPostDiv = RHDRegRead(PLL, EXT1_SYM_PPLL_POST_DIV) & 0x007F; + + PLL->StoreCrtc1Owner = !(RHDRegRead(PLL, PCLK_CRTC1_CNTL) & 0x00010000); + PLL->StoreCrtc2Owner = !(RHDRegRead(PLL, PCLK_CRTC2_CNTL) & 0x00010000); + + PLL->StoreDCCGCLKOwner = RV620DCCGCLKAvailable(PLL); + if (PLL->StoreDCCGCLKOwner) + PLL->StoreDCCGCLK = RHDRegRead(PLL, DCCG_DISP_CLK_SRCSEL); + else + PLL->StoreDCCGCLK = 0; + + PLL->Stored = TRUE; +} + +/* + * + */ +static void +RV620PLL2Save(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + PLL->StoreActive = !(RHDRegRead(PLL, P2PLL_CNTL) & 0x03); + PLL->StoreRefDiv = RHDRegRead(PLL, EXT2_PPLL_REF_DIV); + PLL->StoreFBDiv = RHDRegRead(PLL, EXT2_PPLL_FB_DIV); + PLL->StorePostDiv = RHDRegRead(PLL, EXT2_PPLL_POST_DIV); + PLL->StorePostDivSrc = RHDRegRead(PLL, EXT2_PPLL_POST_DIV_SRC); + PLL->StoreControl = RHDRegRead(PLL, EXT2_PPLL_CNTL); + PLL->StoreSpreadSpectrum = RHDRegRead(PLL, P2PLL_INT_SS_CNTL); + + PLL->StoreGlitchReset = RHDRegRead(PLL, P2PLL_CNTL) & 0x00002000; + + PLL->StoreScalerPostDiv = RHDRegRead(PLL, P2PLL_DISP_CLK_CNTL) & 0x003F; + PLL->StoreSymPostDiv = RHDRegRead(PLL, EXT2_SYM_PPLL_POST_DIV) & 0x007F; + + PLL->StoreCrtc1Owner = RHDRegRead(PLL, PCLK_CRTC1_CNTL) & 0x00010000; + PLL->StoreCrtc2Owner = RHDRegRead(PLL, PCLK_CRTC2_CNTL) & 0x00010000; + + PLL->StoreDCCGCLKOwner = RV620DCCGCLKAvailable(PLL); + if (PLL->StoreDCCGCLKOwner) + PLL->StoreDCCGCLK = RHDRegRead(PLL, DCCG_DISP_CLK_SRCSEL); + else + PLL->StoreDCCGCLK = 0; + + PLL->Stored = TRUE; +} + +/* + * Notice how we handle the DCCG ownership here. There is a difference between + * currently holding the DCCG and what was held when in the VT. With the + * solution here we no longer hardlock, but we do have the danger of keeping + * the DCCG in external mode for too long a time, if both PLL restores are + * too far apart. This is currently not an issue as VT restoration goes over + * the whole device in one go anyway; no partial restoration going on + */ +static void +RV620PLL1Restore(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + if (RV620DCCGCLKAvailable(PLL)) + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 0x03, 0x00000003); + + if (PLL->StoreActive) { + RV620PLL1SetLow(PLL, PLL->StoreRefDiv, PLL->StoreFBDiv, + PLL->StorePostDiv, PLL->StoreScalerPostDiv, + PLL->StoreSymPostDiv, PLL->StoreControl); + RHDRegMask(PLL, P1PLL_INT_SS_CNTL, + PLL->StoreSpreadSpectrum, 0x00000001); + + if (PLL->StoreDCCGCLKOwner) + RHDRegWrite(PLL, DCCG_DISP_CLK_SRCSEL, PLL->StoreDCCGCLK); + + } else { + PLL->Power(PLL, RHD_POWER_SHUTDOWN); + + /* lame attempt at at least restoring the old values */ + RHDRegWrite(PLL, EXT1_PPLL_REF_DIV, PLL->StoreRefDiv); + RHDRegWrite(PLL, EXT1_PPLL_FB_DIV, PLL->StoreFBDiv); + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV, PLL->StorePostDiv); + RHDRegWrite(PLL, EXT1_PPLL_POST_DIV_SRC, PLL->StorePostDivSrc); + RHDRegWrite(PLL, EXT1_PPLL_CNTL, PLL->StoreControl); + RHDRegMask(PLL, P1PLL_DISP_CLK_CNTL, PLL->StoreScalerPostDiv, 0x003F); + RHDRegMask(PLL, EXT1_SYM_PPLL_POST_DIV, PLL->StoreSymPostDiv, 0x007F); + RHDRegWrite(PLL, P1PLL_INT_SS_CNTL, PLL->StoreSpreadSpectrum); + + if (PLL->StoreGlitchReset) + RHDRegMask(PLL, P1PLL_CNTL, 0x00002000, 0x00002000); + else + RHDRegMask(PLL, P1PLL_CNTL, 0, 0x00002000); + } + + if (PLL->StoreCrtc1Owner) + R500PLLCRTCGrab(PLL, FALSE); + if (PLL->StoreCrtc2Owner) + R500PLLCRTCGrab(PLL, TRUE); + + if (PLL->StoreDCCGCLKOwner) + RHDRegWrite(PLL, DCCG_DISP_CLK_SRCSEL, PLL->StoreDCCGCLK); +} + +/* + * + */ +static void +RV620PLL2Restore(struct rhdPLL *PLL) +{ + RHDFUNC(PLL); + + if (RV620DCCGCLKAvailable(PLL)) + RHDRegMask(PLL, DCCG_DISP_CLK_SRCSEL, 0x03, 0x00000003); + + if (PLL->StoreActive) { + RV620PLL2SetLow(PLL, PLL->StoreRefDiv, PLL->StoreFBDiv, + PLL->StorePostDiv, PLL->StoreScalerPostDiv, + PLL->StoreSymPostDiv, PLL->StoreControl); + RHDRegMask(PLL, P2PLL_INT_SS_CNTL, + PLL->StoreSpreadSpectrum, 0x00000001); + } else { + PLL->Power(PLL, RHD_POWER_SHUTDOWN); + + /* lame attempt at at least restoring the old values */ + RHDRegWrite(PLL, EXT2_PPLL_REF_DIV, PLL->StoreRefDiv); + RHDRegWrite(PLL, EXT2_PPLL_FB_DIV, PLL->StoreFBDiv); + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV, PLL->StorePostDiv); + RHDRegWrite(PLL, EXT2_PPLL_POST_DIV_SRC, PLL->StorePostDivSrc); + RHDRegWrite(PLL, EXT2_PPLL_CNTL, PLL->StoreControl); + RHDRegMask(PLL, P2PLL_DISP_CLK_CNTL, PLL->StoreScalerPostDiv, 0x003F); + RHDRegMask(PLL, EXT2_SYM_PPLL_POST_DIV, PLL->StoreSymPostDiv, 0x007F); + RHDRegWrite(PLL, P2PLL_INT_SS_CNTL, PLL->StoreSpreadSpectrum); + + if (PLL->StoreGlitchReset) + RHDRegMask(PLL, P2PLL_CNTL, 0x00002000, 0x00002000); + else + RHDRegMask(PLL, P2PLL_CNTL, 0, 0x00002000); + } + + if (PLL->StoreCrtc1Owner) + R500PLLCRTCGrab(PLL, FALSE); + if (PLL->StoreCrtc2Owner) + R500PLLCRTCGrab(PLL, TRUE); + + if (PLL->StoreDCCGCLKOwner) + RHDRegWrite(PLL, DCCG_DISP_CLK_SRCSEL, PLL->StoreDCCGCLK); +} + +/* Some defaults for when we don't have this info */ +/* XTAL is visible on the cards */ +#define RHD_PLL_REFERENCE_DEFAULT 27000 +/* these required quite some testing */ +#define RHD_R500_PLL_INTERNAL_MIN_DEFAULT 648000 +#define RHD_RV620_PLL_INTERNAL_MIN_DEFAULT 702000 +/* Lowest value seen so far */ +#define RHD_PLL_INTERNAL_MAX_DEFAULT 1100000 +#define RHD_PLL_MIN_DEFAULT 16000 /* guess */ +#define RHD_PLL_MAX_DEFAULT 400000 /* 400Mhz modes... hrm */ + +enum pllComp { + PLL_NONE, + PLL_MIN, + PLL_MAX +}; + +/* + * + */ +#ifdef ATOM_BIOS +static Bool +getPLLValuesFromAtomBIOS(RHDPtr rhdPtr, + AtomBiosRequestID func, char *msg, CARD32 *val, enum pllComp comp) +{ + AtomBiosArgRec arg; + AtomBiosResult ret; + + if (rhdPtr->atomBIOS) { + ret = RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, + func, &arg); + if (ret == ATOM_SUCCESS) { + if (arg.val) { + switch (comp) { + case PLL_MAX: + if (arg.val < *val) + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "Lower %s detected than the default: %lu %lu.\n" + "Please contact the authors ASAP.\n", msg, + (unsigned long)*val, (unsigned long)arg.val * 10); + break; + case PLL_MIN: + if (arg.val > *val) + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "Higher %s detected than the default: %lu %lu.\n" + "Please contact the authors ASAP.\n", msg, + (unsigned long)*val, (unsigned long)arg.val * 10); + break; + default: + break; + } + *val = arg.val; + } + } + return TRUE; + } else + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Failed to retrieve the %s" + " clock from ATOM.\n",msg); + return FALSE; +} +#endif + +/* + * + */ +void +RHDSetupLimits(RHDPtr rhdPtr, CARD32 *RefClock, + CARD32 *IntMin, CARD32 *IntMax, + CARD32 *PixMin, CARD32 *PixMax) +{ + /* Retrieve the internal PLL frequency limits*/ + *RefClock = RHD_PLL_REFERENCE_DEFAULT; + if (rhdPtr->ChipSet < RHD_RV620) + *IntMin = RHD_R500_PLL_INTERNAL_MIN_DEFAULT; + else + *IntMin = RHD_RV620_PLL_INTERNAL_MIN_DEFAULT; + + *IntMax = RHD_PLL_INTERNAL_MAX_DEFAULT; + + /* keep the defaults */ + *PixMin = RHD_PLL_MIN_DEFAULT; + *PixMax = RHD_PLL_MAX_DEFAULT; + +#ifdef ATOM_BIOS + getPLLValuesFromAtomBIOS(rhdPtr, ATOM_GET_MIN_PIXEL_CLOCK_PLL_OUTPUT, "minimum PLL output", + IntMin, PLL_MIN); + getPLLValuesFromAtomBIOS(rhdPtr, ATOM_GET_MAX_PIXEL_CLOCK_PLL_OUTPUT, "maximum PLL output", + IntMax, PLL_MAX); + getPLLValuesFromAtomBIOS(rhdPtr, ATOM_GET_MAX_PIXEL_CLK, "Pixel Clock", + PixMax, PLL_MAX); + getPLLValuesFromAtomBIOS(rhdPtr, ATOM_GET_REF_CLOCK, "reference clock", + RefClock, PLL_NONE); + if (*IntMax == 0) { + if (rhdPtr->ChipSet < RHD_RV620) + *IntMax = RHD_R500_PLL_INTERNAL_MIN_DEFAULT; + else + *IntMax = RHD_RV620_PLL_INTERNAL_MIN_DEFAULT; + + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "AtomBIOS reports maximum VCO freq 0. " + "Using %lu instead\n",(unsigned long)*IntMax); + } +#endif +} + +/* + * + */ +Bool +RHDPLLsInit(RHDPtr rhdPtr) +{ + struct rhdPLL *PLL; + CARD32 RefClock, IntMin, IntMax, PixMin, PixMax; + + RHDFUNC(rhdPtr); + + if (RHDUseAtom(rhdPtr, NULL, atomUsagePLL)) + return FALSE; + + RHDSetupLimits(rhdPtr, &RefClock, &IntMin, &IntMax, &PixMin, &PixMax); + + /* PLL1 */ + PLL = (struct rhdPLL *) xnfcalloc(sizeof(struct rhdPLL), 1); + + PLL->scrnIndex = rhdPtr->scrnIndex; + PLL->Name = PLL_NAME_PLL1; + PLL->Id = PLL_ID_PLL1; + + PLL->RefClock = RefClock; + PLL->IntMin = IntMin; + PLL->IntMax = IntMax; + PLL->PixMin = PixMin; + PLL->PixMax = PixMax; + + PLL->Valid = NULL; + if (rhdPtr->ChipSet < RHD_RV620) { + PLL->Set = R500PLL1Set; + PLL->Power = R500PLL1Power; + PLL->Save = R500PLL1Save; + PLL->Restore = R500PLL1Restore; + } else { + PLL->Set = RV620PLL1Set; + PLL->Power = RV620PLL1Power; + PLL->Save = RV620PLL1Save; + PLL->Restore = RV620PLL1Restore; + } + + rhdPtr->PLLs[0] = PLL; + + /* PLL2 */ + PLL = (struct rhdPLL *) xnfcalloc(sizeof(struct rhdPLL), 1); + + PLL->scrnIndex = rhdPtr->scrnIndex; + PLL->Name = PLL_NAME_PLL2; + PLL->Id = PLL_ID_PLL2; + + PLL->RefClock = RefClock; + PLL->IntMin = IntMin; + PLL->IntMax = IntMax; + PLL->PixMin = PixMin; + PLL->PixMax = PixMax; + + PLL->Valid = NULL; + if (rhdPtr->ChipSet < RHD_RV620) { + PLL->Set = R500PLL2Set; + PLL->Power = R500PLL2Power; + PLL->Save = R500PLL2Save; + PLL->Restore = R500PLL2Restore; + } else { + PLL->Set = RV620PLL2Set; + PLL->Power = RV620PLL2Power; + PLL->Save = RV620PLL2Save; + PLL->Restore = RV620PLL2Restore; + } + + rhdPtr->PLLs[1] = PLL; + + return TRUE; +} + +/* + * + */ +ModeStatus +RHDPLLValid(struct rhdPLL *PLL, CARD32 Clock) +{ + RHDFUNC(PLL); + + if (Clock < PLL->PixMin) + return MODE_CLOCK_LOW; + if (Clock > PLL->PixMax) + return MODE_CLOCK_HIGH; + + if (PLL->Valid) + return PLL->Valid(PLL, Clock); + else + return MODE_OK; +} + + +/* + * Calculate the PLL parameters for a given dotclock. + * + * This calculation uses a linear approximation of an experimentally found + * curve that delimits reference versus feedback dividers on rv610. This curve + * can be shifted towards higher feedback divider through increasing the gain + * control, but the effect of this is rather limited. + * + * Since this upper limit still provides a wide enough range with enough + * granularity, we use it for all r5xx and r6xx devices. + */ +static Bool +PLLCalculate(struct rhdPLL *PLL, CARD32 PixelClock, + CARD16 *RefDivider, CARD16 *FBDivider, CARD8 *PostDivider) +{ +/* limited by the number of bits available */ +#define FB_DIV_LIMIT 2048 +#define REF_DIV_LIMIT 1024 +#define POST_DIV_LIMIT 128 + + CARD32 FBDiv, RefDiv, PostDiv, BestDiff = 0xFFFFFFFF; + float Ratio; + + Ratio = ((float) PixelClock) / ((float) PLL->RefClock); + + for (PostDiv = 2; PostDiv < POST_DIV_LIMIT; PostDiv++) { + CARD32 VCOOut = PixelClock * PostDiv; + + /* we are conservative and avoid the limits */ + if (VCOOut <= PLL->IntMin) + continue; + if (VCOOut >= PLL->IntMax) + break; + + for (RefDiv = 1; RefDiv <= REF_DIV_LIMIT; RefDiv++) { + CARD32 Diff; + + FBDiv = (CARD32) ((Ratio * PostDiv * RefDiv) + 0.5); + + if (FBDiv >= FB_DIV_LIMIT) + break; + if (FBDiv > (500 + (13 * RefDiv))) /* rv6x0 limit */ + break; + + Diff = abs( PixelClock - (FBDiv * PLL->RefClock) / (PostDiv * RefDiv) ); + + if (Diff < BestDiff) { + *FBDivider = FBDiv; + *RefDivider = RefDiv; + *PostDivider = PostDiv; + BestDiff = Diff; + } + + if (BestDiff == 0) + break; + } + if (BestDiff == 0) + break; + } + + if (BestDiff != 0xFFFFFFFF) { + RHDDebug(PLL->scrnIndex, "PLL Calculation: %dkHz = " + "(((%i / 0x%X) * 0x%X) / 0x%X) (%dkHz off)\n", + (int) PixelClock, (unsigned int) PLL->RefClock, *RefDivider, + *FBDivider, *PostDivider, (int) BestDiff); + return TRUE; + } else { /* Should never happen */ + xf86DrvMsg(PLL->scrnIndex, X_ERROR, + "%s: Failed to get a valid PLL setting for %dkHz\n", + __func__, (int) PixelClock); + return FALSE; + } +} + +/* + * + */ +void +RHDPLLSet(struct rhdPLL *PLL, CARD32 Clock) +{ + CARD16 RefDivider = 0, FBDivider = 0; + CARD8 PostDivider = 0; + + RHDDebug(PLL->scrnIndex, "%s: Setting %s to %dkHz\n", __func__, + PLL->Name, Clock); + + if (PLLCalculate(PLL, Clock, &RefDivider, &FBDivider, &PostDivider)) { + PLL->Set(PLL, Clock, RefDivider, FBDivider, PostDivider); + + PLL->CurrentClock = Clock; + PLL->Active = TRUE; + } else + xf86DrvMsg(PLL->scrnIndex, X_WARNING, + "%s: Not altering any settings.\n", __func__); +} + +/* + * + */ +void +RHDPLLPower(struct rhdPLL *PLL, int Power) +{ + RHDFUNC(PLL); + + if (PLL->Power) + PLL->Power(PLL, Power); +} + +/* + * + */ +void +RHDPLLsPowerAll(RHDPtr rhdPtr, int Power) +{ + struct rhdPLL *PLL; + + RHDFUNC(rhdPtr); + + PLL = rhdPtr->PLLs[0]; + if (PLL->Power) + PLL->Power(PLL, Power); + + PLL = rhdPtr->PLLs[1]; + if (PLL->Power) + PLL->Power(PLL, Power); +} + +/* + * + */ +void +RHDPLLsShutdownInactive(RHDPtr rhdPtr) +{ + struct rhdPLL *PLL; + + RHDFUNC(rhdPtr); + + PLL = rhdPtr->PLLs[0]; + if (PLL->Power && !PLL->Active) + PLL->Power(PLL, RHD_POWER_SHUTDOWN); + + PLL = rhdPtr->PLLs[1]; + if (PLL->Power && !PLL->Active) + PLL->Power(PLL, RHD_POWER_SHUTDOWN); +} + +/* + * + */ +void +RHDPLLsSave(RHDPtr rhdPtr) +{ + struct rhdPLL *PLL; + + RHDFUNC(rhdPtr); + + PLL = rhdPtr->PLLs[0]; + if (PLL->Save) + PLL->Save(PLL); + + PLL = rhdPtr->PLLs[1]; + if (PLL->Save) + PLL->Save(PLL); +} + +/* + * + */ +void +RHDPLLsRestore(RHDPtr rhdPtr) +{ + struct rhdPLL *PLL; + + RHDFUNC(rhdPtr); + + PLL = rhdPtr->PLLs[0]; + if (PLL->Restore) + PLL->Restore(PLL); + + PLL = rhdPtr->PLLs[1]; + if (PLL->Restore) + PLL->Restore(PLL); +} + +/* + * + */ +void +RHDPLLsDestroy(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + if (rhdPtr->PLLs[0] && rhdPtr->PLLs[0]->Private) + xfree(rhdPtr->PLLs[0]->Private); + xfree(rhdPtr->PLLs[0]); + if (rhdPtr->PLLs[1] && rhdPtr->PLLs[1]->Private) + xfree(rhdPtr->PLLs[1]->Private); + xfree(rhdPtr->PLLs[1]); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_pll.h b/driver/xf86-video-radeonhd/src/rhd_pll.h new file mode 100644 index 000000000..cba151cce --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_pll.h @@ -0,0 +1,97 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_PLL_H +#define _RHD_PLL_H + +struct rhdPLL { + int scrnIndex; + +#define PLL_NAME_PLL1 "PLL 1" +#define PLL_NAME_PLL2 "PLL 2" + char *Name; + +/* also used as an index to rhdPtr->PLLs */ +#define PLL_ID_PLL1 0 +#define PLL_ID_PLL2 1 +#define PLL_ID_NONE -1 + int Id; + + CARD32 CurrentClock; + Bool Active; + + /* from defaults or from atom */ + CARD32 RefClock; + CARD32 IntMin; + CARD32 IntMax; + CARD32 PixMin; + CARD32 PixMax; + + ModeStatus (*Valid) (struct rhdPLL *PLL, CARD32 Clock); + void (*Set) (struct rhdPLL *PLL, int PixelClock, CARD16 ReferenceDivider, + CARD16 FeedbackDivider, CARD8 PostDivider); + void (*Power) (struct rhdPLL *PLL, int Power); + void (*Save) (struct rhdPLL *PLL); + void (*Restore) (struct rhdPLL *PLL); + + /* For save/restore: Move to a Private */ + Bool Stored; + + void *Private; + + Bool StoreActive; + Bool StoreCrtc1Owner; + Bool StoreCrtc2Owner; + CARD32 StoreRefDiv; + CARD32 StoreFBDiv; + CARD32 StorePostDiv; + CARD32 StoreControl; + CARD32 StoreSpreadSpectrum; + + /* RV620/RV635/RS780 */ + Bool StoreDCCGCLKOwner; + CARD32 StoreDCCGCLK; + CARD8 StoreScalerPostDiv; + CARD8 StoreSymPostDiv; + CARD32 StorePostDivSrc; + Bool StoreGlitchReset; +}; + +Bool RHDPLLsInit(RHDPtr rhdPtr); +ModeStatus RHDPLLValid(struct rhdPLL *PLL, CARD32 Clock); +void RHDPLLSet(struct rhdPLL *PLL, CARD32 Clock); +void RHDPLLPower(struct rhdPLL *PLL, int Power); +void RHDPLLsPowerAll(RHDPtr rhdPtr, int Power); +void RHDPLLsShutdownInactive(RHDPtr rhdPtr); +void RHDPLLsSave(RHDPtr rhdPtr); +void RHDPLLsRestore(RHDPtr rhdPtr); +void RHDPLLsDestroy(RHDPtr rhdPtr); + +void RHDSetupLimits(RHDPtr rhdPtr, CARD32 *RefClock, + CARD32 *IntMin, CARD32 *IntMax, + CARD32 *PixMin, CARD32 *PixMax); +Bool RHDAtomPLLsInit(RHDPtr rhdPtr); + +#endif /* _RHD_PLL_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_pm.c b/driver/xf86-video-radeonhd/src/rhd_pm.c new file mode 100644 index 000000000..26433aa87 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_pm.c @@ -0,0 +1,475 @@ +/* + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ + +/* + * Authors: + * Yang Zhao + * Matthias Hopf + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +#include "rhd.h" +#include "rhd_pm.h" + +#include "rhd_atombios.h" + +#ifdef ATOM_BIOS + +#define COMPARE_MIN_ENGINE_CLOCK 100000 +#define SAVE_MIN_ENGINE_CLOCK 200000 +#define COMPARE_MAX_ENGINE_CLOCK 3000000 +#define COMPARE_MIN_MEMORY_CLOCK 100000 +#define SAVE_MIN_MEMORY_CLOCK 200000 +#define COMPARE_MAX_MEMORY_CLOCK 3000000 +#define COMPARE_MIN_VOLTAGE 500 +#define COMPARE_MAX_VOLTAGE 2000 + +static char *PmLevels[] = { + "Off", "Idle", "Slow2D", "Fast2D", "Slow3D", "Fast3D", "Max3D", "User" +} ; + + +static void +rhdPmPrint (struct rhdPm *Pm, char *name, struct rhdPowerState *state) +{ + xf86DrvMsg(Pm->scrnIndex, X_INFO, " %-8s %8d kHz / %8d kHz / %6.3f V\n", + name, (int) state->EngineClock, (int) state->MemoryClock, + state->VDDCVoltage / 1000.0); +} + +/* Certain clocks require certain voltage settings */ +/* TODO: So far we only know few safe points. Interpolate? */ +static void rhdPmValidateSetting (struct rhdPm *Pm, struct rhdPowerState *setting, int forceVoltage) +{ + /* CARD32 compare = setting->VDDCVoltage ? setting->VDDCVoltage : Pm->Current.VDDCVoltage; */ + if (! setting->EngineClock) + setting->EngineClock = Pm->Current.EngineClock; + if (setting->EngineClock < Pm->Minimum.EngineClock) + setting->EngineClock = Pm->Minimum.EngineClock; + if (setting->EngineClock < COMPARE_MIN_ENGINE_CLOCK) + setting->EngineClock = SAVE_MIN_ENGINE_CLOCK; + if (setting->EngineClock > Pm->Maximum.EngineClock && Pm->Maximum.EngineClock) + setting->EngineClock = Pm->Maximum.EngineClock; + if (setting->EngineClock > COMPARE_MAX_ENGINE_CLOCK) + setting->EngineClock = Pm->Default.EngineClock; + if (setting->EngineClock > COMPARE_MAX_ENGINE_CLOCK) + setting->EngineClock = 0; + if (! setting->MemoryClock) + setting->MemoryClock = Pm->Current.MemoryClock; + if (setting->MemoryClock < Pm->Minimum.MemoryClock) + setting->MemoryClock = Pm->Minimum.MemoryClock; + if (setting->MemoryClock < COMPARE_MIN_MEMORY_CLOCK) + setting->MemoryClock = SAVE_MIN_MEMORY_CLOCK; + if (setting->MemoryClock > Pm->Maximum.MemoryClock && Pm->Maximum.MemoryClock) + setting->MemoryClock = Pm->Maximum.MemoryClock; + if (setting->MemoryClock > COMPARE_MAX_MEMORY_CLOCK) + setting->MemoryClock = Pm->Default.MemoryClock; + if (setting->MemoryClock > COMPARE_MAX_MEMORY_CLOCK) + setting->MemoryClock = 0; + if (! setting->VDDCVoltage) + setting->VDDCVoltage = Pm->Current.VDDCVoltage; + if (setting->VDDCVoltage < Pm->Minimum.VDDCVoltage) + setting->VDDCVoltage = Pm->Minimum.VDDCVoltage; + if (setting->VDDCVoltage < COMPARE_MIN_VOLTAGE) + setting->VDDCVoltage = Pm->Current.VDDCVoltage; + if (setting->VDDCVoltage < COMPARE_MIN_VOLTAGE) + setting->VDDCVoltage = 0; + if (setting->VDDCVoltage > Pm->Maximum.VDDCVoltage && Pm->Maximum.VDDCVoltage) + setting->VDDCVoltage = Pm->Maximum.VDDCVoltage; + if (setting->VDDCVoltage > COMPARE_MAX_VOLTAGE) + setting->VDDCVoltage = Pm->Default.VDDCVoltage; + if (setting->VDDCVoltage > COMPARE_MAX_VOLTAGE) + setting->VDDCVoltage = 0; + /* TODO: voltage adaption logic missing */ + /* Only set to lower Voltages than compare if 0 */ +} + +static void rhdPmValidateMinMax (struct rhdPm *Pm) +{ + if (Pm->Maximum.EngineClock < Pm->Default.EngineClock) + Pm->Maximum.EngineClock = Pm->Default.EngineClock; + if (Pm->Maximum.MemoryClock < Pm->Default.MemoryClock) + Pm->Maximum.MemoryClock = Pm->Default.MemoryClock; + if (Pm->Maximum.VDDCVoltage < Pm->Default.VDDCVoltage) + Pm->Maximum.VDDCVoltage = Pm->Default.VDDCVoltage; + if (Pm->Maximum.EngineClock < Pm->Current.EngineClock) + Pm->Maximum.EngineClock = Pm->Current.EngineClock; + if (Pm->Maximum.MemoryClock < Pm->Current.MemoryClock) + Pm->Maximum.MemoryClock = Pm->Current.MemoryClock; + if (Pm->Maximum.VDDCVoltage < Pm->Current.VDDCVoltage) + Pm->Maximum.VDDCVoltage = Pm->Current.VDDCVoltage; + if((Pm->Minimum.EngineClock > Pm->Default.EngineClock && Pm->Default.EngineClock) || ! Pm->Minimum.EngineClock) + Pm->Minimum.EngineClock = Pm->Default.EngineClock; + if((Pm->Minimum.MemoryClock > Pm->Default.MemoryClock && Pm->Default.MemoryClock) || ! Pm->Minimum.MemoryClock) + Pm->Minimum.MemoryClock = Pm->Default.MemoryClock; + if((Pm->Minimum.VDDCVoltage > Pm->Default.VDDCVoltage && Pm->Default.VDDCVoltage) || ! Pm->Minimum.VDDCVoltage) + Pm->Minimum.VDDCVoltage = Pm->Default.VDDCVoltage; + if((Pm->Minimum.EngineClock > Pm->Current.EngineClock && Pm->Current.EngineClock) || ! Pm->Minimum.EngineClock) + Pm->Minimum.EngineClock = Pm->Current.EngineClock; + if((Pm->Minimum.MemoryClock > Pm->Current.MemoryClock && Pm->Current.MemoryClock) || ! Pm->Minimum.MemoryClock) + Pm->Minimum.MemoryClock = Pm->Current.MemoryClock; + if((Pm->Minimum.VDDCVoltage > Pm->Current.VDDCVoltage && Pm->Current.VDDCVoltage) || ! Pm->Minimum.VDDCVoltage) + Pm->Minimum.VDDCVoltage = Pm->Current.VDDCVoltage; + rhdPmValidateSetting (Pm, &Pm->Maximum, 1); + rhdPmValidateSetting (Pm, &Pm->Minimum, 1); + rhdPmValidateSetting (Pm, &Pm->Default, 1); + + if (Pm->NumKnown) { + int i; + for (i = 0; i < Pm->NumKnown; i++) { + if (Pm->Maximum.EngineClock < Pm->Known[i].EngineClock) + Pm->Maximum.EngineClock = Pm->Known[i].EngineClock; + if (Pm->Maximum.MemoryClock < Pm->Known[i].MemoryClock) + Pm->Maximum.MemoryClock = Pm->Known[i].MemoryClock; + if (Pm->Maximum.VDDCVoltage < Pm->Known[i].VDDCVoltage) + Pm->Maximum.VDDCVoltage = Pm->Known[i].VDDCVoltage; + if (Pm->Minimum.EngineClock > Pm->Known[i].EngineClock && Pm->Known[i].EngineClock) + Pm->Minimum.EngineClock = Pm->Known[i].EngineClock; + if (Pm->Minimum.MemoryClock > Pm->Known[i].MemoryClock && Pm->Known[i].MemoryClock) + Pm->Minimum.MemoryClock = Pm->Known[i].MemoryClock; + if (Pm->Minimum.VDDCVoltage > Pm->Known[i].VDDCVoltage && Pm->Known[i].VDDCVoltage) + Pm->Minimum.VDDCVoltage = Pm->Known[i].VDDCVoltage; + } + } + + if (Pm->Minimum.VDDCVoltage == Pm->Maximum.VDDCVoltage) + Pm->Minimum.VDDCVoltage = Pm->Maximum.VDDCVoltage = Pm->Default.VDDCVoltage = 0; +} + +/* Some AtomBIOSes provide broken current clocks (esp. memory) */ +static void rhdPmValidateClearSetting (struct rhdPm *Pm, struct rhdPowerState *setting) +{ + if (setting->EngineClock < COMPARE_MIN_ENGINE_CLOCK) + setting->EngineClock = 0; + if (setting->EngineClock > COMPARE_MAX_ENGINE_CLOCK) + setting->EngineClock = 0; + if (setting->MemoryClock < COMPARE_MIN_MEMORY_CLOCK) + setting->MemoryClock = 0; + if (setting->MemoryClock > COMPARE_MAX_MEMORY_CLOCK) + setting->MemoryClock = 0; + if (setting->VDDCVoltage < COMPARE_MIN_VOLTAGE) + setting->VDDCVoltage = 0; + if (setting->VDDCVoltage > COMPARE_MAX_VOLTAGE) + setting->VDDCVoltage = 0; +} + +/* Have: a list of possible power settings, eventual minimum and maximum settings. + * Want: all rhdPowerState_e settings */ +static void rhdPmSelectSettings (RHDPtr rhdPtr) +{ + int i; + struct rhdPm *Pm = rhdPtr->Pm; + + /* Initialize with default; STORED state is special */ + for (i = 0; i < RHD_PM_NUM_STATES; i++) + memcpy (&Pm->States[i], &Pm->Default, sizeof(struct rhdPowerState)); + + /* TODO: This still needs a lot of work */ + + /* RHD_PM_OFF: minimum */ + memcpy (&Pm->States[RHD_PM_OFF], &Pm->Minimum, sizeof (struct rhdPowerState)); + + if (rhdPtr->lowPowerMode.val.bool) { + /* TODO: copy lowest config with default Voltage/Mem setting? */ + if (!rhdPtr->lowPowerModeEngineClock.val.integer) { + Pm->States[RHD_PM_IDLE].EngineClock = Pm->States[RHD_PM_OFF].EngineClock; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "ForceLowPowerMode: calculated engine clock at %dkHz\n", + (int) Pm->States[RHD_PM_IDLE].EngineClock); + } else { + /* TODO: this should actually set the user mode */ + Pm->States[RHD_PM_IDLE].EngineClock = rhdPtr->lowPowerModeEngineClock.val.integer; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "ForceLowPowerMode: set idle engine clock to %dkHz\n", + (int) Pm->States[RHD_PM_IDLE].EngineClock); + } + + if (!rhdPtr->lowPowerModeMemoryClock.val.integer) { + Pm->States[RHD_PM_IDLE].MemoryClock = Pm->States[RHD_PM_OFF].MemoryClock; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "ForceLowPowerMode: calculated memory clock at %dkHz\n", + (int) Pm->States[RHD_PM_IDLE].MemoryClock); + } else { + Pm->States[RHD_PM_IDLE].MemoryClock = rhdPtr->lowPowerModeMemoryClock.val.integer; + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "ForceLowPowerMode: set idle memory clock to %dkHz\n", + (int) Pm->States[RHD_PM_IDLE].MemoryClock); + } + + rhdPmValidateSetting (Pm, &Pm->States[RHD_PM_IDLE], 1); + + if (rhdPtr->lowPowerModeEngineClock.val.integer < 0) { + Pm->States[RHD_PM_IDLE].EngineClock = - rhdPtr->lowPowerModeEngineClock.val.integer; + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "ForceLowPowerMode: user requested to ignore validation for engine clock\n"); + } + if (rhdPtr->lowPowerModeMemoryClock.val.integer < 0) { + Pm->States[RHD_PM_IDLE].MemoryClock = - rhdPtr->lowPowerModeMemoryClock.val.integer; + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "ForceLowPowerMode: user requested to ignore validation for memory clock\n"); + } + } + + memcpy (&Pm->States[RHD_PM_MAX_3D], &Pm->Maximum, sizeof (struct rhdPowerState)); + + xf86DrvMsg (rhdPtr->scrnIndex, X_INFO, + "Power Management: Final Levels\n"); + ASSERT (sizeof(PmLevels) / sizeof(char *) == RHD_PM_NUM_STATES); + for (i = 0; i < RHD_PM_NUM_STATES; i++) + rhdPmPrint (Pm, PmLevels[i], &Pm->States[i]); +} + +static void +rhdPmGetRawState (RHDPtr rhdPtr, struct rhdPowerState *state) +{ + union AtomBiosArg data; + + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_ENGINE_CLOCK, &data) == ATOM_SUCCESS) + state->EngineClock = data.clockValue; + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_MEMORY_CLOCK, &data) == ATOM_SUCCESS) + state->MemoryClock = data.clockValue; + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_VOLTAGE, &data) == ATOM_SUCCESS) + state->VDDCVoltage = data.val; +} + +static Bool +rhdPmSetRawState (RHDPtr rhdPtr, struct rhdPowerState *state) +{ + union AtomBiosArg data; + Bool ret = TRUE; + struct rhdPowerState dummy; + + /* TODO: Idle first; find which idles are needed and expose them */ + /* FIXME: Voltage */ + /* FIXME: If Voltage is to be rised, then do that first, then change frequencies. + * If Voltage is to be lowered, do it the other way round. */ + if (state->EngineClock && state->EngineClock != rhdPtr->Pm->Current.EngineClock) { + data.clockValue = state->EngineClock; + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_SET_ENGINE_CLOCK, &data) == ATOM_SUCCESS) + rhdPtr->Pm->Current.EngineClock = state->EngineClock; + else + ret = FALSE; + } +#if 0 /* don't do for the moment */ + if (state->MemoryClock && state->MemoryClock != rhdPtr->Pm->Current.MemoryClock) { + data.clockValue = state->MemoryClock; + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_SET_MEMORY_CLOCK, &data) != ATOM_SUCCESS) + rhdPtr->Pm->Current.MemoryClock = state->MemoryClock; + else + ret = FALSE; + } +#endif +#if 0 /* don't do for the moment */ + if (state->VDDCVoltage && state->VDDCVoltage != rhdPtr->Pm->Current.VDDCVoltage) { + data.val = state->VDDCVoltage; + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_SET_VOLTAGE, &data) != ATOM_SUCCESS) + rhdPtr->Pm->Current.VDDCVoltage = state->VDDCVoltage; + else + ret = FALSE; + } +#endif + + /* AtomBIOS might change values, so that later comparisons would fail, even + * if re-setting wouldn't change the actual values. So don't save real + * state in Current, but update only to current values. */ + rhdPmGetRawState (rhdPtr, &dummy); + return ret; +} + + +/* + * API + */ + +static Bool +rhdPmSelectState (RHDPtr rhdPtr, enum rhdPowerState_e num) +{ + return rhdPmSetRawState (rhdPtr, &rhdPtr->Pm->States[num]); +} + +static Bool +rhdPmDefineState (RHDPtr rhdPtr, enum rhdPowerState_e num, struct rhdPowerState *state) +{ + ASSERT(0); +} + +void RHDPmInit(RHDPtr rhdPtr) +{ + struct rhdPm *Pm = (struct rhdPm *) xnfcalloc(sizeof(struct rhdPm), 1); + union AtomBiosArg data; + RHDFUNC(rhdPtr); + + rhdPtr->Pm = Pm; + + Pm->scrnIndex = rhdPtr->scrnIndex; + Pm->SelectState = rhdPmSelectState; + Pm->DefineState = rhdPmDefineState; + + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CHIP_LIMITS, &data) != ATOM_SUCCESS) { + /* Not getting the information is fatal */ + xfree (Pm); + rhdPtr->Pm = NULL; + return; + } + memcpy (&Pm->Minimum, &data.chipLimits.Minimum, sizeof (struct rhdPowerState)); + memcpy (&Pm->Maximum, &data.chipLimits.Maximum, sizeof (struct rhdPowerState)); + memcpy (&Pm->Default, &data.chipLimits.Default, sizeof (struct rhdPowerState)); + + memcpy (&Pm->Current, &Pm->Default, sizeof (Pm->Default)); + rhdPmGetRawState (rhdPtr, &Pm->Current); + rhdPmValidateClearSetting (Pm, &Pm->Current); + + xf86DrvMsg (rhdPtr->scrnIndex, X_INFO, + "Power Management: used engine clock / memory clock / core (VDDC) voltage (0: ignore)\n"); + xf86DrvMsg (rhdPtr->scrnIndex, X_INFO, "Power Management: Raw Ranges\n"); + rhdPmPrint (Pm, "Minimum", &Pm->Minimum); + rhdPmPrint (Pm, "Maximum", &Pm->Maximum); + rhdPmPrint (Pm, "Default", &Pm->Default); + + if (RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_GET_CHIP_CONFIGS, &data) == ATOM_SUCCESS) { + Pm->NumKnown = data.chipConfigs.num; + Pm->Known = data.chipConfigs.Settings; + } else + xf86DrvMsg (rhdPtr->scrnIndex, X_ERROR, + "Power Management: Cannot get known good chip configurations\n"); + + /* Validate */ + if (! Pm->Default.EngineClock || ! Pm->Default.MemoryClock) + memcpy (&Pm->Default, &Pm->Current, sizeof (Pm->Current)); + rhdPmValidateMinMax (Pm); + rhdPmValidateSetting (Pm, &Pm->Current, 0); + + xf86DrvMsg (rhdPtr->scrnIndex, X_INFO, "Power Management: Validated Ranges\n"); + rhdPmPrint (Pm, "Minimum", &Pm->Minimum); + rhdPmPrint (Pm, "Maximum", &Pm->Maximum); + rhdPmPrint (Pm, "Default", &Pm->Default); + + if (Pm->NumKnown) { + int i; + xf86DrvMsg (rhdPtr->scrnIndex, X_INFO, + "Power Management: Known Good Configurations\n"); + for (i = 0; i < Pm->NumKnown; i++) { + char buf[4]; /* number of known entries is 8bit */ + snprintf (buf, 4, "%d", i+1); + rhdPmPrint (Pm, buf, &Pm->Known[i]); + } + } + + rhdPmSelectSettings (rhdPtr); + /* TODO: cleanup function: xfree(): Pm->Known[], Pm */ +} + +#else /* ATOM_BIOS */ + +void +RHDPmInit (RHDPtr rhdPtr) +{ + rhdPtr->Pm = NULL; +} + +#endif /* ATOM_BIOS */ + + +/* + * save current engine clock + */ +void +RHDPmSave (RHDPtr rhdPtr) +{ + struct rhdPm *Pm = rhdPtr->Pm; + RHDFUNC(rhdPtr); + +#ifdef ATOM_BIOS + /* ATM unconditionally enable power management features + * if low power mode requested */ + if (rhdPtr->atomBIOS) { + union AtomBiosArg data; + + data.val = 1; + RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_PM_SETUP, &data); + if (rhdPtr->ChipSet < RHD_R600) { + data.val = 1; + RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_PM_CLOCKGATING_SETUP, &data); + } + } +#endif + + if (!Pm) return; + + memcpy (&Pm->Stored, &Pm->Default, sizeof (Pm->Default)); + rhdPmGetRawState (rhdPtr, &Pm->Stored); + rhdPmValidateClearSetting (Pm, &Pm->Stored); +} + +/* + * restore saved engine clock + */ +void +RHDPmRestore (RHDPtr rhdPtr) +{ + struct rhdPm *Pm = rhdPtr->Pm; + + RHDFUNC(rhdPtr); + +#ifdef ATOM_BIOS + /* Don't know how to save state yet - unconditionally disable */ + if (rhdPtr->atomBIOS) { + union AtomBiosArg data; + + data.val = 0; + RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_PM_SETUP, &data); + if (rhdPtr->ChipSet < RHD_R600) { + data.val = 0; + RHDAtomBiosFunc (rhdPtr->scrnIndex, rhdPtr->atomBIOS, + ATOM_PM_CLOCKGATING_SETUP, &data); + } + } +#endif + + if (!Pm) + return; + + if (! Pm->Stored.EngineClock && ! Pm->Stored.MemoryClock) { + xf86DrvMsg (Pm->scrnIndex, X_ERROR, "%s: trying to restore " + "uninitialized values.\n", __func__); + return; + } + rhdPmSetRawState (rhdPtr, &Pm->Stored); +} + diff --git a/driver/xf86-video-radeonhd/src/rhd_pm.h b/driver/xf86-video-radeonhd/src/rhd_pm.h new file mode 100644 index 000000000..9f7744cb2 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_pm.h @@ -0,0 +1,78 @@ +/* + * 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, 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 (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 ATI, VA LINUX SYSTEMS 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. + */ + +#ifndef _RHD_PM_H +# define _RHD_PM_H + +/* Note about settings: RHD_PM_OFF may always change the memory clock, while + * for the others it remains to be seen whether we can change it without video + * disturbance. */ +/* TODO: forced settings overwrite default settings (Q: in which cases? RHD_PM_OFF?) */ +enum rhdPowerState_e { + /* DPMS off (Q: what about screensavers, what about 3D offscreen rendering apps) */ + RHD_PM_OFF, + /* DPMS on, no activity for some time */ + RHD_PM_IDLE, + /* Simple 2D activity */ + RHD_PM_SLOW_2D, + /* Advanced 2D activity, e.g. video playback */ + RHD_PM_FAST_2D, + /* Simple 3D activity, e.g. compiz (Q: how to select? indirect rendering only? */ + RHD_PM_SLOW_3D, + /* Fast 3D activity, e.g. games. Usually using default AtomBIOS setting. */ + RHD_PM_FAST_3D, + /* Use theoretical chip maximum, maybe beyond default - not selected automatically */ + RHD_PM_MAX_3D, + /* User supplied */ + RHD_PM_USER, + RHD_PM_NUM_STATES +}; + +struct rhdPm { + int scrnIndex; + + /* R/O */ + struct rhdPowerState Default; + struct rhdPowerState Minimum; + struct rhdPowerState Maximum; + /* Known good settings (in addition to Default). May be NULL */ + int NumKnown; + struct rhdPowerState *Known; + + struct rhdPowerState States[RHD_PM_NUM_STATES]; + struct rhdPowerState Current; + struct rhdPowerState Stored; + + Bool (*DefineState) (RHDPtr rhdPtr, enum rhdPowerState_e num, struct rhdPowerState *state); + Bool (*SelectState) (RHDPtr rhdPtr, enum rhdPowerState_e num); +#if 0 /* TODO: expose? */ + Bool (*SetRawState) (RHDPtr rhdPtr, struct rhdPowerState *state); + void (*GetRawState) (RHDPtr rhdPtr, struct rhdPowerState *state); +#endif +}; + +void RHDPmInit(RHDPtr rhdPtr); +void RHDPmSave(RHDPtr rhdPtr); +void RHDPmRestore(RHDPtr rhdPtr); + +#endif /* _RHD_PM_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_randr.c b/driver/xf86-video-radeonhd/src/rhd_randr.c new file mode 100644 index 000000000..956119b81 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_randr.c @@ -0,0 +1,2162 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * RandR interface. + * + * Only supports RandR 1.2 ATM or no RandR at all. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +/* The _AtomBIOS property is experimental for now - only enable if needed. + * Beware - there be dragons and crashes */ +#define ENABLE_PROPERTY_ATOMBIOS 0 + +/* Xserver interface */ +#include "xf86.h" + +#ifdef RANDR_12_SUPPORT +/* Xserver interface */ +# include "randrstr.h" +# include "xf86i2c.h" /* Missing in old versions of xf86Crtc.h */ +# include "xf86Crtc.h" +# include "xf86RandR12.h" +# include "xaa.h" +# include "exa.h" +#ifdef HAVE_XEXTPROTO_71 +# include "X11/extensions/dpmsconst.h" +#else +# define DPMS_SERVER +# include "X11/extensions/dpms.h" +#endif + +# include "X11/Xatom.h" +#endif /* RANDR_12_SUPPORT */ + +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#endif + +/* Driver specific headers */ +#include "rhd.h" +#include "rhd_atombios.h" +#include "rhd_randr.h" + +#ifdef RANDR_12_SUPPORT +# include "rhd_crtc.h" +# include "rhd_cursor.h" +# include "rhd_connector.h" +# include "rhd_output.h" +# include "rhd_modes.h" +# include "rhd_monitor.h" +# include "rhd_vga.h" +# include "rhd_pll.h" +# include "rhd_lut.h" +# include "rhd_mc.h" +# include "rhd_card.h" +# include "rhd_i2c.h" +# include "rhd_audio.h" + +/* + * Driver internal + */ + +# define WRAP_SCRNINFO(func,new) \ + do { \ + rhdPtr->randr->func = pScrn->func; \ + pScrn->func = new; \ + } while (0) +# define UNWRAP_SCRNINFO(func) \ + pScrn->func = rhdPtr->randr->func + +struct rhdRandr { + xf86CrtcPtr RandrCrtc[2]; + xf86OutputPtr *RandrOutput; /* NULL-terminated */ + void (*PointerMoved)(int, int, int); +} ; + +#define MAX_CONNECTORS_PER_RR_OUTPUT 4 +/* Outputs and Connectors are combined for RandR due to missing abstraction */ +typedef struct _rhdRandrOutput { + char Name[64]; + struct rhdConnector *Connector; + struct rhdOutput *Output; + DisplayModePtr ScaledToMode; + struct rhdCrtc *Crtc; + struct rhdConnector *AllConnectors[MAX_CONNECTORS_PER_RR_OUTPUT]; + Bool OutputActive; +} rhdRandrOutputRec, *rhdRandrOutputPtr; + +struct rhdRandrCrtc { + struct rhdCrtc *rhdCrtc; + union { + FBLinearPtr MemXAA; + ExaOffscreenArea *MemEXA; + } u; +}; + +#define ATOM_EDID "EDID" +#define ATOM_EDID2 "EDID_DATA" +#define ATOM_SIGNAL_FORMAT "SignalFormat" +#define ATOM_CONNECTOR_TYPE "ConnectorType" +#define ATOM_CONNECTOR_NUMBER "ConnectorNumber" +#define ATOM_OUTPUT_NUMBER "_OutputNumber" +#define ATOM_PANNING_AREA "_PanningArea" +#define ATOM_BACKLIGHT "Backlight" +#define ATOM_COHERENT "_Coherent" +#define ATOM_HDMI "_HDMI" +#define ATOM_AUDIO_WORKAROUND "_AudioStreamSilence" +#define ATOM_ATOMBIOS "_AtomBIOS" + +static Atom atom_SignalFormat, atom_ConnectorType, atom_ConnectorNumber, + atom_OutputNumber, atom_PanningArea, atom_Backlight, atom_Coherent, + atom_HdmiProperty, atom_AudioWorkaround; +static Atom atom_unknown, atom_VGA, atom_TMDS, atom_LVDS, atom_DisplayPort, atom_TV; +static Atom atom_DVI, atom_DVII, atom_DVID, atom_DVIA, atom_HDMI, atom_Panel; +static Atom atom_EDID, atom_EDID2, atom_AtomBIOS; + + +/* Get RandR property values */ +static Atom +rhdGetSignalFormat(rhdRandrOutputPtr ro) +{ + switch (ro->Output->Id) { + case RHD_OUTPUT_DACA: + case RHD_OUTPUT_DACB: + switch (ro->Connector->Type) { + case RHD_CONNECTOR_VGA: + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + return atom_VGA; + case RHD_CONNECTOR_TV: + default: + return atom_unknown; /* TODO */ + } + case RHD_OUTPUT_LVTMA: + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_LVDS: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: +#if RHD_OUTPUT_LVTMB != RHD_OUTPUT_LVDS + case RHD_OUTPUT_LVTMB: +#endif + switch (ro->Connector->Type) { + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: + return atom_TMDS; + case RHD_CONNECTOR_PANEL: + return atom_LVDS; + default: + return atom_unknown; + } + case RHD_OUTPUT_TMDSA: +#if RHD_OUTPUT_TMDSB != RHD_OUTPUT_LVDS + case RHD_OUTPUT_TMDSB: +#endif + return atom_TMDS; + default: + return atom_unknown; + } +} +static Atom +rhdGetConnectorType(rhdRandrOutputPtr ro) +{ + switch (ro->Connector->Type) { + case RHD_CONNECTOR_VGA: + return atom_VGA; + case RHD_CONNECTOR_DVI: + case RHD_CONNECTOR_DVI_SINGLE: +#ifdef NOTYET + if (ro->Output->Connector == RHD_CONNECTOR_HDMI || ro->Output->Connector == RHD_CONNECTOR_HDMI_DUAL) + return atom_HDMI; +#endif + if (strncmp (ro->Connector->Name, "DVI-I", 5) == 0) + return atom_DVII; + if (strncmp (ro->Connector->Name, "DVI-D", 5) == 0) + return atom_DVID; + if (strncmp (ro->Connector->Name, "DVI-A", 5) == 0) + return atom_DVIA; + return atom_DVI; + case RHD_CONNECTOR_PANEL: + return atom_Panel; + case RHD_CONNECTOR_TV: + return atom_TV; /* TODO */ + default: + return atom_unknown; + } +} + +/* Set crtc pos according to mouse pos and panning information */ +static void +rhdUpdateCrtcPos(RHDPtr rhdPtr, struct rhdCrtc *Crtc, int x, int y) +{ + int i; + + if (Crtc->MaxX > 0) { + int cx = Crtc->X, cy = Crtc->Y; + int w = Crtc->CurrentMode->HDisplay; + int h = Crtc->CurrentMode->VDisplay; + if (x < cx) + cx = x > Crtc->MinX ? x : Crtc->MinX; + if (x >= cx + w) + cx = x < Crtc->MaxX ? x-w+1 : Crtc->MaxX-w; + if (y < cy) + cy = y > Crtc->MinY ? y : Crtc->MinY; + if (y >= cy + h) + cy = y < Crtc->MaxY ? y-h+1 : Crtc->MaxY-h; + if (cx != Crtc->X || cy != Crtc->Y) + Crtc->FrameSet(Crtc, cx, cy); + for (i = 0; i < 2; i++) { + xf86CrtcPtr crtc = (xf86CrtcPtr) rhdPtr->randr->RandrCrtc[i]; + if (Crtc == ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc) { + crtc->x = cx; + crtc->y = cy; + } + } + } +} + +/* Debug: print out state */ +void +RHDDebugRandrState (RHDPtr rhdPtr, const char *msg) +{ + int i; + xf86OutputPtr *ro; + RHDDebug(rhdPtr->scrnIndex, "State at %s:\n", msg); + + for (i = 0; i < 2; i++) { + xf86CrtcPtr crtc = rhdPtr->randr->RandrCrtc[i]; + struct rhdCrtc *c = ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc; + RHDDebugCont(" RRCrtc #%d [rhd %s]: active %d [%d] " + "mode %s (%dx%d) +%d+%d\n", + i, c->Name, crtc->enabled, c->Active, + crtc->mode.name ? crtc->mode.name : "unnamed", + crtc->mode.HDisplay, crtc->mode.VDisplay, + crtc->x, crtc->y); + } + for (ro = rhdPtr->randr->RandrOutput; *ro; ro++) { + rhdRandrOutputPtr o = (rhdRandrOutputPtr) (*ro)->driver_private; + ASSERT(!strcmp((*ro)->name,o->Name)); + RHDDebugCont(" RROut %s [Out %s Conn %s] Crtc %s [%s] " + "[%sactive] %s\n", + (*ro)->name, o->Output->Name, o->Connector->Name, + (*ro)->crtc ? ((struct rhdRandrCrtc *)((*ro)->crtc->driver_private))->rhdCrtc->Name : "null", + o->Output->Crtc ? o->Output->Crtc->Name : "null", + o->Output->Active ? "" : "in", + (*ro)->status == XF86OutputStatusConnected ? "connected" : + (*ro)->status == XF86OutputStatusDisconnected ? "disconnected" : + (*ro)->status == XF86OutputStatusUnknown ? "unknownState" : + "badState" ); + } +} + + +/* + * xf86CrtcConfig callback functions + */ + +static Bool +rhdRRXF86CrtcResize(ScrnInfoPtr pScrn, int width, int height) +{ + RHDFUNC(pScrn); + /* This is strange... if we set virtualX/virtualY like the intel driver + * does, we limit ourself in the future to this maximum size. + * The check for this is internally in RandR, no idea why the intel driver + * actually works this way... + * Even more curious: if we DON'T update virtual, everything seems to + * work as expected... */ +#if 0 + pScrn->virtualX = width; + pScrn->virtualY = height; +#endif + return TRUE; +} + + +/* + * xf86Crtc callback functions + */ + +/* Turns the crtc on/off, or sets intermediate power levels if available. */ +static void +rhdRRCrtcDpms(xf86CrtcPtr Crtc, int mode) +{ + RHDPtr rhdPtr = RHDPTR(Crtc->scrn); + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)(Crtc->driver_private))->rhdCrtc; + + RHDDebug(rhdCrtc->scrnIndex, "%s: %s: %s\n", __func__, rhdCrtc->Name, + mode==DPMSModeOn ? "On" : mode==DPMSModeOff ? "Off" : "Other"); + + switch (mode) { + case DPMSModeOn: + if (rhdCrtc->PLL) + rhdCrtc->PLL->Power(rhdCrtc->PLL, RHD_POWER_ON); + rhdCrtc->Power(rhdCrtc, RHD_POWER_ON); + rhdCrtc->Active = TRUE; + break; + case DPMSModeSuspend: + case DPMSModeStandby: + rhdCrtc->Power(rhdCrtc, RHD_POWER_RESET); + if (rhdCrtc->PLL) + rhdCrtc->PLL->Power(rhdCrtc->PLL, RHD_POWER_RESET); + rhdCrtc->Active = FALSE; + break; + case DPMSModeOff: + rhdCrtc->Power(rhdCrtc, RHD_POWER_SHUTDOWN); + if (rhdCrtc->PLL) + rhdCrtc->PLL->Power(rhdCrtc->PLL, RHD_POWER_SHUTDOWN); + rhdCrtc->Active = FALSE; + break; + default: + ASSERT(!"Unknown DPMS mode"); + } + RHDDebugRandrState(rhdPtr, "POST-CrtcDpms"); +} + +/* Lock CRTC prior to mode setting. Returns whether unlock is needed */ +static Bool +rhdRRCrtcLock(xf86CrtcPtr crtc) +{ + /* Looks like we don't have to lock for mode setting. Only as long as + * buffers are fixed, of course */ + return FALSE; +} + +/* Unlock CRTC after mode setting */ +static void +rhdRRCrtcUnlock (xf86CrtcPtr crtc) +{ } + +/* Helper: setup PLL and LUT for Crtc */ +static void +setupCrtc(RHDPtr rhdPtr, struct rhdCrtc *Crtc) +{ + int i; + + /* PLL & LUT setup - static at the moment */ + if (Crtc->PLL) + return; + for (i = 0; i < 2; i++) + if (Crtc == rhdPtr->Crtc[i]) + break; + ASSERT(i<2); + Crtc->PLL = rhdPtr->PLLs[i]; + Crtc->LUT = rhdPtr->LUT[i]; +} + +/* Set video mode. + * randr calls for Crtc and Output separately, while order should be + * up to the driver. Well. */ +static void +rhdRRCrtcPrepare(xf86CrtcPtr crtc) +{ + RHDPtr rhdPtr = RHDPTR(crtc->scrn); + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)(crtc->driver_private))->rhdCrtc; + + RHDFUNC(rhdPtr); + setupCrtc(rhdPtr, rhdCrtc); + pScrn->vtSema = TRUE; + + /* Disable CRTCs to stop noise from appearing. */ + rhdCrtc->Power(rhdCrtc, RHD_POWER_RESET); + + /* Verify panning area */ + if (rhdCrtc->MaxX > rhdCrtc->Width) + rhdCrtc->MaxX = rhdCrtc->Width; + if (rhdCrtc->MaxY > rhdCrtc->Height) + rhdCrtc->MaxY = rhdCrtc->Height; +} + +static void +rhdRRCrtcModeSet(xf86CrtcPtr crtc, + DisplayModePtr OrigMode, DisplayModePtr Mode, + int x, int y) +{ + RHDPtr rhdPtr = RHDPTR(crtc->scrn); + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc*) (crtc->driver_private))->rhdCrtc; + xf86CrtcConfigPtr xf86CrtcConfig = XF86_CRTC_CONFIG_PTR(crtc->scrn); + CARD32 ScanOutOffset; + int i; + + /* RandR may give us a mode without a name... (xf86RandRModeConvert) */ + if (!Mode->name && crtc->mode.name) + Mode->name = xstrdup(crtc->mode.name); + + RHDDebug(rhdPtr->scrnIndex, "%s: %s : %s at %d/%d\n", __func__, + rhdCrtc->Name, Mode->name, x, y); + + /* + * for AtomBIOS SetPixelClock we need information about the outputs. + * So find the output(s) matching this Crtc and assign the Crtc to it. + */ + for (i = 0; i < xf86CrtcConfig->num_output; i++) { + if (xf86CrtcConfig->output[i]->crtc == crtc) { + rhdRandrOutputPtr rout = xf86CrtcConfig->output[i]->driver_private; + rout->Output->Crtc = rhdCrtc; + } + } + + if (rhdPtr->verbosity >= 3) { + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "On Crtc %i Setting %3.1f Hz Mode: ", + rhdCrtc->Id, Mode->VRefresh); + RHDPrintModeline(Mode); + if (OrigMode->VDisplay != Mode->VDisplay || OrigMode->HDisplay != Mode->HDisplay) { + xf86DrvMsg(-1, X_NONE, "Scaled from: "); + RHDPrintModeline(OrigMode); + } + } + /* Set up mode */ + if (crtc->rotatedData != NULL) { + ScanOutOffset = (unsigned long) crtc->rotatedData - (unsigned long)rhdPtr->FbBase; + x = y = 0; + } else { + ScanOutOffset = rhdPtr->FbScanoutStart; + } + rhdCrtc->FBSet(rhdCrtc, pScrn->displayWidth, pScrn->virtualX, pScrn->virtualY, + pScrn->depth, ScanOutOffset); + rhdCrtc->ModeSet(rhdCrtc, Mode); + if (OrigMode->VDisplay != Mode->VDisplay || OrigMode->HDisplay != Mode->HDisplay) + rhdCrtc->ScaleSet(rhdCrtc, rhdCrtc->ScaleType, OrigMode, Mode); + else + rhdCrtc->ScaleSet(rhdCrtc, RHD_CRTC_SCALE_TYPE_NONE, Mode, NULL); + + rhdCrtc->FrameSet(rhdCrtc, x, y); + rhdUpdateCrtcPos(rhdPtr, rhdCrtc, rhdCrtc->Cursor->X, rhdCrtc->Cursor->Y); + RHDPLLSet(rhdCrtc->PLL, Mode->Clock); /* This also powers up PLL */ + rhdCrtc->LUTSelect(rhdCrtc, rhdCrtc->LUT); + + /* + * RandR is able to bring up new Crtcs, but can't be bothered to set up + * a cmap on them. + * + * The pScreen check tells us whether we are still in PreInit. If we are + * still in PreInit, the xserver will still do the right thing and call + * LoadPalette accordingly after the modeset. VT switch will also do the + * right thing still, but at that time no new CRTC gets initialised, so + * LUT->Initialised is either set, or the current function isn't called. + */ + if (!rhdCrtc->LUT->Initialised && pScrn->pScreen) + RHDLUTCopyForRR(rhdCrtc->LUT); +} + +static void +rhdRRCrtcCommit(xf86CrtcPtr crtc) +{ + RHDPtr rhdPtr = RHDPTR(crtc->scrn); + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)(crtc->driver_private))->rhdCrtc; + + RHDFUNC(rhdPtr); + + rhdCrtc->Active = TRUE; + rhdCrtc->Power(rhdCrtc, RHD_POWER_ON); + + if (crtc->scrn->pScreen != NULL) + xf86_reload_cursors(crtc->scrn->pScreen); + + RHDDebugRandrState(rhdPtr, rhdCrtc->Name); +} + +static void +rhdRRCrtcGammaSet(xf86CrtcPtr crtc, CARD16 *red, CARD16 *green, CARD16 *blue, + int size) +{ + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)(crtc->driver_private))->rhdCrtc; + RHDDebug(rhdCrtc->scrnIndex, "%s: %s.\n", __func__, rhdCrtc->Name); + + if (size < 256) { + xf86DrvMsg(rhdCrtc->scrnIndex, X_ERROR, + "LUT: only %d rows of LUT given, when 256 expected; aborting", size); + return; + } else if (size > 256) { + xf86DrvMsg(rhdCrtc->scrnIndex, X_WARNING, + "LUT: %d rows of LUT given, when 256 expected; some rows are ignored", size); + } + + rhdCrtc->LUT->Set(rhdCrtc->LUT, red, green, blue); +} + +/* Dummy, because not tested for NULL */ +static Bool +rhdRRCrtcModeFixupDUMMY(xf86CrtcPtr crtc, + DisplayModePtr mode, + DisplayModePtr adjusted_mode) +{ + return TRUE; +} + +#if XF86_CRTC_VERSION >= 2 +/* Entry point for RandR 1.3 panning */ +static void +rhdRRCrtcSetOrigin(xf86CrtcPtr crtc, int x, int y) +{ + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc*) (crtc->driver_private))->rhdCrtc; + + rhdCrtc->FrameSet(rhdCrtc, x, y); +} +#endif + + +/* + * xf86Output callback functions + */ + +static void +rhdRROutputCreateResources(xf86OutputPtr out) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + struct rhdOutput *o; + INT32 val; + CARD32 num; + int err; + INT32 range[2]; + static xf86OutputPtr first_output = NULL; + + RHDFUNC(rhdPtr); + if (! first_output) + first_output = out; + + /* Create atoms for RandR 1.3 properties */ + atom_EDID = MakeAtom(ATOM_EDID, + sizeof(ATOM_EDID)-1, TRUE); + atom_EDID2 = MakeAtom(ATOM_EDID2, + sizeof(ATOM_EDID2)-1, TRUE); + atom_SignalFormat = MakeAtom(ATOM_SIGNAL_FORMAT, + sizeof(ATOM_SIGNAL_FORMAT)-1, TRUE); + atom_ConnectorType = MakeAtom(ATOM_CONNECTOR_TYPE, + sizeof(ATOM_CONNECTOR_TYPE)-1, TRUE); + atom_ConnectorNumber = MakeAtom(ATOM_CONNECTOR_NUMBER, + sizeof(ATOM_CONNECTOR_NUMBER)-1, TRUE); + atom_OutputNumber = MakeAtom(ATOM_OUTPUT_NUMBER, + sizeof(ATOM_OUTPUT_NUMBER)-1, TRUE); + atom_PanningArea = MakeAtom(ATOM_PANNING_AREA, + sizeof(ATOM_PANNING_AREA)-1, TRUE); + atom_AtomBIOS = MakeAtom(ATOM_ATOMBIOS, + sizeof(ATOM_ATOMBIOS)-1, TRUE); + + /* Create atoms for RandR 1.3 property values */ + atom_unknown = MakeAtom("unknown", 7, TRUE); + atom_VGA = MakeAtom("VGA", 3, TRUE); + atom_TMDS = MakeAtom("TMDS", 4, TRUE); + atom_LVDS = MakeAtom("LVDS", 4, TRUE); + atom_DisplayPort = MakeAtom("DisplayPort", 11, TRUE); + atom_TV = MakeAtom("TV", 2, TRUE); + atom_DVI = MakeAtom("DVI", 3, TRUE); + atom_DVII = MakeAtom("DVI-I", 5, TRUE); + atom_DVID = MakeAtom("DVI-D", 5, TRUE); + atom_DVIA = MakeAtom("DVI-A", 5, TRUE); + atom_HDMI = MakeAtom("HDMI", 4, TRUE); + atom_Panel = MakeAtom("Panel", 5, TRUE); + + /* Set up properties */ + val = rhdGetSignalFormat(rout); + /* TODO: for TV multiple signal formats will be possible */ + RRConfigureOutputProperty(out->randr_output, atom_SignalFormat, + FALSE, FALSE, TRUE, 1, &val); + RRChangeOutputProperty(out->randr_output, atom_SignalFormat, + XA_ATOM, 32, PropModeReplace, + 1, &val, FALSE, FALSE); + + val = rhdGetConnectorType(rout); + RRConfigureOutputProperty(out->randr_output, atom_ConnectorType, + FALSE, FALSE, TRUE, 0, NULL); + RRChangeOutputProperty(out->randr_output, atom_ConnectorType, + XA_ATOM, 32, PropModeReplace, + 1, &val, FALSE, FALSE); + + for (num = 0; num < RHD_CONNECTORS_MAX; num++) + if (rout->Connector == rhdPtr->Connector[num]) + break; + ASSERT(num < RHD_CONNECTORS_MAX); + num++; /* For RANDR_CONNECTOR_NUMBER 0 is unknown */ + RRConfigureOutputProperty(out->randr_output, atom_ConnectorNumber, + FALSE, FALSE, TRUE, 0, NULL); + RRChangeOutputProperty(out->randr_output, atom_ConnectorNumber, + XA_INTEGER, 32, PropModeReplace, + 1, &num, FALSE, FALSE); + + for (num = 1, o = rhdPtr->Outputs; o; num++, o = o->Next) + if (rout->Output == o) + break; + ASSERT(o); + RRConfigureOutputProperty(out->randr_output, atom_OutputNumber, + FALSE, FALSE, FALSE, 0, NULL); + RRChangeOutputProperty(out->randr_output, atom_OutputNumber, + XA_INTEGER, 32, PropModeReplace, + 1, &num, FALSE, FALSE); + + RRConfigureOutputProperty(out->randr_output, atom_PanningArea, + FALSE, FALSE, FALSE, 0, NULL); + RRChangeOutputProperty(out->randr_output, atom_PanningArea, + XA_STRING, 8, PropModeReplace, + 0, NULL, FALSE, FALSE); + +#if ENABLE_PROPERTY_ATOMBIOS + /* AtomBIOS usage */ + /* We don't have per-CRTC or even per-GPU properties; + * so fake this by only applying to first output */ + if (out == first_output) { + char *string; + RRConfigureOutputProperty(out->randr_output, atom_AtomBIOS, + FALSE, FALSE, FALSE, 0, NULL); + string = rhdReturnAtomBIOSUsage(rhdPtr); + RRChangeOutputProperty(out->randr_output, atom_AtomBIOS, + XA_STRING, 8, PropModeReplace, + strlen(string), string, FALSE, FALSE); + free (string); + } +#endif + + if (rout->Output->Property) { + if (rout->Output->Property(rout->Output, rhdPropertyCheck, RHD_OUTPUT_BACKLIGHT, NULL)) { + atom_Backlight = MakeAtom(ATOM_BACKLIGHT, + sizeof(ATOM_BACKLIGHT)-1, TRUE); + + range[0] = 0; + range[1] = RHD_BACKLIGHT_PROPERTY_MAX; + err = RRConfigureOutputProperty(out->randr_output, atom_Backlight, + FALSE, TRUE, FALSE, 2, range); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "RRConfigureOutputProperty error: %d\n", err); + else { + union rhdPropertyData val; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, RHD_OUTPUT_BACKLIGHT, &val)) + val.integer = RHD_BACKLIGHT_PROPERTY_MAX; /* max */ + + err = RRChangeOutputProperty(out->randr_output, atom_Backlight, + XA_INTEGER, 32, PropModeReplace, + 1, &val.integer, FALSE, FALSE); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "In %s RRChangeOutputProperty error: %d\n", + __func__, err); + } + } + if (rout->Output->Property(rout->Output, rhdPropertyCheck, RHD_OUTPUT_COHERENT, NULL)) { + atom_Coherent = MakeAtom(ATOM_COHERENT, + sizeof(ATOM_COHERENT)-1, TRUE); + + range[0] = 0; + range[1] = 1; + err = RRConfigureOutputProperty(out->randr_output, atom_Coherent, + FALSE, TRUE, FALSE, 2, range); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "RRConfigureOutputProperty error: %d\n", err); + else { + union rhdPropertyData val; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, RHD_OUTPUT_COHERENT, &val)) + val.Bool = 1; + err = RRChangeOutputProperty(out->randr_output, atom_Coherent, + XA_INTEGER, 32, PropModeReplace, + 1, &val.Bool, FALSE, FALSE); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "In %s RRChangeOutputProperty error: %d\n", + __func__, err); + } + } + if (rout->Output->Property(rout->Output, rhdPropertyCheck, RHD_OUTPUT_HDMI, NULL)) { + atom_HdmiProperty = MakeAtom(ATOM_HDMI, sizeof(ATOM_HDMI)-1, TRUE); + + range[0] = 0; + range[1] = 1; + err = RRConfigureOutputProperty(out->randr_output, atom_HdmiProperty, + FALSE, TRUE, FALSE, 2, range); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "RRConfigureOutputProperty error: %d\n", err); + else { + union rhdPropertyData val; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, RHD_OUTPUT_HDMI, &val)) + val.Bool = 1; + err = RRChangeOutputProperty(out->randr_output, atom_HdmiProperty, + XA_INTEGER, 32, PropModeReplace, + 1, &val.Bool, FALSE, FALSE); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "In %s RRChangeOutputProperty error: %d\n", + __func__, err); + } + } + if (rout->Output->Property(rout->Output, rhdPropertyCheck, RHD_OUTPUT_AUDIO_WORKAROUND, NULL)) { + atom_AudioWorkaround = MakeAtom(ATOM_AUDIO_WORKAROUND, sizeof(ATOM_AUDIO_WORKAROUND)-1, TRUE); + + range[0] = 0; + range[1] = 1; + err = RRConfigureOutputProperty(out->randr_output, atom_AudioWorkaround, + FALSE, TRUE, FALSE, 2, range); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "RRConfigureOutputProperty error: %d\n", err); + else { + union rhdPropertyData val; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, RHD_OUTPUT_AUDIO_WORKAROUND, &val)) + val.Bool = 1; + err = RRChangeOutputProperty(out->randr_output, atom_AudioWorkaround, + XA_INTEGER, 32, PropModeReplace, + 1, &val.Bool, FALSE, FALSE); + if (err != 0) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "In %s RRChangeOutputProperty error: %d\n", + __func__, err); + } + } + + } +} + +/* Turns the output on/off, or sets intermediate power levels if available. */ +/* Something that cannot be solved with the current RandR model is that + * multiple connectors might be attached to the same output. They cannot be + * driven with different crtcs then, but RandR sees them as different outputs + * because of a missing abstraction layer. This implementation will silently + * set one crtc or the other, and maybe even won't warn. */ +static void +rhdRROutputDpms(xf86OutputPtr out, + int mode) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + xf86OutputPtr *ro; + struct rhdCrtc *rhdCrtc = out->crtc ? ((struct rhdRandrCrtc *)(out->crtc->driver_private))->rhdCrtc : NULL; + const char *outUsedBy = NULL; + + RHDDebug(rhdPtr->scrnIndex, "%s: Output %s : %s\n", __func__, rout->Name, + mode==DPMSModeOn ? "On" : mode==DPMSModeOff ? "Off" : "Other"); + + for (ro = rhdPtr->randr->RandrOutput; *ro; ro++) { + rhdRandrOutputPtr o = (rhdRandrOutputPtr) (*ro)->driver_private; + if (o != rout && o->Output == rout->Output && (*ro)->crtc) + outUsedBy = (*ro)->name; + } + switch (mode) { + case DPMSModeOn: + rout->Output->Power(rout->Output, RHD_POWER_ON); + rout->Output->Active = TRUE; + ASSERT(rhdCrtc); + ASSERT(rhdCrtc == rout->Output->Crtc); + rout->Crtc = rhdCrtc; + break; + case DPMSModeSuspend: + case DPMSModeStandby: + if (outUsedBy) { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "RandR: While resetting %s: output %s is also used " + "by %s - ignoring\n", + out->name, rout->Output->Name, outUsedBy); + break; + } + rout->Output->Power(rout->Output, RHD_POWER_RESET); + rout->Output->Active = FALSE; + rout->Crtc = NULL; + break; + case DPMSModeOff: + if (outUsedBy) { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "RandR: While switching off %s: output %s is also used " + "by %s - ignoring\n", + out->name, rout->Output->Name, outUsedBy); + break; + } + rout->Output->Power(rout->Output, RHD_POWER_SHUTDOWN); + rout->Output->Active = FALSE; + rout->Crtc = NULL; + break; + default: + ASSERT(!"Unknown DPMS mode"); + } + RHDDebugRandrState(rhdPtr, "POST-OutputDpms"); +} + +/* RandR has a weird sense of how validation and fixup should be handled: + * - Fixup and validation can interfere, they would have to be looped + * - Validation should be done after fixup + * - There is no crtc validation AT ALL + * - The necessity of adjusted_mode is questionable + * - Outputs and crtcs are checked independently, and one at a time. + * This can interfere, the driver should know the complete setup for + * validation and fixup. + * We also cannot emulate, because we never know when validation is finished. + * Therefore we only use a single function for all and have to work around + * not knowing what the other crtcs might be needed for. */ +static int +rhdRROutputModeValid(xf86OutputPtr out, + DisplayModePtr OrigMode) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + DisplayModePtr Mode = xf86DuplicateMode(OrigMode); + int Status; + + RHDFUNC(rhdPtr); + + /* RandR may give us a mode without a name... (xf86RandRModeConvert) + * xf86DuplicateMode should fill it up, though */ + if (!Mode->name) + Mode->name = xstrdup("n/a"); + + RHDDebug(rhdPtr->scrnIndex, "%s: Output %s : %s\n", __func__, + rout->Name, Mode->name); + if (rhdPtr->verbosity >= LOG_DEBUG) + RHDPrintModeline(Mode); + ASSERT(rout->Connector); + ASSERT(rout->Output); + + /* If out->crtc is not NULL, it is not necessarily the Crtc that will + * be used, so let's better skip crtc based checks... */ + /* Monitor is handled by RandR */ + if (!rout->Output->Connector) + return MODE_OUTPUT_UNDEF; + Status = RHDRRModeFixup(out->scrn, Mode, NULL, rout->Connector, + rout->Output, NULL, rout->ScaledToMode ? TRUE : FALSE); + RHDDebug(rhdPtr->scrnIndex, "%s: %s: %s\n", __func__, + Mode->name, RHDModeStatusToString(Status)); + xfree(Mode->name); + xfree(Mode); + return Status; +} + +static void +rhdRRModeCopy(DisplayModePtr OrigMode, DisplayModePtr Mode) +{ + memset(Mode, 0, sizeof(DisplayModeRec)); + Mode->name = xstrdup(OrigMode->name ? OrigMode->name : "n/a"); + Mode->status = OrigMode->status; + Mode->type = OrigMode->type; + Mode->Clock = OrigMode->Clock; + Mode->HDisplay = OrigMode->HDisplay; + Mode->HSyncStart = OrigMode->HSyncStart; + Mode->HSyncEnd = OrigMode->HSyncEnd; + Mode->HTotal = OrigMode->HTotal; + Mode->HSkew = OrigMode->HSkew; + Mode->VDisplay = OrigMode->VDisplay; + Mode->VSyncStart = OrigMode->VSyncStart; + Mode->VSyncEnd = OrigMode->VSyncEnd; + Mode->VTotal = OrigMode->VTotal; + Mode->VScan = OrigMode->VScan; + Mode->Flags = OrigMode->Flags; + + if ((Mode->type & M_T_CRTC_C) == M_T_BUILTIN) { + Mode->CrtcHDisplay = OrigMode->CrtcHDisplay; + Mode->CrtcHBlankStart = OrigMode->CrtcHBlankStart; + Mode->CrtcHSyncStart = OrigMode->CrtcHSyncStart; + Mode->CrtcHBlankEnd = OrigMode->CrtcHBlankEnd; + Mode->CrtcHSyncEnd = OrigMode->CrtcHSyncEnd; + Mode->CrtcHTotal = OrigMode->CrtcHTotal; + Mode->CrtcVDisplay = OrigMode->CrtcVDisplay; + Mode->CrtcVBlankStart = OrigMode->CrtcVBlankStart; + Mode->CrtcVSyncStart = OrigMode->CrtcVSyncStart; + Mode->CrtcVSyncEnd = OrigMode->CrtcVSyncEnd; + Mode->CrtcVBlankEnd = OrigMode->CrtcVBlankEnd; + Mode->CrtcVTotal = OrigMode->CrtcVTotal; + } +} + +/* + * + */ +static void +rhdRRSanitizeMode(DisplayModePtr Mode) +{ + if (!Mode->name) + Mode->name = xstrdup("n/a"); + Mode->status = MODE_OK; + if ((Mode->type & M_T_CRTC_C) != M_T_BUILTIN) { + Mode->CrtcHDisplay = Mode->CrtcHBlankStart = + Mode->CrtcHSyncStart = Mode->CrtcHBlankEnd = + Mode->CrtcHSyncEnd = Mode->CrtcHTotal = 0; + Mode->CrtcVDisplay = Mode->CrtcVBlankStart = + Mode->CrtcVSyncStart = Mode->CrtcVSyncEnd = + Mode->CrtcVBlankEnd = Mode->CrtcVTotal = 0; + Mode->SynthClock = 0; + } +} + +/* + * + */ +static void +rhdRRFreeOutputs( RHDPtr rhdPtr) +{ + xf86OutputPtr *ro; + struct rhdOutput *Output; + /* + * modesUpdated indicates if we are entering here for a first time after a + * OutputsModeValid(). In this case a new mode setting round starts, thus + * we need to free all outputs so that all inactive outputs are freed. + * We later on allocate each output. + */ + for (Output = rhdPtr->Outputs; Output; Output = Output->Next) { + if (Output->AllocFree) { + for (ro = rhdPtr->randr->RandrOutput; *ro; ro++) { + rhdRandrOutputPtr o = (rhdRandrOutputPtr) (*ro)->driver_private; + if (o->Output == Output) { + if (!(*ro)->crtc) { + Output->AllocFree(Output, RHD_OUTPUT_FREE); + RHDDebug(rhdPtr->scrnIndex, "%s: Freeing Output: %s\n",__func__, + Output->Name); + } + } + } + } + } +} + +/* The crtc is only known on fixup time. Now it's actually to late to reject a + * mode and give a reasonable answer why (return is bool), but we'll better not + * set a mode than scrap our hardware */ +static Bool +rhdRROutputModeFixup(xf86OutputPtr out, + DisplayModePtr OrigMode, + DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + struct rhdCrtc *rhdCrtc = NULL; + int Status; + DisplayModePtr DisplayedMode; + Bool Scaled = FALSE; + + RHDFUNC(rhdPtr); + ASSERT(out->crtc); + rhdCrtc = ((struct rhdRandrCrtc *)(out->crtc->driver_private))->rhdCrtc; + + rhdRRFreeOutputs(rhdPtr); + + xfree(Mode->name); + if (rout->ScaledToMode) { + DisplayModePtr tmp = RHDModeCopy(rout->ScaledToMode); + /* validate against CRTC. */ + if ((Status = RHDValidateScaledToMode(rhdCrtc, tmp))!= MODE_OK) { + RHDDebug(rhdPtr->scrnIndex, "%s: %s ScaledToMode INVALID: [0x%x] %s\n", __func__, + tmp->name, Status, RHDModeStatusToString(Status)); + xfree(tmp); + return FALSE; /* failing here doesn't help */ + } + memcpy(Mode, tmp, sizeof(DisplayModeRec)); + Mode->name = xstrdup(tmp->name); + Mode->prev = Mode->next = NULL; + xfree(tmp->name); + xfree(tmp); + + /* sanitize OrigMode */ + rhdRRSanitizeMode(OrigMode); + DisplayedMode = OrigMode; + rhdCrtc->ScaledToMode = Mode; + Scaled = TRUE; + } else { + /* !@#$ xf86RandRModeConvert doesn't initialize Mode with 0 + * Fixed in xserver git c6c284e6 */ + rhdRRModeCopy(OrigMode, Mode); + + DisplayedMode = Mode; + } + + /* RHDRRModeFixup will set up the remaining bits */ + + RHDDebug(rhdPtr->scrnIndex, "%s: Output %s : %s\n", __func__, + rout->Name, Mode->name); + ASSERT(rout->Connector); + ASSERT(rout->Output); + + setupCrtc(rhdPtr, rhdCrtc); + + /* Monitor is handled by RandR */ + if (!rout->Output->AllocFree || rout->Output->AllocFree(rout->Output, RHD_OUTPUT_ALLOC)) { + Status = RHDRRModeFixup(out->scrn, DisplayedMode, rhdCrtc, rout->Connector, + rout->Output, NULL, Scaled); + } else + Status = MODE_NO_ENCODER; + + if (Status != MODE_OK) { + rout->OutputActive = FALSE; + RHDDebug(rhdPtr->scrnIndex, "%s: %s FAILED: [0x%x] %s\n", __func__, + Mode->name, Status, RHDModeStatusToString(Status)); + return FALSE; + } + rout->OutputActive = TRUE; + return TRUE; +} + +/* Set output mode. + * Again, randr calls for Crtc and Output separately, while order should be + * up to the driver. There wouldn't be a need for prepare/set/commit then. + * We cannot do everything in OutputModeSet, because the viewport isn't known + * here. */ +static void +rhdRROutputPrepare(xf86OutputPtr out) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + ScrnInfoPtr pScrn = xf86Screens[rhdPtr->scrnIndex]; + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + + RHDFUNC(rhdPtr); + pScrn->vtSema = TRUE; + + /* no active output == no mess */ + rout->Output->Power(rout->Output, RHD_POWER_RESET); + rout->Output->Crtc = rout->Crtc = NULL; +} +static void +rhdRROutputModeSet(xf86OutputPtr out, + DisplayModePtr OrigMode, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)(out->crtc->driver_private))->rhdCrtc; + + RHDFUNC(rhdPtr); + + /* RandR may give us a mode without a name... (xf86RandRModeConvert) */ + if (!Mode->name && out->crtc->mode.name) + Mode->name = xstrdup(out->crtc->mode.name); + + RHDDebug(rhdPtr->scrnIndex, "%s: Output %s : %s to %s\n", __func__, + rout->Name, Mode->name, + rhdCrtc->Name); + + /* RandR might want to set up several outputs (RandR speech) with different + * crtcs, while the outputs differ in fact only by the connector and thus + * cannot be used by different crtcs */ + if (rout->Crtc && rout->Crtc != rhdCrtc) + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "RandR: Output %s has already CRTC attached - " + "assuming ouput/connector clash\n", rout->Name); + /* Set up mode */ + rout->Crtc = rhdCrtc; + ASSERT(rhdCrtc == rout->Output->Crtc); + rout->Output->Mode(rout->Output, Mode); +} +static void +rhdRROutputCommit(xf86OutputPtr out) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + CARD32 val; + char buf[32]; + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)(out->crtc->driver_private))->rhdCrtc; + + RHDFUNC(rhdPtr); + ASSERT(rhdCrtc == rout->Output->Crtc); + + rout->Output->Active = TRUE; + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + rout->Output->Power(rout->Output, RHD_POWER_ON); + + /* Some outputs may have physical protocol changes (e.g. TV) */ + val = rhdGetSignalFormat(rout); + RRChangeOutputProperty(out->randr_output, atom_SignalFormat, + XA_ATOM, 32, PropModeReplace, + 1, &val, TRUE, FALSE); + /* Should be a crtc property */ + if (rhdCrtc->MaxX > rhdCrtc->MinX && rhdCrtc->MaxY > rhdCrtc->MinY) + sprintf(buf, "%dx%d+%d+%d", rhdCrtc->MaxX - rhdCrtc->MinX, + rhdCrtc->MaxY - rhdCrtc->MinY, rhdCrtc->MinX, rhdCrtc->MinY); + else + buf[0] = 0; + RRChangeOutputProperty(out->randr_output, atom_PanningArea, + XA_STRING, 8, PropModeReplace, + strlen(buf), buf, TRUE, FALSE); + + RHDDebugRandrState(rhdPtr, rout->Name); +} + +/* + * This function looks for other outputs on the connector rout is connected to. + * If one of those outputs can be sensed and is sensed the function will return + * one of those. + */ +static rhdRandrOutputPtr +rhdRROtherOutputOnConnectorHelper(RHDPtr rhdPtr, rhdRandrOutputPtr rout) +{ + xf86OutputPtr *ro; + + for (ro = rhdPtr->randr->RandrOutput; *ro; ro++) { + rhdRandrOutputPtr o = + (rhdRandrOutputPtr) (*ro)->driver_private; + if (o != rout && + o->Connector == rout->Connector && + o->Output->Sense) { + /* Yes, this looks wrong, but is correct */ + enum rhdSensedOutput SensedType = + o->Output->Sense(o->Output, o->Connector); + if (SensedType != RHD_SENSED_NONE) { + RHDOutputPrintSensedType(o->Output); + return o; + } + } + } + return NULL; +} + +/* Probe for a connected output. */ +static xf86OutputStatus +rhdRROutputDetect(xf86OutputPtr output) +{ + RHDPtr rhdPtr = RHDPTR(output->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) output->driver_private; + + RHDDebug(rhdPtr->scrnIndex, "%s: Output %s\n", __func__, rout->Name); + + /* Assume that a panel is always connected */ + if (rout->Connector->Type == RHD_CONNECTOR_PANEL) { + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + return XF86OutputStatusConnected; + } else if (rout->Connector->Type == RHD_CONNECTOR_TV) /* until TV_OUT is fixed we bail here */ + return XF86OutputStatusDisconnected; + + if (rout->Connector->HPDCheck) { + /* Hot Plug Detection available, use it */ + if (rout->Connector->HPDCheck(rout->Connector)) { + /* + * HPD returned true + */ + if (rout->Output->Sense) { + if ((rout->Output->SensedType + = rout->Output->Sense(rout->Output, + rout->Connector)) != RHD_SENSED_NONE) { + RHDOutputPrintSensedType(rout->Output); + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + return XF86OutputStatusConnected; + } else + return XF86OutputStatusDisconnected; + } else { + /* HPD returned true, but no Sense() available + * Typically the case on TMDSB. + * Check if there is another output attached to this connector + * and use Sense() on that one to verify whether something + * is attached to this one */ + if (rhdRROtherOutputOnConnectorHelper(rhdPtr, rout)) + return XF86OutputStatusDisconnected; + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + return XF86OutputStatusConnected; + } + } else { + /* + * HPD returned false + */ + /* There is the infamous DMS-59 connector, on which HPD returns + * false when 'only' VGA is connected. */ + if (rhdPtr->Card && (rhdPtr->Card->flags & RHD_CARD_FLAG_DMS59)) { + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, + "RandR: Verifying state of DMS-59 VGA connector.\n"); + if (rout->Output->Sense) { + rout->Output->SensedType + = rout->Output->Sense(rout->Output, + rout->Connector); + if (rout->Output->SensedType != RHD_SENSED_NONE) { + RHDOutputPrintSensedType(rout->Output); + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + return XF86OutputStatusConnected; + } + } + } + return XF86OutputStatusDisconnected; + } + } else { + /* + * No HPD available, Sense() if possible + */ + if (rout->Output->Sense) { + rout->Output->SensedType + = rout->Output->Sense(rout->Output, rout->Connector); + if (rout->Output->SensedType != RHD_SENSED_NONE) { + RHDOutputPrintSensedType(rout->Output); + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + return XF86OutputStatusConnected; + } else + return XF86OutputStatusDisconnected; + } + /* Use DDC address probing if possible otherwise */ + if (rout->Connector->DDC) { + RHDI2CDataArg i2cRec; + i2cRec.probe.slave = 0xa0; + i2cRec.probe.i2cBusPtr = rout->Connector->DDC; + if (RHDI2CFunc(rhdPtr->scrnIndex, rhdPtr->I2C,RHD_I2C_PROBE_ADDR,&i2cRec) + == RHD_I2C_SUCCESS) { + rhdRandrOutputPtr rout_tmp; + RHDDebug(rout->Output->scrnIndex, "DDC Probing for Output %s returned connected\n", + rout->Output->Name); + if ((rout_tmp = rhdRROtherOutputOnConnectorHelper(rhdPtr, rout))) { + RHDDebug(rout->Output->scrnIndex, "Output %s on same connector already connected\n", + rout_tmp->Output->Name); + return XF86OutputStatusDisconnected; + } + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + return XF86OutputStatusConnected; + } else { + RHDDebug(rout->Output->scrnIndex, "DDC Probing for Output %s returned disconnected\n", + rout->Output->Name); + return XF86OutputStatusDisconnected; + } + } + RHDOutputAttachConnector(rout->Output, rout->Connector); /* @@@ */ + return XF86OutputStatusUnknown; + } +} + +/* + * RHDRRMonitorInit(): adds synthesized modes for scaling to list generated by RHDMonitorInit() + * as with RandR this is the only chance we have access to the full modes list. + */ +static struct rhdMonitor * +RHDRRMonitorInit(struct rhdConnector *Connector) +{ + struct rhdMonitor *m = RHDMonitorInit(Connector); + + RHDFUNC(Connector); + if (RHDScalePolicy(m, Connector)) + RHDSynthModes(Connector->scrnIndex, m->Modes); + + return m; +} + +/* Query the device for the modes it provides. Set MonInfo, mm_width/height. */ +static DisplayModePtr +rhdRROutputGetModes(xf86OutputPtr output) +{ + RHDPtr rhdPtr = RHDPTR(output->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) output->driver_private; + struct rhdOutput *o; + + RHDDebug(rhdPtr->scrnIndex, "%s: Output %s\n", __func__, rout->Name); + /* TODO: per-output options ForceReduced & UseXF86Edid */ + + /* Nuke old monitor */ + if (rout->Connector->Monitor) { + /* EDID is already freed by RandR (OutputSetEDID+return) */ + rout->Connector->Monitor->EDID = NULL; + RHDMonitorDestroy(rout->Connector->Monitor); + } + + /* Get new one */ + if (! (rout->Connector->Monitor = RHDRRMonitorInit(rout->Connector)) ) { + xf86OutputSetEDID (output, NULL); + return NULL; + } + + ASSERT(rout->Output); + o = rout->Output; + + if (RHDScalePolicy(rout->Connector->Monitor, rout->Connector)) { + if (o->Connector->Monitor) { + rout->ScaledToMode = RHDModeCopy(o->Connector->Monitor->NativeMode); + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Found native mode: "); + RHDPrintModeline(rout->ScaledToMode); + if (RHDRRValidateScaledToMode(rout->Output, rout->ScaledToMode) != MODE_OK) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "Native mode doesn't validate: deleting\n"); + xfree(rout->ScaledToMode->name); + xfree(rout->ScaledToMode); + rout->ScaledToMode = NULL; + } + } + } else + rout->ScaledToMode = NULL; + + /* If digitally attached, enable reduced blanking */ + if (rout->Output->Id == RHD_OUTPUT_TMDSA || + rout->Output->Id == RHD_OUTPUT_LVTMA || + rout->Output->Id == RHD_OUTPUT_KLDSKP_LVTMA || + rout->Output->Id == RHD_OUTPUT_UNIPHYA || + rout->Output->Id == RHD_OUTPUT_UNIPHYB || + rout->Output->Id == RHD_OUTPUT_UNIPHYC || + rout->Output->Id == RHD_OUTPUT_UNIPHYD || + rout->Output->Id == RHD_OUTPUT_UNIPHYE || + rout->Output->Id == RHD_OUTPUT_UNIPHYF + ) + rout->Connector->Monitor->ReducedAllowed = TRUE; + /* Allow user overrides */ + if (rhdPtr->forceReduced.set) + rout->Connector->Monitor->ReducedAllowed = + rhdPtr->forceReduced.val.bool; + + xf86OutputSetEDID (output, rout->Connector->Monitor->EDID); + + /* If no EDID data is available, calculate mm_size by assuming 96dpi + * for the preferred (or first if no preferred) mode */ + if (! rout->Connector->Monitor->EDID) { + DisplayModePtr m; + for (m = rout->Connector->Monitor->Modes; m; m = m->next) + if (m->type & M_T_PREFERRED) + break; + if (! m) + m = rout->Connector->Monitor->Modes; + if (m) { +#define DEFAULT_MM_PER_DOT (25.4 / 96) + output->mm_width = m->HDisplay * DEFAULT_MM_PER_DOT; + output->mm_height = m->VDisplay * DEFAULT_MM_PER_DOT; + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, + "No monitor size info, assuming 96dpi.\n"); + } + } + RHDDebug(rhdPtr->scrnIndex, "%s: Adding Output Modes:\n",__func__); + if (rhdPtr->verbosity >= 7) { + DisplayModePtr mode = rout->Connector->Monitor->Modes; + while (mode) { + RHDPrintModeline(mode); + mode = mode->next; + } + } + return xf86DuplicateModes(output->scrn, rout->Connector->Monitor->Modes); +} + +/* An output's property has changed. */ +static Bool +rhdRROutputSetProperty(xf86OutputPtr out, Atom property, + RRPropertyValuePtr value) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + char buf[256]; + + RHDFUNC(rhdPtr); + + /* Unfortunately, strings are not necessarily 0 terminated */ + if (value->type == XA_STRING && value->format == 8) { + int len = value->size < 255 ? value->size : 255; + memcpy (buf, value->data, len); + buf[len] = 0; + } + if (property == atom_PanningArea) { + int w = 0, h = 0, x = 0, y = 0; + struct rhdCrtc *Crtc = rout->Output->Crtc; + int i; + + if (!Crtc) + return FALSE; + for (i = 0; i < 2; i++) { + xf86CrtcPtr crtc = (xf86CrtcPtr) rhdPtr->randr->RandrCrtc[i]; + if (Crtc == ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc) { + /* Don't allow panning while rotated */ + if (crtc->rotation != RR_Rotate_0) + return FALSE; + else + break; + } + } + if (value->type != XA_STRING || value->format != 8) + return FALSE; + switch (sscanf(buf, "%dx%d+%d+%d", &w, &h, &x, &y)) { + case 0: + case 2: + case 4: + if (w < 0 || h < 0 || x < 0 || y < 0 || + x+w > Crtc->Width || y+h > Crtc->Height) + return FALSE; + Crtc->MinX = x; + Crtc->MinY = y; + Crtc->MaxX = x + w; + Crtc->MaxY = y + h; + rhdUpdateCrtcPos(rhdPtr, Crtc, Crtc->Cursor->X, Crtc->Cursor->Y); + RHDDebug(rhdPtr->scrnIndex, "%s: PanningArea %d/%d - %d/%d\n", + x, y, x+w, y+h); + return TRUE; + default: + return FALSE; + } + } else if (property == atom_Backlight) { + if (value->type != XA_INTEGER || value->format != 32) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: wrong value\n", __func__); + return FALSE; + } + if (rout->Output->Property) { + union rhdPropertyData val; + val.integer = *(int*)(value->data); + if(rout->Output->Property(rout->Output, rhdPropertySet, + RHD_OUTPUT_BACKLIGHT, &val)) + return rout->Output->Property(rout->Output, rhdPropertyCommit, + RHD_OUTPUT_BACKLIGHT, NULL); + } + return FALSE; + } else if (property == atom_Coherent) { + if (value->type != XA_INTEGER || value->format != 32) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: wrong value\n", __func__); + return FALSE; + } + if (rout->Output->Property) { + union rhdPropertyData val; + val.Bool = *(int*)(value->data); + if(rout->Output->Property(rout->Output, rhdPropertySet, + RHD_OUTPUT_COHERENT, &val)) + return rout->Output->Property(rout->Output, rhdPropertyCommit, + RHD_OUTPUT_COHERENT, NULL); + } + return FALSE; + } else if (property == atom_HdmiProperty) { + if (value->type != XA_INTEGER || value->format != 32) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: wrong value\n", __func__); + return FALSE; + } + if (rout->Output->Property) { + union rhdPropertyData val; + val.Bool = *(int*)(value->data); + if(rout->Output->Property(rout->Output, rhdPropertySet, + RHD_OUTPUT_HDMI, &val)) + return rout->Output->Property(rout->Output, rhdPropertyCommit, + RHD_OUTPUT_HDMI, NULL); + } + return FALSE; + } else if (property == atom_AudioWorkaround) { + if (value->type != XA_INTEGER || value->format != 32) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, "%s: wrong value\n", __func__); + return FALSE; + } + if (rout->Output->Property) { + union rhdPropertyData val; + val.Bool = *(int*)(value->data); + if(rout->Output->Property(rout->Output, rhdPropertySet, + RHD_OUTPUT_AUDIO_WORKAROUND, &val)) + return rout->Output->Property(rout->Output, rhdPropertyCommit, + RHD_OUTPUT_AUDIO_WORKAROUND, NULL); + } + return FALSE; +#if ENABLE_PROPERTY_ATOMBIOS + } else if (property == atom_AtomBIOS) { + if (value->type != XA_STRING || value->format != 8) + return FALSE; + if (rhdUpdateAtomBIOSUsage(rhdPtr, buf)) { + free (value->data); + value->data = rhdReturnAtomBIOSUsage(rhdPtr); + value->size = strlen(value->data); + return TRUE; + } + return FALSE; +#endif + } else if (property == atom_EDID || property == atom_EDID2) { + /* Don't do anything, but allow change */ + return TRUE; + } + + return FALSE; /* Others are not mutable */ +} + +/* + * + */ +static void * +rhdRRCrtcShadowAllocate(xf86CrtcPtr crtc, int Width, int Height) +{ + ScrnInfoPtr pScrn = crtc->scrn; + RHDPtr rhdPtr = RHDPTR(crtc->scrn); + ScreenPtr pScreen = screenInfo.screens[pScrn->scrnIndex]; + struct rhdRandrCrtc *rhdRRCrtc = (struct rhdRandrCrtc*) crtc->driver_private; + int OctPerPixel = pScrn->bitsPerPixel >> 3; + int Size = (pScrn->displayWidth * OctPerPixel) * Height; + + if (rhdPtr->AccelMethod == RHD_ACCEL_SHADOWFB + || rhdPtr->AccelMethod == RHD_ACCEL_NONE) + return NULL; + +#ifdef USE_EXA + if (rhdPtr->AccelMethod == RHD_ACCEL_EXA) { + + ASSERT(rhdRRCrtc->u.MemEXA == NULL); + + rhdRRCrtc->u.MemEXA = exaOffscreenAlloc(pScreen, Size, 4096, + TRUE, NULL, NULL); + if (rhdRRCrtc->u.MemEXA == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to allocate shadow memory for rotated CRTC\n"); + return NULL; + } + return ((char *)rhdPtr->FbBase + + rhdRRCrtc->u.MemEXA->offset); + } +#endif /* USE_EXA */ + + if (rhdPtr->AccelMethod == RHD_ACCEL_XAA) { + int Align = (4096 + OctPerPixel - 1) / OctPerPixel; + Size = (Size + OctPerPixel - 1) / OctPerPixel; + + ASSERT(rhdRRCrtc->u.MemXAA == NULL); + + rhdRRCrtc->u.MemXAA = + xf86AllocateOffscreenLinear(pScreen, Size, Align, /* @@@ */ + NULL, NULL, NULL); + if (rhdRRCrtc->u.MemXAA == NULL) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to allocate shadow memory for rotated CRTC\n"); + return NULL; + } + + return ((char *)rhdPtr->FbBase + + rhdPtr->FbScanoutStart + + rhdRRCrtc->u.MemXAA->offset * OctPerPixel); + } + + return NULL; +} + +/* + * + */ +static PixmapPtr +rhdRRCrtcShadowCreate(xf86CrtcPtr Crtc, void *Data, int Width, int Height) +{ + ScrnInfoPtr pScrn = Crtc->scrn; + PixmapPtr RPixmap; + + if (!Data) + Data = rhdRRCrtcShadowAllocate(Crtc, Width, Height); + + RPixmap = GetScratchPixmapHeader(pScrn->pScreen, + Width, Height, + pScrn->depth, + pScrn->bitsPerPixel, + pScrn->displayWidth * pScrn->bitsPerPixel >> 3, + Data); + + if (RPixmap == NULL) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Unable to allocate shadow pixmap for rotated CRTC\n"); + + return RPixmap; +} + +/* + * + */ +static void +rhdRRCrtcShadowDestroy(xf86CrtcPtr crtc, PixmapPtr RPixmap, void *Data) +{ + + ScrnInfoPtr pScrn = crtc->scrn; + RHDPtr rhdPtr = RHDPTR(crtc->scrn); + struct rhdRandrCrtc *rhdRRCrtc = (struct rhdRandrCrtc*) crtc->driver_private; + + if (RPixmap) + FreeScratchPixmapHeader(RPixmap); + + if (Data) { +#ifdef USE_EXA + if (rhdPtr->AccelMethod == RHD_ACCEL_EXA) { + exaOffscreenFree(pScrn->pScreen, rhdRRCrtc->u.MemEXA); + rhdRRCrtc->u.MemEXA = NULL; + } + +#endif /* USE_EXA */ + if (rhdPtr->AccelMethod == RHD_ACCEL_XAA) { + xf86FreeOffscreenLinear(rhdRRCrtc->u.MemXAA); + rhdRRCrtc->u.MemXAA = NULL; + } + } +} + + +#ifdef RANDR_13_INTERFACE +static Bool +rhdRROutputGetProperty(xf86OutputPtr out, Atom property) +{ + RHDPtr rhdPtr = RHDPTR(out->scrn); + rhdRandrOutputPtr rout = (rhdRandrOutputPtr) out->driver_private; + int err = BadValue; + union rhdPropertyData val; + + RHDFUNC(rhdPtr); + + if (property == atom_Backlight) { + if (rout->Output->Property == NULL) + return FALSE; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, + RHD_OUTPUT_BACKLIGHT, &val)) + return FALSE; + err = RRChangeOutputProperty(out->randr_output, atom_Backlight, + XA_INTEGER, 32, PropModeReplace, + 1, &val.integer, FALSE, FALSE); + + } else if (property == atom_Coherent) { + if (rout->Output->Property == NULL) + return FALSE; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, + RHD_OUTPUT_COHERENT, &val)) + return FALSE; + + err = RRChangeOutputProperty(out->randr_output, atom_Coherent, + XA_INTEGER, 32, PropModeReplace, + 1, &val.Bool, FALSE, FALSE); + } else if (property == atom_HdmiProperty) { + if (rout->Output->Property == NULL) + return FALSE; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, + RHD_OUTPUT_HDMI, &val)) + return FALSE; + + err = RRChangeOutputProperty(out->randr_output, atom_HdmiProperty, + XA_INTEGER, 32, PropModeReplace, + 1, &val.Bool, FALSE, FALSE); + } else if (property == atom_AudioWorkaround) { + if (rout->Output->Property == NULL) + return FALSE; + + if (!rout->Output->Property(rout->Output, rhdPropertyGet, + RHD_OUTPUT_AUDIO_WORKAROUND, &val)) + return FALSE; + + err = RRChangeOutputProperty(out->randr_output, atom_AudioWorkaround, + XA_INTEGER, 32, PropModeReplace, + 1, &val.Bool, FALSE, FALSE); + } + + RHDDebug(rhdPtr->scrnIndex, "%s 0x%x returns %d\n", __func__, property, err); + + if (err != 0) + return FALSE; + return TRUE; +} + +#endif + +/* + * + */ +Bool +RHDRRInitCursor(ScreenPtr pScreen) +{ + RHDFUNCI(pScreen->myNum); + + /* still need to alloc fb mem for cursors */ + return xf86_cursors_init(pScreen, MAX_CURSOR_WIDTH, MAX_CURSOR_HEIGHT, + HARDWARE_CURSOR_TRUECOLOR_AT_8BPP + | HARDWARE_CURSOR_UPDATE_UNHIDDEN + | HARDWARE_CURSOR_AND_SOURCE_WITH_MASK + | HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_1 + | HARDWARE_CURSOR_ARGB); +} + +/* + * + */ +static void +rhdRRShowCursor(xf86CrtcPtr crtc) +{ + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc; + rhdCrtcShowCursor(rhdCrtc); +} + +/* + * + */ +static void +rhdRRHideCursor(xf86CrtcPtr crtc) +{ + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc; + rhdCrtcHideCursor(rhdCrtc); +} + +/* + * + */ +static void +rhdRRLoadCursorARGB(xf86CrtcPtr crtc, CARD32 *Image) +{ + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc; + rhdCrtcLoadCursorARGB(rhdCrtc, Image); +} + +/* + * + */ +static void +rhdRRSetCursorColors(xf86CrtcPtr crtc, int bg, int fg) +{ + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc; + rhdCrtcSetCursorColors(rhdCrtc, bg, fg); +} + +/* + * + */ +static void +rhdRRSetCursorPosition(xf86CrtcPtr crtc, int x, int y) +{ + struct rhdCrtc *rhdCrtc = ((struct rhdRandrCrtc *)crtc->driver_private)->rhdCrtc; + /* + * Given cursor pos is always relative to frame - make absolute + * NOTE: This is hardware specific, it doesn't really fit here, + * but it's the only place where the relevant information is + * available. + */ + if (!crtc->rotatedData) { + x += crtc->x; + y += crtc->y; + } + rhdCrtcSetCursorPosition(rhdCrtc, x, y); +} + +/* + * Xorg Interface + */ + +static const xf86CrtcConfigFuncsRec rhdRRCrtcConfigFuncs = { + rhdRRXF86CrtcResize +}; + +static xf86CrtcFuncsRec rhdRRCrtcFuncs = { + rhdRRCrtcDpms, + NULL, NULL, /* Save,Restore */ + rhdRRCrtcLock, rhdRRCrtcUnlock, + rhdRRCrtcModeFixupDUMMY, + rhdRRCrtcPrepare, rhdRRCrtcModeSet, rhdRRCrtcCommit, + rhdRRCrtcGammaSet, + rhdRRCrtcShadowAllocate, rhdRRCrtcShadowCreate, rhdRRCrtcShadowDestroy, + rhdRRSetCursorColors, rhdRRSetCursorPosition, rhdRRShowCursor, rhdRRHideCursor, + NULL, rhdRRLoadCursorARGB, NULL + /* SetCursorColors,SetCursorPosition,ShowCursor,HideCursor, + * LoadCursorImage,LoadCursorArgb,CrtcDestroy */ +#ifdef XF86CRTCFUNCS_HAS_SETMODEMAJOR + /* set_mode_major */ + , NULL +#endif +#if XF86_CRTC_VERSION >= 2 + /* set_origin */ + , rhdRRCrtcSetOrigin +#endif +}; + +/* + * + */ +void +RHDRRFreeShadow(ScrnInfoPtr pScrn) +{ +#ifndef HAVE_FREE_SHADOW + int i; + xf86CrtcConfigPtr CrtcConfig = XF86_CRTC_CONFIG_PTR(pScrn); + + for (i = 0; i < CrtcConfig->num_crtc; i++) { + xf86CrtcPtr Crtc = CrtcConfig->crtc[i]; + if (Crtc->rotatedPixmap || Crtc->rotatedData) { + Crtc->funcs->shadow_destroy(Crtc, Crtc->rotatedPixmap, + Crtc->rotatedData); + Crtc->rotatedPixmap = NULL; + Crtc->rotatedData = NULL; + } + } +#else + xf86RotateFreeShadow(pScrn); +#endif +} + +static const xf86OutputFuncsRec rhdRROutputFuncs = { + rhdRROutputCreateResources, rhdRROutputDpms, + NULL, NULL, /* Save,Restore */ + rhdRROutputModeValid, rhdRROutputModeFixup, + rhdRROutputPrepare, rhdRROutputCommit, + rhdRROutputModeSet, rhdRROutputDetect, rhdRROutputGetModes, +#ifdef RANDR_12_INTERFACE + rhdRROutputSetProperty, /* Only(!) RANDR_12_INTERFACE */ +#endif +#ifdef RANDR_13_INTERFACE + rhdRROutputGetProperty, /* get_property */ +#endif +#ifdef RANDR_GET_CRTC_INTERFACE + NULL, +#endif + NULL /* Destroy */ +}; + + +/* Helper: Create rhdRandrOutput with unique name per Connector/Output combo */ +static rhdRandrOutputPtr +createRandrOutput(ScrnInfoPtr pScrn, + struct rhdConnector *conn, struct rhdOutput *out) +{ + rhdRandrOutputPtr rro; + char *c; + + rro = xnfcalloc(1, sizeof(rhdRandrOutputRec)); + rro->Connector = conn; + rro->Output = out; + sprintf(rro->Name, "%.30s", conn->Name); + for (c = rro->Name; *c; c++) + if (isspace(*c)) + *c='_'; + return rro; +} + +/* Helper: Consolidate names, improve duplicates */ +static void +consolidateRandrOutputNames(rhdRandrOutputPtr *rop, int num) +{ + int i, j, changed; + const char *outname; + char *c; + /* First try to come up with something sensible */ + for (i = 0; i < num; i++) { + for (j = i+1; j < num; j++) + if (strcmp(rop[i]->Name, rop[j]->Name) == 0) + break; + if (j < num) { + for (j = num-1; j >= i; j--) /* Include i */ + if (strcmp(rop[i]->Name, rop[j]->Name) == 0) { + switch (rop[j]->Output->Id) { + case RHD_OUTPUT_DACA: + case RHD_OUTPUT_DACB: + outname = "analog"; + break; + case RHD_OUTPUT_TMDSA: + case RHD_OUTPUT_LVTMA: + case RHD_OUTPUT_KLDSKP_LVTMA: + case RHD_OUTPUT_UNIPHYA: + case RHD_OUTPUT_UNIPHYB: + case RHD_OUTPUT_UNIPHYC: + case RHD_OUTPUT_UNIPHYD: + case RHD_OUTPUT_UNIPHYE: + case RHD_OUTPUT_UNIPHYF: + outname = "digital"; + break; + default: + outname = rop[j]->Output->Name; + } + sprintf(rop[j]->Name, "%.30s/%.30s", + rop[j]->Connector->Name, outname); + for (c = rop[j]->Name; *c; c++) + if (isspace(*c)) + *c='_'; + } + } + } + /* This shouldn't happen, but better be safe: + * fix up every remaining name with the old naming scheme */ + for (i = 0; i < num; i++) { + changed=0; + for (j = i+1; j < num; j++) + if (strcmp(rop[i]->Name, rop[j]->Name) == 0) { + changed++; + sprintf(rop[j]->Name, "%.30s/%.30s", + rop[j]->Connector->Name, rop[j]->Output->Name); + for (c = rop[j]->Name; *c; c++) + if (isspace(*c)) + *c='_'; + } + if (changed) { + sprintf(rop[i]->Name, "%.30s/%.30s", + rop[i]->Connector->Name, rop[i]->Output->Name); + for (c = rop[i]->Name; *c; c++) + if (isspace(*c)) + *c='_'; + } + } +} + +/* Helper: Create and set up xf86Output */ +static xf86OutputPtr +createXF86Output(ScrnInfoPtr pScrn, rhdRandrOutputPtr rro) +{ + xf86OutputPtr xo; + xo = xf86OutputCreate(pScrn, &rhdRROutputFuncs, rro->Name); + ASSERT(xo); + xo->driver_private = rro; + xo->possible_crtcs = ~0; /* No limitations */ + xo->possible_clones = ~0; /* No limitations */ + xo->interlaceAllowed = TRUE; + xo->doubleScanAllowed = TRUE; + xo->subpixel_order = SubPixelUnknown; + xf86OutputUseScreenMonitor (xo, FALSE); + return xo; +} + +/* Call in PreInit after memory + io has been set up */ +Bool +RHDRandrPreInit(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct rhdRandr *randr; + int i, j, k, numCombined = 0; + rhdRandrOutputPtr *RandrOutput, *r; + char *outputorder; + + RHDFUNC(rhdPtr); + if (rhdPtr->noRandr.val.bool) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "RandR 1.2 support disabled due to configuration\n"); + return FALSE; + } + + randr = xnfcalloc(1, sizeof(struct rhdRandr)); + xf86CrtcConfigInit(pScrn, &rhdRRCrtcConfigFuncs); + /* Maximum for D1GRPH_X/Y_END: 8k */ + xf86CrtcSetSizeRange (pScrn, 320, 200, 8000, 8000); + + for (i = 0; i < 2; i++) { + randr->RandrCrtc[i] = xf86CrtcCreate(pScrn, &rhdRRCrtcFuncs); + ASSERT(randr->RandrCrtc[i]); + randr->RandrCrtc[i]->driver_private = xnfcalloc(sizeof(struct rhdRandrCrtc),1); + ((struct rhdRandrCrtc*) randr->RandrCrtc[i]->driver_private)->rhdCrtc = rhdPtr->Crtc[i]; /* TODO: not cleaning up correctly */ + } + + /* First count, then allocate */ + for (i = 0; i < RHD_CONNECTORS_MAX; i++) { + struct rhdConnector *conn = rhdPtr->Connector[i]; + if (conn) + for (j = 0; j < MAX_OUTPUTS_PER_CONNECTOR; j++) { + struct rhdOutput *out = conn->Output[j]; + if (out) + numCombined++; + } + } + RandrOutput = r = + xnfcalloc(numCombined+1, sizeof(struct rhdRandrOutputPtr *)); + + /* Create combined unique output names */ + for (i = 0; i < RHD_CONNECTORS_MAX; i++) { + struct rhdConnector *conn = rhdPtr->Connector[i]; + if (conn) { + for (j = 0; j < MAX_OUTPUTS_PER_CONNECTOR; j++) { + struct rhdOutput *out = conn->Output[j]; + if (out) + *r++ = createRandrOutput(pScrn, conn, out); + } + } + } + + /* + * Each rhdRandrOutputRec carries a list of all connectors this output belongs to. + * Since the output can only drive one connector but RandR doesn't seem to have + * any notion of 'shared outputs' we need to probe them all and decide which + * output that reports connected we pass to RandR as connected. + */ + for (i = 0; i < numCombined; i++) { + int cnt = 0; + for (j = 0; j < RHD_CONNECTORS_MAX; j++) { + struct rhdConnector *conn = rhdPtr->Connector[j]; + if (!conn) continue; + for (k = 0; k < MAX_OUTPUTS_PER_CONNECTOR; k++) { + if (conn->Output[k] == RandrOutput[i]->Output) { + if (cnt >= MAX_CONNECTORS_PER_RR_OUTPUT) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: Number of Connectors for Output %s exceeds %i\n", + __func__,RandrOutput[i]->Name, MAX_CONNECTORS_PER_RR_OUTPUT); + else + RandrOutput[i]->AllConnectors[cnt++] = conn; + break; + } + } + } + } + consolidateRandrOutputNames(RandrOutput, numCombined); + for (i = 0; i < numCombined; i++) + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "RandR: Adding RRoutput %s for Output %s\n", + RandrOutput[i]->Name, RandrOutput[i]->Output->Name); + + /* Reorder for xinerama screen enumeration if requested */ + outputorder = rhdPtr->rrOutputOrder.val.string; + if (outputorder && *outputorder) { + rhdRandrOutputPtr *RandrOutputReorder = r = + xnfcalloc(numCombined+1, sizeof(struct xf86OutputPtr *)); + while (*outputorder) { + char *end = strchr(outputorder, ' '); + int len = end ? end-outputorder : (signed) strlen(outputorder); + end = strchr(outputorder, ','); + if (end) + len = end-outputorder < len ? end-outputorder : len; + for (i = 0; i < numCombined; i++) { + if (RandrOutput[i] && + strncmp(RandrOutput[i]->Name, outputorder, len) == 0 && + RandrOutput[i]->Name[len] == 0) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "RandR: Reordering output %s\n", + RandrOutput[i]->Name); + *r++ = RandrOutput[i]; + RandrOutput[i] = NULL; + } + } + outputorder += len; + while (*outputorder == ' ' || *outputorder == ',') + outputorder++; + } + for (i = 0; i < numCombined; i++) + if (RandrOutput[i]) + *r++ = RandrOutput[i]; + ASSERT(r - RandrOutputReorder == numCombined); + xfree(RandrOutput); + RandrOutput = RandrOutputReorder; + } + + /* Initialize RandR structures */ + randr->RandrOutput = + xnfcalloc(numCombined+1, sizeof(struct xf86OutputPtr *)); + for (i = 0; i < numCombined; i++) { + randr->RandrOutput[i] = createXF86Output(pScrn, RandrOutput[i]); + } + xfree(RandrOutput); + rhdPtr->randr = randr; + + /* Unless we're able to shrink/enlarge FB on the fly (GEM etc.), allocate + * large enough (TM) virtual size */ + if (!pScrn->display->virtualX || !pScrn->display->virtualY) { + /* Have at least enough space for double buffering and z Buffer + some textures */ + if (2 * 1920*1920 * ((unsigned)pScrn->bitsPerPixel/8) <= rhdPtr->FbFreeSize / 4) { + /* Fits on 128MB and up */ + pScrn->display->virtualX = 2 * 1920; + pScrn->display->virtualY = 1920; + } else if (2 * 1680*1280 * ((unsigned)pScrn->bitsPerPixel/8) <= rhdPtr->FbFreeSize / 4) { + /* Fits on 64MB and up */ + pScrn->display->virtualX = 2 * 1680; + pScrn->display->virtualY = 1280; + } + } + + if (!xf86InitialConfiguration(pScrn, FALSE)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "RandR: No valid modes. Disabling RandR support.\n"); + for (i = 0; i < 2; i++) + xfree(randr->RandrCrtc[i]->driver_private); + xfree(randr); + rhdPtr->randr = NULL; /* TODO: not cleaning up correctly */ + return FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "RandR 1.2 support enabled\n"); + + /* No docs, but radeon, avivo, and nv drivers calling this + * after(!) xf86InitialConfiguration */ + if (!xf86RandR12PreInit (pScrn)) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "RandR: xf86RandR12PreInit failed. Disabled.\n"); + for (i = 0; i < 2; i++) + xfree(randr->RandrCrtc[i]->driver_private); + xfree(randr); + rhdPtr->randr = NULL; /* TODO: not cleaning up correctly */ + return FALSE; + } + + return TRUE; +} + +/* Wrapped PointerMoved for driver-level panning */ +static void +rhdRRPointerMoved(int scrnIndex, int x, int y) +{ + ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; + RHDPtr rhdPtr = RHDPTR(xf86Screens[scrnIndex]); + int i; + + for (i = 0; i < 2; i++) { + struct rhdCrtc *Crtc = rhdPtr->Crtc[i]; + if (Crtc->scrnIndex == scrnIndex && Crtc->Active) + rhdUpdateCrtcPos(rhdPtr, Crtc, x + pScrn->frameX0, y + pScrn->frameY0); + } + UNWRAP_SCRNINFO(PointerMoved); + pScrn->PointerMoved(scrnIndex, x, y); + WRAP_SCRNINFO(PointerMoved, rhdRRPointerMoved); +} + +/* Call in ScreenInit after frame buffer + acceleration layers */ +Bool +RHDRandrScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(rhdPtr); + + if (rhdPtr->AccelMethod == RHD_ACCEL_NONE || rhdPtr->AccelMethod == RHD_ACCEL_SHADOWFB) { + rhdRRCrtcFuncs.shadow_allocate = NULL; + rhdRRCrtcFuncs.shadow_create = NULL; + rhdRRCrtcFuncs.shadow_destroy = NULL; + } + + if (!xf86CrtcScreenInit(pScreen)) + return FALSE; + /* Wrap cursor for driver-level panning */ + WRAP_SCRNINFO(PointerMoved, rhdRRPointerMoved); + + RHDDebugRandrState(rhdPtr, "POST-ScreenInit"); + return TRUE; +} + +/* ModeInit: Set modes according to current layout */ +Bool +RHDRandrModeInit(ScrnInfoPtr pScrn) +{ + Bool ret; + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(rhdPtr); + + /* Stop crap from being shown: gets reenabled through SaveScreen */ + rhdPtr->Crtc[0]->Blank(rhdPtr->Crtc[0], TRUE); + rhdPtr->Crtc[1]->Blank(rhdPtr->Crtc[1], TRUE); + + RHDPrepareMode(rhdPtr); + ret = xf86SetDesiredModes(pScrn); + RHDDebugRandrState(rhdPtr, "POST-ModeInit"); + + return ret; +} + +/* SwitchMode: Legacy: Set one mode */ +Bool +RHDRandrSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ + return xf86SetSingleMode(pScrn, mode, RR_Rotate_0); +} + + +#else /* RANDR_12_SUPPORT */ + +Bool +RHDRandrPreInit(ScrnInfoPtr pScrn) +{ + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "RandR 1.2 support disabled (not available at compile time)\n"); + return FALSE; +} + +Bool +RHDRandrScreenInit(ScreenPtr pScreen) +{ ASSERT(0); return FALSE; } + +Bool +RHDRandrModeInit(ScrnInfoPtr pScrn) +{ ASSERT(0); return FALSE; } + +Bool +RHDRandrSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode) +{ ASSERT(0); return FALSE; } + + +#endif /* RANDR_12_SUPPORT */ + diff --git a/driver/xf86-video-radeonhd/src/rhd_randr.h b/driver/xf86-video-radeonhd/src/rhd_randr.h new file mode 100644 index 000000000..817613e91 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_randr.h @@ -0,0 +1,42 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * RandR interface. + * + * Only supports RandR 1.2 ATM. + */ + +#ifndef _RHD_RANDR_H +#define _RHD_RANDR_H + +extern Bool RHDRandrPreInit(ScrnInfoPtr pScrn); +extern Bool RHDRandrScreenInit(ScreenPtr pScreen); +extern Bool RHDRandrModeInit(ScrnInfoPtr pScrn); +extern Bool RHDRandrSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode); +extern void RHDRRFreeShadow(ScrnInfoPtr pScrn); +extern Bool RHDRRInitCursor(ScreenPtr pScreen); + +#endif diff --git a/driver/xf86-video-radeonhd/src/rhd_regs.h b/driver/xf86-video-radeonhd/src/rhd_regs.h new file mode 100644 index 000000000..0e75d0693 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_regs.h @@ -0,0 +1,1150 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ +#ifndef _RHD_REGS_H +# define _RHD_REGS_H + +enum { + CLOCK_CNTL_INDEX = 0x8, /* (RW) */ + CLOCK_CNTL_DATA = 0xC, /* (RW) */ + BUS_CNTL = 0x4C, /* (RW) */ + MC_IND_INDEX = 0x70, /* (RW) */ + MC_IND_DATA = 0x74, /* (RW) */ + RS600_MC_INDEX = 0x70, + RS600_MC_DATA = 0x74, + RS690_MC_INDEX = 0x78, + RS690_MC_DATA = 0x7c, + RS780_MC_INDEX = 0x28f8, + RS780_MC_DATA = 0x28fc, + + RS60_MC_NB_MC_INDEX = 0x78, + RS60_MC_NB_MC_DATA = 0x7C, + CONFIG_CNTL = 0xE0, + PCIE_RS69_MC_INDEX = 0xE8, + PCIE_RS69_MC_DATA = 0xEC, + R5XX_CONFIG_MEMSIZE = 0x00F8, + + HDP_FB_LOCATION = 0x0134, + + SEPROM_CNTL1 = 0x1C0, /* (RW) */ + + AGP_BASE = 0x0170, + + GPIOPAD_MASK = 0x198, /* (RW) */ + GPIOPAD_A = 0x19C, /* (RW) */ + GPIOPAD_EN = 0x1A0, /* (RW) */ + VIPH_CONTROL = 0xC40, /* (RW) */ + + ROM_CNTL = 0x1600, + GENERAL_PWRMGT = 0x0618, + LOW_VID_LOWER_GPIO_CNTL = 0x0724, + MEDIUM_VID_LOWER_GPIO_CNTL = 0x0720, + HIGH_VID_LOWER_GPIO_CNTL = 0x071C, + CTXSW_VID_LOWER_GPIO_CNTL = 0x0718, + LOWER_GPIO_ENABLE = 0x0710, + + /* VGA registers */ + VGA_RENDER_CONTROL = 0x0300, + VGA_MODE_CONTROL = 0x0308, + VGA_MEMORY_BASE_ADDRESS = 0x0310, + VGA_HDP_CONTROL = 0x0328, + D1VGA_CONTROL = 0x0330, + D2VGA_CONTROL = 0x0338, + + EXT1_PPLL_REF_DIV_SRC = 0x0400, + EXT1_PPLL_REF_DIV = 0x0404, + EXT1_PPLL_UPDATE_LOCK = 0x0408, + EXT1_PPLL_UPDATE_CNTL = 0x040C, + EXT2_PPLL_REF_DIV_SRC = 0x0410, + EXT2_PPLL_REF_DIV = 0x0414, + EXT2_PPLL_UPDATE_LOCK = 0x0418, + EXT2_PPLL_UPDATE_CNTL = 0x041C, + + EXT1_PPLL_FB_DIV = 0x0430, + EXT2_PPLL_FB_DIV = 0x0434, + EXT1_PPLL_POST_DIV_SRC = 0x0438, + EXT1_PPLL_POST_DIV = 0x043C, + EXT2_PPLL_POST_DIV_SRC = 0x0440, + EXT2_PPLL_POST_DIV = 0x0444, + EXT1_PPLL_CNTL = 0x0448, + EXT2_PPLL_CNTL = 0x044C, + P1PLL_CNTL = 0x0450, + P2PLL_CNTL = 0x0454, + P1PLL_INT_SS_CNTL = 0x0458, + P2PLL_INT_SS_CNTL = 0x045C, + + P1PLL_DISP_CLK_CNTL = 0x0468, /* rv620+ */ + P2PLL_DISP_CLK_CNTL = 0x046C, /* rv620+ */ + EXT1_SYM_PPLL_POST_DIV = 0x0470, /* rv620+ */ + EXT2_SYM_PPLL_POST_DIV = 0x0474, /* rv620+ */ + + PCLK_CRTC1_CNTL = 0x0480, + PCLK_CRTC2_CNTL = 0x0484, + + /* these regs were reverse enginered, + * so the chance is high that the naming is wrong + * R6xx+ ??? */ + AUDIO_PLL1_MUL = 0x0514, + AUDIO_PLL1_DIV = 0x0518, + AUDIO_PLL2_MUL = 0x0524, + AUDIO_PLL2_DIV = 0x0528, + AUDIO_CLK_SRCSEL = 0x0534, + + DCCG_DISP_CLK_SRCSEL = 0x0538, /* rv620+ */ + + AGP_STATUS = 0x0F5C, + + R7XX_MC_VM_FB_LOCATION = 0x2024, + + R6XX_MC_VM_FB_LOCATION = 0x2180, + R6XX_HDP_NONSURFACE_BASE = 0x2C04, + R6XX_CONFIG_MEMSIZE = 0x5428, + R6XX_CONFIG_FB_BASE = 0x542C, /* AKA CONFIG_F0_BASE */ + /* PCI config space */ + PCI_CONFIG_SPACE_BASE = 0x5000, + PCI_CAPABILITIES_PTR = 0x5034, + + /* CRTC1 registers */ + D1CRTC_H_TOTAL = 0x6000, + D1CRTC_H_BLANK_START_END = 0x6004, + D1CRTC_H_SYNC_A = 0x6008, + D1CRTC_H_SYNC_A_CNTL = 0x600C, + D1CRTC_H_SYNC_B = 0x6010, + D1CRTC_H_SYNC_B_CNTL = 0x6014, + + D1CRTC_V_TOTAL = 0x6020, + D1CRTC_V_BLANK_START_END = 0x6024, + D1CRTC_V_SYNC_A = 0x6028, + D1CRTC_V_SYNC_A_CNTL = 0x602C, + D1CRTC_V_SYNC_B = 0x6030, + D1CRTC_V_SYNC_B_CNTL = 0x6034, + + D1CRTC_CONTROL = 0x6080, + D1CRTC_BLANK_CONTROL = 0x6084, + D1CRTC_INTERLACE_CONTROL = 0x6088, + D1CRTC_BLACK_COLOR = 0x6098, + D1CRTC_STATUS = 0x609C, + D1CRTC_COUNT_CONTROL = 0x60B4, + + /* D1GRPH registers */ + D1GRPH_ENABLE = 0x6100, + D1GRPH_CONTROL = 0x6104, + D1GRPH_LUT_SEL = 0x6108, + D1GRPH_SWAP_CNTL = 0x610C, + D1GRPH_PRIMARY_SURFACE_ADDRESS = 0x6110, + D1GRPH_SECONDARY_SURFACE_ADDRESS = 0x6118, + D1GRPH_PITCH = 0x6120, + D1GRPH_SURFACE_OFFSET_X = 0x6124, + D1GRPH_SURFACE_OFFSET_Y = 0x6128, + D1GRPH_X_START = 0x612C, + D1GRPH_Y_START = 0x6130, + D1GRPH_X_END = 0x6134, + D1GRPH_Y_END = 0x6138, + D1GRPH_UPDATE = 0x6144, + + /* LUT */ + DC_LUT_RW_SELECT = 0x6480, + DC_LUT_RW_MODE = 0x6484, + DC_LUT_RW_INDEX = 0x6488, + DC_LUT_SEQ_COLOR = 0x648C, + DC_LUT_PWL_DATA = 0x6490, + DC_LUT_30_COLOR = 0x6494, + DC_LUT_READ_PIPE_SELECT = 0x6498, + DC_LUT_WRITE_EN_MASK = 0x649C, + DC_LUT_AUTOFILL = 0x64A0, + + /* LUTA */ + DC_LUTA_CONTROL = 0x64C0, + DC_LUTA_BLACK_OFFSET_BLUE = 0x64C4, + DC_LUTA_BLACK_OFFSET_GREEN = 0x64C8, + DC_LUTA_BLACK_OFFSET_RED = 0x64CC, + DC_LUTA_WHITE_OFFSET_BLUE = 0x64D0, + DC_LUTA_WHITE_OFFSET_GREEN = 0x64D4, + DC_LUTA_WHITE_OFFSET_RED = 0x64D8, + + /* D1CUR */ + D1CUR_CONTROL = 0x6400, + D1CUR_SURFACE_ADDRESS = 0x6408, + D1CUR_SIZE = 0x6410, + D1CUR_POSITION = 0x6414, + D1CUR_HOT_SPOT = 0x6418, + D1CUR_UPDATE = 0x6424, + + /* D1MODE */ + D1MODE_DESKTOP_HEIGHT = 0x652C, + D1MODE_VLINE_START_END = 0x6538, + D1MODE_VLINE_STATUS = 0x653C, + D1MODE_VIEWPORT_START = 0x6580, + D1MODE_VIEWPORT_SIZE = 0x6584, + D1MODE_EXT_OVERSCAN_LEFT_RIGHT = 0x6588, + D1MODE_EXT_OVERSCAN_TOP_BOTTOM = 0x658C, + D1MODE_DATA_FORMAT = 0x6528, + + /* D1SCL */ + D1SCL_ENABLE = 0x6590, + D1SCL_TAP_CONTROL = 0x6594, + D1MODE_CENTER = 0x659C, /* guess */ + D1SCL_HVSCALE = 0x65A4, /* guess */ + D1SCL_HFILTER = 0x65B0, /* guess */ + D1SCL_VFILTER = 0x65C0, /* guess */ + D1SCL_UPDATE = 0x65CC, + D1SCL_DITHER = 0x65D4, /* guess */ + D1SCL_FLIP_CONTROL = 0x65D8, /* guess */ + + /* CRTC2 registers */ + D2CRTC_H_TOTAL = 0x6800, + D2CRTC_H_BLANK_START_END = 0x6804, + D2CRTC_H_SYNC_A = 0x6808, + D2CRTC_H_SYNC_A_CNTL = 0x680C, + D2CRTC_H_SYNC_B = 0x6810, + D2CRTC_H_SYNC_B_CNTL = 0x6814, + + D2CRTC_V_TOTAL = 0x6820, + D2CRTC_V_BLANK_START_END = 0x6824, + D2CRTC_V_SYNC_A = 0x6828, + D2CRTC_V_SYNC_A_CNTL = 0x682C, + D2CRTC_V_SYNC_B = 0x6830, + D2CRTC_V_SYNC_B_CNTL = 0x6834, + + D2CRTC_CONTROL = 0x6880, + D2CRTC_BLANK_CONTROL = 0x6884, + D2CRTC_BLACK_COLOR = 0x6898, + D2CRTC_INTERLACE_CONTROL = 0x6888, + D2CRTC_STATUS = 0x689C, + D2CRTC_COUNT_CONTROL = 0x68B4, + + /* D2GRPH registers */ + D2GRPH_ENABLE = 0x6900, + D2GRPH_CONTROL = 0x6904, + D2GRPH_LUT_SEL = 0x6908, + D2GRPH_SWAP_CNTL = 0x690C, + D2GRPH_PRIMARY_SURFACE_ADDRESS = 0x6910, + D2GRPH_PITCH = 0x6920, + D2GRPH_SURFACE_OFFSET_X = 0x6924, + D2GRPH_SURFACE_OFFSET_Y = 0x6928, + D2GRPH_X_START = 0x692C, + D2GRPH_Y_START = 0x6930, + D2GRPH_X_END = 0x6934, + D2GRPH_Y_END = 0x6938, + + /* LUTB */ + DC_LUTB_CONTROL = 0x6CC0, + DC_LUTB_BLACK_OFFSET_BLUE = 0x6CC4, + DC_LUTB_BLACK_OFFSET_GREEN = 0x6CC8, + DC_LUTB_BLACK_OFFSET_RED = 0x6CCC, + DC_LUTB_WHITE_OFFSET_BLUE = 0x6CD0, + DC_LUTB_WHITE_OFFSET_GREEN = 0x6CD4, + DC_LUTB_WHITE_OFFSET_RED = 0x6CD8, + + /* D2MODE */ + D2MODE_DESKTOP_HEIGHT = 0x6D2C, + D2MODE_VLINE_START_END = 0x6D38, + D2MODE_VLINE_STATUS = 0x6D3C, + D2MODE_VIEWPORT_START = 0x6D80, + D2MODE_VIEWPORT_SIZE = 0x6D84, + D2MODE_EXT_OVERSCAN_LEFT_RIGHT = 0x6D88, + D2MODE_EXT_OVERSCAN_TOP_BOTTOM = 0x6D8C, + D2MODE_DATA_FORMAT = 0x6D28, + + /* D2SCL */ + D2SCL_ENABLE = 0x6D90, + D2SCL_TAP_CONTROL = 0x6D94, + D2MODE_CENTER = 0x6D9C, /* guess */ + D2SCL_HVSCALE = 0x6DA4, /* guess */ + D2SCL_HFILTER = 0x6DB0, /* guess */ + D2SCL_VFILTER = 0x6DC0, /* guess */ + D2SCL_UPDATE = 0x6DCC, + D2SCL_DITHER = 0x6DD4, /* guess */ + D2SCL_FLIP_CONTROL = 0x6DD8, /* guess */ + + /* Audio, reverse enginered */ + AUDIO_ENABLE = 0x7300, /* RW */ + AUDIO_TIMING = 0x7344, /* RW */ + /* Audio params */ + AUDIO_VENDOR_ID = 0x7380, /* RW */ + AUDIO_REVISION_ID = 0x7384, /* RW */ + AUDIO_ROOT_NODE_COUNT = 0x7388, /* RW */ + AUDIO_NID1_NODE_COUNT = 0x738c, /* RW */ + AUDIO_NID1_TYPE = 0x7390, /* RW */ + AUDIO_SUPPORTED_SIZE_RATE = 0x7394, /* RW */ + AUDIO_SUPPORTED_CODEC = 0x7398, /* RW */ + AUDIO_SUPPORTED_POWER_STATES = 0x739c, /* RW */ + AUDIO_NID2_CAPS = 0x73a0, /* RW */ + AUDIO_NID3_CAPS = 0x73a4, /* RW */ + AUDIO_NID3_PIN_CAPS = 0x73a8, /* RW */ + /* Audio conn list */ + AUDIO_CONN_LIST_LEN = 0x73ac, /* RW */ + AUDIO_CONN_LIST = 0x73b0, /* RW */ + /* Audio verbs */ + AUDIO_RATE_BPS_CHANNEL = 0x73c0, /* RO */ + AUDIO_PLAYING = 0x73c4, /* RO */ + AUDIO_IMPLEMENTATION_ID = 0x73c8, /* RW */ + AUDIO_CONFIG_DEFAULT = 0x73cc, /* RW */ + AUDIO_PIN_SENSE = 0x73d0, /* RW */ + AUDIO_PIN_WIDGET_CNTL = 0x73d4, /* RO */ + AUDIO_STATUS_BITS = 0x73d8, /* RO */ + + /* HDMI */ + HDMI_TMDS = 0x7400, + HDMI_LVTMA = 0x7700, + HDMI_DIG = 0x7800, + + /* R500 DAC A */ + DACA_ENABLE = 0x7800, + DACA_SOURCE_SELECT = 0x7804, + DACA_SYNC_TRISTATE_CONTROL = 0x7820, + DACA_SYNC_SELECT = 0x7824, + DACA_AUTODETECT_CONTROL = 0x7828, + DACA_AUTODETECT_INT_CONTROL = 0x7838, + DACA_FORCE_OUTPUT_CNTL = 0x783C, + DACA_FORCE_DATA = 0x7840, + DACA_POWERDOWN = 0x7850, + DACA_CONTROL1 = 0x7854, + DACA_CONTROL2 = 0x7858, + DACA_COMPARATOR_ENABLE = 0x785C, + DACA_COMPARATOR_OUTPUT = 0x7860, + +/* TMDSA */ + TMDSA_CNTL = 0x7880, + TMDSA_SOURCE_SELECT = 0x7884, + TMDSA_COLOR_FORMAT = 0x7888, + TMDSA_FORCE_OUTPUT_CNTL = 0x788C, + TMDSA_BIT_DEPTH_CONTROL = 0x7894, + TMDSA_DCBALANCER_CONTROL = 0x78D0, + TMDSA_DATA_SYNCHRONIZATION_R500 = 0x78D8, + TMDSA_DATA_SYNCHRONIZATION_R600 = 0x78DC, + TMDSA_TRANSMITTER_ENABLE = 0x7904, + TMDSA_LOAD_DETECT = 0x7908, + TMDSA_MACRO_CONTROL = 0x790C, /* r5x0 and r600: 3 for pll and 1 for TX */ + TMDSA_PLL_ADJUST = 0x790C, /* rv6x0: pll only */ + TMDSA_TRANSMITTER_CONTROL = 0x7910, + TMDSA_TRANSMITTER_ADJUST = 0x7920, /* rv6x0: TX part of macro control */ + + /* DAC B */ + DACB_ENABLE = 0x7A00, + DACB_SOURCE_SELECT = 0x7A04, + DACB_SYNC_TRISTATE_CONTROL = 0x7A20, + DACB_SYNC_SELECT = 0x7A24, + DACB_AUTODETECT_CONTROL = 0x7A28, + DACB_AUTODETECT_INT_CONTROL = 0x7A38, + DACB_FORCE_OUTPUT_CNTL = 0x7A3C, + DACB_FORCE_DATA = 0x7A40, + DACB_POWERDOWN = 0x7A50, + DACB_CONTROL1 = 0x7A54, + DACB_CONTROL2 = 0x7A58, + DACB_COMPARATOR_ENABLE = 0x7A5C, + DACB_COMPARATOR_OUTPUT = 0x7A60, + + /* LVTMA */ + LVTMA_CNTL = 0x7A80, + LVTMA_SOURCE_SELECT = 0x7A84, + LVTMA_COLOR_FORMAT = 0x7A88, + LVTMA_FORCE_OUTPUT_CNTL = 0x7A8C, + LVTMA_BIT_DEPTH_CONTROL = 0x7A94, + LVTMA_DCBALANCER_CONTROL = 0x7AD0, + + /* no longer shared between both r5xx and r6xx */ + LVTMA_R500_DATA_SYNCHRONIZATION = 0x7AD8, + LVTMA_R500_PWRSEQ_REF_DIV = 0x7AE4, + LVTMA_R500_PWRSEQ_DELAY1 = 0x7AE8, + LVTMA_R500_PWRSEQ_DELAY2 = 0x7AEC, + LVTMA_R500_PWRSEQ_CNTL = 0x7AF0, + LVTMA_R500_PWRSEQ_STATE = 0x7AF4, + LVTMA_R500_BL_MOD_CNTL = 0x7AF8, + LVTMA_R500_LVDS_DATA_CNTL = 0x7AFC, + LVTMA_R500_MODE = 0x7B00, + LVTMA_R500_TRANSMITTER_ENABLE = 0x7B04, + LVTMA_R500_MACRO_CONTROL = 0x7B0C, + LVTMA_R500_TRANSMITTER_CONTROL = 0x7B10, + LVTMA_R500_REG_TEST_OUTPUT = 0x7B14, + + /* R600 adds an undocumented register at 0x7AD8, + * shifting all subsequent registers by exactly one. */ + LVTMA_R600_DATA_SYNCHRONIZATION = 0x7ADC, + LVTMA_R600_PWRSEQ_REF_DIV = 0x7AE8, + LVTMA_R600_PWRSEQ_DELAY1 = 0x7AEC, + LVTMA_R600_PWRSEQ_DELAY2 = 0x7AF0, + LVTMA_R600_PWRSEQ_CNTL = 0x7AF4, + LVTMA_R600_PWRSEQ_STATE = 0x7AF8, + LVTMA_R600_BL_MOD_CNTL = 0x7AFC, + LVTMA_R600_LVDS_DATA_CNTL = 0x7B00, + LVTMA_R600_MODE = 0x7B04, + LVTMA_R600_TRANSMITTER_ENABLE = 0x7B08, + LVTMA_R600_MACRO_CONTROL = 0x7B10, + LVTMA_R600_TRANSMITTER_CONTROL = 0x7B14, + LVTMA_R600_REG_TEST_OUTPUT = 0x7B18, + + LVTMA_TRANSMITTER_ADJUST = 0x7B24, /* RV630 */ + LVTMA_PREEMPHASIS_CONTROL = 0x7B28, /* RV630 */ + + /* I2C in separate enum */ + + /* HPD */ + DC_GPIO_HPD_MASK = 0x7E90, + DC_GPIO_HPD_A = 0x7E94, + DC_GPIO_HPD_EN = 0x7E98, + DC_GPIO_HPD_Y = 0x7E9C +}; + +enum CONFIG_CNTL_BITS { + RS69_CFG_ATI_REV_ID_SHIFT = 8, + RS69_CFG_ATI_REV_ID_MASK = 0xF << RS69_CFG_ATI_REV_ID_SHIFT +}; + +enum rv620Regs { + /* DAC common */ + RV620_DAC_COMPARATOR_MISC = 0x7da4, + RV620_DAC_COMPARATOR_OUTPUT = 0x7da8, + + /* RV620 DAC A */ + RV620_DACA_ENABLE = 0x7000, + RV620_DACA_SOURCE_SELECT = 0x7004, + RV620_DACA_SYNC_TRISTATE_CONTROL = 0x7020, + /* RV620_DACA_SYNC_SELECT = 0x7024, ?? */ + RV620_DACA_AUTODETECT_CONTROL = 0x7028, + RV620_DACA_AUTODETECT_STATUS = 0x7034, + RV620_DACA_AUTODETECT_INT_CONTROL = 0x7038, + RV620_DACA_FORCE_OUTPUT_CNTL = 0x703C, + RV620_DACA_FORCE_DATA = 0x7040, + RV620_DACA_POWERDOWN = 0x7050, + /* RV620_DACA_CONTROL1 moved */ + RV620_DACA_CONTROL2 = 0x7058, + RV620_DACA_COMPARATOR_ENABLE = 0x705C, + /* RV620_DACA_COMPARATOR_OUTPUT changed */ + RV620_DACA_BGADJ_SRC = 0x7ef0, + RV620_DACA_MACRO_CNTL = 0x7ef4, + RV620_DACA_AUTO_CALIB_CONTROL = 0x7ef8, + + /* DAC B */ + RV620_DACB_ENABLE = 0x7100, + RV620_DACB_SOURCE_SELECT = 0x7104, + RV620_DACB_SYNC_TRISTATE_CONTROL = 0x7120, + /* RV620_DACB_SYNC_SELECT = 0x7124, ?? */ + RV620_DACB_AUTODETECT_CONTROL = 0x7128, + RV620_DACB_AUTODETECT_STATUS = 0x7134, + RV620_DACB_AUTODETECT_INT_CONTROL = 0x7138, + RV620_DACB_FORCE_OUTPUT_CNTL = 0x713C, + RV620_DACB_FORCE_DATA = 0x7140, + RV620_DACB_POWERDOWN = 0x7150, + /* RV620_DACB_CONTROL1 moved */ + RV620_DACB_CONTROL2 = 0x7158, + RV620_DACB_COMPARATOR_ENABLE = 0x715C, + RV620_DACB_BGADJ_SRC = 0x7ef0, + RV620_DACB_MACRO_CNTL = 0x7ff4, + RV620_DACB_AUTO_CALIB_CONTROL = 0x7ef8, + /* DIG1 */ + RV620_DIG1_CNTL = 0x75A0, + RV620_DIG1_CLOCK_PATTERN = 0x75AC, + RV620_LVDS1_DATA_CNTL = 0x75BC, + RV620_TMDS1_CNTL = 0x75C0, + /* DIG2 */ + RV620_DIG2_CNTL = 0x79A0, + RV620_DIG2_CLOCK_PATTERN = 0x79AC, + RV620_LVDS2_DATA_CNTL = 0x79BC, + RV620_TMDS2_CNTL = 0x79C0, + + /* RV62x I2C */ + RV62_GENERIC_I2C_CONTROL = 0x7d80, /* (RW) */ + RV62_GENERIC_I2C_INTERRUPT_CONTROL = 0x7d84, /* (RW) */ + RV62_GENERIC_I2C_STATUS = 0x7d88, /* (RW) */ + RV62_GENERIC_I2C_SPEED = 0x7d8c, /* (RW) */ + RV62_GENERIC_I2C_SETUP = 0x7d90, /* (RW) */ + RV62_GENERIC_I2C_TRANSACTION = 0x7d94, /* (RW) */ + RV62_GENERIC_I2C_DATA = 0x7d98, /* (RW) */ + RV62_GENERIC_I2C_PIN_SELECTION = 0x7d9c, /* (RW) */ + RV62_DC_GPIO_DDC4_MASK = 0x7e20, /* (RW) */ + RV62_DC_GPIO_DDC1_MASK = 0x7e40, /* (RW) */ + RV62_DC_GPIO_DDC2_MASK = 0x7e50, /* (RW) */ + RV62_DC_GPIO_DDC3_MASK = 0x7e60, /* (RW) */ + + /* ?? */ + RV620_DCIO_LINK_STEER_CNTL = 0x7FA4, + + RV620_LVTMA_TRANSMITTER_CONTROL= 0x7F00, + RV620_LVTMA_TRANSMITTER_ENABLE = 0x7F04, + RV620_LVTMA_TRANSMITTER_ADJUST = 0x7F18, + RV620_LVTMA_PREEMPHASIS_CONTROL= 0x7F1C, + RV620_LVTMA_MACRO_CONTROL = 0x7F0C, + RV620_LVTMA_PWRSEQ_CNTL = 0x7F80, + RV620_LVTMA_PWRSEQ_STATE = 0x7f84, + RV620_LVTMA_PWRSEQ_REF_DIV = 0x7f88, + RV620_LVTMA_PWRSEQ_DELAY1 = 0x7f8C, + RV620_LVTMA_PWRSEQ_DELAY2 = 0x7f90, + RV620_LVTMA_BL_MOD_CNTL = 0x7F94, + RV620_LVTMA_DATA_SYNCHRONIZATION = 0x7F98, + RV620_FMT1_CONTROL = 0x6700, + RV620_FMT1_BIT_DEPTH_CONTROL= 0x6710, + RV620_FMT1_CLAMP_CNTL = 0x672C, + RV620_FMT2_CONTROL = 0x6F00, + RV620_FMT2_CNTL = 0x6F10, + RV620_FMT2_CLAMP_CNTL = 0x6F2C, + + RV620_EXT1_DIFF_POST_DIV_CNTL= 0x0420, + RV620_EXT2_DIFF_POST_DIV_CNTL= 0x0424, + RV620_DCCG_PCLK_DIGA_CNTL = 0x04b0, + RV620_DCCG_PCLK_DIGB_CNTL = 0x04b4, + RV620_DCCG_SYMCLK_CNTL = 0x04b8 +}; + +enum RV620_EXT1_DIFF_POST_DIV_CNTL_BITS { + RV62_EXT1_DIFF_POST_DIV_RESET = 1 << 0, + RV62_EXT1_DIFF_POST_DIV_SELECT = 1 << 4, + RV62_EXT1_DIFF_DRIVER_ENABLE = 1 << 8 +}; + +enum RV620_EXT2_DIFF_POST_DIV_CNTL_BITS { + RV62_EXT2_DIFF_POST_DIV_RESET = 1 << 0, + RV62_EXT2_DIFF_POST_DIV_SELECT = 1 << 4, + RV62_EXT2_DIFF_DRIVER_ENABLE = 3 << 8 +}; + +enum RV620_LVTMA_PWRSEQ_CNTL_BITS { + RV62_LVTMA_PWRSEQ_EN = 1 << 0, + RV62_LVTMA_PWRSEQ_DISABLE_SYNCEN_CONTROL_OF_TX_EN = 1 << 1, + RV62_LVTMA_PLL_ENABLE_PWRSEQ_MASK = 1 << 2, + RV62_LVTMA_PLL_RESET_PWRSEQ_MASK = 1 << 3, + RV62_LVTMA_PWRSEQ_TARGET_STATE = 1 << 4, + RV62_LVTMA_SYNCEN = 1 << 8, + RV62_LVTMA_SYNCEN_OVRD = 1 << 9, + RV62_LVTMA_SYNCEN_POL = 1 << 10, + RV62_LVTMA_DIGON = 1 << 16, + RV62_LVTMA_DIGON_OVRD = 1 << 17, + RV62_LVTMA_DIGON_POL = 1 << 18, + RV62_LVTMA_BLON = 1 << 24, + RV62_LVTMA_BLON_OVRD = 1 << 25, + RV62_LVTMA_BLON_POL = 1 << 26 +}; + +enum RV620_LVTMA_PWRSEQ_STATE_BITS { + RV62_LVTMA_PWRSEQ_STATE_SHIFT = 8 +}; + +enum RV620_LVTMA_PWRSEQ_STATE_VAL { + RV62_POWERUP_DONE = 4, + RV62_POWERDOWN_DONE = 9 +}; + +enum RV620_LVTMA_TRANSMITTER_CONTROL_BITS { + RV62_LVTMA_PLL_ENABLE = 1 << 0, + RV62_LVTMA_PLL_RESET = 1 << 1, + RV62_LVTMA_IDSCKSEL = 1 << 4, + RV62_LVTMA_BGSLEEP = 1 << 5, + RV62_LVTMA_IDCLK_SEL = 1 << 6, + RV62_LVTMA_TMCLK = 1 << 8, + RV62_LVTMA_TMCLK_FROM_PADS = 1 << 13, + RV62_LVTMA_TDCLK = 1 << 14, + RV62_LVTMA_TDCLK_FROM_PADS = 1 << 15, + RV62_LVTMA_BYPASS_PLL = 1 << 28, + RV62_LVTMA_USE_CLK_DATA = 1 << 29, + RV62_LVTMA_MODE = 1 << 30, + RV62_LVTMA_INPUT_TEST_CLK_SEL = 1 << 31 +}; + +enum RV620_DCCG_SYMCLK_CNTL { + RV62_SYMCLKA_SRC_SHIFT = 8, + RV62_SYMCLKB_SRC_SHIFT = 12 +}; + +enum RV620_DCCG_DIG_CNTL { + RV62_PCLK_DIGA_ON = 0x1 +}; + +enum RV620_DCIO_LINK_STEER_CNTL { + RV62_LINK_STEER_SWAP = 1 << 0, + RV62_LINK_STEER_PLLSEL_OVERWRITE_EN = 1 << 16, + RV62_LINK_STEER_PLLSELA = 1 << 17, + RV62_LINK_STEER_PLLSELB = 1 << 18 +}; + +enum R620_LVTMA_TRANSMITTER_ENABLE_BITS { + RV62_LVTMA_LNK0EN = 1 << 0, + RV62_LVTMA_LNK1EN = 1 << 1, + RV62_LVTMA_LNK2EN = 1 << 2, + RV62_LVTMA_LNK3EN = 1 << 3, + RV62_LVTMA_LNK4EN = 1 << 4, + RV62_LVTMA_LNK5EN = 1 << 5, + RV62_LVTMA_LNK6EN = 1 << 6, + RV62_LVTMA_LNK7EN = 1 << 7, + RV62_LVTMA_LNK8EN = 1 << 8, + RV62_LVTMA_LNK9EN = 1 << 9, + RV62_LVTMA_LNKL = RV62_LVTMA_LNK0EN | RV62_LVTMA_LNK1EN + | RV62_LVTMA_LNK2EN | RV62_LVTMA_LNK3EN, + RV62_LVTMA_LNKU = RV62_LVTMA_LNK4EN | RV62_LVTMA_LNK5EN + | RV62_LVTMA_LNK6EN | RV62_LVTMA_LNK7EN, + RV62_LVTMA_LNK_ALL = RV62_LVTMA_LNKL | RV62_LVTMA_LNKU + | RV62_LVTMA_LNK8EN | RV62_LVTMA_LNK9EN, + RV62_LVTMA_LNKEN_HPD_MASK = 1 << 16 +}; + +enum RV620_LVTMA_DATA_SYNCHRONIZATION { + RV62_LVTMA_DSYNSEL = (1 << 0), + RV62_LVTMA_PFREQCHG = (1 << 8) +}; + +enum RV620_LVTMA_PWRSEQ_REF_DIV_BITS { + LVTMA_PWRSEQ_REF_DI_SHIFT = 0, + LVTMA_BL_MOD_REF_DI_SHIFT = 16 +}; + +enum RV620_LVTMA_BL_MOD_CNTL_BITS { + LVTMA_BL_MOD_EN = 1 << 0, + LVTMA_BL_MOD_LEVEL_SHIFT = 8, + LVTMA_BL_MOD_RES_SHIFT = 16 +}; + +enum RV620_DIG_CNTL_BITS { + /* 0x75A0 */ + RV62_DIG_SWAP = (0x1 << 16), + RV62_DIG_DUAL_LINK_ENABLE = (0x1 << 12), + RV62_DIG_START = (0x1 << 6), + RV62_DIG_MODE = (0x7 << 8), + RV62_DIG_STEREOSYNC_SELECT = (1 << 2), + RV62_DIG_SOURCE_SELECT = (1 << 0) +}; + +enum RV620_DIG_LVDS_DATA_CNTL_BITS { + /* 0x75BC */ + RV62_LVDS_24BIT_ENABLE = (0x1 << 0), + RV62_LVDS_24BIT_FORMAT = (0x1 << 4) +}; + +enum RV620_TMDS_CNTL_BITS { + /* 0x75C0 */ + RV62_TMDS_PIXEL_ENCODING = (0x1 << 4), + RV62_TMDS_COLOR_FORMAT = (0x3 << 8) +}; + +enum RV620_FMT_BIT_DEPTH_CONTROL { + RV62_FMT_TRUNCATE_EN = 1 << 0, + RV62_FMT_TRUNCATE_DEPTH = 1 << 4, + RV62_FMT_SPATIAL_DITHER_EN = 1 << 8, + RV62_FMT_SPATIAL_DITHER_MODE = 1 << 9, + RV62_FMT_SPATIAL_DITHER_DEPTH = 1 << 12, + RV62_FMT_FRAME_RANDOM_ENABLE = 1 << 13, + RV62_FMT_RGB_RANDOM_ENABLE = 1 << 14, + RV62_FMT_HIGHPASS_RANDOM_ENABLE = 1 << 15, + RV62_FMT_TEMPORAL_DITHER_EN = 1 << 16, + RV62_FMT_TEMPORAL_DITHER_DEPTH = 1 << 20, + RV62_FMT_TEMPORAL_DITHER_OFFSET = 3 << 21, + RV62_FMT_TEMPORAL_LEVEL = 1 << 24, + RV62_FMT_TEMPORAL_DITHER_RESET = 1 << 25, + RV62_FMT_25FRC_SEL = 3 << 26, + RV62_FMT_50FRC_SEL = 3 << 28, + RV62_FMT_75FRC_SEL = 3 << 30 +}; + +enum RV620_FMT_CONTROL { + RV62_FMT_PIXEL_ENCODING = 1 << 16 +}; + +enum _r5xxMCRegs { + R5XX_MC_STATUS = 0x0000, + RV515_MC_FB_LOCATION = 0x0001, + R5XX_MC_FB_LOCATION = 0x0004, + RV515_MC_STATUS = 0x0008, + RV515_MC_MISC_LAT_TIMER = 0x0009 +}; + +enum _r5xxRegs { + /* I2C */ + R5_DC_I2C_STATUS1 = 0x7D30, /* (RW) */ + R5_DC_I2C_RESET = 0x7D34, /* (RW) */ + R5_DC_I2C_CONTROL1 = 0x7D38, /* (RW) */ + R5_DC_I2C_CONTROL2 = 0x7D3C, /* (RW) */ + R5_DC_I2C_CONTROL3 = 0x7D40, /* (RW) */ + R5_DC_I2C_DATA = 0x7D44, /* (RW) */ + R5_DC_I2C_INTERRUPT_CONTROL = 0x7D48, /* (RW) */ + R5_DC_I2C_ARBITRATION = 0x7D50, /* (RW) */ + + R5_DC_GPIO_DDC1_MASK = 0x7E40, /* (RW) */ + R5_DC_GPIO_DDC1_A = 0x7E44, /* (RW) */ + R5_DC_GPIO_DDC1_EN = 0x7E48, /* (RW) */ + R5_DC_GPIO_DDC2_MASK = 0x7E50, /* (RW) */ + R5_DC_GPIO_DDC2_A = 0x7E54, /* (RW) */ + R5_DC_GPIO_DDC2_EN = 0x7E58, /* (RW) */ + R5_DC_GPIO_DDC3_MASK = 0x7E60, /* (RW) */ + R5_DC_GPIO_DDC3_A = 0x7E64, /* (RW) */ + R5_DC_GPIO_DDC3_EN = 0x7E68 /* (RW) */ +}; + +enum _r5xxSPLLRegs { + SPLL_FUNC_CNTL = 0x0 /* (RW) */ +}; + +enum _r6xxRegs { + /* MCLK */ + R6_MCLK_PWRMGT_CNTL = 0x620, + /* I2C */ + R6_DC_I2C_CONTROL = 0x7D30, /* (RW) */ + R6_DC_I2C_ARBITRATION = 0x7D34, /* (RW) */ + R6_DC_I2C_INTERRUPT_CONTROL = 0x7D38, /* (RW) */ + R6_DC_I2C_SW_STATUS = 0x7d3c, /* (RW) */ + R6_DC_I2C_DDC1_SPEED = 0x7D4C, /* (RW) */ + R6_DC_I2C_DDC1_SETUP = 0x7D50, /* (RW) */ + R6_DC_I2C_DDC2_SPEED = 0x7D54, /* (RW) */ + R6_DC_I2C_DDC2_SETUP = 0x7D58, /* (RW) */ + R6_DC_I2C_DDC3_SPEED = 0x7D5C, /* (RW) */ + R6_DC_I2C_DDC3_SETUP = 0x7D60, /* (RW) */ + R6_DC_I2C_TRANSACTION0 = 0x7D64, /* (RW) */ + R6_DC_I2C_TRANSACTION1 = 0x7D68, /* (RW) */ + R6_DC_I2C_DATA = 0x7D74, /* (RW) */ + R6_DC_I2C_DDC4_SPEED = 0x7DB4, /* (RW) */ + R6_DC_I2C_DDC4_SETUP = 0x7DBC, /* (RW) */ + R6_DC_GPIO_DDC4_MASK = 0x7E00, /* (RW) */ + R6_DC_GPIO_DDC4_A = 0x7E04, /* (RW) */ + R6_DC_GPIO_DDC4_EN = 0x7E08, /* (RW) */ + R6_DC_GPIO_DDC1_MASK = 0x7E40, /* (RW) */ + R6_DC_GPIO_DDC1_A = 0x7E44, /* (RW) */ + R6_DC_GPIO_DDC1_EN = 0x7E48, /* (RW) */ + R6_DC_GPIO_DDC1_Y = 0x7E4C, /* (RW) */ + R6_DC_GPIO_DDC2_MASK = 0x7E50, /* (RW) */ + R6_DC_GPIO_DDC2_A = 0x7E54, /* (RW) */ + R6_DC_GPIO_DDC2_EN = 0x7E58, /* (RW) */ + R6_DC_GPIO_DDC2_Y = 0x7E5C, /* (RW) */ + R6_DC_GPIO_DDC3_MASK = 0x7E60, /* (RW) */ + R6_DC_GPIO_DDC3_A = 0x7E64, /* (RW) */ + R6_DC_GPIO_DDC3_EN = 0x7E68, /* (RW) */ + R6_DC_GPIO_DDC3_Y = 0x7E6C /* (RW) */ +}; + +enum R6_MCLK_PWRMGT_CNTL { + R6_MC_BUSY = (1 << 5) +}; + + +/* *_Q: questionbable */ +enum _rs69xRegs { + /* I2C */ + RS69_DC_I2C_CONTROL = 0x7D30, /* (RW) *//* */ + RS69_DC_I2C_UNKNOWN_2 = 0x7D34, /* (RW) */ + RS69_DC_I2C_INTERRUPT_CONTROL = 0x7D38, /* (RW) */ + RS69_DC_I2C_SW_STATUS = 0x7d3c, /* (RW) *//**/ + RS69_DC_I2C_UNKNOWN_1 = 0x7d40, + RS69_DC_I2C_DDC_SETUP_Q = 0x7D44, /* (RW) */ + RS69_DC_I2C_DATA = 0x7D58, /* (RW) *//**/ + RS69_DC_I2C_TRANSACTION0 = 0x7D48, /* (RW) *//**/ + RS69_DC_I2C_TRANSACTION1 = 0x7D4C, /* (RW) *//**/ + /* DDIA */ + RS69_DDIA_CNTL = 0x7200, + RS69_DDIA_SOURCE_SELECT = 0x7204, + RS69_DDIA_BIT_DEPTH_CONTROL = 0x7214, + RS69_DDIA_DCBALANCER_CONTROL = 0x7250, + RS69_DDIA_PATH_CONTROL = 0x7264, + RS69_DDIA_PCIE_LINK_CONTROL2 = 0x7278, + RS69_DDIA_PCIE_LINK_CONTROL3 = 0x727c, + RS69_DDIA_PCIE_PHY_CONTROL1 = 0x728c, + RS69_DDIA_PCIE_PHY_CONTROL2 = 0x7290 +}; + +enum RS69_DDIA_CNTL_BITS { + RS69_DDIA_ENABLE = 1 << 0, + RS69_DDIA_HDMI_EN = 1 << 2, + RS69_DDIA_ENABLE_HPD_MASK = 1 << 4, + RS69_DDIA_HPD_SELECT = 1 << 8, + RS69_DDIA_SYNC_PHASE = 1 << 12, + RS69_DDIA_PIXEL_ENCODING = 1 << 16, + RS69_DDIA_DUAL_LINK_ENABLE = 1 << 24, + RS69_DDIA_SWAP = 1 << 28 +}; + +enum RS69_DDIA_SOURCE_SELECT_BITS { + RS69_DDIA_SOURCE_SELECT_BIT = 1 << 0, + RS69_DDIA_SYNC_SELECT = 1 << 8, + RS69_DDIA_STEREOSYNC_SELECT = 1 << 16 +}; + +enum RS69_DDIA_LINK_CONTROL2_SHIFT { + RS69_DDIA_PCIE_OUTPUT_MUX_SEL0 = 0, + RS69_DDIA_PCIE_OUTPUT_MUX_SEL1 = 4, + RS69_DDIA_PCIE_OUTPUT_MUX_SEL2 = 8, + RS69_DDIA_PCIE_OUTPUT_MUX_SEL3 = 12 +}; + +enum RS69_DDIA_BIT_DEPTH_CONTROL_BITS { + RS69_DDIA_TRUNCATE_EN = 1 << 0, + RS69_DDIA_TRUNCATE_DEPTH = 1 << 4, + RS69_DDIA_SPATIAL_DITHER_EN = 1 << 8, + RS69_DDIA_SPATIAL_DITHER_DEPTH = 1 << 12, + RS69_DDIA_TEMPORAL_DITHER_EN = 1 << 16, + RS69_DDIA_TEMPORAL_DITHER_DEPTH = 1 << 20, + RS69_DDIA_TEMPORAL_LEVEL = 1 << 24, + RS69_DDIA_TEMPORAL_DITHER_RESET = 1 << 25 +}; + +enum RS69_DDIA_DCBALANCER_CONTROL_BITS { + RS69_DDIA_DCBALANCER_EN = 1 << 0, + RS69_DDIA_SYNC_DCBAL_EN_SHIFT = 4, + RS69_DDIA_SYNC_DCBAL_EN_MASK = 7 << RS69_DDIA_SYNC_DCBAL_EN_SHIFT, + RS69_DDIA_DCBALANCER_TEST_EN = 1 << 8, + RS69_DDIA_DCBALANCER_TEST_IN_SHIFT = 16, + RS69_DDIA_DCBALANCER_FORCE = 1 << 24 +}; + +enum RS69_DDIA_PATH_CONTROL_BITS { + RS69_DDIA_PATH_SELECT_SHIFT = 0, + RS69_DDIA_DDPII_DE_ALIGN_EN = 1 << 4, + RS69_DDIA_DDPII_TRAIN_EN = 1 << 8, + RS69_DDIA_DDPII_TRAIN_SELECT = 1 << 12, + RS69_DDIA_DDPII_SCRAMBLE_EN = 1 << 16, + RS69_DDIA_REPL_MODE_SELECT = 1 << 20, + RS69_DDIA_RB_30b_SWAP_EN = 1 << 24, + RS69_DDIA_PIXVLD_RESET = 1 << 28, + RS69_DDIA_REARRANGER_EN = 1 << 30 +}; + +enum RS69_DDIA_PCIE_LINK_CONTROL3_BITS { + RS69_DDIA_PCIE_MIRROR_EN = 1 << 0, + RS69_DDIA_PCIE_CFGDUALLINK = 1 << 4, + RS69_DDIA_PCIE_NCHG3EN = 1 << 8, + RS69_DDIA_PCIE_RX_PDNB_SHIFT = 12 +}; + +enum RS69_MC_INDEX_BITS { + PCIE_RS69_MC_IND_ADDR = (0x1 << 0), + PCIE_RS69_MC_IND_WR_EN = (0x1 << 9) +}; + +enum RS60_MC_NB_MC_INDEX_BITS { + RS60_NB_MC_IND_ADDR = (0x1 << 0), + RS60_NB_MC_IND_WR_EN = (0x1 << 8) +}; + +enum _rs690MCRegs { + RS69_K8_FB_LOCATION = 0x1E, + RS69_MC_MISC_UMA_CNTL = 0x5f, + RS69_MC_SYSTEM_STATUS = 0x90, /* (RW) */ + RS69_MCCFG_FB_LOCATION = 0x100, + RS69MCCFG_AGP_LOCATION = 0x101, + RS69_MC_INIT_MISC_LAT_TIMER = 0x104 +}; + +enum MC_MISC_LAT_TIMER_BITS { + MC_CPR_INIT_LAT_SHIFT = 0, + MC_VF_INIT_LAT = 4, + MC_DISP0R_INIT_LAT_SHIFT = 8, + MC_DISP1R_INIT_LAT_SHIFT = 12, + MC_FIXED_INIT_LAT_SHIFT = 16, + MC_E2R_INIT_LAT_SHIFT = 20, + SAME_PAGE_PRIO_SHIFT = 24, + MC_GLOBW_INIT_LAT_SHIFT = 28 +}; + +enum RS69_MC_MISC_UMA_CNTL_BITS { + RS69_K8_40BIT_ADDR_EXTENSION = (0x1 << 0), + RS69_GART_BYPASS = (0x1 << 8), + RS69_GFX_64BYTE_MODE = (0x1 << 9), + RS69_GFX_64BYTE_LAT = (0x1 << 10), + RS69_GTW_COHERENCY = (0x1 << 15), + RS69_READ_BUFFER_SIZE = (0x1 << 16), + RS69_HDR_ROUTE_TO_DSP = (0x1 << 24), + RS69_GTW_ROUTE_TO_DSP = (0x1 << 25), + RS69_DSP_ROUTE_TO_GFX = (0x1 << 26), + RS69_USE_HDPW_LAT_INIT = (0x1 << 27), + RS69_USE_GFXW_LAT_INIT = (0x1 << 28), + RS69_MCIFR_COHERENT = (0x1 << 29), + RS69_NON_SNOOP_AZR_AIC_BP = (0x1 << 30), + RS69_SIDE_PORT_PRESENT_R = (0x1 << 31) +}; + +enum _rs600MCRegs { + RS60_MC_SYSTEM_STATUS = 0x0, + RS60_NB_FB_LOCATION = 0xa +}; + +enum RS600_MC_INDEX_BITS { + RS600_MC_INDEX_ADDR_MASK = 0xffff, + RS600_MC_INDEX_SEQ_RBS_0 = (1 << 16), + RS600_MC_INDEX_SEQ_RBS_1 = (1 << 17), + RS600_MC_INDEX_SEQ_RBS_2 = (1 << 18), + RS600_MC_INDEX_SEQ_RBS_3 = (1 << 19), + RS600_MC_INDEX_AIC_RBS = (1 << 20), + RS600_MC_INDEX_CITF_ARB0 = (1 << 21), + RS600_MC_INDEX_CITF_ARB1 = (1 << 22), + RS600_MC_INDEX_WR_EN = (1 << 23) +}; + +enum RS690_MC_INDEX_BITS { + RS690_MC_INDEX_ADDR_MASK = 0x1ff, + RS690_MC_INDEX_WR_EN = (1 << 9), + RS690_MC_INDEX_WR_ACK = 0x7f +}; + +enum RS780_MC_INDEX_BITS { + RS780_MC_INDEX_ADDR_MASK = 0x1ff, + RS780_MC_INDEX_WR_EN = (1 << 9) +}; + +enum _rs780NBRegs { + PCIE_RS78_NB_MC_IND_INDEX = 0x70, + PCIE_RS78_NB_MC_IND_DATA = 0x74 +}; + +enum RS78_NB_IND_INDEX_BITS { + PCIE_RS78_NB_MC_IND_INDEX_MASK = (0xffff << 0), + PCIE_RS78_MC_IND_SEQ_RBS_0 = (0x1 << 16), + PCIE_RS78_MC_IND_SEQ_RBS_1 = (0x1 << 17), + PCIE_RS78_MC_IND_SEQ_RBS_2 = (0x1 << 18), + PCIE_RS78_MC_IND_SEQ_RBS_3 = (0x1 << 19), + PCIE_RS78_MC_IND_AIC_RBS = (0x1 << 20), + PCIE_RS78_MC_IND_CITF_ARB0 = (0x1 << 21), + PCIE_RS78_MC_IND_CITF_ARB1 = (0x1 << 22), + PCIE_RS78_MC_IND_WR_EN = (0x1 << 23), + PCIE_RS78_MC_IND_RD_INV = (0x1 << 24) +}; + +enum _rs780MCRegs { + RS78_MC_SYSTEM_STATUS = 0x0, + RS78_MC_FB_LOCATION = 0x10, + RS78_K8_FB_LOCATION = 0x11, + RS78_MC_MISC_UMA_CNTL = 0x12 +}; + +enum RS6X_MC_SYSTEM_STATUS_BITS { + RS6X_MC_SYSTEM_IDLE = (0x1 << 0), + RS6X_MC_SEQUENCER_IDLE = (0x1 << 1), + RS6X_MC_ARBITER_IDLE = (0x1 << 2), + RS6X_MC_SELECT_PM = (0x1 << 3), + RS6X_RESERVED4 = (0xf << 4), + RS6X_RESERVED8 = (0xf << 8), + RS6X_RESERVED12_SYSTEM_STATUS = (0xf << 12), + RS6X_MCA_INIT_EXECUTED = (0x1 << 16), + RS6X_MCA_IDLE = (0x1 << 17), + RS6X_MCA_SEQ_IDLE = (0x1 << 18), + RS6X_MCA_ARB_IDLE = (0x1 << 19), + RS6X_RESERVED20_SYSTEM_STATUS = (0xfff << 20) +}; + +enum RS78_MC_MISC_UMA_CNTL_BITS { + RS78_K8_40BIT_ADDR_EXTENSION = ( 0x1 << 0), + RS78_BANKGROUP_SEL = ( 0x1 << 8), + RS78_CNTL_SPARE = ( 0x1 << 15), + RS78_SIDE_PORT_PRESENT_R = ( 0x1 << 31) +}; + +enum R5XX_MC_STATUS_BITS { + R5XX_MEM_PWRUP_COMPL = (0x1 << 0), + R5XX_MC_IDLE = (0x1 << 1) +}; + +enum RV515_MC_STATUS_BITS { + RV515_MC_IDLE = (0x1 << 4) +}; + +enum RS78_MC_SYSTEM_STATUS_BITS { + RS78_MC_SYSTEM_IDLE = 1 << 0, + RS78_MC_SEQUENCER_IDLE = 1 << 1, + RS78_MC_ARBITER_IDLE = 1 << 2, + RS78_MC_SELECT_PM = 1 << 3, + RS78_MC_STATUS_15_4_SHIFT = 4, + RS78_MCA_INIT_EXECUTED = 1 << 16, + RS78_MCA_IDLE = 1 << 17, + RS78_MCA_SEQ_IDLE = 1 << 18, + RS78_MCA_ARB_IDLE = 1 << 19, + RS78_MC_STATUS_31_20_SHIFT = 20 +}; + +enum BUS_CNTL_BITS { + /* BUS_CNTL */ + BUS_DBL_RESYNC = (0x1 << 0), + BIOS_ROM_WRT_EN = (0x1 << 1), + BIOS_ROM_DIS = (0x1 << 2), + PMI_IO_DIS = (0x1 << 3), + PMI_MEM_DIS = (0x1 << 4), + PMI_BM_DIS = (0x1 << 5), + PMI_INT_DIS = (0x1 << 6) +}; + +enum SEPROM_SNTL1_BITS { + /* SEPROM_CNTL1 */ + WRITE_ENABLE = (0x1 << 0), + WRITE_DISABLE = (0x1 << 1), + READ_CONFIG = (0x1 << 2), + WRITE_CONFIG = (0x1 << 3), + READ_STATUS = (0x1 << 4), + SECT_TO_SRAM = (0x1 << 5), + READY_BUSY = (0x1 << 7), + SEPROM_BUSY = (0x1 << 8), + BCNT_OVER_WTE_EN = (0x1 << 9), + RB_MASKB = (0x1 << 10), + SOFT_RESET = (0x1 << 11), + STATE_IDLEb = (0x1 << 12), + SECTOR_ERASE = (0x1 << 13), + BYTE_CNT = (0xff << 16), + SCK_PRESCALE = (0xff << 24) +}; + +enum VIPH_CONTROL_BITS { + /* VIPH_CONTROL */ + VIPH_CLK_SEL = (0xff << 0), + VIPH_REG_RDY = (0x1 << 13), + VIPH_MAX_WAIT = (0xf << 16), + VIPH_DMA_MODE = (0x1 << 20), + VIPH_EN = (0x1 << 21), + VIPH_DV0_WID = (0x1 << 24), + VIPH_DV1_WID = (0x1 << 25), + VIPH_DV2_WID = (0x1 << 26), + VIPH_DV3_WID = (0x1 << 27), + VIPH_PWR_DOWN = (0x1 << 28), + VIPH_PWR_DOWN_AK = (0x1 << 28), + VIPH_VIPCLK_DIS = (0x1 << 29) +}; + +enum ROM_CNTL_BITS { + SCK_OVERWRITE = 1 << 1, + CLOCK_GATING_EN = 1 << 2, + CSB_ACTIVE_TO_SCK_SETUP_TIME_SHIFT = 8, + CSB_ACTIVE_TO_SCK_HOLD_TIME_SHIFT = 16, + SCK_PRESCALE_REFCLK_SHIFT = 24, + SCK_PRESCALE_CRYSTAL_CLK_SHIFT = 28 +}; + +enum GENERAL_PWRMGT_BITS { + GLOBAL_PWRMGT_EN = 1 << 0, + STATIC_PM_EN = 1 << 1, + MOBILE_SU = 1 << 2, + THERMAL_PROTECTION_DIS = 1 << 3, + THERMAL_PROTECTION_TYPE = 1 << 4, + ENABLE_GEN2PCIE = 1 << 5, + SW_GPIO_INDEX_SHIFT = 1 << 6, + LOW_VOLT_D2_ACPI = 1 << 8, + LOW_VOLT_D3_ACPI = 1 << 9, + VOLT_PWRMGT_EN = 1 << 10, + OPEN_DRAIN_PADS = 1 << 11, + AVP_SCLK_EN = 1 << 12, + IDCT_SCLK_EN = 1 << 13, + GPU_COUNTER_ACPI = 1 << 14, + GPU_COUNTER_CLK = 1 << 15, + BACKBIAS_PAD_EN = 1 << 16, + BACKBIAS_VALUE = 1 << 17, + BACKBIAS_DPM_CNTL = 1 << 18, + SPREAD_SPECTRUM_INDEX_SHIFT = 19, + DYN_SPREAD_SPECTRUM_EN = 1 << 2 +}; + +enum VGA_RENDER_CONTROL_BITS { + /* VGA_RENDER_CONTROL */ + VGA_BLINK_RATE = (0x1f << 0), + VGA_BLINK_MODE = (0x3 << 5), + VGA_CURSOR_BLINK_INVERT = (0x1 << 7), + VGA_EXTD_ADDR_COUNT_ENABLE = (0x1 << 8), + VGA_VSTATUS_CNTL = (0x3 << 16), + VGA_LOCK_8DOT = (0x1 << 24), + VGAREG_LINECMP_COMPATIBILITY_SEL = (0x1 << 25) +}; + +enum D1VGA_CONTROL_BITS { + /* D1VGA_CONTROL */ + D1VGA_MODE_ENABLE = (0x1 << 0), + D1VGA_TIMING_SELECT = (0x1 << 8), + D1VGA_SYNC_POLARITY_SELECT = (0x1 << 9), + D1VGA_OVERSCAN_TIMING_SELECT = (0x1 << 10), + D1VGA_OVERSCAN_COLOR_EN = (0x1 << 16), + D1VGA_ROTATE = (0x3 << 24) +}; + +enum D2VGA_CONTROL_BITS { + /* D2VGA_CONTROL */ + D2VGA_MODE_ENABLE = (0x1 << 0), + D2VGA_TIMING_SELECT = (0x1 << 8), + D2VGA_SYNC_POLARITY_SELECT = (0x1 << 9), + D2VGA_OVERSCAN_TIMING_SELECT = (0x1 << 10), + D2VGA_OVERSCAN_COLOR_EN = (0x1 << 16), + D2VGA_ROTATE = (0x3 << 24) +}; + +enum { + /* CLOCK_CNTL_INDEX */ + PLL_ADDR = (0x3f << 0), + PLL_WR_EN = (0x1 << 7), + PPLL_DIV_SEL = (0x3 << 8), + + /* CLOCK_CNTL_DATA */ +#define PLL_DATA 0xffffffff + + /* SPLL_FUNC_CNTL */ + SPLL_CHG_STATUS = (0x1 << 29), + SPLL_BYPASS_EN = (0x1 << 25), + + /* MC_IND_INDEX */ + MC_IND_ADDR = (0xffff << 0), + MC_IND_SEQ_RBS_0 = (0x1 << 16), + MC_IND_SEQ_RBS_1 = (0x1 << 17), + MC_IND_SEQ_RBS_2 = (0x1 << 18), + MC_IND_SEQ_RBS_3 = (0x1 << 19), + MC_IND_AIC_RBS = (0x1 << 20), + MC_IND_CITF_ARB0 = (0x1 << 21), + MC_IND_CITF_ARB1 = (0x1 << 22), + MC_IND_WR_EN = (0x1 << 23), + MC_IND_RD_INV = (0x1 << 24) +#define MC_IND_ALL (MC_IND_SEQ_RBS_0 | MC_IND_SEQ_RBS_1 \ + | MC_IND_SEQ_RBS_2 | MC_IND_SEQ_RBS_3 \ + | MC_IND_AIC_RBS | MC_IND_CITF_ARB0 | MC_IND_CITF_ARB1) + + /* MC_IND_DATA */ +#define MC_IND_DATA_BIT 0xffffffff +}; + +enum AGP_STATUS_BITS { + AGP_1X_MODE = 0x01, + AGP_2X_MODE = 0x02, + AGP_4X_MODE = 0x04, + AGP_FW_MODE = 0x10, + AGP_MODE_MASK = 0x17, + AGPv3_MODE = 0x08, + AGPv3_4X_MODE = 0x01, + AGPv3_8X_MODE = 0x02 +}; + +enum { + /* HDMI registers */ + HDMI_ENABLE = 0x00, + HDMI_STATUS = 0x04, + HDMI_CNTL = 0x08, + HDMI_UNKNOWN_0 = 0x0C, + HDMI_AUDIOCNTL = 0x10, + HDMI_VIDEOCNTL = 0x14, + HDMI_VERSION = 0x18, + HDMI_UNKNOWN_1 = 0x28, + HDMI_VIDEOINFOFRAME_0 = 0x54, + HDMI_VIDEOINFOFRAME_1 = 0x58, + HDMI_VIDEOINFOFRAME_2 = 0x5c, + HDMI_VIDEOINFOFRAME_3 = 0x60, + HDMI_32kHz_CTS = 0xac, + HDMI_32kHz_N = 0xb0, + HDMI_44_1kHz_CTS = 0xb4, + HDMI_44_1kHz_N = 0xb8, + HDMI_48kHz_CTS = 0xbc, + HDMI_48kHz_N = 0xc0, + HDMI_AUDIOINFOFRAME_0 = 0xcc, + HDMI_AUDIOINFOFRAME_1 = 0xd0, + HDMI_IEC60958_1 = 0xd4, + HDMI_IEC60958_2 = 0xd8, + HDMI_UNKNOWN_2 = 0xdc, + HDMI_AUDIO_DEBUG_0 = 0xe0, + HDMI_AUDIO_DEBUG_1 = 0xe4, + HDMI_AUDIO_DEBUG_2 = 0xe8, + HDMI_AUDIO_DEBUG_3 = 0xec +}; + +#endif /* _RHD_REGS_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_shadow.c b/driver/xf86-video-radeonhd/src/rhd_shadow.c new file mode 100644 index 000000000..ecb670950 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_shadow.c @@ -0,0 +1,177 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "scrnintstr.h" +#include "shadow.h" +#include "fb.h" +#include "xf86.h" +#include "rhd.h" + +typedef struct _rhdShadowRec +{ + unsigned char *shadow; + CreateScreenResourcesProcPtr CreateScreenResources; +} rhdShadowRec; + +Bool +RHDShadowPreInit(ScrnInfoPtr pScrn) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + + RHDFUNC(pScrn); + + if (!xf86LoadSubModule(pScrn, "shadow")) { + return FALSE; + } + if (!(rhdPtr->shadowPtr = (rhdShadowPtr)xalloc(sizeof(rhdShadowRec)))) + return FALSE; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using ShadowFB\n"); + + return TRUE; +} + +static void * +rhdShadowWindow(ScreenPtr pScreen, CARD32 row, CARD32 offset, int mode, + CARD32 *size, void *closure) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + + DEBUGP(RHDDebugVerb(pScrn->scrnIndex, 1, "FUNCTION: %s row: %i\n",__func__,row)); + + *size = pScrn->displayWidth * (pScrn->bitsPerPixel >> 3); + return ((CARD8 *)rhdPtr->FbBase + rhdPtr->FbScanoutStart + + row * (*size) + offset); +} + +static Bool +rhdShadowCreateScreenResources(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + rhdShadowPtr shadowPtr = rhdPtr->shadowPtr; + Bool ret; + shadowUpdateProc update; + + RHDFUNC(pScrn); + + update = shadowUpdatePackedWeak(); + pScreen->CreateScreenResources = shadowPtr->CreateScreenResources; + ret = pScreen->CreateScreenResources(pScreen); + pScreen->CreateScreenResources = rhdShadowCreateScreenResources; + + shadowAdd(pScreen, pScreen->GetScreenPixmap(pScreen), + update, + rhdShadowWindow, 0, 0); + + return ret; +} + +Bool +RHDShadowScreenInit(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + rhdShadowPtr shadowPtr = rhdPtr->shadowPtr; + Bool ret; + + RHDFUNC(pScrn); + + if (shadowPtr) { + if (!(shadowPtr->shadow + = xcalloc(1, pScrn->displayWidth * pScrn->virtualY + * ((pScrn->bitsPerPixel + 7) >> 3)))) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate shadow FB buffer\n"); + return FALSE; + } + ret = fbScreenInit(pScreen, + (CARD8 *) shadowPtr->shadow, + pScrn->virtualX, pScrn->virtualY, + pScrn->xDpi, pScrn->yDpi, + pScrn->displayWidth, pScrn->bitsPerPixel); + if (!ret) { + xfree(shadowPtr->shadow); + shadowPtr->shadow = NULL; + } + return ret; + } + return FALSE; +} + +Bool +RHDShadowSetup(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + rhdShadowPtr shadowPtr = rhdPtr->shadowPtr; + + RHDFUNC(pScrn); + + if (!shadowPtr || !shadowPtr->shadow) + return TRUE; + + if (!shadowSetup(pScreen)) + return FALSE; + + shadowPtr->CreateScreenResources = pScreen->CreateScreenResources; + pScreen->CreateScreenResources = rhdShadowCreateScreenResources; + + return TRUE; +} + +Bool +RHDShadowCloseScreen(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + rhdShadowPtr shadowPtr = rhdPtr->shadowPtr; + + RHDFUNC(pScrn); + + if (!shadowPtr) + return TRUE; + + xfree(shadowPtr->shadow); + shadowPtr->shadow = NULL; + + return TRUE; +} + +void +RHDShadowDestroy(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + if (rhdPtr->shadowPtr) { + xfree(rhdPtr->shadowPtr); + rhdPtr->shadowPtr = NULL; + } +} diff --git a/driver/xf86-video-radeonhd/src/rhd_shadow.h b/driver/xf86-video-radeonhd/src/rhd_shadow.h new file mode 100644 index 000000000..318bf4c2e --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_shadow.h @@ -0,0 +1,38 @@ +/* + * Copyright 2007 Luc Verhaegen + * Copyright 2007 Matthias Hopf + * Copyright 2007 Egbert Eich + * Copyright 2007 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + + +#ifndef RHD_SHADOW_H_ +# define RHD_SHADOW_H_ + +Bool RHDShadowPreInit(ScrnInfoPtr pScrn); +Bool RHDShadowScreenInit(ScreenPtr pScreen); +Bool RHDShadowSetup(ScreenPtr pScreen); +Bool RHDShadowCloseScreen(ScreenPtr pScreen); +void RHDShadowDestroy(RHDPtr rhdPtr); + +#endif + + diff --git a/driver/xf86-video-radeonhd/src/rhd_tmds.c b/driver/xf86-video-radeonhd/src/rhd_tmds.c new file mode 100644 index 000000000..7148ff5ee --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_tmds.c @@ -0,0 +1,569 @@ +/* + * Copyright 2007-2008 Luc Verhaegen + * Copyright 2007-2008 Matthias Hopf + * Copyright 2007-2008 Egbert Eich + * Copyright 2007-2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +/* + * Deals with the Primary TMDS device (TMDSA) of R500s, R600s. + * Gets replaced by DDIA on RS690 and DIG/UNIPHY on RV620. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" + +/* for usleep */ +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#else +# include +#endif + +#include "rhd.h" +#include "rhd_crtc.h" +#include "rhd_connector.h" +#include "rhd_output.h" +#include "rhd_regs.h" +#include "rhd_hdmi.h" + +#ifdef ATOM_BIOS +#include "rhd_atombios.h" +#endif + +struct rhdTMDSPrivate { + Bool RunsDualLink; + DisplayModePtr Mode; + Bool Coherent; + Bool HdmiEnabled; + int PowerState; + + struct rhdHdmi *Hdmi; + + Bool Stored; + + CARD32 StoreControl; + CARD32 StoreSource; + CARD32 StoreFormat; + CARD32 StoreForce; + CARD32 StoreReduction; + CARD32 StoreDCBalancer; + CARD32 StoreDataSynchro; + CARD32 StoreTXEnable; + CARD32 StoreMacro; + CARD32 StoreTXControl; + CARD32 StoreTXAdjust; +}; + +/* + * We cannot sense for dual link here at all, plus, we need a bit more work + * for enabling the transmitter for sensing to happen on most R5xx cards. + * RV570 (0x7280) and R600 and above seem ok. + */ +static enum rhdSensedOutput +TMDSASense(struct rhdOutput *Output, struct rhdConnector *Connector) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + CARD32 Enable, Control, Detect; + enum rhdConnectorType Type = Connector->Type; + Bool ret; + + RHDFUNC(Output); + + if ((Type != RHD_CONNECTOR_DVI) && (Type != RHD_CONNECTOR_DVI_SINGLE)) { + xf86DrvMsg(Output->scrnIndex, X_WARNING, + "%s: connector type %d is not supported.\n", + __func__, Type); + return RHD_SENSED_NONE; + } + + Enable = RHDRegRead(Output, TMDSA_TRANSMITTER_ENABLE); + Control = RHDRegRead(Output, TMDSA_TRANSMITTER_CONTROL); + Detect = RHDRegRead(Output, TMDSA_LOAD_DETECT); + + if (rhdPtr->ChipSet < RHD_R600) { + RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x00000003, 0x00000003); + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000001, 0x00000003); + } + + RHDRegMask(Output, TMDSA_LOAD_DETECT, 0x00000001, 0x00000001); + usleep(1); + ret = RHDRegRead(Output, TMDSA_LOAD_DETECT) & 0x00000010; + + RHDRegMask(Output, TMDSA_LOAD_DETECT, Detect, 0x00000001); + if (rhdPtr->ChipSet < RHD_R600) { + RHDRegWrite(Output, TMDSA_TRANSMITTER_ENABLE, Enable); + RHDRegWrite(Output, TMDSA_TRANSMITTER_CONTROL, Control); + } + + RHDDebug(Output->scrnIndex, "%s: %s\n", __func__, + ret ? "Attached" : "Disconnected"); + + if (ret) + return RHD_SENSED_DVI; + else + return RHD_SENSED_NONE; +} + +/* + * + */ +static ModeStatus +TMDSAModeValid(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDFUNC(Output); + + if (Mode->Clock < 25000) + return MODE_CLOCK_LOW; + + if (Output->Connector->Type == RHD_CONNECTOR_DVI_SINGLE) { + if (Mode->Clock > 165000) + return MODE_CLOCK_HIGH; + } else if (Output->Connector->Type == RHD_CONNECTOR_DVI) { + if (Mode->Clock > 330000) /* could go higher still */ + return MODE_CLOCK_HIGH; + } + + return MODE_OK; +} + +/* + * This information is not provided in an atombios data table. + */ +static struct R5xxTMDSAMacro { + CARD16 Device; + CARD32 Macro; +} R5xxTMDSAMacro[] = { + { 0x7104, 0x00C00414 }, /* R520 */ + { 0x7142, 0x00A00415 }, /* RV515 */ + { 0x7145, 0x00A00416 }, /* M54 */ + { 0x7146, 0x00C0041F }, /* RV515 */ + { 0x7147, 0x00C00418 }, /* RV505 */ + { 0x7149, 0x00800416 }, /* M56 */ + { 0x7152, 0x00A00415 }, /* RV515 */ + { 0x7183, 0x00600412 }, /* RV530 */ + { 0x71C1, 0x00C0041F }, /* RV535 */ + { 0x71C2, 0x00A00416 }, /* RV530 */ + { 0x71C4, 0x00A00416 }, /* M56 */ + { 0x71C5, 0x00A00416 }, /* M56 */ + { 0x71C6, 0x00A00513 }, /* RV530 */ + { 0x71D2, 0x00A00513 }, /* RV530 */ + { 0x71D5, 0x00A00513 }, /* M66 */ + { 0x7249, 0x00A00513 }, /* R580 */ + { 0x724B, 0x00A00513 }, /* R580 */ + { 0x7280, 0x00C0041F }, /* RV570 */ + { 0x7288, 0x00C0041F }, /* RV570 */ + { 0x9400, 0x00910419 }, /* R600: */ + { 0, 0} /* End marker */ +}; + +static struct Rv6xxTMDSAMacro { + CARD16 Device; + CARD32 PLL; + CARD32 TX; +} Rv6xxTMDSAMacro[] = { + { 0x94C1, 0x00010416, 0x00010308 }, /* RV610 */ + { 0x94C3, 0x00010416, 0x00010308 }, /* RV610 */ + { 0x9501, 0x00010416, 0x00010308 }, /* RV670: != atombios */ + { 0x9505, 0x00010416, 0x00010308 }, /* RV670: != atombios */ + { 0x950F, 0x00010416, 0x00010308 }, /* R680 : != atombios */ + { 0x9581, 0x00030410, 0x00301044 }, /* M76 */ + { 0x9587, 0x00010416, 0x00010308 }, /* RV630 */ + { 0x9588, 0x00010416, 0x00010388 }, /* RV630 */ + { 0x9589, 0x00010416, 0x00010388 }, /* RV630 */ + { 0, 0, 0} /* End marker */ +}; + +static void +TMDSAVoltageControl(struct rhdOutput *Output) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + int i; + + if (rhdPtr->ChipSet < RHD_RV610) { + for (i = 0; R5xxTMDSAMacro[i].Device; i++) + if (R5xxTMDSAMacro[i].Device == rhdPtr->PciDeviceID) { + RHDRegWrite(Output, TMDSA_MACRO_CONTROL, R5xxTMDSAMacro[i].Macro); + return; + } + + xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: unhandled chipset: 0x%04X.\n", + __func__, rhdPtr->PciDeviceID); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TMDSA_MACRO_CONTROL: 0x%08X\n", + (unsigned int) RHDRegRead(Output, TMDSA_MACRO_CONTROL)); + } else { + for (i = 0; Rv6xxTMDSAMacro[i].Device; i++) + if (Rv6xxTMDSAMacro[i].Device == rhdPtr->PciDeviceID) { + RHDRegWrite(Output, TMDSA_PLL_ADJUST, Rv6xxTMDSAMacro[i].PLL); + RHDRegWrite(Output, TMDSA_TRANSMITTER_ADJUST, Rv6xxTMDSAMacro[i].TX); + return; + } + xf86DrvMsg(Output->scrnIndex, X_ERROR, "%s: unhandled chipset: 0x%04X.\n", + __func__, rhdPtr->PciDeviceID); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TMDSA_PLL_ADJUST: 0x%08X\n", + (unsigned int) RHDRegRead(Output, TMDSA_PLL_ADJUST)); + xf86DrvMsg(Output->scrnIndex, X_INFO, "TMDSA_TRANSMITTER_ADJUST: 0x%08X\n", + (unsigned int) RHDRegRead(Output, TMDSA_TRANSMITTER_ADJUST)); + } +} + +/* + * + */ +static Bool +TMDSAPropertyControl(struct rhdOutput *Output, + enum rhdPropertyAction Action, enum rhdOutputProperty Property, union rhdPropertyData *val) +{ + struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; + + RHDFUNC(Output); + switch (Action) { + case rhdPropertyCheck: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + case RHD_OUTPUT_AUDIO_WORKAROUND: + return TRUE; + default: + return FALSE; + } + case rhdPropertyGet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + val->Bool = Private->Coherent; + return TRUE; + case RHD_OUTPUT_HDMI: + val->Bool = Private->HdmiEnabled; + return TRUE; + case RHD_OUTPUT_AUDIO_WORKAROUND: + val->Bool = RHDHdmiGetAudioWorkaround(Private->Hdmi); + return TRUE; + default: + return FALSE; + } + break; + case rhdPropertySet: + switch (Property) { + case RHD_OUTPUT_COHERENT: + Private->Coherent = val->Bool; + break; + case RHD_OUTPUT_HDMI: + Private->HdmiEnabled = val->Bool; + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiSetAudioWorkaround(Private->Hdmi, val->Bool); + break; + default: + return FALSE; + } + break; + case rhdPropertyCommit: + switch (Property) { + case RHD_OUTPUT_COHERENT: + case RHD_OUTPUT_HDMI: + Output->Mode(Output, Private->Mode); + Output->Power(Output, RHD_POWER_ON); + break; + case RHD_OUTPUT_AUDIO_WORKAROUND: + RHDHdmiCommitAudioWorkaround(Private->Hdmi); + break; + default: + return FALSE; + } + break; + } + return TRUE; +} + +/* + * + */ +static void +TMDSASet(struct rhdOutput *Output, DisplayModePtr Mode) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; + + RHDFUNC(Output); + + /* Clear out some HPD events first: this should be under driver control. */ + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0, 0x0000000C); + RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0, 0x00070000); + RHDRegMask(Output, TMDSA_CNTL, 0, 0x00000010); + + /* Disable the transmitter */ + RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0, 0x00001D1F); + + /* Disable bit reduction and reset temporal dither */ + RHDRegMask(Output, TMDSA_BIT_DEPTH_CONTROL, 0, 0x00010101); + if (rhdPtr->ChipSet < RHD_R600) { + RHDRegMask(Output, TMDSA_BIT_DEPTH_CONTROL, 0x04000000, 0x04000000); + usleep(2); + RHDRegMask(Output, TMDSA_BIT_DEPTH_CONTROL, 0, 0x04000000); + } else { + RHDRegMask(Output, TMDSA_BIT_DEPTH_CONTROL, 0x02000000, 0x02000000); + usleep(2); + RHDRegMask(Output, TMDSA_BIT_DEPTH_CONTROL, 0, 0x02000000); + } + + /* reset phase on vsync and use RGB */ + RHDRegMask(Output, TMDSA_CNTL, 0x00001000, 0x00011000); + + /* Select CRTC, select syncA, no stereosync */ + RHDRegMask(Output, TMDSA_SOURCE_SELECT, Output->Crtc->Id, 0x00010101); + + /* Single link, for now */ + RHDRegWrite(Output, TMDSA_COLOR_FORMAT, 0); + + /* store this for TRANSMITTER_ENABLE in TMDSAPower */ + Private->Mode = Mode; + if (Mode->SynthClock > 165000) { + RHDRegMask(Output, TMDSA_CNTL, 0x01000000, 0x01000000); + Private->RunsDualLink = TRUE; /* for TRANSMITTER_ENABLE in TMDSAPower */ + } else { + RHDRegMask(Output, TMDSA_CNTL, 0, 0x01000000); + Private->RunsDualLink = FALSE; + } + + /* Disable force data */ + RHDRegMask(Output, TMDSA_FORCE_OUTPUT_CNTL, 0, 0x00000001); + + /* DC balancer enable */ + RHDRegMask(Output, TMDSA_DCBALANCER_CONTROL, 0x00000001, 0x00000001); + + TMDSAVoltageControl(Output); + + /* use IDCLK */ + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000010, 0x00000010); + + if (Private->Coherent) + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000000, 0x10000000); + else + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x10000000, 0x10000000); + + RHDHdmiSetMode(Private->Hdmi, Mode); +} + +/* + * + */ +static void +TMDSAPower(struct rhdOutput *Output, int Power) +{ + RHDPtr rhdPtr = RHDPTRI(Output); + struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; + + RHDDebug(Output->scrnIndex, "%s(%s,%s)\n",__func__,Output->Name, + rhdPowerString[Power]); + + switch (Power) { + case RHD_POWER_ON: + if (Private->PowerState == RHD_POWER_SHUTDOWN + || Private->PowerState == RHD_POWER_UNKNOWN) { + RHDRegMask(Output, TMDSA_CNTL, 0x1, 0x00000001); + + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000001, 0x00000001); + usleep(20); + + /* reset transmitter PLL */ + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); + usleep(2); + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0, 0x00000002); + + usleep(30); + + /* restart data synchronisation */ + if (rhdPtr->ChipSet < RHD_R600) { + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0x00000001, 0x00000001); + usleep(2); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0x00000100, 0x00000100); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R500, 0, 0x00000001); + } else { + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0x00000001, 0x00000001); + usleep(2); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0x00000100, 0x00000100); + RHDRegMask(Output, TMDSA_DATA_SYNCHRONIZATION_R600, 0, 0x00000001); + } + } + + if (Private->RunsDualLink) { + /* bit 9 is not known by anything below RV610, but is ignored by + the hardware anyway */ + RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x00001F1F, 0x00001F1F); + } else + RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0x0000001F, 0x00001F1F); + + RHDHdmiEnable(Private->Hdmi, Private->HdmiEnabled); + Private->PowerState = RHD_POWER_ON; + return; + + case RHD_POWER_RESET: + RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0, 0x00001F1F); + /* if we do a RESET after a SHUTDOWN don't raise the power level, + * and similarly, don't raise from UNKNOWN state. */ + if (Private->PowerState == RHD_POWER_ON) + Private->PowerState = RHD_POWER_RESET; + return; + + case RHD_POWER_SHUTDOWN: + default: + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0x00000002, 0x00000002); + usleep(2); + RHDRegMask(Output, TMDSA_TRANSMITTER_CONTROL, 0, 0x00000001); + RHDRegMask(Output, TMDSA_TRANSMITTER_ENABLE, 0, 0x00001F1F); + RHDRegMask(Output, TMDSA_CNTL, 0, 0x00000001); + RHDHdmiEnable(Private->Hdmi, FALSE); + Private->PowerState = RHD_POWER_SHUTDOWN; + return; + } +} + +/* + * + */ +static void +TMDSASave(struct rhdOutput *Output) +{ + int ChipSet = RHDPTRI(Output)->ChipSet; + struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; + + RHDFUNC(Output); + + Private->StoreControl = RHDRegRead(Output, TMDSA_CNTL); + Private->StoreSource = RHDRegRead(Output, TMDSA_SOURCE_SELECT); + Private->StoreFormat = RHDRegRead(Output, TMDSA_COLOR_FORMAT); + Private->StoreForce = RHDRegRead(Output, TMDSA_FORCE_OUTPUT_CNTL); + Private->StoreReduction = RHDRegRead(Output, TMDSA_BIT_DEPTH_CONTROL); + Private->StoreDCBalancer = RHDRegRead(Output, TMDSA_DCBALANCER_CONTROL); + + if (ChipSet < RHD_R600) + Private->StoreDataSynchro = RHDRegRead(Output, TMDSA_DATA_SYNCHRONIZATION_R500); + else + Private->StoreDataSynchro = RHDRegRead(Output, TMDSA_DATA_SYNCHRONIZATION_R600); + + Private->StoreTXEnable = RHDRegRead(Output, TMDSA_TRANSMITTER_ENABLE); + Private->StoreMacro = RHDRegRead(Output, TMDSA_MACRO_CONTROL); + Private->StoreTXControl = RHDRegRead(Output, TMDSA_TRANSMITTER_CONTROL); + + if (ChipSet >= RHD_RV610) + Private->StoreTXAdjust = RHDRegRead(Output, TMDSA_TRANSMITTER_ADJUST); + + RHDHdmiSave(Private->Hdmi); + + Private->Stored = TRUE; +} + +/* + * + */ +static void +TMDSARestore(struct rhdOutput *Output) +{ + int ChipSet = RHDPTRI(Output)->ChipSet; + struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; + + RHDFUNC(Output); + + if (!Private->Stored) { + xf86DrvMsg(Output->scrnIndex, X_ERROR, + "%s: No registers stored.\n", __func__); + return; + } + + RHDRegWrite(Output, TMDSA_CNTL, Private->StoreControl); + RHDRegWrite(Output, TMDSA_SOURCE_SELECT, Private->StoreSource); + RHDRegWrite(Output, TMDSA_COLOR_FORMAT, Private->StoreFormat); + RHDRegWrite(Output, TMDSA_FORCE_OUTPUT_CNTL, Private->StoreForce); + RHDRegWrite(Output, TMDSA_BIT_DEPTH_CONTROL, Private->StoreReduction); + RHDRegWrite(Output, TMDSA_DCBALANCER_CONTROL, Private->StoreDCBalancer); + + if (ChipSet < RHD_R600) + RHDRegWrite(Output, TMDSA_DATA_SYNCHRONIZATION_R500, Private->StoreDataSynchro); + else + RHDRegWrite(Output, TMDSA_DATA_SYNCHRONIZATION_R600, Private->StoreDataSynchro); + + RHDRegWrite(Output, TMDSA_TRANSMITTER_ENABLE, Private->StoreTXEnable); + RHDRegWrite(Output, TMDSA_MACRO_CONTROL, Private->StoreMacro); + RHDRegWrite(Output, TMDSA_TRANSMITTER_CONTROL, Private->StoreTXControl); + + if (ChipSet >= RHD_RV610) + RHDRegWrite(Output, TMDSA_TRANSMITTER_ADJUST, Private->StoreTXAdjust); + + RHDHdmiRestore(Private->Hdmi); +} + +/* + * + */ +static void +TMDSADestroy(struct rhdOutput *Output) +{ + struct rhdTMDSPrivate *Private = (struct rhdTMDSPrivate *) Output->Private; + RHDFUNC(Output); + + if (!Private) + return; + + RHDHdmiDestroy(Private->Hdmi); + + xfree(Private); + Output->Private = NULL; +} + +/* + * + */ +struct rhdOutput * +RHDTMDSAInit(RHDPtr rhdPtr) +{ + struct rhdOutput *Output; + struct rhdTMDSPrivate *Private; + + RHDFUNC(rhdPtr); + + Output = xnfcalloc(sizeof(struct rhdOutput), 1); + + Output->scrnIndex = rhdPtr->scrnIndex; + Output->Name = "TMDS A"; + Output->Id = RHD_OUTPUT_TMDSA; + + Output->Sense = TMDSASense; + Output->ModeValid = TMDSAModeValid; + Output->Mode = TMDSASet; + Output->Power = TMDSAPower; + Output->Save = TMDSASave; + Output->Restore = TMDSARestore; + Output->Destroy = TMDSADestroy; + Output->Property = TMDSAPropertyControl; + + Private = xnfcalloc(sizeof(struct rhdTMDSPrivate), 1); + Private->RunsDualLink = FALSE; + Private->Coherent = FALSE; + Private->PowerState = RHD_POWER_UNKNOWN; + Private->Hdmi = RHDHdmiInit(rhdPtr, Output); + + Output->Private = Private; + + return Output; +} diff --git a/driver/xf86-video-radeonhd/src/rhd_vga.c b/driver/xf86-video-radeonhd/src/rhd_vga.c new file mode 100644 index 000000000..c32ead940 --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_vga.c @@ -0,0 +1,234 @@ +/* + * Copyright 2007-2008 Luc Verhaegen + * Copyright 2007-2008 Matthias Hopf + * Copyright 2007-2008 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "xf86.h" +#if HAVE_XF86_ANSIC_H +# include "xf86_ansic.h" +#endif + +#include "rhd.h" +#include "rhd_vga.h" +#include "rhd_regs.h" +#include "rhd_mc.h" + +struct rhdVGA { + Bool Stored; + + CARD32 FBOffset; + CARD8 *FB; + int FBSize; /* 256kB */ + + CARD32 Render_Control; + CARD32 Mode_Control; + CARD32 HDP_Control; + CARD32 D1_Control; + CARD32 D2_Control; +}; + +/* + * + */ +void +RHDVGAInit(RHDPtr rhdPtr) +{ + struct rhdVGA *VGA; + + RHDFUNC(rhdPtr); + + /* Check whether one of our VGA bits is set */ + if (!(RHDRegRead(rhdPtr, VGA_RENDER_CONTROL) & 0x00030000) && + (RHDRegRead(rhdPtr, VGA_HDP_CONTROL) & 0x00000010) && + !(RHDRegRead(rhdPtr, D1VGA_CONTROL) & 0x00000001) && + !(RHDRegRead(rhdPtr, D2VGA_CONTROL) & 0x00000001)) + return; + + xf86DrvMsg(rhdPtr->scrnIndex, X_INFO, "Detected VGA mode.\n"); + + VGA = xnfcalloc(sizeof(struct rhdVGA), 1); + VGA->Stored = FALSE; + + rhdPtr->VGA = VGA; +} + +/* + * Thoroughly check whether our VGA FB is accessible. + */ +static CARD32 +rhdVGAFBOffsetGet(RHDPtr rhdPtr) +{ + CARD32 FBSize, VGAFBOffset, VGAFBSize = 256 * 1024; + CARD64 FBAddress = RHDMCGetFBLocation(rhdPtr, &FBSize); + CARD64 VGAFBAddress = RHDRegRead(rhdPtr, VGA_MEMORY_BASE_ADDRESS); + + if (VGAFBAddress < FBAddress) + return 0xFFFFFFFF; + + if ((VGAFBAddress + VGAFBSize) > (FBAddress + FBSize)) + return 0xFFFFFFFF; + + VGAFBOffset = VGAFBAddress - FBAddress; /* < FBSize, so 32bit */ + + if ((VGAFBOffset + VGAFBSize) >= rhdPtr->FbMapSize) + return 0xFFFFFFFF; + + return VGAFBOffset; +} + +/* + * This is (usually) ok, as VGASave is called after the memory has been mapped, + * but before the MC is set up. So the use of RHDMCGetFBLocation is correct in + * rhdVGAFBOffsetGet. + */ +static void +rhdVGASaveFB(RHDPtr rhdPtr) +{ + struct rhdVGA *VGA = rhdPtr->VGA; + + ASSERT(rhdPtr->FbBase); + + RHDFUNC(rhdPtr); + + VGA->FBOffset = rhdVGAFBOffsetGet(rhdPtr); + + if (VGA->FBOffset == 0xFFFFFFFF) { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "%s: Unable to access the VGA " + "framebuffer (0x%08X)\n", __func__, + (unsigned int) RHDRegRead(rhdPtr, VGA_MEMORY_BASE_ADDRESS)); + if (VGA->FB) + xfree(VGA->FB); + VGA->FB = NULL; + VGA->FBSize = 0; + return; + } + + VGA->FBSize = 256 * 1024; + + RHDDebug(rhdPtr->scrnIndex, "%s: VGA FB Offset 0x%08X [0x%08X]\n", + __func__, VGA->FBOffset, VGA->FBSize); + + if (!VGA->FB) + VGA->FB = xcalloc(VGA->FBSize, 1); + + if (VGA->FB) + memcpy(VGA->FB, ((CARD8 *) rhdPtr->FbBase) + VGA->FBOffset, + VGA->FBSize); + else { + xf86DrvMsg(rhdPtr->scrnIndex, X_WARNING, "%s: Failed to allocate" + " space for storing the VGA framebuffer.\n", __func__); + VGA->FBOffset = 0xFFFFFFFF; + VGA->FBSize = 0; + } +} + +/* + * + */ +void +RHDVGASave(RHDPtr rhdPtr) +{ + struct rhdVGA *VGA = rhdPtr->VGA; + + RHDFUNC(rhdPtr); + + if (!VGA) + return; /* We don't need to warn , this is intended use */ + + VGA->Render_Control = RHDRegRead(rhdPtr, VGA_RENDER_CONTROL); + VGA->Mode_Control = RHDRegRead(rhdPtr, VGA_MODE_CONTROL); + VGA->HDP_Control = RHDRegRead(rhdPtr, VGA_HDP_CONTROL); + VGA->D1_Control = RHDRegRead(rhdPtr, D1VGA_CONTROL); + VGA->D2_Control = RHDRegRead(rhdPtr, D2VGA_CONTROL); + + rhdVGASaveFB(rhdPtr); + VGA->Stored = TRUE; +} + +/* + * + */ +void +RHDVGARestore(RHDPtr rhdPtr) +{ + struct rhdVGA *VGA = rhdPtr->VGA; + + RHDFUNC(rhdPtr); + + if (!VGA) + return; /* We don't need to warn , this is intended use */ + + if (!VGA->Stored) { + xf86DrvMsg(rhdPtr->scrnIndex, X_ERROR, + "%s: trying to restore uninitialized values.\n", __func__); + return; + } + + if (VGA->FB) + memcpy(((CARD8 *) rhdPtr->FbBase) + VGA->FBOffset, VGA->FB, + VGA->FBSize); + + RHDRegWrite(rhdPtr, VGA_RENDER_CONTROL, VGA->Render_Control); + RHDRegWrite(rhdPtr, VGA_MODE_CONTROL, VGA->Mode_Control); + RHDRegWrite(rhdPtr, VGA_HDP_CONTROL, VGA->HDP_Control); + RHDRegWrite(rhdPtr, D1VGA_CONTROL, VGA->D1_Control); + RHDRegWrite(rhdPtr, D2VGA_CONTROL, VGA->D2_Control); + RHD_UNSETDEBUGFLAG(rhdPtr, VGA_SETUP); +} + +/* + * + */ +void +RHDVGADisable(RHDPtr rhdPtr) +{ + RHDFUNC(rhdPtr); + + RHDRegMask(rhdPtr, VGA_RENDER_CONTROL, 0, 0x00030000); + RHDRegMask(rhdPtr, VGA_MODE_CONTROL, 0, 0x00000030); + RHDRegMask(rhdPtr, VGA_HDP_CONTROL, 0x00010010, 0x00010010); + RHDRegMask(rhdPtr, D1VGA_CONTROL, 0, D1VGA_MODE_ENABLE); + RHDRegMask(rhdPtr, D2VGA_CONTROL, 0, D2VGA_MODE_ENABLE); + RHD_SETDEBUGFLAG(rhdPtr, VGA_SETUP); +} + +/* + * + */ +void +RHDVGADestroy(RHDPtr rhdPtr) +{ + struct rhdVGA *VGA = rhdPtr->VGA; + + RHDFUNC(rhdPtr); + + if (!VGA) + return; /* We don't need to warn , this is intended use */ + + if (VGA->FB) + xfree(VGA->FB); + xfree(VGA); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_vga.h b/driver/xf86-video-radeonhd/src/rhd_vga.h new file mode 100644 index 000000000..3b7bff5cc --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_vga.h @@ -0,0 +1,34 @@ +/* + * Copyright 2007-2008 Luc Verhaegen + * Copyright 2007-2008 Matthias Hopf + * Copyright 2007-2008 Egbert Eich + * + * 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ + +#ifndef _RHD_VGA_H +#define _RHD_VGA_H + +void RHDVGAInit(RHDPtr rhdPtr); +void RHDVGASave(RHDPtr rhdPtr); +void RHDVGARestore(RHDPtr rhdPtr); +void RHDVGADisable(RHDPtr rhdPtr); +void RHDVGADestroy(RHDPtr rhdPtr); + +#endif /* _RHD_PLL_H */ diff --git a/driver/xf86-video-radeonhd/src/rhd_video.c b/driver/xf86-video-radeonhd/src/rhd_video.c new file mode 100644 index 000000000..383f926fa --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_video.c @@ -0,0 +1,1028 @@ +/* + * Copyright 2008 Luc Verhaegen + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * Copyright 2008 Alex Deucher + * + * 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 (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 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. + * + * + * Based on radeon_exa_render.c and kdrive ati_video.c by Eric Anholt, et al. + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include +#include + +/* for memory management */ +#include "xaa.h" +#ifdef USE_EXA +#include "exa.h" +#endif + +#include "xf86xv.h" + +#include "rhd.h" +#include "rhd_cs.h" + +#include "r5xx_regs.h" + +/* for R5xx3DInit */ +#include "r5xx_accel.h" + +#include "rhd_video.h" + +#include "xf86.h" +#include "dixstruct.h" +#include "xf86fbman.h" + +#include +#include "fourcc.h" + +static Atom xvColorSpace; + +#ifdef USE_EXA +/* + * + */ +static Bool +rhdXvAllocateEXA(ScrnInfoPtr pScrn, struct RHDPortPriv *pPriv, int size) +{ + ExaOffscreenArea *area = pPriv->BufferHandle; + + if (area && (area->size == size)) + return TRUE; + + if (area) + exaOffscreenFree(pScrn->pScreen, area); + + area = exaOffscreenAlloc(pScrn->pScreen, size, RHD_FB_ALIGNMENT, + TRUE, NULL, NULL); + if (!area) { + pPriv->BufferHandle = NULL; + pPriv->BufferOffset = 0; + return FALSE; + } else { + pPriv->BufferHandle = area; + pPriv->BufferOffset = area->offset + RHDPTR(pScrn)->FbScanoutStart; + return TRUE; + } +} +#endif /* USE_EXA */ + +/* + * + */ +static FBLinearPtr +rhdXvAllocateXAAHelper(ScreenPtr pScreen, FBLinearPtr linear, int size) +{ + if (linear) { + if (linear->size == size) + return linear; + + if (xf86ResizeOffscreenLinear(linear, size)) + return linear; + + xf86FreeOffscreenLinear(linear); + } + + linear = xf86AllocateOffscreenLinear(pScreen, size, 1, + NULL, NULL, NULL); + + if (!linear) { + int max_size; + + xf86QueryLargestOffscreenLinear(pScreen, &max_size, 1, + PRIORITY_EXTREME); + if (max_size < size) + return NULL; + + xf86PurgeUnlockedOffscreenAreas(pScreen); + linear = xf86AllocateOffscreenLinear(pScreen, size, 1, + NULL, NULL, NULL); + } + + return linear; +} + +/* + * + */ +static Bool +rhdXvAllocateXAA(ScrnInfoPtr pScrn, struct RHDPortPriv *pPriv, int size) +{ + int cpp = pScrn->bitsPerPixel >> 3; + FBLinearPtr linear; + + /* We need to do FB alignment manually */ + size += RHD_FB_ALIGNMENT - 1; + + /* XAA allocates in units of pixels */ + size = (size + cpp - 1) / cpp; + + linear = rhdXvAllocateXAAHelper(pScrn->pScreen, pPriv->BufferHandle, size); + if (!linear) { + pPriv->BufferHandle = NULL; + pPriv->BufferOffset = 0; + return FALSE; + } else { + pPriv->BufferHandle = linear; + pPriv->BufferOffset = RHDPTR(pScrn)->FbScanoutStart + + RHD_FB_CHUNK(linear->offset * cpp + RHD_FB_ALIGNMENT - 1); + return TRUE; + } +} + +/* + * + */ +static void +rhdStopVideo(ScrnInfoPtr pScrn, pointer data, Bool cleanup) +{ + if (cleanup) { + struct RHDPortPriv *pPriv = data; + + switch (RHDPTR(pScrn)->AccelMethod) { +#ifdef USE_EXA + case RHD_ACCEL_EXA: + exaOffscreenFree(pScrn->pScreen, + (ExaOffscreenArea *) pPriv->BufferHandle); + break; +#endif /* USE_EXA */ + case RHD_ACCEL_XAA: + xf86FreeOffscreenLinear((FBLinearPtr) pPriv->BufferHandle); + break; + default: + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: cannot de-allocate memory!\n", __func__); + break; + } + + pPriv->BufferHandle = NULL; + pPriv->BufferOffset = 0; + } +} + +/* + * + */ +static int +rhdSetPortAttribute(ScrnInfoPtr pScrn, + Atom attribute, + INT32 value, + pointer data) +{ + /*RHDPtr rhdPtr = RHDPTR(pScrn);*/ + struct RHDPortPriv *pPriv = (struct RHDPortPriv*)data; + + if (attribute == xvColorSpace) + pPriv->color_space = value; + else + return BadMatch; + + return Success; +} + +/* + * + */ +static int +rhdGetPortAttribute(ScrnInfoPtr pScrn, + Atom attribute, + INT32 *value, + pointer data) +{ + /*RHDPtr rhdPtr = RHDPTR(pScrn);*/ + struct RHDPortPriv *pPriv = (struct RHDPortPriv*)data; + + if (attribute == xvColorSpace) + *value = pPriv->color_space; + else + return BadMatch; + + return Success; +} + +/* + * + */ +static void +rhdQueryBestSize( + ScrnInfoPtr pScrn, + Bool motion, + short vid_w, short vid_h, + short drw_w, short drw_h, + unsigned int *p_w, unsigned int *p_h, + pointer data +){ + + *p_w = drw_w; + *p_h = drw_h; +} + +/* + * + */ +static int +rhdQueryImageAttributes(ScrnInfoPtr pScrn, int id, CARD16 *w, CARD16 *h, + int *pitches, int *offsets) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + int size; + + if (!pitches || !offsets) + return 0; + + *w = ALIGN(*w, 2); + + if ((rhdPtr->ChipSet == RHD_RS690) || (rhdPtr->ChipSet == RHD_RS600) || + (rhdPtr->ChipSet == RHD_RS740)) { + if (*w > 2048) + *w = 2048; + if (*h > 2048) + *h = 2048; + } else if (rhdPtr->ChipSet >= RHD_R600) { + if (*w > 8192) + *w = 8192; + if (*h > 8192) + *h = 8192; + } else { + if (*w > 4096) + *w = 4096; + if (*h > 4096) + *h = 4096; + } + + switch(id) { + case FOURCC_YV12: + case FOURCC_I420: + *h = ALIGN(*h, 2); + + offsets[0] = 0; + + if (pitches) + pitches[0] = ALIGN(*w, 4); + size = *h * pitches[0]; + + offsets[1] = *h * pitches[0]; + pitches[1] = ALIGN(*w / 2, 4); + + offsets[2] = *h * (pitches[0] + pitches[1] / 2); + pitches[2] = pitches[1]; + + size = *h * (pitches[0] + pitches[1]); + break; + case FOURCC_UYVY: + case FOURCC_YUY2: + default: + offsets[0] = 0; + pitches[0] = 2 * *w; + size = pitches[0] * *h; + break; + } + + return size; +} + +/* + * Buffer swaps for big endian. + */ +#if X_BYTE_ORDER == X_BIG_ENDIAN +static inline void +MemCopySwap32(CARD8 *dst, CARD8 *src, unsigned int size) +{ + unsigned int *d = (unsigned int *)dst; + unsigned int *s = (unsigned int *)src; + unsigned int nwords = size >> 2; + + for (; nwords > 0; --nwords, ++d, ++s) +#ifdef __powerpc__ + asm volatile("stwbrx %0,0,%1" : : "r" (*s), "r" (d)); +#else + *d = ((*s >> 24) & 0xff) | ((*s >> 8) & 0xff00) + | ((*s & 0xff00) << 8) | ((*s & 0xff) << 24); +#endif +} +#else +#define MemCopySwap32 memcpy +#endif /* X_BYTE_ORDER */ + +/* + * + */ +static void +R5xxXvCopyPackedDMA(RHDPtr rhdPtr, CARD8 *src, CARD8 *dst, + CARD16 srcPitch, CARD16 dstPitch, CARD16 h) +{ + struct RhdCS *CS = rhdPtr->CS; + CARD32 Offset = dst - (CARD8 *)rhdPtr->FbBase + rhdPtr->FbIntAddress; + CARD32 Control = R5XX_GMC_DST_PITCH_OFFSET_CNTL | + R5XX_GMC_DST_CLIPPING | R5XX_GMC_BRUSH_NONE | + R5XX_GMC_DST_8BPP_CI | R5XX_GMC_SRC_DATATYPE_COLOR | + R5XX_ROP3_S | R5XX_DP_SRC_SOURCE_HOST_DATA | + R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_WR_MSK_DIS; + CARD16 y = 0, dwords; + CARD16 hpass = ((CS->Size - 10) * 4) / srcPitch; + + while (h) { + if (h < hpass) + hpass = h; + + dwords = hpass * srcPitch / 4; + + RHDCSGrab(CS, dwords + 10); + RHDCSWrite(CS, CP_PACKET3(R5XX_CP_PACKET3_CNTL_HOSTDATA_BLT, + dwords + 10 - 2)); + RHDCSWrite(CS, Control); + RHDCSWrite(CS, (dstPitch << 16) | (Offset >> 10)); + RHDCSWrite(CS, y << 16); + RHDCSWrite(CS, ((y + hpass) << 16) | srcPitch); + RHDCSWrite(CS, 0xFFFFFFFF); + RHDCSWrite(CS, 0xFFFFFFFF); + RHDCSWrite(CS, y << 16); + RHDCSWrite(CS, (hpass << 16) | srcPitch); + RHDCSWrite(CS, dwords); + + MemCopySwap32((CARD8 *) &CS->Buffer[CS->Wptr], src, hpass * srcPitch); + CS->Wptr += dwords; + + src += hpass * srcPitch; + + y += hpass; + h -= hpass; + } + + RHDCSFlush(CS); + + return; +} + + +/* + * + */ +static void +R5xxXvCopyPacked(RHDPtr rhdPtr, CARD8 *src, CARD8 *dst, + CARD16 srcPitch, CARD16 dstPitch, CARD16 h) +{ +#if X_BYTE_ORDER == X_BIG_ENDIAN + CARD32 val, new; + val = RHDRegRead(rhdPtr, R5XX_SURFACE_CNTL); + new = val & + ~(R5XX_NONSURF_AP0_SWP_32BPP | R5XX_NONSURF_AP1_SWP_32BPP | + R5XX_NONSURF_AP0_SWP_16BPP | R5XX_NONSURF_AP1_SWP_16BPP); + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, new); +#endif + + if (srcPitch == dstPitch) + memcpy(dst, src, srcPitch * h); + else { + while (h--) { + memcpy(dst, src, srcPitch); + src += srcPitch; + dst += dstPitch; + } + } + +#if X_BYTE_ORDER == X_BIG_ENDIAN + /* restore byte swapping */ + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, val); +#endif +} + +/* + * + */ +static void +R5xxXvCopyPlanarToPacked(CARD8 *dst, CARD16 dstPitch, + CARD8 *src1, CARD16 src1Pitch, + CARD8 *src2, CARD16 src2Pitch, + CARD8 *src3, CARD16 width, CARD16 height) +{ + int i, j; + + for (i = 0; i < height; i++) { + CARD32 *d = (CARD32 *) dst; + CARD8 *s1 = src1; + CARD8 *s2 = src2; + CARD8 *s3 = src3; + + for (j = width / 2; j > 4; j -= 4) { + d[0] = s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24); + d[1] = s1[2] | (s1[3] << 16) | (s3[1] << 8) | (s2[1] << 24); + d[2] = s1[4] | (s1[5] << 16) | (s3[2] << 8) | (s2[2] << 24); + d[3] = s1[6] | (s1[7] << 16) | (s3[3] << 8) | (s2[3] << 24); + d += 4; + s2 += 4; + s3 += 4; + s1 += 8; + } + + for (; j; j--) { + d[0] = s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24); + d++; + s2++; + s3++; + s1 += 2; + } + + dst += dstPitch; + src1 += src1Pitch; + if (i & 1) { + src2 += src2Pitch; + src3 += src2Pitch; + } + } +} + +/* + * TODO: check big endian. + */ +static void +R5xxXvCopyPlanarDMA(RHDPtr rhdPtr, CARD8 *src1, CARD8 *src2, CARD8 *src3, + CARD8 *dst1, CARD16 srcPitch, CARD16 srcPitch2, + CARD16 dstPitch, CARD16 h, CARD16 w) +{ + struct RhdCS *CS = rhdPtr->CS; + /* We need to make sure that our hpass is always even, so that we don't run + * into trouble with R5xxXvCopyPlanarToPacked. */ + CARD16 hpass = (2 * (CS->Size - 10) / w) & ~0x01; + CARD32 Offset = dst1 - (CARD8 *)rhdPtr->FbBase + rhdPtr->FbIntAddress; + CARD32 Control = R5XX_GMC_DST_PITCH_OFFSET_CNTL | + R5XX_GMC_DST_CLIPPING | R5XX_GMC_BRUSH_NONE | + R5XX_GMC_DST_32BPP | R5XX_GMC_SRC_DATATYPE_COLOR | + R5XX_ROP3_S | R5XX_DP_SRC_SOURCE_HOST_DATA | + R5XX_GMC_CLR_CMP_CNTL_DIS | R5XX_GMC_WR_MSK_DIS; + CARD16 y = 0, dwords; + + while (h) { + if (h < hpass) + hpass = h; + + dwords = hpass * w / 2; + + RHDCSGrab(CS, dwords + 10); + RHDCSWrite(CS, CP_PACKET3(R5XX_CP_PACKET3_CNTL_HOSTDATA_BLT, dwords + 10 - 2)); + RHDCSWrite(CS, Control); + RHDCSWrite(CS, (dstPitch << 16) | (Offset >> 10)); + RHDCSWrite(CS, y << 16); + RHDCSWrite(CS, ((y + hpass) << 16) | (w / 2)); + RHDCSWrite(CS, 0xFFFFFFFF); + RHDCSWrite(CS, 0xFFFFFFFF); + RHDCSWrite(CS, y << 16); + RHDCSWrite(CS, (hpass << 16) | (w / 2)); + RHDCSWrite(CS, dwords); + + R5xxXvCopyPlanarToPacked((CARD8 *) &CS->Buffer[CS->Wptr], 2 * w, src1, + srcPitch, src2, srcPitch2, src3, w, hpass); + CS->Wptr += dwords; + + src1 += hpass * srcPitch; + src2 += hpass * srcPitch2 / 2; + src3 += hpass * srcPitch2 / 2; + + y += hpass; + h -= hpass; + } + + RHDCSFlush(CS); +} + +/* + * + */ +static void +R5xxXvCopyPlanar(RHDPtr rhdPtr, CARD8 *src1, CARD8 *src2, CARD8 *src3, + CARD8 *dst1, CARD16 srcPitch, CARD16 srcPitch2, + CARD16 dstPitch, CARD16 h, CARD16 w) +{ +#if X_BYTE_ORDER == X_BIG_ENDIAN + CARD32 val = RHDRegRead(rhdPtr, R5XX_SURFACE_CNTL); + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, + (val | R5XX_NONSURF_AP0_SWP_32BPP) & ~R5XX_NONSURF_AP0_SWP_16BPP); +#endif + + R5xxXvCopyPlanarToPacked(dst1, dstPitch, src1, srcPitch, + src2, srcPitch2, src3, w, h); + +#if X_BYTE_ORDER == X_BIG_ENDIAN + /* restore byte swapping */ + RHDRegWrite(rhdPtr, R5XX_SURFACE_CNTL, val); +#endif +} + +static void +R600CopyPlanarHW(ScrnInfoPtr pScrn, + unsigned char *y_src, unsigned char *u_src, unsigned char *v_src, + uint32_t dst_mc_addr, + int srcPitch, int srcPitch2, int dstPitch, + int w, int h) +{ + int dstPitch2 = dstPitch >> 1; + int h2 = h >> 1; + int w2 = w >> 1; + int v_offset, u_offset; + v_offset = dstPitch * h; + v_offset = (v_offset + 255) & ~255; + u_offset = v_offset + (dstPitch2 * h2); + u_offset = (u_offset + 255) & ~255; + + /* Y */ + R600CopyToVRAM(pScrn, + (char *)y_src, srcPitch, + dstPitch, dst_mc_addr, h, 8, + 0, 0, w, h); + + /* V */ + R600CopyToVRAM(pScrn, + (char *)v_src, srcPitch2, + dstPitch2, dst_mc_addr + v_offset, h2, 8, + 0, 0, w2, h2); + + /* U */ + R600CopyToVRAM(pScrn, + (char *)u_src, srcPitch2, + dstPitch2, dst_mc_addr + u_offset, h2, 8, + 0, 0, w2, h2); +} + +static void +R600CopyPackedHW(ScrnInfoPtr pScrn, + unsigned char *src, uint32_t dst_mc_addr, + int srcPitch, int dstPitch, + int w, int h) +{ + /* YUV */ + R600CopyToVRAM(pScrn, + (char *)src, srcPitch, + dstPitch >> 2, dst_mc_addr, h, 32, + 0, 0, w >> 1, h); +} + +static void +R600CopyPlanarSW(ScrnInfoPtr pScrn, + unsigned char *y_src, unsigned char *u_src, unsigned char *v_src, + unsigned char *dst, + int srcPitch, int srcPitch2, int dstPitch, + int w, int h) +{ + int i; + int dstPitch2 = dstPitch >> 1; + int h2 = h >> 1; + + /* Y */ + if (srcPitch == dstPitch) { + memcpy(dst, y_src, srcPitch * h); + dst += (dstPitch * h); + } else { + for (i = 0; i < h; i++) { + memcpy(dst, y_src, srcPitch); + y_src += srcPitch; + dst += dstPitch; + } + } + + /* tex base need 256B alignment */ + if (h & 1) + dst += dstPitch; + + /* V */ + if (srcPitch2 == dstPitch2) { + memcpy(dst, v_src, srcPitch2 * h2); + dst += (dstPitch2 * h2); + } else { + for (i = 0; i < h2; i++) { + memcpy(dst, v_src, srcPitch2); + v_src += srcPitch2; + dst += dstPitch2; + } + } + + /* tex base need 256B alignment */ + if (h2 & 1) + dst += dstPitch2; + + /* U */ + if (srcPitch2 == dstPitch2) { + memcpy(dst, u_src, srcPitch2 * h2); + dst += (dstPitch2 * h2); + } else { + for (i = 0; i < h2; i++) { + memcpy(dst, u_src, srcPitch2); + u_src += srcPitch2; + dst += dstPitch2; + } + } +} + +static void +R600CopyPackedSW(ScrnInfoPtr pScrn, + unsigned char *src, unsigned char *dst, + int srcPitch, int dstPitch, + int w, int h) +{ + int i; + + if (srcPitch == dstPitch) { + memcpy(dst, src, srcPitch * h); + dst += (dstPitch * h); + } else { + for (i = 0; i < h; i++) { + memcpy(dst, src, srcPitch); + src += srcPitch; + dst += dstPitch; + } + } +} + +/* + * + */ +static int +rhdPutImageTextured(ScrnInfoPtr pScrn, + short src_x, short src_y, + short drw_x, short drw_y, + short src_w, short src_h, + short drw_w, short drw_h, + int id, + unsigned char *buf, + short width, + short height, + Bool sync, + RegionPtr clipBoxes, + pointer data, + DrawablePtr pDraw) +{ + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RHDPortPriv *pPriv = data; + CARD8 *FBBuf; + + /* + * First, make sure we can render to the drawable. + */ + if (pDraw->type == DRAWABLE_WINDOW) + pPriv->pPixmap = (*pScrn->pScreen->GetWindowPixmap)((WindowPtr)pDraw); + else + pPriv->pPixmap = (PixmapPtr)pDraw; + + +#if defined(USE_EXA) && ((EXA_VERSION_MAJOR > 2) || (EXA_VERSION_MAJOR == 2 && EXA_VERSION_MINOR >= 1)) + if (rhdPtr->AccelMethod == RHD_ACCEL_EXA) { + /* Force the pixmap into framebuffer so we can draw to it. */ + exaMoveInPixmap(pPriv->pPixmap); + } else +#endif + /* + * TODO: Copy the pixmap into the FB ourselves!!! + */ + if (((rhdPtr->AccelMethod != RHD_ACCEL_NONE) || (rhdPtr->AccelMethod != RHD_ACCEL_SHADOWFB)) && + (((char *)pPriv->pPixmap->devPrivate.ptr < ((char *)rhdPtr->FbBase + rhdPtr->FbScanoutStart)) || + ((char *)pPriv->pPixmap->devPrivate.ptr >= ((char *)rhdPtr->FbBase + rhdPtr->FbMapSize)))) { + /* If the pixmap wasn't in framebuffer, then we have no way to + * force it there. So, we simply refuse to draw and fail. + */ + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: pixmap is not in Framebuffer!\n", __func__); + return BadAlloc; + } + + pPriv->pDraw = pDraw; + + if (rhdPtr->ChipSet >= RHD_R600) + pPriv->BufferPitch = ALIGN(2 * width, 256); + else + pPriv->BufferPitch = ALIGN(2 * width, 64); + + /* + * Now, find out whether we have enough memory available. + */ + switch (rhdPtr->AccelMethod) { +#ifdef USE_EXA + case RHD_ACCEL_EXA: + rhdXvAllocateEXA(pScrn, pPriv, 2 * pPriv->BufferPitch * height); + break; +#endif /* USE_EXA */ + case RHD_ACCEL_XAA: + rhdXvAllocateXAA(pScrn, pPriv, 2 * pPriv->BufferPitch * height); + break; + default: + pPriv->BufferHandle = NULL; + pPriv->BufferOffset = 0; + break; + } + + if (!pPriv->BufferHandle) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "%s: Failed to allocate framebuffer memory.\n", __func__); + return BadAlloc; + } + + if (rhdPtr->ChipSet >= RHD_R600) + pPriv->BufferOffset = (pPriv->BufferOffset + 255) & ~255; + + /* + * Now copy the buffer to the framebuffer, and convert to planar when necessary. + */ + if (rhdPtr->ChipSet >= RHD_R600) + FBBuf = (CARD8 *)rhdPtr->FbBase + rhdPtr->FbScanoutStart + pPriv->BufferOffset; + else + FBBuf = (CARD8 *)rhdPtr->FbBase + pPriv->BufferOffset; + + switch(id) { + case FOURCC_YV12: + case FOURCC_I420: + { + int srcPitch = (width + 3) & ~3; + int srcPitch2 = ((width >> 1) + 3) & ~3; + int s2offset = srcPitch * height; + int s3offset = s2offset + srcPitch2 * (height >> 1); + + if (id == FOURCC_YV12) { + if (rhdPtr->ChipSet >= RHD_R600) { + pPriv->BufferPitch = ALIGN(width, 256); + if (rhdPtr->cardType != RHD_CARD_AGP) + R600CopyPlanarHW(pScrn, buf, buf + s3offset, buf + s2offset, + pPriv->BufferOffset + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart, + srcPitch, srcPitch2, pPriv->BufferPitch, + width, height); + else + R600CopyPlanarSW(pScrn, buf, buf + s3offset, buf + s2offset, + FBBuf, + srcPitch, srcPitch2, pPriv->BufferPitch, + width, height); + } else if (rhdPtr->CS->Type == RHD_CS_CPDMA) + R5xxXvCopyPlanarDMA(rhdPtr, buf, buf + s2offset, + buf + s3offset, FBBuf, srcPitch, + srcPitch2, pPriv->BufferPitch, + height, width); + else + R5xxXvCopyPlanar(rhdPtr, buf, buf + s2offset, + buf + s3offset, FBBuf, srcPitch, + srcPitch2, pPriv->BufferPitch, + height, width); + } else { + if (rhdPtr->ChipSet >= RHD_R600) { + if (rhdPtr->cardType != RHD_CARD_AGP) + R600CopyPlanarHW(pScrn, buf, buf + s2offset, buf + s3offset, + pPriv->BufferOffset + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart, + srcPitch, srcPitch2, pPriv->BufferPitch, + width, height); + else + R600CopyPlanarSW(pScrn, buf, buf + s2offset, buf + s3offset, + FBBuf, + srcPitch, srcPitch2, pPriv->BufferPitch, + width, height); + } else if (rhdPtr->CS->Type == RHD_CS_CPDMA) + R5xxXvCopyPlanarDMA(rhdPtr, buf, buf + s3offset, + buf + s2offset, FBBuf, srcPitch, + srcPitch2, pPriv->BufferPitch, + height, width); + else + R5xxXvCopyPlanar(rhdPtr, buf, buf + s3offset, + buf + s2offset, FBBuf, srcPitch, + srcPitch2, pPriv->BufferPitch, + height, width); + } + } + break; + case FOURCC_UYVY: + case FOURCC_YUY2: + default: + if (rhdPtr->ChipSet >= RHD_R600) { + pPriv->BufferPitch = ALIGN(2 * width, 256); + if (rhdPtr->cardType != RHD_CARD_AGP) + R600CopyPackedHW(pScrn, buf, pPriv->BufferOffset + rhdPtr->FbIntAddress + rhdPtr->FbScanoutStart, + 2 * width, pPriv->BufferPitch, + width, height); + else + R600CopyPackedSW(pScrn, buf, FBBuf, + 2 * width, pPriv->BufferPitch, + width, height); + } else if (rhdPtr->CS->Type == RHD_CS_CPDMA) + R5xxXvCopyPackedDMA(rhdPtr, buf, FBBuf, 2 * width, + pPriv->BufferPitch, height); + else + R5xxXvCopyPacked(rhdPtr, buf, FBBuf, 2 * width, + pPriv->BufferPitch, height); + break; + } + + /* + * Update cliplist + */ + if (!REGION_EQUAL(pScrn->pScreen, &pPriv->clip, clipBoxes)) + REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes); + + /* + * Now let the 3D engine work its magic. + */ + pPriv->id = id; + pPriv->src_w = src_w; + pPriv->src_h = src_h; + pPriv->drw_x = drw_x; + pPriv->drw_y = drw_y; + pPriv->dst_w = drw_w; + pPriv->dst_h = drw_h; + pPriv->w = width; + pPriv->h = height; + + if (rhdPtr->ChipSet >= RHD_R600) + R600DisplayTexturedVideo(pScrn, pPriv); + else + RHDRADEONDisplayTexturedVideo(pScrn, pPriv); + + return Success; +} + +/* + * RS690, RS600, RS740 all have a maximum texture size of 2048x2048. + * R500s quadruple this to 4096x4096. + */ +static XF86VideoEncodingRec DummyEncodingRS600[1] = +{ + { 0, "XV_IMAGE", 2048, 2048, {1, 1}} +}; + +static XF86VideoEncodingRec DummyEncodingR500[1] = +{ + { 0, "XV_IMAGE", 4096, 4096, {1, 1}} +}; + +static XF86VideoEncodingRec DummyEncodingR600[1] = +{ + { 0, "XV_IMAGE", 8192, 8192, {1, 1}} +}; + +#define NUM_FORMATS 3 + +static XF86VideoFormatRec Formats[NUM_FORMATS] = +{ + {15, TrueColor}, {16, TrueColor}, {24, TrueColor} +}; + +#define NUM_IMAGES 4 + +static XF86ImageRec Images[NUM_IMAGES] = +{ + XVIMAGE_YUY2, + XVIMAGE_YV12, + XVIMAGE_I420, + XVIMAGE_UYVY +}; + +#define NUM_ATTRIBUTES 1 + +static XF86AttributeRec Attributes[NUM_ATTRIBUTES+1] = +{ + {XvSettable | XvGettable, 0, RHD_XV_NUM_COLOR_SPACE-1, "XV_COLORSPACE"}, + { 0, 0, 0, NULL} /* place holder */ +}; + +/* + * + */ +static XF86VideoAdaptorPtr +rhdSetupImageTexturedVideo(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + struct RHDPortPriv *pPortPriv; + XF86VideoAdaptorPtr adapt; + int i; + int num_texture_ports = 16; + + RHDFUNC(pScrn); + + /* Create attribute atoms */ + xvColorSpace = MakeAtom("XV_COLORSPACE", 13, TRUE); + + adapt = xnfcalloc(1, sizeof(XF86VideoAdaptorRec) + num_texture_ports * + (sizeof(struct RHDPortPriv) + sizeof(DevUnion))); + + adapt->type = XvWindowMask | XvInputMask | XvImageMask; + adapt->flags = 0; + adapt->name = "RadeonHD Textured Video"; + adapt->nEncodings = 1; + + if ((rhdPtr->ChipSet == RHD_RS690) || (rhdPtr->ChipSet == RHD_RS600) || + (rhdPtr->ChipSet == RHD_RS740)) + adapt->pEncodings = DummyEncodingRS600; + else if (rhdPtr->ChipSet >= RHD_R600) + adapt->pEncodings = DummyEncodingR600; + else + adapt->pEncodings = DummyEncodingR500; + + adapt->nFormats = NUM_FORMATS; + adapt->pFormats = Formats; + adapt->nPorts = num_texture_ports; + adapt->pPortPrivates = (DevUnion*)(&adapt[1]); + + pPortPriv = + (struct RHDPortPriv *)(&adapt->pPortPrivates[num_texture_ports]); + + /* Xv Attributes for r6xx/r7xx only for now */ + if (rhdPtr->ChipSet >= RHD_R600) { + adapt->nAttributes = NUM_ATTRIBUTES; + adapt->pAttributes = Attributes; + } else { + adapt->nAttributes = 0; + adapt->pAttributes = NULL; + } + adapt->pImages = Images; + adapt->nImages = NUM_IMAGES; + adapt->PutVideo = NULL; + adapt->PutStill = NULL; + adapt->GetVideo = NULL; + adapt->GetStill = NULL; + adapt->StopVideo = rhdStopVideo; + adapt->SetPortAttribute = rhdSetPortAttribute; + adapt->GetPortAttribute = rhdGetPortAttribute; + adapt->QueryBestSize = rhdQueryBestSize; + adapt->PutImage = rhdPutImageTextured; + adapt->ReputImage = NULL; + adapt->QueryImageAttributes = rhdQueryImageAttributes; + + for (i = 0; i < num_texture_ports; i++) { + struct RHDPortPriv *pPriv = &pPortPriv[i]; + + /* gotta uninit this someplace, XXX: shouldn't be necessary for textured */ + REGION_NULL(pScreen, &pPriv->clip); + + /* Set default attribute values */ + pPriv->color_space = RHD_XV_COLOR_SPACE_AUTODETECT; + + adapt->pPortPrivates[i].ptr = (pointer) (pPriv); + } + + return adapt; +} + +/* + * + */ +void +RHDInitVideo(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + RHDPtr rhdPtr = RHDPTR(pScrn); + XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL; + XF86VideoAdaptorPtr texturedAdaptor = NULL; + int num_adaptors; + + RHDFUNC(pScrn); + + num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors); + newAdaptors = xalloc((num_adaptors + 2) * sizeof(XF86VideoAdaptorPtr *)); + if (newAdaptors == NULL) + return; + + memcpy(newAdaptors, adaptors, num_adaptors * sizeof(XF86VideoAdaptorPtr)); + adaptors = newAdaptors; + + if (rhdPtr->TwoDPrivate && rhdPtr->CS && + ((rhdPtr->CS->Type == RHD_CS_CP) || + (rhdPtr->CS->Type == RHD_CS_CPDMA))) { + + texturedAdaptor = rhdSetupImageTexturedVideo(pScreen); + + adaptors[num_adaptors++] = texturedAdaptor; + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Xv: Textured Video initialised.\n"); + + /* EXA could've initialised this already */ + if (rhdPtr->ChipSet < RHD_R600) { + if (!rhdPtr->ThreeDPrivate) + R5xx3DInit(pScrn); + } + } else + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Xv: No Textured Video " + "possible without the Command Processor.\n"); + + if (num_adaptors) + xf86XVScreenInit(pScreen, adaptors, num_adaptors); + + if (newAdaptors) + xfree(newAdaptors); +} diff --git a/driver/xf86-video-radeonhd/src/rhd_video.h b/driver/xf86-video-radeonhd/src/rhd_video.h new file mode 100644 index 000000000..bc45dae7e --- /dev/null +++ b/driver/xf86-video-radeonhd/src/rhd_video.h @@ -0,0 +1,73 @@ +/* + * Copyright 2008 Luc Verhaegen + * Copyright 2008 Matthias Hopf + * Copyright 2008 Egbert Eich + * + * 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 (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 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. + */ + +#ifndef _RHD_VIDEO_H +#define _RHD_VIDEO_H + +/* seriously ?! @#$%% */ +# define uint32_t CARD32 +# define uint64_t CARD64 + +enum RHDXvColorSpace { + RHD_XV_COLOR_SPACE_AUTODETECT, + RHD_XV_COLOR_SPACE_REC601, + RHD_XV_COLOR_SPACE_REC709, + RHD_XV_NUM_COLOR_SPACE +}; + +/* Xvideo port struct */ +struct RHDPortPriv { + DrawablePtr pDraw; + PixmapPtr pPixmap; + + RegionRec clip; + + void *BufferHandle; + CARD32 BufferOffset; + CARD32 BufferPitch; + + int id; + int src_w; + int src_h; + int dst_w; + int dst_h; + int w; + int h; + int drw_x; + int drw_y; + + enum RHDXvColorSpace color_space; +}; + +extern void RHDRADEONDisplayTexturedVideo(ScrnInfoPtr pScrn, struct RHDPortPriv *pPriv); +extern void RHDInitVideo(ScreenPtr pScreen); +extern void R600DisplayTexturedVideo(ScrnInfoPtr pScrn, struct RHDPortPriv *pPriv); +extern Bool +R600CopyToVRAM(ScrnInfoPtr pScrn, + char *src, int src_pitch, + uint32_t dst_pitch, uint32_t dst_mc_addr, uint32_t dst_height, int bpp, + int x, int y, int w, int h); + +#endif /* _RHD_VIDEO_H */ diff --git a/driver/xf86-video-radeonhd/utils/conntest/Imakefile b/driver/xf86-video-radeonhd/utils/conntest/Imakefile new file mode 100644 index 000000000..36a59c243 --- /dev/null +++ b/driver/xf86-video-radeonhd/utils/conntest/Imakefile @@ -0,0 +1,21 @@ +#include +#include "../../RadeonHD.tmpl" + +SRCS_conntest = rhd_conntest.c git_version.h +OBJS_conntest = rhd_conntest.o +SRCS_dump = rhd_dump.c git_version.h +OBJS_dump = rhd_dump.o + +INCLUDES = -I$(TOP)/src/AtomBios/includes + +DEFINES = $(INCLUDES) \ + $(RHD_GIT_DEFINES) \ + $(RHD_VERSION_DEFINES) + +SYS_LIBS = -lpci -lz + +NormalProgramTarget(rhd_conntest,$(OBJS_conntest),,,$(SYS_LIBS)) +NormalProgramTarget(rhd_dump,$(OBJS_dump),,,$(SYS_LIBS)) +AllTarget(ProgramTargetName(rhd_conntest)) +AllTarget(ProgramTargetName(rhd_dump)) +DependTarget() diff --git a/driver/xf86-video-radeonhd/utils/conntest/Makefile.am b/driver/xf86-video-radeonhd/utils/conntest/Makefile.am new file mode 100644 index 000000000..48fafbedc --- /dev/null +++ b/driver/xf86-video-radeonhd/utils/conntest/Makefile.am @@ -0,0 +1,44 @@ +BUILT_SOURCES = +CLEANFILES = +include $(top_srcdir)/RadeonHD.am + +EXTRA_DIST = README Imakefile + +EXTRA_PROGRAMS = rhd_conntest rhd_dump + +if XSERVER_LIBPCIACCESS +noinst_PROGRAMS = rhd_conntest rhd_dump +endif + +if HAVE_PCI_PCI_H +if HAVE_ZLIB +noinst_PROGRAMS = rhd_conntest rhd_dump +endif +endif + +all-local: + @if test "x$(noinst_PROGRAMS)" = "x"; then \ + echo "WARNING: Cannot build the rhd_conntest program due to missing dependencies."; \ + echo " *IF* you want to build rhd_conntest, install development packages of"; \ + echo " both pciutils and zlib/libz and re-run the configure (or autogen) script."; \ + fi + +# Including config.h requires xorg-config.h, so we need the XORG_CFLAGS here +AM_CFLAGS = @XORG_CFLAGS@ @WARN_CFLAGS@ @PCIUTILS_CFLAGS@ +AM_CPPFLAGS = -I$(top_srcdir)/src/AtomBios/includes + +rhd_conntest_SOURCES = rhd_conntest.c +nodist_rhd_conntest_SOURCES = git_version.h +if XSERVER_LIBPCIACCESS +rhd_conntest_LDADD = @PCIACCESS_LIBS@ +else +rhd_conntest_LDADD = @PCIUTILS_LIBS@ +endif + +rhd_dump_SOURCES = rhd_dump.c +nodist_rhd_dump_SOURCES = git_version.h +if XSERVER_LIBPCIACCESS +rhd_dump_LDADD = @PCIACCESS_LIBS@ +else +rhd_dump_LDADD = @PCIUTILS_LIBS@ +endif diff --git a/driver/xf86-video-radeonhd/utils/conntest/Makefile.in b/driver/xf86-video-radeonhd/utils/conntest/Makefile.in new file mode 100644 index 000000000..04e1ca8e7 --- /dev/null +++ b/driver/xf86-video-radeonhd/utils/conntest/Makefile.in @@ -0,0 +1,568 @@ +# Makefile.in generated by automake 1.9.6 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +# Copyright (c) 2007 Hans Ulrich Niedermann +# +# This Makefile fragment is free software; the author(s) give(s) +# unlimited permission to copy, distribute and modify it. + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = ../.. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(top_srcdir)/RadeonHD.am +EXTRA_PROGRAMS = rhd_conntest$(EXEEXT) rhd_dump$(EXEEXT) +@HAVE_PCI_PCI_H_FALSE@@XSERVER_LIBPCIACCESS_TRUE@noinst_PROGRAMS = rhd_conntest$(EXEEXT) \ +@HAVE_PCI_PCI_H_FALSE@@XSERVER_LIBPCIACCESS_TRUE@ rhd_dump$(EXEEXT) +@HAVE_PCI_PCI_H_TRUE@@HAVE_ZLIB_TRUE@noinst_PROGRAMS = \ +@HAVE_PCI_PCI_H_TRUE@@HAVE_ZLIB_TRUE@ rhd_conntest$(EXEEXT) \ +@HAVE_PCI_PCI_H_TRUE@@HAVE_ZLIB_TRUE@ rhd_dump$(EXEEXT) +@HAVE_ZLIB_FALSE@@XSERVER_LIBPCIACCESS_TRUE@noinst_PROGRAMS = rhd_conntest$(EXEEXT) \ +@HAVE_ZLIB_FALSE@@XSERVER_LIBPCIACCESS_TRUE@ rhd_dump$(EXEEXT) +subdir = utils/conntest +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/acinclude.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(install_sh) -d +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +PROGRAMS = $(noinst_PROGRAMS) +am_rhd_conntest_OBJECTS = rhd_conntest.$(OBJEXT) +nodist_rhd_conntest_OBJECTS = +rhd_conntest_OBJECTS = $(am_rhd_conntest_OBJECTS) \ + $(nodist_rhd_conntest_OBJECTS) +rhd_conntest_DEPENDENCIES = +am_rhd_dump_OBJECTS = rhd_dump.$(OBJEXT) +nodist_rhd_dump_OBJECTS = +rhd_dump_OBJECTS = $(am_rhd_dump_OBJECTS) $(nodist_rhd_dump_OBJECTS) +rhd_dump_DEPENDENCIES = +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \ + $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ + $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(rhd_conntest_SOURCES) $(nodist_rhd_conntest_SOURCES) \ + $(rhd_dump_SOURCES) $(nodist_rhd_dump_SOURCES) +DIST_SOURCES = $(rhd_conntest_SOURCES) $(rhd_dump_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ADMIN_MAN_DIR = @ADMIN_MAN_DIR@ +ADMIN_MAN_SUFFIX = @ADMIN_MAN_SUFFIX@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AM_MAKEFLAGS = @AM_MAKEFLAGS@ +APP_MAN_DIR = @APP_MAN_DIR@ +APP_MAN_SUFFIX = @APP_MAN_SUFFIX@ +AR = @AR@ +ATOMBIOS_CFLAGS = @ATOMBIOS_CFLAGS@ +ATOM_BIOS_FALSE = @ATOM_BIOS_FALSE@ +ATOM_BIOS_PARSER_FALSE = @ATOM_BIOS_PARSER_FALSE@ +ATOM_BIOS_PARSER_TRUE = @ATOM_BIOS_PARSER_TRUE@ +ATOM_BIOS_TRUE = @ATOM_BIOS_TRUE@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXCPP = @CXXCPP@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +DRIVER_MAN_DIR = @DRIVER_MAN_DIR@ +DRIVER_MAN_SUFFIX = @DRIVER_MAN_SUFFIX@ +DRIVER_NAME = @DRIVER_NAME@ +DRI_CFLAGS = @DRI_CFLAGS@ +DRI_LIBS = @DRI_LIBS@ +DSYMUTIL = @DSYMUTIL@ +ECHO = @ECHO@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +F77 = @F77@ +FC = @FC@ +FFLAGS = @FFLAGS@ +FILE_MAN_DIR = @FILE_MAN_DIR@ +FILE_MAN_SUFFIX = @FILE_MAN_SUFFIX@ +GREP = @GREP@ +HAVE_PCI_PCI_H_FALSE = @HAVE_PCI_PCI_H_FALSE@ +HAVE_PCI_PCI_H_TRUE = @HAVE_PCI_PCI_H_TRUE@ +HAVE_SED_WITH_REASONABLE_SUBSTITUTION_FALSE = @HAVE_SED_WITH_REASONABLE_SUBSTITUTION_FALSE@ +HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE = @HAVE_SED_WITH_REASONABLE_SUBSTITUTION_TRUE@ +HAVE_XEXTPROTO_71_FALSE = @HAVE_XEXTPROTO_71_FALSE@ +HAVE_XEXTPROTO_71_TRUE = @HAVE_XEXTPROTO_71_TRUE@ +HAVE_XF86_ANSIC_H_FALSE = @HAVE_XF86_ANSIC_H_FALSE@ +HAVE_XF86_ANSIC_H_TRUE = @HAVE_XF86_ANSIC_H_TRUE@ +HAVE_ZLIB_FALSE = @HAVE_ZLIB_FALSE@ +HAVE_ZLIB_TRUE = @HAVE_ZLIB_TRUE@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LIBTOOL = @LIBTOOL@ +LIB_MAN_DIR = @LIB_MAN_DIR@ +LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@ +LN_S = @LN_S@ +LTLIBOBJS = @LTLIBOBJS@ +MAINT = @MAINT@ +MAINTAINER_MODE_FALSE = @MAINTAINER_MODE_FALSE@ +MAINTAINER_MODE_TRUE = @MAINTAINER_MODE_TRUE@ +MAKEFLAGS = @MAKEFLAGS@ +MAKEINFO = @MAKEINFO@ +MISC_MAN_DIR = @MISC_MAN_DIR@ +MISC_MAN_SUFFIX = @MISC_MAN_SUFFIX@ +NMEDIT = @NMEDIT@ +OBJC = @OBJC@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PCIACCESS_CFLAGS = @PCIACCESS_CFLAGS@ +PCIACCESS_LIBS = @PCIACCESS_LIBS@ +PCIUTILS_CFLAGS = @PCIUTILS_CFLAGS@ +PCIUTILS_LIBS = @PCIUTILS_LIBS@ +PEDANTIC_CFLAGS = @PEDANTIC_CFLAGS@ +PKG_CONFIG = @PKG_CONFIG@ +Q = @Q@ +RANDR_VERSION = @RANDR_VERSION@ +RANLIB = @RANLIB@ +SED = @SED@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +USE_DRI_FALSE = @USE_DRI_FALSE@ +USE_DRI_TRUE = @USE_DRI_TRUE@ +USE_EXA_FALSE = @USE_EXA_FALSE@ +USE_EXA_TRUE = @USE_EXA_TRUE@ +V = @V@ +VERSION = @VERSION@ +WARN_CFLAGS = @WARN_CFLAGS@ +XEXT_CFLAGS = @XEXT_CFLAGS@ +XEXT_LIBS = @XEXT_LIBS@ +XORG_CFLAGS = @XORG_CFLAGS@ +XORG_LIBS = @XORG_LIBS@ +XSERVER_LIBPCIACCESS_FALSE = @XSERVER_LIBPCIACCESS_FALSE@ +XSERVER_LIBPCIACCESS_TRUE = @XSERVER_LIBPCIACCESS_TRUE@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_F77 = @ac_ct_F77@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +moduledir = @moduledir@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +shavedir = @shavedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ + +# The stamp file which is never created ensures that git_version.h is updated +# before every build. Having git_version.h in foo_SOURCES ensures a recompile +# of foo-bar.c if it is newer than the foo-bar.o file. Using noinst_foo_SOURCES +# instead of foo_SOURCES prevents shipping git_version.h in dist tarballs, +# which may cause false GIT_FOO readings. +BUILT_SOURCES = git_version.stamp +CLEANFILES = git_version.h +GIT_VERSION_CMD = $(SHELL) $(top_srcdir)/git_version.sh +EXTRA_DIST = README Imakefile + +# Including config.h requires xorg-config.h, so we need the XORG_CFLAGS here +AM_CFLAGS = @XORG_CFLAGS@ @WARN_CFLAGS@ @PCIUTILS_CFLAGS@ +AM_CPPFLAGS = -I$(top_srcdir)/src/AtomBios/includes +rhd_conntest_SOURCES = rhd_conntest.c +nodist_rhd_conntest_SOURCES = git_version.h +@XSERVER_LIBPCIACCESS_FALSE@rhd_conntest_LDADD = @PCIUTILS_LIBS@ +@XSERVER_LIBPCIACCESS_TRUE@rhd_conntest_LDADD = @PCIACCESS_LIBS@ +rhd_dump_SOURCES = rhd_dump.c +nodist_rhd_dump_SOURCES = git_version.h +@XSERVER_LIBPCIACCESS_FALSE@rhd_dump_LDADD = @PCIUTILS_LIBS@ +@XSERVER_LIBPCIACCESS_TRUE@rhd_dump_LDADD = @PCIACCESS_LIBS@ +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/RadeonHD.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu utils/conntest/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu utils/conntest/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +clean-noinstPROGRAMS: + @list='$(noinst_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +rhd_conntest$(EXEEXT): $(rhd_conntest_OBJECTS) $(rhd_conntest_DEPENDENCIES) + @rm -f rhd_conntest$(EXEEXT) + $(LINK) $(rhd_conntest_LDFLAGS) $(rhd_conntest_OBJECTS) $(rhd_conntest_LDADD) $(LIBS) +rhd_dump$(EXEEXT): $(rhd_dump_OBJECTS) $(rhd_dump_DEPENDENCIES) + @rm -f rhd_dump$(EXEEXT) + $(LINK) $(rhd_dump_LDFLAGS) $(rhd_dump_OBJECTS) $(rhd_dump_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rhd_conntest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rhd_dump.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.c.lo: +@am__fastdepCC_TRUE@ if $(LTCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/../.. + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-hook +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) all-local +installdirs: +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \ + clean-generic clean-libtool clean-noinstPROGRAMS ctags \ + dist-hook distclean distclean-compile distclean-generic \ + distclean-libtool distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am + +git_version.stamp: + @if test -f "$(srcdir)/git_version.h"; then \ + if test -f "git_version.h"; then :; \ + else \ + cp "$(srcdir)/git_version.h" "git_version.h"; \ + fi; \ + fi + $(GIT_VERSION_CMD) -k -s $(top_srcdir) -o git_version.h + @if test -s "$(srcdir)/git_version.h"; then \ + if cmp "$(srcdir)/git_version.h" "git_version.h"; then :; \ + else \ + echo "Error: $(srcdir)/git_version.h and git_version.h differ."; \ + echo " You probably want to remove the former."; \ + exit 1; \ + fi; \ + fi + +dist-hook: git_version.stamp + if test -f "git_version.h"; then \ + $(SED) -e 's|^#undef GIT_IS_DIST.*|#define GIT_IS_DIST 1|' \ + "git_version.h" > "$(distdir)/git_version.h"; \ + fi + +all-local: + @if test "x$(noinst_PROGRAMS)" = "x"; then \ + echo "WARNING: Cannot build the rhd_conntest program due to missing dependencies."; \ + echo " *IF* you want to build rhd_conntest, install development packages of"; \ + echo " both pciutils and zlib/libz and re-run the configure (or autogen) script."; \ + fi +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/driver/xf86-video-radeonhd/utils/conntest/README b/driver/xf86-video-radeonhd/utils/conntest/README new file mode 100644 index 000000000..3b42a8fd5 --- /dev/null +++ b/driver/xf86-video-radeonhd/utils/conntest/README @@ -0,0 +1,131 @@ +********************* +* radeonhd conntest * +********************* + +A helper utility to test the status of the connectors of the AMD GPG +Radeon R5xx and R6xx graphics devices. + +Build: +------ + + * Make sure the pciutils development files and zlib are installed. + * Descend into xf86-video-radeonhd/utils/conntest/ + * Run "make". + +Usage: +------ + +As root run: +./rhd_conntest [-d] [-s] [-x num] + + is in the form :., the most common position +is 1:0.0. lspci happily provides you with this information. + +The optional option -s will scan the known I2C for additional slaves (besides +the DDC slave on 0xA0). Depending on your hardware this may take long. + +The optional argument -x will dump bytes of data from the +available DDC slaves. must not be higher than 256. + +To dump the content of the VBIOS run: +./rhd_conntest -d +This will dump the VBIOS to the file: + ...vga.rom +to the current directory. Should the id information be unavailable the VBIOS +will be dumped to the file 'posted.vga.rom'. + +DO NOT try to run rhd_conntest on the secondary PCI function. (1:0.1 in our +example). For R5xx this is just a fake device to fool some Microsoft operating +systems, and is of no use to us. For R6xx this is a HDMI sound device, and is +of no use for a video driver. + +Background information: +----------------------- + +R5xx and R6xx standalone cards usually have either 1 VGA and 1 DVI-I or 2 +DVI-I connectors. Since we are not handling TV encoders yet in our driver, any +s-video or composite connector is still ignored at this point. Laptops with +R5xx or R6xx style hardware usually come with one panel and one VGA or DVI-I +connector. + +These connectors share many things in them. + +In case of a DVI-I, they connect up to two outputs: A TMDS encoder (DVI) and a +DAC (analog VGA/CRT); with a DDC bus (Display Data Channel) and a HPD pin (Hot +Plug Detect). + +For a VGA connector, this is only a single DAC and a DDC bus. + +For a Panel, this is using the LVDS encoder and possibly a DDC bus. + +Currently up to 4 outputs are possible: DACA, DACB, TMDSA and LVTMA. DACA and +DACB are fully load detect capable, and our utility is able to do this for +you. TMDSA is also able to do load detection. LVTMA is a shared LVDS/TMDS +encoder. Sadly this lacks load detection and will not detect whether a DVI +cable is attached. If LVDS is initialised by the BIOS, then this utility will +gdump further information as well. + +When looking at the component side of the graphics card, the PCI-E/AGP/PCI +should be seen as down, the connectors will be on the left hand side now. +As a convention, we treat the connector that is now towards the top of the +card as the first to go into our connector list. Please adhere to this +convention, or you and your fellow users will at one point be led into +confusion. + +If there is anything unclear here, please contact the developers. + +Procedure for standalone graphics cards: +---------------------------------------- + +Please read carefully through the background information section first, it +introduces important concepts and notions needed to successfully add connector +support for your card. + +Create a small text file. Each step, mention which cable was connected where. + +Go over each connector separately, and connect the analogue (VGA) cable once +and connect the DVI cable once (when possible). Each time running rhd_conntest +and saving the data rhd_conntest spews out. + +Make sure that only one cable is attached at each time. + +The resulting file, plus further information about the make and model of your +board will hopefully provide all the information the developers of the +radeonhd driver need. + +Procedure for laptops: +---------------------- + +Please read carefully through the background information section first, it +introduces important concepts and notions needed to successfully add connector +support for your card. + +Create a small text file. Each step, mention which cable was connected where. + +First, run rhd_conntest without an external monitor attached. This will show +us if or whether a DDC bus is attached to the internal panel. Save the data. + +Then attach a monitor through the analogue (VGA) connection, use the adaptor +plug when needed. Run rhd_conntest and save the data. + +When available, attach a monitor through its DVI connection. Run rhd_conntest +and save the data. + +The resulting file, plus further information about the make and model of your +laptop will hopefully provide all the information the developers of the +radeonhd driver need. + +Where to get help and send results: +----------------------------------- + +There is the mailing list: radeonhd@opensuse.org +You can subscribe to this list by sending a mail to: + radeonhd+subscribe@opensuse.org + +There is also an irc channel on freenode.net that's called #radeonhd. + +Authors: +-------- + +Luc Verhaegen (aka libv) and Egbert Eich (aka egbert), reusing code from their +driver. diff --git a/driver/xf86-video-radeonhd/utils/conntest/git_version.h b/driver/xf86-video-radeonhd/utils/conntest/git_version.h new file mode 100644 index 000000000..361b633bd --- /dev/null +++ b/driver/xf86-video-radeonhd/utils/conntest/git_version.h @@ -0,0 +1,68 @@ +/* + * Basic versioning gathered from the git repository. + * Automatically generated by ../../../git_version.sh. + */ + +#ifndef GIT_VERSION_H +#define GIT_VERSION_H 1 + +/* whether this is a dist tarball or not */ +#define GIT_IS_DIST 1 + +/* No errors occured while running git */ +#undef GIT_ERRORS + +/* git utilities found */ +#undef GIT_NOT_FOUND +#define GIT_VERSION "git version 1.6.0.2" + +/* git repo found */ +#define GIT_REPO 1 + +/* Git SHA ID of last commit */ +#define GIT_SHAID "8cbff7bf" + +/* Branch this tree is on */ +#define GIT_BRANCH "master" + +/* SHA-ID uniquely defines the state of this code */ +#undef GIT_DIRTY + +/* Define GIT_MESSAGE such that + * printf("%s: built from %s", argv[0], GIT_MESSAGE); + * forms a proper sentence. + */ + +#ifdef GIT_DIRTY +# define GIT_DIRTY_MSG " + changes" +#else /* !GIT_DIRTY */ +# define GIT_DIRTY_MSG "" +#endif /* GIT_DIRTY */ + +#ifdef GIT_ERRORS +# define GIT_ERROR_MSG " with error: " GIT_ERRORS +#else /* !GIT_ERRORS */ +# define GIT_ERROR_MSG "" +#endif /* GIT_ERRORS */ + +#ifdef GIT_IS_DIST +# define GIT_DIST_MSG "dist of " +#else /* !GIT_IS_DIST */ +# define GIT_DIST_MSG "" +#endif /* GIT_IS_DIST */ + +#ifdef GIT_REPO +# ifdef GIT_NOT_FOUND +# define GIT_MESSAGE GIT_DIST_MSG "git sources without git: " GIT_NOT_FOUND +# else /* !GIT_NOT_FOUND */ +# define GIT_MESSAGE \ + GIT_DIST_MSG \ + "git branch " GIT_BRANCH ", " \ + "commit " GIT_SHAID GIT_DIRTY_MSG \ + GIT_ERROR_MSG +# endif /* GIT_NOT_FOUND */ +#else /* !GIT_REPO */ +# define GIT_MESSAGE GIT_DIST_MSG "non-git sources" GIT_ERROR_MSG +#endif /* GIT_REPO */ + +#endif /* GIT_VERSION_H */ diff --git a/driver/xf86-video-radeonhd/utils/conntest/rhd_conntest.c b/driver/xf86-video-radeonhd/utils/conntest/rhd_conntest.c new file mode 100644 index 000000000..f1db55291 --- /dev/null +++ b/driver/xf86-video-radeonhd/utils/conntest/rhd_conntest.c @@ -0,0 +1,3089 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 tool is here to help create a connector mapping table. + * + */ +/* #define DEBUG */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif +#include "git_version.h" + +#ifdef XSERVER_LIBPCIACCESS +#include +#else +#include +#endif + +#ifndef ULONG +typedef unsigned int ULONG; +# define ULONG ULONG +#endif +#ifndef UCHAR +typedef unsigned char UCHAR; +# define UCHAR UCHAR +#endif +#ifndef USHORT +typedef unsigned short USHORT; +# define USHORT USHORT +#endif + +#include "atombios.h" + +typedef int Bool; +#define FALSE 0 +#define TRUE 1 +typedef unsigned char CARD8; +typedef unsigned short CARD16; +typedef unsigned int CARD32; + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define SHORT(x) (x) +#else +#define SHORT(x) (((x & 0xff) << 8) | ((x & 0xff) >> 8)) +#endif + +#define VBIOS_BASE 0xC0000 +#define VBIOS_MAXSIZE 0x10000 +#define DEV_MEM "/dev/mem" +#define TARGET_HW_I2C_CLOCK 25 /* kHz */ + +/* Some register names */ +enum { + /* Needed for enable PCI ROM read */ + BUS_CNTL = 0x4C, /* (RW) */ + GPIOPAD_MASK = 0x198, /* (RW) */ + GPIOPAD_A = 0x19C, /* (RW) */ + GPIOPAD_EN = 0x1A0, /* (RW) */ + VIPH_CONTROL = 0xC40, /* (RW) */ + SEPROM_CNTL1 = 0x1C0, /* (RW) */ + + ROM_CNTL = 0x1600, + GENERAL_PWRMGT = 0x0618, + LOW_VID_LOWER_GPIO_CNTL = 0x0724, + MEDIUM_VID_LOWER_GPIO_CNTL = 0x0720, + HIGH_VID_LOWER_GPIO_CNTL = 0x071C, + CTXSW_VID_LOWER_GPIO_CNTL = 0x0718, + LOWER_GPIO_ENABLE = 0x0710, + + VGA_RENDER_CONTROL = 0x0300, + D1VGA_CONTROL = 0x0330, + D2VGA_CONTROL = 0x0338, + + /* DAC A */ + DACA_ENABLE = 0x7800, + DACA_SOURCE_SELECT = 0x7804, + DACA_AUTODETECT_CONTROL = 0x7828, + DACA_AUTODETECT_INT_CONTROL = 0x7838, + DACA_FORCE_OUTPUT_CNTL = 0x783C, + DACA_FORCE_DATA = 0x7840, + DACA_POWERDOWN = 0x7850, + DACA_CONTROL1 = 0x7854, + DACA_CONTROL2 = 0x7858, + DACA_COMPARATOR_ENABLE = 0x785C, + DACA_COMPARATOR_OUTPUT = 0x7860, + + RV620_DACA_ENABLE = 0x7000, + RV620_DACA_SOURCE_SELECT = 0x7004, + RV620_DACA_AUTODETECT_CONTROL = 0x7028, + RV620_DACA_AUTODETECT_STATUS = 0x7034, + RV620_DACA_AUTODETECT_INT_CONTROL = 0x7038, + RV620_DACA_FORCE_OUTPUT_CNTL = 0x703C, + RV620_DACA_FORCE_DATA = 0x7040, + RV620_DACA_POWERDOWN = 0x7050, + /* RV620_DACB_CONTROL1 moved */ + RV620_DACA_CONTROL2 = 0x7058, + RV620_DACA_COMPARATOR_ENABLE = 0x705C, + + RV620_DACA_CONTROL1 = 0x7ef4, + + /* DAC B */ + DACB_ENABLE = 0x7A00, + DACB_SOURCE_SELECT = 0x7A04, + DACB_AUTODETECT_CONTROL = 0x7A28, + DACB_AUTODETECT_INT_CONTROL = 0x7A38, + DACB_FORCE_OUTPUT_CNTL = 0x7A3C, + DACB_FORCE_DATA = 0x7A40, + DACB_POWERDOWN = 0x7A50, + DACB_CONTROL1 = 0x7A54, + DACB_CONTROL2 = 0x7A58, + DACB_COMPARATOR_ENABLE = 0x7A5C, + DACB_COMPARATOR_OUTPUT = 0x7A60, + + RV620_DACB_ENABLE = 0x7100, + RV620_DACB_SOURCE_SELECT = 0x7104, + RV620_DACB_AUTODETECT_CONTROL = 0x7128, + RV620_DACB_AUTODETECT_STATUS = 0x7034, + RV620_DACB_FORCE_OUTPUT_CNTL = 0x713C, + RV620_DACB_FORCE_DATA = 0x7140, + RV620_DACB_POWERDOWN = 0x7150, + /* RV620_DACB_CONTROL1 moved */ + RV620_DACB_CONTROL2 = 0x7158, + RV620_DACB_COMPARATOR_ENABLE = 0x715C, + + RV620_DACB_CONTROL1 = 0x7ff4, + + /* DAC common */ + RV620_DAC_COMPARATOR_MISC = 0x7da4, + RV620_DAC_COMPARATOR_OUTPUT = 0x7da8, + + /* TMDSA */ + TMDSA_CNTL = 0x7880, + TMDSA_SOURCE_SELECT = 0x7884, + TMDSA_COLOR_FORMAT = 0x7888, + TMDSA_FORCE_OUTPUT_CNTL = 0x788C, + TMDSA_BIT_DEPTH_CONTROL = 0x7894, + TMDSA_DCBALANCER_CONTROL = 0x78D0, + TMDSA_DATA_SYNCHRONIZATION_R500 = 0x78D8, + TMDSA_DATA_SYNCHRONIZATION_R600 = 0x78DC, + TMDSA_TRANSMITTER_ENABLE = 0x7904, + TMDSA_LOAD_DETECT = 0x7908, + TMDSA_MACRO_CONTROL = 0x790C, /* r5x0 and r600: 3 for pll and 1 for TX */ + TMDSA_PLL_ADJUST = 0x790C, /* rv6x0: pll only */ + TMDSA_TRANSMITTER_CONTROL = 0x7910, + TMDSA_TRANSMITTER_ADJUST = 0x7920, /* rv6x0: TX part of macro control */ + + /* LVTMA */ + LVTMA_CNTL = 0x7A80, + LVTMA_SOURCE_SELECT = 0x7A84, + LVTMA_BIT_DEPTH_CONTROL = 0x7A94, + LVTMA_DATA_SYNCHRONIZATION = 0x7AD8, + LVTMA_PWRSEQ_REF_DIV = 0x7AE4, + LVTMA_PWRSEQ_DELAY1 = 0x7AE8, + LVTMA_PWRSEQ_DELAY2 = 0x7AEC, + LVTMA_PWRSEQ_CNTL = 0x7AF0, + LVTMA_PWRSEQ_STATE = 0x7AF4, + LVTMA_LVDS_DATA_CNTL = 0x7AFC, + LVTMA_MODE = 0x7B00, + LVTMA_TRANSMITTER_ENABLE = 0x7B04, + LVTMA_MACRO_CONTROL = 0x7B0C, + LVTMA_TRANSMITTER_CONTROL = 0x7B10, + + /* I2C */ + /* R5XX */ + R5_DC_I2C_STATUS1 = 0x7D30, + R5_DC_I2C_RESET = 0x7D34, + R5_DC_I2C_CONTROL1 = 0x7D38, + R5_DC_I2C_CONTROL2 = 0x7D3C, + R5_DC_I2C_CONTROL3 = 0x7D40, + R5_DC_I2C_DATA = 0x7D44, + R5_DC_I2C_INTERRUPT_CONTROL = 0x7D48, + R5_DC_I2C_ARBITRATION = 0x7D50, + + /* R6XX */ + R6_DC_I2C_CONTROL = 0x7D30, /* (RW) */ + R6_DC_I2C_ARBITRATION = 0x7D34, /* (RW) */ + R6_DC_I2C_INTERRUPT_CONTROL = 0x7D38, /* (RW) */ + R6_DC_I2C_SW_STATUS = 0x7d3c, /* (RW) */ + R6_DC_I2C_DDC1_SPEED = 0x7D4C, /* (RW) */ + R6_DC_I2C_DDC1_SETUP = 0x7D50, /* (RW) */ + R6_DC_I2C_DDC2_SPEED = 0x7D54, /* (RW) */ + R6_DC_I2C_DDC2_SETUP = 0x7D58, /* (RW) */ + R6_DC_I2C_DDC3_SPEED = 0x7D5C, /* (RW) */ + R6_DC_I2C_DDC3_SETUP = 0x7D60, /* (RW) */ + R6_DC_I2C_TRANSACTION0 = 0x7D64, /* (RW) */ + R6_DC_I2C_TRANSACTION1 = 0x7D68, /* (RW) */ + R6_DC_I2C_DATA = 0x7D74, /* (RW) */ + R6_DC_I2C_DDC4_SPEED = 0x7DB4, /* (RW) */ + R6_DC_I2C_DDC4_SETUP = 0x7DBC, /* (RW) */ + + DC_GPIO_DDC4_MASK = 0x7E00, /* (RW) */ + DC_GPIO_DDC4_A = 0x7E04, /* (RW) */ + DC_GPIO_DDC4_EN = 0x7E08, /* (RW) */ + DC_GPIO_DDC1_MASK = 0x7E40, /* (RW) */ + DC_GPIO_DDC1_A = 0x7E44, /* (RW) */ + DC_GPIO_DDC1_EN = 0x7E48, /* (RW) */ + DC_GPIO_DDC1_Y = 0x7E4C, /* (RW) */ + DC_GPIO_DDC2_MASK = 0x7E50, /* (RW) */ + DC_GPIO_DDC2_A = 0x7E54, /* (RW) */ + DC_GPIO_DDC2_EN = 0x7E58, /* (RW) */ + DC_GPIO_DDC2_Y = 0x7E5C, /* (RW) */ + DC_GPIO_DDC3_MASK = 0x7E60, /* (RW) */ + DC_GPIO_DDC3_A = 0x7E64, /* (RW) */ + DC_GPIO_DDC3_EN = 0x7E68, /* (RW) */ + DC_GPIO_DDC3_Y = 0x7E6C, /* (RW) */ + + /* RS69x I2C */ + RS69_DC_I2C_CONTROL = 0x7D30, /* (RW) */ + RS69_DC_I2C_UNKNOWN_2 = 0x7D34, /* (RW) */ + RS69_DC_I2C_INTERRUPT_CONTROL = 0x7D38, /* (RW) */ + RS69_DC_I2C_SW_STATUS = 0x7d3c, /* (RW) */ + RS69_DC_I2C_UNKNOWN_1 = 0x7d40, + RS69_DC_I2C_DDC_SETUP_Q = 0x7D44, /* (RW) */ + RS69_DC_I2C_DATA = 0x7D58, /* (RW) */ + RS69_DC_I2C_TRANSACTION0 = 0x7D48, /* (RW) */ + RS69_DC_I2C_TRANSACTION1 = 0x7D4C, /* (RW) */ + + /* RV62x I2C */ + RV62_GENERIC_I2C_CONTROL = 0x7d80, /* (RW) */ + RV62_GENERIC_I2C_INTERRUPT_CONTROL = 0x7d84, /* (RW) */ + RV62_GENERIC_I2C_STATUS = 0x7d88, /* (RW) */ + RV62_GENERIC_I2C_SPEED = 0x7d8c, /* (RW) */ + RV62_GENERIC_I2C_SETUP = 0x7d90, /* (RW) */ + RV62_GENERIC_I2C_TRANSACTION = 0x7d94, /* (RW) */ + RV62_GENERIC_I2C_DATA = 0x7d98, /* (RW) */ + RV62_GENERIC_I2C_PIN_SELECTION = 0x7d9c, /* (RW) */ + RV62_DC_GPIO_DDC4_MASK = 0x7e20, /* (RW) */ + RV62_DC_GPIO_DDC1_MASK = 0x7e40, /* (RW) */ + RV62_DC_GPIO_DDC2_MASK = 0x7e50, /* (RW) */ + RV62_DC_GPIO_DDC3_MASK = 0x7e60, /* (RW) */ + + /* HPD */ + DC_GPIO_HPD_Y = 0x7E9C +}; + +typedef enum _chipType { + RHD_R500 = 1, + RHD_RS690, + RHD_R600, + RHD_RV620 +} chipType; + +typedef enum dacOutput { + DAC_NONE, + DAC_VGA, + DAC_SVIDEO, + DAC_COMPOSITE, + DAC_COMPONENT +} dacOutput; + +/* Some defines needed for getting access to unposted BIOS */ + +#define SCK_PRESCALE (0xff << 24) +#define VIPH_EN (1 << 21) +#define BIOS_ROM_DIS (1 << 2) +#define D1VGA_MODE_ENABLE (1 << 0) +#define D1VGA_TIMING_SELECT (1 << 8) +#define D2VGA_MODE_ENABLE (1 << 0) +#define D2VGA_TIMING_SELECT (1 << 8) +#define VGA_VSTATUS_CNTL (0x3 << 16) +#define SCK_OVERWRITE (1 << 1) +#define SCK_PRESCALE_CRYSTAL_CLK_SHIFT 28 +#define OPEN_DRAIN_PADS (1 << 11) + + +/* for RHD_R500/R600/RS690/RV620 */ +chipType ChipType; + +typedef struct _tableVersion +{ + CARD8 crev; + CARD8 frev; +} tableVersion; + +typedef struct _atomDataTables +{ + union { + void *base; + ATOM_FIRMWARE_INFO *FirmwareInfo; + ATOM_FIRMWARE_INFO_V1_2 *FirmwareInfo_V_1_2; + ATOM_FIRMWARE_INFO_V1_3 *FirmwareInfo_V_1_3; + ATOM_FIRMWARE_INFO_V1_4 *FirmwareInfo_V_1_4; + } FirmwareInfo; + tableVersion FirmwareInfoVersion; + ATOM_GPIO_I2C_INFO *GPIO_I2C_Info; + tableVersion GPIO_I2C_InfoVersion; +} atomDataTables, *atomDataTablesPtr; + +atomDataTables AtomData; +unsigned char **command_table = NULL; +int num_command_table_entries = 0; +unsigned char * AtomBiosGetDataFromCodeTable(unsigned char **tablelist, int n, short *size); + + +/* + * Match pci ids against data and some callbacks + */ +struct RHDDevice { + CARD16 vendor; + CARD16 device; + int bar; + chipType type; +} rhdDevices[] = { + + { 0x1002, 0x7100, 2, RHD_R500}, + { 0x1002, 0x7101, 2, RHD_R500}, + { 0x1002, 0x7102, 2, RHD_R500}, + { 0x1002, 0x7103, 2, RHD_R500}, + { 0x1002, 0x7104, 2, RHD_R500}, + { 0x1002, 0x7105, 2, RHD_R500}, + { 0x1002, 0x7106, 2, RHD_R500}, + { 0x1002, 0x7108, 2, RHD_R500}, + { 0x1002, 0x7109, 2, RHD_R500}, + { 0x1002, 0x710A, 2, RHD_R500}, + { 0x1002, 0x710B, 2, RHD_R500}, + { 0x1002, 0x710C, 2, RHD_R500}, + { 0x1002, 0x710E, 2, RHD_R500}, + { 0x1002, 0x710F, 2, RHD_R500}, + { 0x1002, 0x7140, 2, RHD_R500}, + { 0x1002, 0x7141, 2, RHD_R500}, + { 0x1002, 0x7142, 2, RHD_R500}, + { 0x1002, 0x7143, 2, RHD_R500}, + { 0x1002, 0x7144, 2, RHD_R500}, + { 0x1002, 0x7145, 2, RHD_R500}, + { 0x1002, 0x7146, 2, RHD_R500}, + { 0x1002, 0x7147, 2, RHD_R500}, + { 0x1002, 0x7149, 2, RHD_R500}, + { 0x1002, 0x714A, 2, RHD_R500}, + { 0x1002, 0x714B, 2, RHD_R500}, + { 0x1002, 0x714C, 2, RHD_R500}, + { 0x1002, 0x714D, 2, RHD_R500}, + { 0x1002, 0x714E, 2, RHD_R500}, + { 0x1002, 0x714F, 2, RHD_R500}, + { 0x1002, 0x7151, 2, RHD_R500}, + { 0x1002, 0x7152, 2, RHD_R500}, + { 0x1002, 0x7153, 2, RHD_R500}, + { 0x1002, 0x715E, 2, RHD_R500}, + { 0x1002, 0x715F, 2, RHD_R500}, + { 0x1002, 0x7180, 2, RHD_R500}, + { 0x1002, 0x7181, 2, RHD_R500}, + { 0x1002, 0x7183, 2, RHD_R500}, + { 0x1002, 0x7186, 2, RHD_R500}, + { 0x1002, 0x7187, 2, RHD_R500}, + { 0x1002, 0x7188, 2, RHD_R500}, + { 0x1002, 0x718A, 2, RHD_R500}, + { 0x1002, 0x718B, 2, RHD_R500}, + { 0x1002, 0x718C, 2, RHD_R500}, + { 0x1002, 0x718D, 2, RHD_R500}, + { 0x1002, 0x718F, 2, RHD_R500}, + { 0x1002, 0x7193, 2, RHD_R500}, + { 0x1002, 0x7196, 2, RHD_R500}, + { 0x1002, 0x719B, 2, RHD_R500}, + { 0x1002, 0x719F, 2, RHD_R500}, + { 0x1002, 0x71C0, 2, RHD_R500}, + { 0x1002, 0x71C1, 2, RHD_R500}, + { 0x1002, 0x71C2, 2, RHD_R500}, + { 0x1002, 0x71C3, 2, RHD_R500}, + { 0x1002, 0x71C4, 2, RHD_R500}, + { 0x1002, 0x71C5, 2, RHD_R500}, + { 0x1002, 0x71C6, 2, RHD_R500}, + { 0x1002, 0x71C7, 2, RHD_R500}, + { 0x1002, 0x71CD, 2, RHD_R500}, + { 0x1002, 0x71CE, 2, RHD_R500}, + { 0x1002, 0x71D2, 2, RHD_R500}, + { 0x1002, 0x71D4, 2, RHD_R500}, + { 0x1002, 0x71D5, 2, RHD_R500}, + { 0x1002, 0x71D6, 2, RHD_R500}, + { 0x1002, 0x71DA, 2, RHD_R500}, + { 0x1002, 0x71DE, 2, RHD_R500}, + { 0x1002, 0x7200, 2, RHD_R500}, + { 0x1002, 0x7210, 2, RHD_R500}, + { 0x1002, 0x7211, 2, RHD_R500}, + { 0x1002, 0x7240, 2, RHD_R500}, + { 0x1002, 0x7243, 2, RHD_R500}, + { 0x1002, 0x7244, 2, RHD_R500}, + { 0x1002, 0x7245, 2, RHD_R500}, + { 0x1002, 0x7246, 2, RHD_R500}, + { 0x1002, 0x7247, 2, RHD_R500}, + { 0x1002, 0x7248, 2, RHD_R500}, + { 0x1002, 0x7249, 2, RHD_R500}, + { 0x1002, 0x724A, 2, RHD_R500}, + { 0x1002, 0x724B, 2, RHD_R500}, + { 0x1002, 0x724C, 2, RHD_R500}, + { 0x1002, 0x724D, 2, RHD_R500}, + { 0x1002, 0x724E, 2, RHD_R500}, + { 0x1002, 0x724F, 2, RHD_R500}, + { 0x1002, 0x7280, 2, RHD_R500}, + { 0x1002, 0x7281, 2, RHD_R500}, + { 0x1002, 0x7283, 2, RHD_R500}, + { 0x1002, 0x7284, 2, RHD_R500}, + { 0x1002, 0x7287, 2, RHD_R500}, + { 0x1002, 0x7288, 2, RHD_R500}, + { 0x1002, 0x7289, 2, RHD_R500}, + { 0x1002, 0x728B, 2, RHD_R500}, + { 0x1002, 0x728C, 2, RHD_R500}, + { 0x1002, 0x7290, 2, RHD_R500}, + { 0x1002, 0x7291, 2, RHD_R500}, + { 0x1002, 0x7293, 2, RHD_R500}, + { 0x1002, 0x7297, 2, RHD_R500}, + { 0x1002, 0x791E, 2, RHD_RS690}, + { 0x1002, 0x791F, 2, RHD_RS690}, + { 0x1002, 0x793F, 2, RHD_RS690}, + { 0x1002, 0x7941, 2, RHD_RS690}, + { 0x1002, 0x7942, 2, RHD_RS690}, + { 0x1002, 0x796C, 2, RHD_R500}, + { 0x1002, 0x796D, 2, RHD_R500}, + { 0x1002, 0x796E, 2, RHD_R500}, + { 0x1002, 0x796F, 2, RHD_R500}, + { 0x1002, 0x9400, 2, RHD_R600}, + { 0x1002, 0x9401, 2, RHD_R600}, + { 0x1002, 0x9402, 2, RHD_R600}, + { 0x1002, 0x9403, 2, RHD_R600}, + { 0x1002, 0x9405, 2, RHD_R600}, + { 0x1002, 0x940A, 2, RHD_R600}, + { 0x1002, 0x940B, 2, RHD_R600}, + { 0x1002, 0x940F, 2, RHD_R600}, + { 0x1002, 0x94C0, 2, RHD_R600}, + { 0x1002, 0x94C1, 2, RHD_R600}, + { 0x1002, 0x94C3, 2, RHD_R600}, + { 0x1002, 0x94C4, 2, RHD_R600}, + { 0x1002, 0x94C5, 2, RHD_R600}, + { 0x1002, 0x94C6, 2, RHD_R600}, + { 0x1002, 0x94C7, 2, RHD_R600}, + { 0x1002, 0x94C8, 2, RHD_R600}, + { 0x1002, 0x94C9, 2, RHD_R600}, + { 0x1002, 0x94CB, 2, RHD_R600}, + { 0x1002, 0x94CC, 2, RHD_R600}, + { 0x1002, 0x9500, 2, RHD_R600}, + { 0x1002, 0x9501, 2, RHD_R600}, + { 0x1002, 0x9505, 2, RHD_R600}, + { 0x1002, 0x9507, 2, RHD_R600}, + { 0x1002, 0x950F, 2, RHD_R600}, + { 0x1002, 0x9511, 2, RHD_R600}, + { 0x1002, 0x9580, 2, RHD_R600}, + { 0x1002, 0x9581, 2, RHD_R600}, + { 0x1002, 0x9583, 2, RHD_R600}, + { 0x1002, 0x9586, 2, RHD_R600}, + { 0x1002, 0x9587, 2, RHD_R600}, + { 0x1002, 0x9588, 2, RHD_R600}, + { 0x1002, 0x9589, 2, RHD_R600}, + { 0x1002, 0x958A, 2, RHD_R600}, + { 0x1002, 0x958B, 2, RHD_R600}, + { 0x1002, 0x958C, 2, RHD_R600}, + { 0x1002, 0x958D, 2, RHD_R600}, + { 0x1002, 0x958E, 2, RHD_R600}, + { 0x1002, 0x958F, 2, RHD_R600}, + { 0x1002, 0x9590, 2, RHD_RV620}, + { 0x1002, 0x9591, 2, RHD_RV620}, + { 0x1002, 0x9593, 2, RHD_RV620}, + { 0x1002, 0x9594, 2, RHD_RV620}, + { 0x1002, 0x9596, 2, RHD_RV620}, + { 0x1002, 0x9597, 2, RHD_RV620}, + { 0x1002, 0x9598, 2, RHD_RV620}, + { 0x1002, 0x9599, 2, RHD_RV620}, + { 0x1002, 0x959B, 2, RHD_RV620}, + { 0x1002, 0x95C0, 2, RHD_RV620}, + { 0x1002, 0x95C2, 2, RHD_RV620}, + { 0x1002, 0x95C4, 2, RHD_RV620}, + { 0x1002, 0x95C5, 2, RHD_RV620}, + { 0x1002, 0x95C7, 2, RHD_RV620}, + { 0x1002, 0x95CC, 2, RHD_RV620}, + { 0x1002, 0x95CD, 2, RHD_RV620}, + { 0x1002, 0x95CE, 2, RHD_RV620}, + { 0x1002, 0x95CF, 2, RHD_RV620}, + { 0x1002, 0x9610, 2, RHD_RV620}, + { 0x1002, 0x9611, 2, RHD_RV620}, + { 0x1002, 0x9612, 2, RHD_RV620}, + { 0x1002, 0x9613, 2, RHD_RV620}, + { 0x1002, 0x9614, 2, RHD_RV620}, + { 0x1002, 0x9440, 2, RHD_RV620}, + { 0x1002, 0x9441, 2, RHD_RV620}, + { 0x1002, 0x9442, 2, RHD_RV620}, + { 0x1002, 0x9444, 2, RHD_RV620}, + { 0x1002, 0x9446, 2, RHD_RV620}, + { 0x1002, 0x944E, 2, RHD_RV620}, + { 0x1002, 0x9456, 2, RHD_RV620}, + { 0x1002, 0x9590, 2, RHD_RV620}, + { 0x1002, 0x954F, 2, RHD_RV620}, + { 0, 0, 0, 0 } +}; + +/* + * + */ +#define LEN 16 +void +dprint(unsigned char *start, unsigned long size) +{ + unsigned int i; + unsigned int count = LEN; + char *c = (char *)start; + + while (size) { + char *d = c; + printf(" "); + + if (size < LEN) + count = size; + size -= count; + + for (i = 0; i 32) + && (((CARD8)(*c)) < 128)) ? + (unsigned char) (*(c)): '.'); + c++; + } + printf("\n"); + } + + printf("\n"); +} + +/* + * + */ +#ifndef XSERVER_LIBPCIACCESS +/* Only for libpci use */ +static struct pci_dev * +DeviceLocate(struct pci_dev *devices, int bus, int dev, int func) +{ + struct pci_dev *device; + + for (device = devices; device; device = device->next) + if ((device->bus == bus) && (device->dev == dev) && + (device->func == func)) + return device; + return NULL; +} +#endif + +/* + * + */ +static struct RHDDevice * +#ifdef XSERVER_LIBPCIACCESS +DeviceMatch(struct pci_device *device) +#else +DeviceMatch(struct pci_dev *device) +#endif +{ + int i; + + for (i = 0; rhdDevices[i].vendor; i++) + if ((rhdDevices[i].vendor == device->vendor_id) && + (rhdDevices[i].device == device->device_id)) + return (rhdDevices + i); + + return NULL; +} + +/* + * + */ +#ifndef XSERVER_LIBPCIACCESS +/* Only for libpci use */ +static void * +MapBar(struct pci_dev *device, int ioBar, int devMem) +{ + void *map; + + pci_fill_info(device, PCI_FILL_BASES | PCI_FILL_SIZES); + if (!device->base_addr[ioBar] +#if !defined (__FreeBSD__) + || !device->size[ioBar] +#endif + ) + return NULL; + /* on FreeBSD the PCI bar sizes don't get filled in; pick a sane default size */ + map = mmap(0, device->size[ioBar] ? device->size[ioBar] : 0x10000, + PROT_WRITE | PROT_READ, MAP_SHARED, devMem, + device->base_addr[ioBar]); + /* printf("Mapped IO at 0x%08X (BAR %1d: 0x%08X)\n", + device->base_addr[ioBar], ioBar, device->size[ioBar]); */ + + return map; +} +#endif + +/* + * + */ +CARD32 +RegRead(void *map, int offset) +{ + CARD32 ret = *(volatile CARD32 *)((CARD8 *) map + offset); +#ifdef DEBUG + fprintf(stderr, "0x%x = RegRead(0x%x)\n",ret,offset); +#endif + return ret; +} + +/* + * + */ +void +RegWrite(void *map, int offset, CARD32 value) +{ +#ifdef DEBUG + fprintf(stderr, "RegWrite(0x%x, 0x%x)\n",offset,value); +#endif + *(volatile CARD32 *)((CARD8 *) map + offset) = value; +} + +/* + * + */ +void +RegMask(void *map, int offset, CARD32 value, CARD32 mask) +{ + CARD32 tmp; + + tmp = RegRead(map, offset); + tmp &= ~mask; + tmp |= (value & mask); + RegWrite(map, offset, tmp); +} + +/* + * + */ +static void +HPDReport(void *map) +{ + int HPD = RegRead(map, DC_GPIO_HPD_Y); + + printf(" HotPlug:"); + if (!(HPD & 0x0101) && !((ChipType == RHD_R600) && (HPD & 0x00010000))) + printf(" RHD_HPD_NONE "); + else { + if (HPD & 0x1) + printf(" RHD_HPD_0"); + + if (HPD & 0x100) + printf(" RHD_HPD_1"); + + if ((ChipType >= RHD_R600) && (HPD & 0x00010000)) + printf(" RHD_HPD_2"); + + if ((ChipType >= RHD_R600) && (HPD & 0x01000000)) + printf(" RHD_HPD_3"); +} + printf("\n"); +} + +/* + * + */ +static dacOutput +DACLoadDetect(void *map, Bool tv, int dac) +{ + CARD32 CompEnable, Control1, Control2, DetectControl, Enable; + CARD8 ret; + unsigned int offset = 0; + + if (dac) offset = 0x200; + + CompEnable = RegRead(map, offset + DACA_COMPARATOR_ENABLE); + Control1 = RegRead(map, offset + DACA_CONTROL1); + Control2 = RegRead(map, offset + DACA_CONTROL2); + DetectControl = RegRead(map, offset + DACA_AUTODETECT_CONTROL); + Enable = RegRead(map, offset + DACA_ENABLE); + + /* enable */ + RegWrite(map, offset + DACA_ENABLE, 1); + /* ack autodetect */ + RegMask(map, offset + DACA_AUTODETECT_INT_CONTROL, 0x01, 0x01); + /* autodetect off */ + RegMask(map, offset + DACA_AUTODETECT_CONTROL, 0, 0x3); + /* zscale shift off */ + RegMask(map, offset + DACA_CONTROL2, 0, 0xff0000); + /* dac force off */ + RegMask(map, offset + DACA_CONTROL2, 0, 0x1); + + /* set TV */ + RegMask(map, offset + DACA_CONTROL2, tv ? 0x100 : 0, 0x100); + + RegWrite(map, offset + DACA_FORCE_DATA, 0); + RegMask(map, offset + DACA_CONTROL2, 0x1, 0x1); + + RegMask(map, offset + DACA_COMPARATOR_ENABLE, 0x00070000, 0x00070101); + RegWrite(map, offset + DACA_CONTROL1, 0x00050802); + + RegMask(map, offset + DACA_POWERDOWN, 0, 0x1); /* Shut down Bandgap Voltage Reference Power */ + usleep(5000); + + RegMask(map, offset + DACA_POWERDOWN, 0, 0x01010100); /* Shut down RGB */ + + RegWrite(map, offset + DACA_FORCE_DATA, 0x1e6); /* 486 out of 1024 */ + usleep(200); + + RegMask(map, offset + DACA_POWERDOWN, 0x01010100, 0x01010100); /* Enable RGB */ + usleep(88); + + RegMask(map, offset + DACA_POWERDOWN, 0, 0x01010100); /* Shut down RGB */ + + RegMask(map, offset + DACA_COMPARATOR_ENABLE, 0x100, 0x100); + usleep(100); + + /* Get RGB detect values + * If only G is detected, we could have a monochrome monitor, + * but we don't bother with this at the moment. + */ + ret = (RegRead(map, offset + DACA_COMPARATOR_OUTPUT) & 0x0E) >> 1; +#ifdef DEBUG + fprintf(stderr, "DAC%s: %x %s\n", dac ? "B" : "A", ret, tv ? "TV" : ""); +#endif + RegMask(map, offset + DACA_COMPARATOR_ENABLE, CompEnable, 0x00FFFFFF); + RegWrite(map, offset + DACA_CONTROL1, Control1); + RegMask(map, offset + DACA_CONTROL2, Control2, 0x1FF); + RegMask(map, offset + DACA_AUTODETECT_CONTROL, DetectControl, 0xFF); + RegMask(map, offset + DACA_ENABLE, Enable, 0xFF); + + switch (ret & 0x7) { + case 0x7: + if (tv) + return DAC_COMPONENT; + else + return DAC_VGA; + case 0x1: + if (tv) + return DAC_COMPOSITE; + else + return DAC_NONE; + case 0x6: + if (tv) + return DAC_SVIDEO; + else + return DAC_NONE; + default: + return DAC_NONE; + } +} + +/* + * + */ +static dacOutput +RS690DACLoadDetect(void *map, Bool tv, int dac) +{ + CARD32 CompEnable, Control1, Control2, DetectControl, Enable; + CARD8 ret; + unsigned int offset = 0; + + if (dac) offset = 0x200; + + CompEnable = RegRead(map, offset + DACA_COMPARATOR_ENABLE); + Control1 = RegRead(map, offset + DACA_CONTROL1); + Control2 = RegRead(map, offset + DACA_CONTROL2); + DetectControl = RegRead(map, offset + DACA_AUTODETECT_CONTROL); + Enable = RegRead(map, offset + DACA_ENABLE); + + /* Shut down Bandgap Voltage Reference Power */ + RegMask(map, offset + DACA_POWERDOWN, 0, 0x1); + /* enable */ + RegWrite(map, offset + DACA_ENABLE, 1); + /* autodetect off */ + RegMask(map, offset + DACA_AUTODETECT_CONTROL, 0, 0x3); + /* zscale shift off */ + RegMask(map, offset + DACA_CONTROL2, 0, 0xff0000); + /* set TV */ + RegMask(map, offset + DACA_CONTROL2, tv ? 0x100 : 0, 0x100); + /* electrical */ + RegWrite(map, offset + DACA_CONTROL1, 0x000A0A02); + usleep(1000); + /* 486 out of 1024 */ + RegWrite(map, offset + DACA_FORCE_DATA, 0x1e6); + /* dac force on */ + RegMask(map, offset + DACA_CONTROL2, 0x1, 0x1); + usleep(1000); + RegMask(map, offset + DACA_COMPARATOR_ENABLE, 0x100, 0x100); + usleep(37000); + + /* Get RGB detect values + * If only G is detected, we could have a monochrome monitor, + * but we don't bother with this at the moment. + */ + ret = (RegRead(map, offset + DACA_COMPARATOR_OUTPUT) & 0x0E) >> 1; +#ifdef DEBUG + fprintf(stderr, "DAC%s: %x %s\n", dac ? "B" : "A", ret, tv ? "TV" : ""); +#endif + RegMask(map, offset + DACA_COMPARATOR_ENABLE, CompEnable, 0x00FFFFFF); + RegWrite(map, offset + DACA_CONTROL1, Control1); + RegMask(map, offset + DACA_CONTROL2, Control2, 0x1FF); + RegMask(map, offset + DACA_AUTODETECT_CONTROL, DetectControl, 0xFF); + RegMask(map, offset + DACA_ENABLE, Enable, 0xFF); + + switch (ret & 0x7) { + case 0x7: + if (tv) + return DAC_COMPONENT; + else + return DAC_VGA; + case 0x1: + if (tv) + return DAC_COMPOSITE; + else + return DAC_NONE; + case 0x6: + if (tv) + return DAC_SVIDEO; + else + return DAC_NONE; + default: + return DAC_NONE; + } +} + +/* + * + */ +static dacOutput +RV620DACLoadDetect(void *map, Bool tv, int dac) +{ + CARD32 offset = 0; + CARD32 ret; + CARD32 DetectControl, AutodetectIntCtl, ForceData, Control1, Control2, CompEnable; + if (dac == 1) + offset = 0x100; + Control1 = RegRead(map, offset + RV620_DACA_CONTROL1); /* 7ef4 */ + Control2 = RegRead(map, offset + RV620_DACA_CONTROL2); /* 7058 */ + ForceData = RegRead(map, offset + RV620_DACA_FORCE_DATA); + AutodetectIntCtl = RegRead(map, offset + RV620_DACA_AUTODETECT_INT_CONTROL); + DetectControl = RegRead(map, offset + RV620_DACA_AUTODETECT_CONTROL); + CompEnable = RegRead(map, offset + RV620_DACA_COMPARATOR_ENABLE); +#if 0 + if (RegRead(map, offset + 0x7000) & 0x01) { + CARD32 my_offset = 0; + switch (RegRead(map, offset + 0x7004) & 0x3) { + case 0: + break; + case 1: + my_offset = 0x200; + break; + case 2: + switch (RegRead(map, offset + 0x60fc) & 0x1) { + case 0: + break; + case 1: + my_offset = 0x200; + break; + } + break; + } + if (RegRead(map, my_offset + 0x6080) & 0x1) { + while (!(RegRead(map, my_offset + 0x609c) & 0x02)) {}; + while (!(RegRead(map, my_offset + 0x609c) & 0x01)) {}; + } + } +#endif + if (tv) + RegMask(map, offset + RV620_DACA_CONTROL2, 0x100, 0xff00); /* TV on */ + else + RegMask(map, offset + RV620_DACA_CONTROL2, 0x00, 0xff00); /* TV off */ + RegMask(map, offset + RV620_DACA_FORCE_DATA, 0x18, 0xffff); + /* ack autodetect */ + RegMask(map, offset + RV620_DACA_AUTODETECT_INT_CONTROL, 0x01, 0x01); + /* autodetect off */ + RegMask(map, offset + RV620_DACA_AUTODETECT_CONTROL, 0x00, 0xff); + /* bandgap */ + RegMask(map, offset + RV620_DACA_CONTROL1, dac ? 0x2502 : 0x2002, 0xffff); + /* DAC RGB async enable */ + RegMask(map, offset + RV620_DACA_CONTROL2, 0x1, 0x1); + /* enable r/g/b comparators, disable D/SDET ref */ + RegMask(map, offset + RV620_DACA_COMPARATOR_ENABLE, 0x70000, 0x070101); + //usleep(100); + /* check for connection */ + RegMask(map, offset + RV620_DACA_AUTODETECT_CONTROL, 0x01, 0xff); + usleep(50); + + ret = RegRead(map, offset + RV620_DACA_AUTODETECT_STATUS); + + RegWrite(map, offset + RV620_DACA_AUTODETECT_CONTROL, DetectControl); + RegWrite(map, offset + RV620_DACA_CONTROL1, Control1); + RegWrite(map, offset + RV620_DACA_CONTROL2, Control2); + RegWrite(map, offset + RV620_DACA_FORCE_DATA, ForceData); + RegWrite(map, offset + RV620_DACA_AUTODETECT_INT_CONTROL, + AutodetectIntCtl); + +#ifdef DEBUG + fprintf(stderr, "DAC%i: ret = 0x%x %s\n",dac,ret,tv ? "TV" : ""); +#endif + + if (!tv) + return ((ret & 0x111) ? DAC_VGA : DAC_NONE); + + switch (ret & 0x1010100) { + case 0x1010100: + if (tv) + return DAC_COMPONENT; + case 0x1000000: + return DAC_COMPOSITE; + case 0x10100: + return DAC_SVIDEO; + default: + return DAC_NONE; + } +} + +/* + * + */ +static Bool +TMDSALoadDetect(void *map) +{ + CARD32 Enable, Control, Detect; + Bool ret; + + Enable = RegRead(map, TMDSA_TRANSMITTER_ENABLE); + Control = RegRead(map, TMDSA_TRANSMITTER_CONTROL); + Detect = RegRead(map, TMDSA_LOAD_DETECT); + + /* r500 needs a tiny bit more work :) */ + if (ChipType < RHD_R600) { + RegMask(map, TMDSA_TRANSMITTER_ENABLE, 0x3, 0x3); + RegMask(map, TMDSA_TRANSMITTER_CONTROL, 0x1, 0x3); + } + + RegMask(map, TMDSA_LOAD_DETECT, 0x1, 0x1); + usleep(1); + ret = RegRead(map, TMDSA_LOAD_DETECT) & 0x10; + RegMask(map, TMDSA_LOAD_DETECT, Detect, 0x1); + + if (ChipType < RHD_R600) { + RegWrite(map, TMDSA_TRANSMITTER_ENABLE, Enable); + RegWrite(map, TMDSA_TRANSMITTER_CONTROL, Control); + } + + return ret; +} + +/* + * + */ +static void +LoadReport(void *map) +{ + dacOutput DACA = DAC_NONE, DACB = DAC_NONE, TVA = DAC_NONE, TVB = DAC_NONE; + Bool TMDSA; + + switch (ChipType) { + case RHD_R500: + case RHD_R600: + DACA = DACLoadDetect(map, FALSE, 0); + DACB = DACLoadDetect(map, FALSE, 1); + TVA = DACLoadDetect(map, TRUE, 0); + TVB = DACLoadDetect(map, TRUE, 1); + break; + case RHD_RS690: + DACA = RS690DACLoadDetect(map, FALSE, 0); + DACB = RS690DACLoadDetect(map, FALSE, 1); + TVA = RS690DACLoadDetect(map, TRUE, 0); + TVB = RS690DACLoadDetect(map, TRUE, 1); + break; + case RHD_RV620: + DACA = RV620DACLoadDetect(map, FALSE, 0); + DACB = RV620DACLoadDetect(map, FALSE, 1); + TVA = RV620DACLoadDetect(map, TRUE, 0); + TVB = RV620DACLoadDetect(map, TRUE, 1); + break; + } + TMDSA =TMDSALoadDetect(map); + printf(" Load Detection:"); + if (!DACA && !DACB && !TMDSA && !TVA && !TVB) + printf(" RHD_OUTPUT_NONE "); + else { + if (DACA == DAC_VGA) + printf(" RHD_OUTPUT_DACA"); + + if (DACB == DAC_VGA) + printf(" RHD_OUTPUT_DACB"); + + switch (TVA) { + case DAC_SVIDEO: + printf(" RHD_OUTPUT_DACA_TV_SVIDEO"); + break; + case DAC_COMPOSITE: + printf(" RHD_OUTPUT_DACA_TV_COMPOSITE"); + break; + case DAC_COMPONENT: + if (!DACA) + printf(" RHD_OUTPUT_DACA_TV_COMPONENT"); + break; + default: + break; + } + + switch (TVB) { + case DAC_SVIDEO: + printf(" RHD_OUTPUT_DACB_TV_SVIDEO"); + break; + case DAC_COMPOSITE: + printf(" RHD_OUTPUT_DACB_TV_COMPOSITE"); + break; + case DAC_COMPONENT: + if (!DACB) + printf(" RHD_OUTPUT_DACB_TV_COMPONENT"); + break; + default: + break; + } + + if (TMDSA) + printf(" RHD_OUTPUT_TMDSA"); + } + printf("\n"); +} + +/* + * + */ +CARD32 +getDDCSpeed(void) +{ + CARD32 clock, ref_clk, ret; + + /* if no AtomBIOS info; use save default */ + clock = 40000; + ref_clk = 270; + + if (AtomData.FirmwareInfo.base) { + switch (AtomData.FirmwareInfoVersion.crev) { + case 1: + clock = AtomData.FirmwareInfo.FirmwareInfo->ulDefaultEngineClock; + ref_clk = AtomData.FirmwareInfo.FirmwareInfo->usReferenceClock; + break; + case 2: + clock = AtomData.FirmwareInfo.FirmwareInfo_V_1_2->ulDefaultEngineClock; + ref_clk = AtomData.FirmwareInfo.FirmwareInfo_V_1_2->usReferenceClock; + break; + case 3: + clock = AtomData.FirmwareInfo.FirmwareInfo_V_1_3->ulDefaultEngineClock; + ref_clk = AtomData.FirmwareInfo.FirmwareInfo_V_1_3->usReferenceClock; + break; + case 4: + clock = AtomData.FirmwareInfo.FirmwareInfo_V_1_4->ulDefaultEngineClock; + ref_clk = AtomData.FirmwareInfo.FirmwareInfo_V_1_4->usReferenceClock; + break; + default: + break; + } + } + + clock *= 10; + ref_clk *= 10; + + switch (ChipType) { + case RHD_R500: + case RHD_RS690: + ret = (0x7F << 8) + + (clock) / (4 * 0x7F * TARGET_HW_I2C_CLOCK); + break; + case RHD_R600: + ret = (clock) / TARGET_HW_I2C_CLOCK; + break; + case RHD_RV620: + ret = (ref_clk) / (4 * TARGET_HW_I2C_CLOCK); + break; + default: + ret = 0; + } +#ifdef DEBUG + printf("%s: Clock: %i Prescale: 0x%x\n",__func__,clock,ret); +#endif + return ret; +} + +/* + * R600 DDC defines. + */ +enum _r6xxI2CBits { + /* R6_DC_I2C_TRANSACTION0 */ + R6_DC_I2C_RW0 = (0x1 << 0), + R6_DC_I2C_STOP_ON_NACK0 = (0x1 << 8), + R6_DC_I2C_ACK_ON_READ0 = (0x1 << 9), + R6_DC_I2C_START0 = (0x1 << 12), + R6_DC_I2C_STOP0 = (0x1 << 13), + R6_DC_I2C_COUNT0 = (0xff << 16), + /* R6_DC_I2C_TRANSACTION1 */ + R6_DC_I2C_RW1 = (0x1 << 0), + R6_DC_I2C_STOP_ON_NACK1 = (0x1 << 8), + R6_DC_I2C_ACK_ON_READ1 = (0x1 << 9), + R6_DC_I2C_START1 = (0x1 << 12), + R6_DC_I2C_STOP1 = (0x1 << 13), + R6_DC_I2C_COUNT1 = (0xff << 16), + /* R6_DC_I2C_DATA */ + R6_DC_I2C_DATA_RW = (0x1 << 0), + R6_DC_I2C_DATA_BIT = (0xff << 8), + R6_DC_I2C_INDEX = (0xff << 16), + R6_DC_I2C_INDEX_WRITE = (0x1 << 31), + /* R6_DC_I2C_CONTROL */ + R6_DC_I2C_GO = (0x1 << 0), + R6_DC_I2C_SOFT_RESET = (0x1 << 1), + R6_DC_I2C_SEND_RESET = (0x1 << 2), + R6_DC_I2C_SW_STATUS_RESET = (0x1 << 3), + R6_DC_I2C_SDVO_EN = (0x1 << 4), + R6_DC_I2C_SDVO_ADDR_SEL = (0x1 << 6), + R6_DC_I2C_DDC_SELECT = (0x7 << 8), + R6_DC_I2C_TRANSACTION_COUNT = (0x3 << 20), + R6_DC_I2C_SW_DONE_INT = (0x1 << 0), + R6_DC_I2C_SW_DONE_ACK = (0x1 << 1), + R6_DC_I2C_SW_DONE_MASK = (0x1 << 2), + R6_DC_I2C_DDC1_HW_DONE_INT = (0x1 << 4), + R6_DC_I2C_DDC1_HW_DONE_ACK = (0x1 << 5), + R6_DC_I2C_DDC1_HW_DONE_MASK = (0x1 << 6), + R6_DC_I2C_DDC2_HW_DONE_INT = (0x1 << 8), + R6_DC_I2C_DDC2_HW_DONE_ACK = (0x1 << 9), + R6_DC_I2C_DDC2_HW_DONE_MASK = (0x1 << 10), + R6_DC_I2C_DDC3_HW_DONE_INT = (0x1 << 12), + R6_DC_I2C_DDC3_HW_DONE_ACK = (0x1 << 13), + R6_DC_I2C_DDC3_HW_DONE_MASK = (0x1 << 14), + R6_DC_I2C_DDC4_HW_DONE_INT = (0x1 << 16), + R6_DC_I2C_DDC4_HW_DONE_ACK = (0x1 << 17), + R6_DC_I2C_DDC4_HW_DONE_MASK = (0x1 << 18), + /* R6_DC_I2C_SW_STATUS */ + R6_DC_I2C_SW_STATUS_BIT = (0x3 << 0), + R6_DC_I2C_SW_DONE = (0x1 << 2), + R6_DC_I2C_SW_ABORTED = (0x1 << 4), + R6_DC_I2C_SW_TIMEOUT = (0x1 << 5), + R6_DC_I2C_SW_INTERRUPTED = (0x1 << 6), + R6_DC_I2C_SW_BUFFER_OVERFLOW = (0x1 << 7), + R6_DC_I2C_SW_STOPPED_ON_NACK = (0x1 << 8), + R6_DC_I2C_SW_SDVO_NACK = (0x1 << 10), + R6_DC_I2C_SW_NACK0 = (0x1 << 12), + R6_DC_I2C_SW_NACK1 = (0x1 << 13), + R6_DC_I2C_SW_NACK2 = (0x1 << 14), + R6_DC_I2C_SW_NACK3 = (0x1 << 15), + R6_DC_I2C_SW_REQ = (0x1 << 18) +}; + +/* + * + */ +static Bool +R6xxI2CSetupStatus(void *map, int channel) +{ + channel &= 0xf; + CARD16 i2c_speed; + + i2c_speed = getDDCSpeed(); + if (!i2c_speed) + return FALSE; + + switch (channel) { + case 0: + RegMask(map, DC_GPIO_DDC1_MASK, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC1_A, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC1_EN, 0x0, 0xffff); + RegMask(map, R6_DC_I2C_DDC1_SPEED, (i2c_speed << 16) | 2, + 0xFFFF00FF); + RegWrite(map, R6_DC_I2C_DDC1_SETUP, 0x30000000); + break; + case 1: + RegMask(map, DC_GPIO_DDC2_MASK, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC2_A, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC2_EN, 0x0, 0xffff); + RegMask(map, R6_DC_I2C_DDC2_SPEED, (i2c_speed << 16) | 2, + 0xffff00ff); + RegWrite(map, R6_DC_I2C_DDC2_SETUP, 0x30000000); + break; + case 2: + RegMask(map, DC_GPIO_DDC3_MASK, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC3_A, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC3_EN, 0x0, 0xffff); + RegMask(map, R6_DC_I2C_DDC3_SPEED, (i2c_speed << 16) | 2, + 0xffff00ff); + RegWrite(map, R6_DC_I2C_DDC3_SETUP, 0x30000000); + break; + case 3: + RegMask(map, DC_GPIO_DDC4_MASK, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC4_A, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC4_EN, 0x0, 0xffff); + RegMask(map, R6_DC_I2C_DDC4_SPEED, (i2c_speed << 16) | 2, + 0xffff00ff); + RegWrite(map, R6_DC_I2C_DDC4_SETUP, 0x30000000); + break; + default: + return FALSE; + } + RegWrite(map, R6_DC_I2C_CONTROL, channel << 8); + RegMask(map, R6_DC_I2C_INTERRUPT_CONTROL, 0x2, 0x2); + RegMask(map, R6_DC_I2C_ARBITRATION, 0, 0xff); + return TRUE; +} + +/* + * + */ +static Bool +R6xxI2CStatus(void *map) +{ + unsigned int count = 800; + CARD32 val = 0; + + while (--count) { + + usleep(1000); + + val = RegRead(map, R6_DC_I2C_SW_STATUS); + if (val & R6_DC_I2C_SW_DONE) + break; + } + RegMask(map, R6_DC_I2C_INTERRUPT_CONTROL, R6_DC_I2C_SW_DONE_ACK, + R6_DC_I2C_SW_DONE_ACK); + +#ifdef DEBUG + fprintf(stderr, "I2CStatus: %x\n",val); +#endif + if (!count || (val & (R6_DC_I2C_SW_STOPPED_ON_NACK + | R6_DC_I2C_SW_ABORTED | R6_DC_I2C_SW_TIMEOUT + | R6_DC_I2C_SW_INTERRUPTED + | R6_DC_I2C_SW_BUFFER_OVERFLOW + | R6_DC_I2C_SW_NACK0 | R6_DC_I2C_SW_NACK1 | 0x3))) + return FALSE; /* 2 */ + return TRUE; /* 1 */ +} + +/* + * + */ +static Bool +R6xxI2CWriteRead(void *map, CARD8 line, CARD8 slave, + unsigned char *WriteBuffer, int nWrite, unsigned char *ReadBuffer, int nRead) +{ + Bool ret = FALSE; + CARD32 data = 0; + int idx = 1; + + enum { + TRANS_WRITE_READ, + TRANS_WRITE, + TRANS_READ + } trans; + + if (nWrite > 0 && nRead > 0) { + trans = TRANS_WRITE_READ; + } else if (nWrite > 0) { + trans = TRANS_WRITE; + } else if (nRead > 0) { + trans = TRANS_READ; + } else { + /* for bus probing */ + trans = TRANS_WRITE; + } + + if (!R6xxI2CSetupStatus(map, line)) + return FALSE; + + RegMask(map, R6_DC_I2C_CONTROL, (trans == TRANS_WRITE_READ) + ? (1 << 20) : 0, R6_DC_I2C_TRANSACTION_COUNT); /* 2 or 1 Transaction */ + RegMask(map, R6_DC_I2C_TRANSACTION0, + R6_DC_I2C_STOP_ON_NACK0 + | (trans == TRANS_READ ? R6_DC_I2C_RW0 : 0) + | R6_DC_I2C_START0 + | (trans == TRANS_WRITE_READ ? 0 : R6_DC_I2C_STOP0 ) + | ((trans == TRANS_READ ? nRead : nWrite) << 16), + 0xffffff); + if (trans == TRANS_WRITE_READ) + RegMask(map, R6_DC_I2C_TRANSACTION1, + nRead << 16 + | R6_DC_I2C_RW1 + | R6_DC_I2C_START1 + | R6_DC_I2C_STOP1, + 0xffffff); /* read */ + + data = R6_DC_I2C_INDEX_WRITE + | (((slave & 0xfe) | (trans == TRANS_READ ? 1 : 0)) << 8 ) + | (0 << 16); + RegWrite(map, R6_DC_I2C_DATA, data); + if (trans != TRANS_READ) { /* we have bytes to write */ + while (nWrite--) { + data = R6_DC_I2C_INDEX_WRITE | ( *(WriteBuffer++) << 8 ) + | (idx++ << 16); + RegWrite(map, R6_DC_I2C_DATA, data); + } + } + if (trans == TRANS_WRITE_READ) { /* we have bytes to read after write */ + data = R6_DC_I2C_INDEX_WRITE | ((slave | 0x1) << 8) | (idx++ << 16); + RegWrite(map, R6_DC_I2C_DATA, data); + } + /* Go! */ + RegMask(map, R6_DC_I2C_CONTROL, R6_DC_I2C_GO, R6_DC_I2C_GO); + if (R6xxI2CStatus(map)) { + /* Hopefully this doesn't write data to index */ + RegWrite(map, R6_DC_I2C_DATA, R6_DC_I2C_INDEX_WRITE + | R6_DC_I2C_DATA_RW | /* idx++ */3 << 16); + while (nRead--) { + data = RegRead(map, R6_DC_I2C_DATA); + *(ReadBuffer++) = (data >> 8) & 0xff; + } + ret = TRUE; + } else + return FALSE; + + RegMask(map, R6_DC_I2C_CONTROL, 0x2, 0xff); + usleep(10); + RegWrite(map, R6_DC_I2C_CONTROL, 0); + + return ret; +} + + +/* + * + */ +static Bool +R6xxDDCProbe(void *map, int Channel, unsigned char slave) +{ + Bool ret = FALSE; + CARD32 data; + + if (!R6xxI2CSetupStatus(map, Channel)) + return FALSE; + + RegMask(map, R6_DC_I2C_CONTROL, 0, 0x00300000); /* 1 Transaction */ + + RegMask(map, R6_DC_I2C_TRANSACTION0, /* only slave */ + R6_DC_I2C_STOP_ON_NACK0 | R6_DC_I2C_START0 + | R6_DC_I2C_STOP0 | (0 << 16), 0x00ffffff); + + data = R6_DC_I2C_INDEX_WRITE | ( slave << 8 ) | (0 << 16); + RegWrite(map, R6_DC_I2C_DATA, data); + + RegMask(map, R6_DC_I2C_CONTROL, R6_DC_I2C_GO, R6_DC_I2C_GO); + + ret = R6xxI2CStatus(map); + + RegMask(map, R6_DC_I2C_CONTROL, 0x2, 0xff); + usleep(1000); + RegWrite(map, R6_DC_I2C_CONTROL, 0); + + return ret; +} + + +enum _rhdRS69I2CBits { + /* RS69_DC_I2C_TRANSACTION0 */ + RS69_DC_I2C_RW0 = (0x1 << 0), + RS69_DC_I2C_STOP_ON_NACK0 = (0x1 << 8), + RS69_DC_I2C_START0 = (0x1 << 12), + RS69_DC_I2C_STOP0 = (0x1 << 13), + /* RS69_DC_I2C_TRANSACTION1 */ + RS69_DC_I2C_RW1 = (0x1 << 0), + RS69_DC_I2C_START1 = (0x1 << 12), + RS69_DC_I2C_STOP1 = (0x1 << 13), + /* RS69_DC_I2C_DATA */ + RS69_DC_I2C_DATA_RW = (0x1 << 0), + RS69_DC_I2C_INDEX_WRITE = (0x1 << 31), + /* RS69_DC_I2C_CONTROL */ + RS69_DC_I2C_GO = (0x1 << 0), + RS69_DC_I2C_TRANSACTION_COUNT = (0x3 << 20), + RS69_DC_I2C_SW_DONE_ACK = (0x1 << 1), + /* RS69_DC_I2C_SW_STATUS */ + RS69_DC_I2C_SW_DONE = (0x1 << 2), + RS69_DC_I2C_SW_ABORTED = (0x1 << 4), + RS69_DC_I2C_SW_TIMEOUT = (0x1 << 5), + RS69_DC_I2C_SW_INTERRUPTED= (0x1 << 6), + RS69_DC_I2C_SW_BUFFER_OVERFLOW= (0x1 << 7), + RS69_DC_I2C_SW_STOPPED_ON_NACK = (0x1 << 8), + RS69_DC_I2C_SW_NACK0 = (0x1 << 12), + RS69_DC_I2C_SW_NACK1 = (0x1 << 13) +}; + +/* + * + */ +static Bool +RS69I2CStatus(void *map) +{ + unsigned int count = 2000; + volatile CARD32 val; + + while (--count) { + + usleep(10); + val = RegRead(map, RS69_DC_I2C_SW_STATUS); +#ifdef DEBUG + fprintf(stderr,"I2CStatus : 0x%x %i\n",(unsigned int)val,count); +#endif + if (val & RS69_DC_I2C_SW_DONE) + break; + } + RegMask(map, RS69_DC_I2C_INTERRUPT_CONTROL, RS69_DC_I2C_SW_DONE_ACK, + RS69_DC_I2C_SW_DONE_ACK); + if (!count || (val & (RS69_DC_I2C_SW_STOPPED_ON_NACK + | RS69_DC_I2C_SW_ABORTED | RS69_DC_I2C_SW_TIMEOUT + | RS69_DC_I2C_SW_INTERRUPTED + | RS69_DC_I2C_SW_BUFFER_OVERFLOW + | RS69_DC_I2C_SW_NACK0 | RS69_DC_I2C_SW_NACK1 + | 0x3))) + return FALSE; /* 2 */ + return TRUE; /* 1 */ +} + +/* + * + */ +static Bool +RS69I2CSetupStatus(void *map, int line) +{ + CARD32 ddc; + CARD16 prescale; + + prescale = getDDCSpeed(); + if (!prescale || !AtomData.GPIO_I2C_Info) + return FALSE; + + RegMask(map, 0x28, 0x200, 0x200); + RegMask(map, RS69_DC_I2C_UNKNOWN_1, prescale << 16 | 0x2, 0xffff00ff); + /* add SDVO handling later */ +#ifdef DEBUG + fprintf(stderr,"GPIO line DDC%i: 0x%x\n",line, + AtomData + .GPIO_I2C_Info->asGPIO_Info[line & 0xf].usClkMaskRegisterIndex); +#endif + switch (AtomData.GPIO_I2C_Info->asGPIO_Info[line & 0xf] + .usClkMaskRegisterIndex) { + case 0x1f90: + ddc = 0; /* ddc1 */ + break; + case 0x1f94: /* ddc2 */ + ddc = 1; + break; + default: + ddc = 2; /* ddc3 */ + break; + } +#ifdef DEBUG + fprintf(stderr, "DDC: line: %i -> %i port: %x\n",line,ddc, + AtomData.GPIO_I2C_Info->asGPIO_Info[line & 0xf] + .usClkMaskRegisterIndex); +#endif + RegWrite(map, RS69_DC_I2C_DDC_SETUP_Q, 0x30000000); + RegMask(map, RS69_DC_I2C_CONTROL, ((line & 0x3) << 16) | ddc << 8, 0xffff << 8); + RegMask(map, RS69_DC_I2C_INTERRUPT_CONTROL, 0x2, 0x2); + RegMask(map, RS69_DC_I2C_UNKNOWN_2, 0x2, 0xff); + + return TRUE; +} + +/* + * + */ +static int +RS69xI2CWriteRead(void *map, CARD8 line, CARD8 slave, + unsigned char *WriteBuffer, int nWrite, unsigned char *ReadBuffer, int nRead) +{ + Bool ret = FALSE; + CARD32 data = 0; + + int idx = 1; + + enum { + TRANS_WRITE_READ, + TRANS_WRITE, + TRANS_READ + } trans; + + if (nWrite > 0 && nRead > 0) { + trans = TRANS_WRITE_READ; + } else if (nWrite > 0) { + trans = TRANS_WRITE; + } else if (nRead > 0) { + trans = TRANS_READ; + } else { + /* for bus probing */ + trans = TRANS_WRITE; + } + + if (!RS69I2CSetupStatus(map, line)) + return FALSE; + + RegMask(map, RS69_DC_I2C_CONTROL, (trans == TRANS_WRITE_READ) + ? (1 << 20) : 0, RS69_DC_I2C_TRANSACTION_COUNT); /* 2 or 1 Transaction */ + RegMask(map, RS69_DC_I2C_TRANSACTION0, + RS69_DC_I2C_STOP_ON_NACK0 + | (trans == TRANS_READ ? RS69_DC_I2C_RW0 : 0) + | RS69_DC_I2C_START0 + | (trans == TRANS_WRITE_READ ? 0 : RS69_DC_I2C_STOP0 ) + | ((trans == TRANS_READ ? nRead : nWrite) << 16), + 0xffffff); + if (trans == TRANS_WRITE_READ) + RegMask(map, RS69_DC_I2C_TRANSACTION1, + nRead << 16 + | RS69_DC_I2C_RW1 + | RS69_DC_I2C_START1 + | RS69_DC_I2C_STOP1, + 0xffffff); /* read */ + + data = RS69_DC_I2C_INDEX_WRITE + | (((slave & 0xfe) | (trans == TRANS_READ ? 1 : 0)) << 8 ) + | (0 << 16); + RegWrite(map, RS69_DC_I2C_DATA, data); + if (trans != TRANS_READ) { /* we have bytes to write */ + while (nWrite--) { + data = RS69_DC_I2C_INDEX_WRITE | ( *(WriteBuffer++) << 8 ) + | (idx++ << 16); + RegWrite(map, RS69_DC_I2C_DATA, data); + } + } + if (trans == TRANS_WRITE_READ) { /* we have bytes to read after write */ + data = RS69_DC_I2C_INDEX_WRITE | ((slave | 0x1) << 8) | (idx++ << 16); + RegWrite(map, RS69_DC_I2C_DATA, data); + } + /* Go! */ + RegMask(map, RS69_DC_I2C_CONTROL, RS69_DC_I2C_GO, RS69_DC_I2C_GO); + if (RS69I2CStatus(map)) { + /* Hopefully this doesn't write data to index */ + RegWrite(map, RS69_DC_I2C_DATA, RS69_DC_I2C_INDEX_WRITE + | RS69_DC_I2C_DATA_RW | /* idx++ */3 << 16); + while (nRead--) { + data = RegRead(map, RS69_DC_I2C_DATA); + *(ReadBuffer++) = (data >> 8) & 0xff; + } + ret = TRUE; + } + + RegMask(map, RS69_DC_I2C_CONTROL, 0x2, 0xff); + usleep(10); + RegWrite(map, RS69_DC_I2C_CONTROL, 0); + + return ret; +} + +/* + * + */ +static Bool +RS69DDCProbe(void *map, int Channel, unsigned char slave) +{ + return RS69xI2CWriteRead(map, Channel, slave, NULL, 0, NULL, 0); +} + +#if 0 +static Bool +RS69DDCProbe(void *map, int Channel, unsigned char slave) +{ + Bool ret = FALSE; + CARD32 data; + + if (!RS69I2CSetupStatus(map, Channel)) + return FALSE; + + RegMask(map, RS69_DC_I2C_CONTROL, 0, RS69_DC_I2C_TRANSACTION_COUNT); /* 1 Transaction */ + + RegMask(map, RS69_DC_I2C_TRANSACTION0, /* only slave */ + RS69_DC_I2C_STOP_ON_NACK0 | RS69_DC_I2C_START0 + | RS69_DC_I2C_STOP0 | (0 << 16), 0x00ffffff); + + data = RS69_DC_I2C_INDEX_WRITE | ( slave << 8 ) | (0 << 16); + RegWrite(map, RS69_DC_I2C_DATA, data); + + RegMask(map, RS69_DC_I2C_CONTROL, RS69_DC_I2C_GO, RS69_DC_I2C_GO); + + ret = RS69I2CStatus(map); + + RegMask(map, RS69_DC_I2C_CONTROL, 0x2, 0xff); + usleep(1000); + RegWrite(map, RS69_DC_I2C_CONTROL, 0); + + return ret; +} +#endif + +enum _rhdR5xxI2CBits { + /* R5_DC_I2C_STATUS1 */ + R5_DC_I2C_DONE = (0x1 << 0), + R5_DC_I2C_NACK = (0x1 << 1), + R5_DC_I2C_HALT = (0x1 << 2), + R5_DC_I2C_GO = (0x1 << 3), + /* R5_DC_I2C_RESET */ + R5_DC_I2C_SOFT_RESET = (0x1 << 0), + R5_DC_I2C_ABORT = (0x1 << 8), + /* R5_DC_I2C_CONTROL1 */ + R5_DC_I2C_START = (0x1 << 0), + R5_DC_I2C_STOP = (0x1 << 1), + R5_DC_I2C_RECEIVE = (0x1 << 2), + R5_DC_I2C_EN = (0x1 << 8), + R5_DC_I2C_PIN_SELECT = (0x3 << 16), + /* R5_DC_I2C_CONTROL2 */ + R5_DC_I2C_ADDR_COUNT = (0x7 << 0), + R5_DC_I2C_DATA_COUNT = (0xf << 8), + R5_DC_I2C_PRESCALE_LOWER = (0xff << 16), + R5_DC_I2C_PRESCALE_UPPER = (0xff << 24), + /* R5_DC_I2C_CONTROL3 */ + R5_DC_I2C_DATA_DRIVE_EN = (0x1 << 0), + R5_DC_I2C_DATA_DRIVE_SEL = (0x1 << 1), + R5_DC_I2C_CLK_DRIVE_EN = (0x1 << 7), + R5_DC_I2C_RD_INTRA_BYTE_DELAY = (0xff << 8), + R5_DC_I2C_WR_INTRA_BYTE_DELAY = (0xff << 16), + R5_DC_I2C_TIME_LIMIT = (0xff << 24), + /* R5_DC_I2C_DATA */ + R5_DC_I2C_DATA_BIT = (0xff << 0), + /* R5_DC_I2C_INTERRUPT_CONTROL */ + R5_DC_I2C_INTERRUPT_STATUS = (0x1 << 0), + R5_DC_I2C_INTERRUPT_AK = (0x1 << 8), + R5_DC_I2C_INTERRUPT_ENABLE = (0x1 << 16), + /* R5_DC_I2C_ARBITRATION */ + R5_DC_I2C_SW_WANTS_TO_USE_I2C = (0x1 << 0), + R5_DC_I2C_SW_CAN_USE_I2C = (0x1 << 1), + R5_DC_I2C_SW_DONE_USING_I2C = (0x1 << 8), + R5_DC_I2C_HW_NEEDS_I2C = (0x1 << 9), + R5_DC_I2C_ABORT_HDCP_I2C = (0x1 << 16), + R5_DC_I2C_HW_USING_I2C = (0x1 << 17) +}; + +/* + * + */ +static Bool +R5xxI2CSetupStatus(void *map, int channel) +{ + switch (channel) { + case 0: + RegMask(map, DC_GPIO_DDC1_MASK, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC1_A, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC1_EN, 0x0, 0xffff); + break; + case 1: + RegMask(map, DC_GPIO_DDC2_MASK, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC2_A, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC2_EN, 0x0, 0xffff); + break; + case 2: + RegMask(map, DC_GPIO_DDC3_MASK, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC3_A, 0x0, 0xffff); + RegMask(map, DC_GPIO_DDC3_EN, 0x0, 0xffff); + break; + default: + return FALSE; + } + return TRUE; +} + +/* + * + */ +static Bool +R5xxI2CStatus(void *map) +{ + int count = 800; + CARD32 res; + + while (count-- != 0) { + usleep (1000); + + if (((RegRead(map, R5_DC_I2C_STATUS1)) + & R5_DC_I2C_GO) != 0) + continue; + res = RegRead(map, R5_DC_I2C_STATUS1); +#ifdef DEBUG + fprintf(stderr, "I2CStatus: %x\n",res); +#endif + if (res & R5_DC_I2C_DONE + && !(res & (R5_DC_I2C_NACK | R5_DC_I2C_HALT))) + return TRUE; + else + return FALSE; + } + + RegMask(map, R5_DC_I2C_RESET, R5_DC_I2C_ABORT, 0xff00); + return FALSE; +} + +/* + * + */ +static int +R5xxDDCProbe(void *map, int Channel, unsigned char slave) +{ + Bool ret = FALSE; + CARD32 SaveControl1, save_494; + CARD16 prescale; + + prescale = getDDCSpeed(); + if (!prescale) + return FALSE; + + if (!R5xxI2CSetupStatus(map, Channel)) + return FALSE; + + RegMask(map, 0x28, 0x200, 0x200); + + SaveControl1 = RegRead(map, R5_DC_I2C_CONTROL1); + save_494 = RegRead(map, 0x494); + RegMask(map, 0x494, 1, 1); + + RegMask(map, R5_DC_I2C_ARBITRATION, R5_DC_I2C_SW_WANTS_TO_USE_I2C, + R5_DC_I2C_SW_WANTS_TO_USE_I2C); + + RegMask(map, R5_DC_I2C_STATUS1, R5_DC_I2C_DONE + | R5_DC_I2C_NACK + | R5_DC_I2C_HALT, 0xff); + RegMask(map, R5_DC_I2C_RESET, R5_DC_I2C_SOFT_RESET, 0xffff); + RegWrite(map, R5_DC_I2C_RESET, 0); + + RegMask(map, R5_DC_I2C_CONTROL1, + (Channel & 0x0f) << 16 | R5_DC_I2C_EN, + R5_DC_I2C_PIN_SELECT | R5_DC_I2C_EN); + /* addr_count = 1; data_count = 1 */ + RegWrite(map, R5_DC_I2C_CONTROL2, prescale << 16 | 0x101); + /* time limit 30 */ + RegMask(map, R5_DC_I2C_CONTROL3, 0x30 << 24, 0xff << 24); + + RegWrite(map, R5_DC_I2C_DATA, slave); /* slave */ + RegWrite(map, R5_DC_I2C_DATA, 0); + + RegMask(map, R5_DC_I2C_CONTROL1, + R5_DC_I2C_START | R5_DC_I2C_STOP, 0xff); + RegMask(map, R5_DC_I2C_STATUS1, R5_DC_I2C_GO, 0xff); + ret = R5xxI2CStatus(map); + + RegMask(map, R5_DC_I2C_STATUS1, + R5_DC_I2C_DONE + | R5_DC_I2C_NACK + | R5_DC_I2C_HALT, 0xff); + RegMask(map, R5_DC_I2C_RESET, R5_DC_I2C_SOFT_RESET, 0xff); + RegWrite(map,R5_DC_I2C_RESET, 0); + + RegMask(map, R5_DC_I2C_ARBITRATION, + R5_DC_I2C_SW_DONE_USING_I2C, 0xff00); + + RegWrite(map, R5_DC_I2C_CONTROL1, SaveControl1); + RegWrite(map, 0x494, save_494); + RegMask(map, 0x28, 0, 0x200); + + return ret; +} + +/* + * + */ +Bool +R5xxI2CWriteReadChunk(void *map, CARD8 line, CARD8 slave, + unsigned char *WriteBuffer, int nWrite, unsigned char *ReadBuffer, int nRead) +{ + int prescale = getDDCSpeed(); + CARD32 save_I2C_CONTROL1, save_494; + CARD32 tmp32; + Bool ret = TRUE; + + RegMask(map, 0x28, 0x200, 0x200); + save_I2C_CONTROL1 = RegRead(map, R5_DC_I2C_CONTROL1); + save_494 = RegRead(map, 0x494); + RegMask(map, 0x494, 1, 1); + RegMask(map, R5_DC_I2C_ARBITRATION, + R5_DC_I2C_SW_WANTS_TO_USE_I2C, + R5_DC_I2C_SW_WANTS_TO_USE_I2C); + + RegMask(map, R5_DC_I2C_STATUS1, R5_DC_I2C_DONE + | R5_DC_I2C_NACK + | R5_DC_I2C_HALT, 0xff); + RegMask(map, R5_DC_I2C_RESET, R5_DC_I2C_SOFT_RESET, 0xffff); + RegWrite(map, R5_DC_I2C_RESET, 0); + + RegMask(map, R5_DC_I2C_CONTROL1, + (line & 0x0f) << 16 | R5_DC_I2C_EN, + R5_DC_I2C_PIN_SELECT | R5_DC_I2C_EN); + + if (nWrite || !nRead) { /* special case for bus probing */ + /* + * chip can't just write the slave address without data. + * Add a dummy byte. + */ + RegWrite(map, R5_DC_I2C_CONTROL2, + prescale << 16 | + (nWrite ? nWrite : 1) << 8 | 0x01); /* addr_cnt: 1 */ + RegMask(map, R5_DC_I2C_CONTROL3, + 0x30 << 24, 0xff << 24); /* time limit 30 */ + + RegWrite(map, R5_DC_I2C_DATA, slave); + + /* Add dummy byte */ + if (!nWrite) + RegWrite(map, R5_DC_I2C_DATA, 0); + else + while (nWrite--) + RegWrite(map, R5_DC_I2C_DATA, *WriteBuffer++); + + RegMask(map, R5_DC_I2C_CONTROL1, + R5_DC_I2C_START | R5_DC_I2C_STOP, 0xff); + RegMask(map, R5_DC_I2C_STATUS1, R5_DC_I2C_GO, 0xff); + + if ((ret = R5xxI2CStatus(map))) + RegMask(map, R5_DC_I2C_STATUS1,R5_DC_I2C_DONE, 0xff); + else + ret = FALSE; + } + + if (ret && nRead) { + + RegWrite(map, R5_DC_I2C_DATA, slave | 1); /*slave*/ + RegWrite(map, R5_DC_I2C_CONTROL2, + prescale << 16 | nRead << 8 | 0x01); /* addr_cnt: 1 */ + + RegMask(map, R5_DC_I2C_CONTROL1, + R5_DC_I2C_START | R5_DC_I2C_STOP | R5_DC_I2C_RECEIVE, 0xff); + RegMask(map, R5_DC_I2C_STATUS1, R5_DC_I2C_GO, 0xff); + if ((ret = R5xxI2CStatus(map))) { + RegMask(map, R5_DC_I2C_STATUS1, R5_DC_I2C_DONE, 0xff); + while (nRead--) { + *(ReadBuffer++) = (CARD8)RegRead(map, R5_DC_I2C_DATA); + } + } else + ret = FALSE; + } + + RegMask(map, R5_DC_I2C_STATUS1, + R5_DC_I2C_DONE | R5_DC_I2C_NACK | R5_DC_I2C_HALT, 0xff); + RegMask(map, R5_DC_I2C_RESET, R5_DC_I2C_SOFT_RESET, 0xff); + RegWrite(map,R5_DC_I2C_RESET, 0); + + RegMask(map,R5_DC_I2C_ARBITRATION, + R5_DC_I2C_SW_DONE_USING_I2C, 0xff00); + + RegWrite(map,R5_DC_I2C_CONTROL1, save_I2C_CONTROL1); + RegWrite(map,0x494, save_494); + tmp32 = RegRead(map,0x28); + RegWrite(map,0x28, tmp32 & 0xfffffdff); + + return ret; +} + +/* + * + */ +static Bool +R5xxI2CWriteRead(void *map, CARD8 line, CARD8 slave, + unsigned char *WriteBuffer, int nWrite, unsigned char *ReadBuffer, int nRead) +{ + /* + * Since the transaction buffer can only hold + * 15 bytes (+ the slave address) we bail out + * on every transaction that is bigger unless + * it's a read transaction following a write + * transaction sending just one byte. + * In this case we assume, that this byte is + * an offset address. Thus we will restart + * the transaction after 15 bytes sending + * a new offset. + */ + + if (nWrite > 15 || (nRead > 15 && nWrite != 1)) { + fprintf(stderr, + "%s: Currently only I2C transfers with " + "maximally 15bytes are supported\n", + __func__); + return FALSE; + } + if (nRead > 15) { + unsigned char offset = *WriteBuffer; + while (nRead) { + int n = nRead > 15 ? 15 : nRead; + if (!R5xxI2CWriteReadChunk(map, line, slave, &offset, 1, ReadBuffer, n)) + return FALSE; + ReadBuffer += n; + nRead -= n; + offset += n; + } + return TRUE; + } else + return R5xxI2CWriteReadChunk(map, line, slave, WriteBuffer, nWrite, + ReadBuffer, nRead); +} + +/* RV620 */ +enum rv620I2CBits { + /* GENERIC_I2C_CONTROL */ + RV62_DC_I2C_GO = (0x1 << 0), + RV62_GENERIC_I2C_GO = (0x1 << 0), + RV62_GENERIC_I2C_SOFT_RESET = (0x1 << 1), + RV62_GENERIC_I2C_SEND_RESET = (0x1 << 2), + /* GENERIC_I2C_INTERRUPT_CONTROL */ + RV62_GENERIC_I2C_DONE_INT = (0x1 << 0), + RV62_GENERIC_I2C_DONE_ACK = (0x1 << 1), + RV62_GENERIC_I2C_DONE_MASK = (0x1 << 2), + /* GENERIC_I2C_STATUS */ + RV62_GENERIC_I2C_STATUS_BIT = (0xf << 0), + RV62_GENERIC_I2C_DONE = (0x1 << 4), + RV62_GENERIC_I2C_ABORTED = (0x1 << 5), + RV62_GENERIC_I2C_TIMEOUT = (0x1 << 6), + RV62_GENERIC_I2C_STOPPED_ON_NACK = (0x1 << 9), + RV62_GENERIC_I2C_NACK = (0x1 << 10), + /* GENERIC_I2C_SPEED */ + RV62_GENERIC_I2C_THRESHOLD = (0x3 << 0), + RV62_GENERIC_I2C_DISABLE_FILTER_DURING_STALL = (0x1 << 4), + RV62_GENERIC_I2C_PRESCALE = (0xffff << 16), + /* GENERIC_I2C_SETUP */ + RV62_GENERIC_I2C_DATA_DRIVE_EN = (0x1 << 0), + RV62_GENERIC_I2C_DATA_DRIVE_SEL = (0x1 << 1), + RV62_GENERIC_I2C_CLK_DRIVE_EN = (0x1 << 7), + RV62_GENERIC_I2C_INTRA_BYTE_DELAY = (0xff << 8), + RV62_GENERIC_I2C_TIME_LIMIT = (0xff << 24), + /* GENERIC_I2C_TRANSACTION */ + RV62_GENERIC_I2C_RW = (0x1 << 0), + RV62_GENERIC_I2C_STOP_ON_NACK = (0x1 << 8), + RV62_GENERIC_I2C_ACK_ON_READ = (0x1 << 9), + RV62_GENERIC_I2C_START = (0x1 << 12), + RV62_GENERIC_I2C_STOP = (0x1 << 13), + RV62_GENERIC_I2C_COUNT = (0xf << 16), + /* GENERIC_I2C_DATA */ + RV62_GENERIC_I2C_DATA_RW = (0x1 << 0), + RV62_GENERIC_I2C_DATA_BIT = (0xff << 8), + RV62_GENERIC_I2C_INDEX = (0xf << 16), + RV62_GENERIC_I2C_INDEX_WRITE = (0x1 << 31), + /* GENERIC_I2C_PIN_SELECTION */ + RV62_GENERIC_I2C_SCL_PIN_SEL = (0x7f << 0), + RV62_GENERIC_I2C_SDA_PIN_SEL = (0x7f << 8), +}; + +/* + * + */ +static Bool +RV620I2CStatus(void *map) +{ + unsigned int count = 50; + volatile CARD32 val; + + while (--count) { + + usleep(10); + val = RegRead(map, RV62_GENERIC_I2C_STATUS); +#ifdef DEBUG + fprintf(stderr,"SW_STATUS: 0x%x %i\n",(unsigned int)val,count); +#endif + if (val & RV62_GENERIC_I2C_DONE) + break; + } + RegMask(map, RV62_GENERIC_I2C_INTERRUPT_CONTROL, 0x2, 0xff); + + if (!count + || (val & (RV62_GENERIC_I2C_STOPPED_ON_NACK | RV62_GENERIC_I2C_NACK + | RV62_GENERIC_I2C_TIMEOUT | RV62_GENERIC_I2C_ABORTED))) + return FALSE; /* 2 */ + + return TRUE; /* 1 */ +} + +/* + * + */ +enum { + rhdDdc1data = 0, + rhdDdc2data = 2, + rhdDdc3data = 4, + rhdVIP_DOUT_scl = 0x41, + rhdDvoData12 = 0x28, + rhdDdc1clk = 1, + rhdDdc2clk = 3, + rhdDdc3clk = 5, + rhdVIP_DOUTvipclk = 0x42, + rhdDvoData13 = 0x29 +}; + +static int +getDDCLineFromGPIO(CARD32 gpio, int shift) +{ + switch (gpio) { + case 0x1f90: + switch (shift) { + case 0: + return rhdDdc1clk; /* ddc1 clk */ + case 8: + return rhdDdc1data; /* ddc1 data */ + } + break; + case 0x1f94: /* ddc2 */ + switch (shift) { + case 0: + return rhdDdc2clk; /* ddc2 clk */ + case 8: + return rhdDdc2data; /* ddc2 data */ + } + break; + case 0x1f98: /* ddc3 */ + switch (shift) { + case 0: + return rhdDdc3clk; /* ddc3 clk */ + case 8: + return rhdDdc3data; /* ddc3 data */ + } + case 0x1f88: /* ddc4 */ + switch (shift) { + case 0: + return rhdVIP_DOUTvipclk; /* ddc4 clk */ + case 8: + return rhdVIP_DOUT_scl; /* ddc4 data */ + } + break; + case 0x1fda: /* ddc5 */ + switch (shift) { + case 0: + return rhdDvoData13; /* ddc5 clk */ + case 8: + return rhdDvoData12; /* ddc5 data */ + } + break; + } + return -1; +} + +/* + * + */ +static Bool +RV620I2CSetupStatus(void *map, int line, int prescale) +{ +/* CARD32 reg_7d9c[] = { 0x1, 0x0203, 0x0405, 0x0607 }; */ + CARD32 gpio, shift, sda, scl; + + if (line > 3) + return FALSE; + + gpio = AtomData.GPIO_I2C_Info->asGPIO_Info[line].usDataMaskRegisterIndex; + shift = AtomData.GPIO_I2C_Info->asGPIO_Info[line].ucDataMaskShift; + sda = getDDCLineFromGPIO(gpio, shift); + + gpio = AtomData.GPIO_I2C_Info->asGPIO_Info[line].usClkMaskRegisterIndex; + shift = AtomData.GPIO_I2C_Info->asGPIO_Info[line].ucClkMaskShift; + scl = getDDCLineFromGPIO(gpio, shift); + + /* Don't understand this yet */ + if (gpio == 0x1fda) + gpio = 0x1f90; + + RegWrite(map, gpio << 2, 0); + RegWrite(map, RV62_GENERIC_I2C_PIN_SELECTION, scl | (sda << 8)); + RegMask(map, RV62_GENERIC_I2C_SPEED, + (prescale & 0xffff) << 16 | 0x02, 0xffff00ff); + RegWrite(map, RV62_GENERIC_I2C_SETUP, 0x30000000); + RegMask(map, RV62_GENERIC_I2C_INTERRUPT_CONTROL, + RV62_GENERIC_I2C_DONE_ACK, RV62_GENERIC_I2C_DONE_ACK); + + return TRUE; +} + +/* + * + */ +static Bool +RV620I2CTransaction(void *map, CARD8 slave, Bool Write, + unsigned char *Buffer, int count) +{ + Bool Start = TRUE; + +#define MAX 8 + + while (count > 0) { + int num; + int idx = 0; + CARD32 data = 0; + + if (count > MAX) { + num = MAX; + RegMask(map, RV62_GENERIC_I2C_TRANSACTION, + (MAX - (((Start) ? 0 : 1))) << 16 + | RV62_GENERIC_I2C_STOP_ON_NACK + | RV62_GENERIC_I2C_ACK_ON_READ + | (Start ? RV62_GENERIC_I2C_START : 0) + | (!Write ? RV62_GENERIC_I2C_RW : 0 ), + 0xFFFFFF); + } else { + num = count; + data = ( count - (((Start) ? 0 : 1)) ) << 16 + | RV62_GENERIC_I2C_STOP_ON_NACK + | RV62_GENERIC_I2C_STOP + | (Start ? RV62_GENERIC_I2C_START : 0) + | (!Write ? RV62_GENERIC_I2C_RW : 0); + RegMask(map, RV62_GENERIC_I2C_TRANSACTION, + data, + 0xFFFFFF); + } + + if (Start) { + data = RV62_GENERIC_I2C_INDEX_WRITE + | (((slave & 0xfe) | ( Write ? 0 : 1)) << 8) + | (idx++ << 16); + RegWrite(map, RV62_GENERIC_I2C_DATA, data); + } + + if (Write) { + while (num--) { + data = RV62_GENERIC_I2C_INDEX_WRITE + | (idx++ << 16) + | *(Buffer++) << 8; + RegWrite(map, RV62_GENERIC_I2C_DATA, data); + } + + RegMask(map, RV62_GENERIC_I2C_CONTROL, + RV62_GENERIC_I2C_GO, RV62_GENERIC_I2C_GO); + if (!RV620I2CStatus(map)) + return FALSE; + } else { + + RegMask(map, RV62_GENERIC_I2C_CONTROL, + RV62_GENERIC_I2C_GO, RV62_GENERIC_I2C_GO); + if (!RV620I2CStatus(map)) + return FALSE; + + RegWrite(map, RV62_GENERIC_I2C_DATA, + RV62_GENERIC_I2C_INDEX_WRITE + | (idx++ << 16) + | RV62_GENERIC_I2C_RW); + + while (num--) { + data = RegRead(map, RV62_GENERIC_I2C_DATA); + *(Buffer++) = (CARD8)((data >> 8) & 0xff); + } + } + Start = FALSE; + count -= MAX; + } + return TRUE; +} + +/* + * + */ +static Bool +RV620I2CWriteRead(void *map, CARD8 line, CARD8 slave, + unsigned char *WriteBuffer, int nWrite, unsigned char *ReadBuffer, int nRead) +{ + int prescale = getDDCSpeed(); + + if (!prescale) + return FALSE; + + RV620I2CSetupStatus(map, line, prescale); + + if (!nWrite && !nRead) + return RV620I2CTransaction(map, slave, TRUE, (unsigned char *)"", 1); + + if (nWrite) + if (!RV620I2CTransaction(map, slave, TRUE, WriteBuffer, nWrite)) + return FALSE; + + if (nRead) + if (!RV620I2CTransaction(map, slave, FALSE, ReadBuffer, nRead)) + return FALSE; + + return TRUE; +} + +/* + * + */ +static Bool +RV620DDCProbe(void *map, int Channel, unsigned char slave) +{ + return RV620I2CWriteRead(map, Channel, slave, NULL, 0, NULL, 0); +} + +/* + * + */ +static Bool +DDCProbe(void *map, int Channel, unsigned char slave, unsigned char *data, int count) +{ + Bool ret; + unsigned char offset = 0; + + switch (ChipType) { + case RHD_R500: + if (( ret = R5xxDDCProbe(map, Channel, slave)) && count > 0) { + ret = R5xxI2CWriteRead(map, Channel, slave, &offset, 1, data, count); + }; + return ret; + case RHD_RS690: + if ((ret = RS69DDCProbe(map, Channel, slave)) && count > 0) { + ret = RS69xI2CWriteRead(map, Channel, slave, &offset, 1, data, count); + }; + return ret; + case RHD_R600: + if ((ret = R6xxDDCProbe(map, Channel, slave)) && count > 0) { + ret = R6xxI2CWriteRead(map, Channel, slave, &offset, 1, data, count); + }; + return ret; + case RHD_RV620: + if ((ret = RV620DDCProbe(map, Channel, slave)) && count > 0) { + ret = RV620I2CWriteRead(map, Channel, slave, &offset, 1, data, count); + }; + return ret; + default: + return FALSE; + } +} + +/* + * + */ +#define EDID_SLAVE 0xA0 + +static void +DDCReport(void *map) +{ + Bool Chan0, Chan1, Chan2, Chan3; + + Chan0 = DDCProbe(map, 0, EDID_SLAVE, NULL, 0); + Chan1 = DDCProbe(map, 1, EDID_SLAVE, NULL, 0); + Chan2 = DDCProbe(map, 2, EDID_SLAVE, NULL, 0); + if (ChipType >= RHD_R600) + Chan3 = DDCProbe(map, 3, EDID_SLAVE, NULL, 0); + else + Chan3 = FALSE; + + printf(" DDC:"); + if (!Chan0 && !Chan1 && !Chan2 && !Chan3) + printf(" RHD_DDC_NONE "); + else { + if (Chan0) + printf(" RHD_DDC_0"); + + if (Chan1) + printf(" RHD_DDC_1"); + + if (Chan2) + printf(" RHD_DDC_2"); + + if (Chan3) + printf(" RHD_DDC_3"); + } + printf("\n"); +} + +/* + * + */ +static void +DDCScanBus(void *map, int count) +{ + int channel; + unsigned char slave; + int max_chan = ((ChipType >= RHD_RS690) ? 3 : 2); + unsigned char *data = NULL; + + if (count) + data = malloc(count); + + for (channel = 0; channel < max_chan; channel ++) { + int state = 0; + + for (slave = 0x8; slave < 0x78; slave++ ) { + + if (DDCProbe(map, channel, slave << 1, data, count)) { + if (state == 0) { + printf(" DDC Line[%i]: Slaves: ", channel); + if (!data) + state = 1; + } + printf("%x ", slave << 1); + if (data) { + printf("\n"); + dprint(data, count); + } + } + } + if (state == 1) + printf("\n"); + } + if (data) free(data); +} + +/* + * + */ +static void +LVDSReport(void *map) +{ + Bool Bits24 = FALSE, DualLink = FALSE, Fpdi = FALSE; + + if (ChipType == RHD_R600) { + /* printf("No information for LVTMA on R600 has been made available yet.\n"); */ + return; + } + + if (!(RegRead(map, LVTMA_CNTL) & 0x1) || + (RegRead(map, LVTMA_MODE) & 0x1)) + return; + + printf(" LVDS Info:\n"); + + DualLink = RegRead(map, LVTMA_CNTL) & 0x01000000; + Bits24 = RegRead(map, LVTMA_LVDS_DATA_CNTL) & 0x1; + Fpdi = RegRead(map, LVTMA_LVDS_DATA_CNTL) & 0x10; + + printf("\t%dbits, %s link, %s Panel found.\n", + Bits24 ? 24 : 18, + DualLink ? "dual" : "single", + Fpdi ? "FPDI" : "LDI"); + + printf("\tPower Timing: 0x%03X, 0x%03X, 0x%02X, 0x%02X, 0x%03X\n", + RegRead(map, LVTMA_PWRSEQ_REF_DIV) & 0xFFF, + (RegRead(map, LVTMA_PWRSEQ_REF_DIV) >> 16) & 0xFFF, + ((RegRead(map, LVTMA_PWRSEQ_DELAY1) & 0xFF) * 2 + 1) / 5, + (((RegRead(map, LVTMA_PWRSEQ_DELAY1) >> 8) & 0xFF) * 2 + 1)/ 5, + (RegRead(map, LVTMA_PWRSEQ_DELAY2) & 0xFFF) << 2); + + printf("\tMacro: 0x%08X, Clock Pattern: 0x%04X\n", + RegRead(map, LVTMA_MACRO_CONTROL), + (RegRead(map, LVTMA_TRANSMITTER_CONTROL) >> 16) & 0x3FF); +} + +/* + * + */ +Bool +WriteToFile(char *name, unsigned char *buffer, int size) + +{ + int fd = open(name, O_CREAT | O_TRUNC | O_WRONLY,S_IRUSR | S_IWUSR); + int ct = 0; + + if (fd < 0) { + fprintf(stderr,"Cannot open file %s: %s\n",name,strerror(errno)); + goto error; + } else { + while (1) { + int ret = write(fd, buffer + ct, size - ct); + if (ret < 0) { + if (errno == EAGAIN || errno == EINVAL) + continue; + else { + fprintf(stderr,"Cannot write output file: %s\n", + strerror(errno)); + close (fd); + goto error; + } + } else { + ct += ret; + if (ct == size) + break; + } + } + close (fd); + return TRUE; + } + error: + return FALSE; +} + +/* + * + */ +unsigned char * +GetVBIOS(int *size) +{ + int i; + unsigned char *rombase; + char chksm = 0; + int saved_errno; + int fd; + + if ((fd = open(DEV_MEM, O_RDONLY)) < 0) { + fprintf(stderr,"Cannot open " DEV_MEM " (%s),\n",strerror(errno)); + return FALSE; + } + rombase = mmap((caddr_t)0, VBIOS_MAXSIZE, PROT_READ, MAP_SHARED, fd, + VBIOS_BASE); + saved_errno = errno; + + close (fd); + + if (rombase == MAP_FAILED) { + fprintf(stderr,"Cannot map (0x%08x:0x%x) (%s)\n",VBIOS_BASE, + VBIOS_MAXSIZE, + strerror(saved_errno)); + return FALSE; + } + + if (rombase[0] != 0x55 || rombase[1] != 0xaa) { + fprintf(stderr,"No BIOS Signature found!\n"); + } else { + *size = rombase[2] * 512; + for (i = 0; i < *size; i++) { + chksm += rombase[i]; + } + if (chksm) + fprintf(stderr,"Warning: VBIOS chksum incorrect!\n"); + } + return rombase; +} + +/* + * + */ +void +FreeVBIOS(unsigned char *rombase, int size) +{ + munmap(rombase,size); +} + + +#ifdef XSERVER_LIBPCIACCESS + +/* Copy BIOS from PCI ROM into memory buffer */ +unsigned char * +GetBIOS_from_PCI(struct RHDDevice *rhdDevice, struct pci_device *dev, void *io, int *size) +{ + unsigned char *rombase = NULL; + int errnum; + + CARD32 save_seprom_cntl1 = 0, + save_gpiopad_a, save_gpiopad_en, save_gpiopad_mask, + save_viph_cntl, + save_bus_cntl, + save_d1vga_control, save_d2vga_control, save_vga_render_control, + save_rom_cntl = 0, + save_gen_pwrmgt = 0, + save_low_vid_lower_gpio_cntl = 0, save_med_vid_lower_gpio_cntl = 0, + save_high_vid_lower_gpio_cntl = 0, save_ctxsw_vid_lower_gpio_cntl = 0, + save_lower_gpio_en = 0; + + /* We have to enable BIOS on an unposted card. But first we save the + state. Much of this code pinched from RHDReadPCIBios() in + rhd_driver.c */ + + if (rhdDevice->type < RHD_R600) + save_seprom_cntl1 = RegRead(io, SEPROM_CNTL1); + save_gpiopad_en = RegRead(io, GPIOPAD_EN); + save_gpiopad_a = RegRead(io, GPIOPAD_A); + save_gpiopad_mask = RegRead(io, GPIOPAD_MASK); + save_viph_cntl = RegRead(io, VIPH_CONTROL); + save_bus_cntl = RegRead(io, BUS_CNTL); + save_d1vga_control = RegRead(io, D1VGA_CONTROL); + save_d2vga_control = RegRead(io, D2VGA_CONTROL); + save_vga_render_control = RegRead(io, VGA_RENDER_CONTROL); + if (rhdDevice->type >= RHD_R600) { + save_rom_cntl = RegRead(io, ROM_CNTL); + save_gen_pwrmgt = RegRead(io, GENERAL_PWRMGT); + save_low_vid_lower_gpio_cntl = RegRead(io, LOW_VID_LOWER_GPIO_CNTL); + save_med_vid_lower_gpio_cntl = RegRead(io, MEDIUM_VID_LOWER_GPIO_CNTL); + save_high_vid_lower_gpio_cntl = RegRead(io, HIGH_VID_LOWER_GPIO_CNTL); + save_ctxsw_vid_lower_gpio_cntl = RegRead(io, CTXSW_VID_LOWER_GPIO_CNTL); + save_lower_gpio_en = RegRead(io, LOWER_GPIO_ENABLE); + } + + /* Set SPI ROM prescale value to change the SCK period */ + if (rhdDevice->type < RHD_R600) + RegMask(io, SEPROM_CNTL1, 0x0C << 24, SCK_PRESCALE); + /* Let chip control GPIO pads - this is the default state after power up */ + RegWrite(io, GPIOPAD_EN, 0); + RegWrite(io, GPIOPAD_A, 0); + /* Put GPIO pads in read mode */ + RegWrite(io, GPIOPAD_MASK, 0); + /* Disable VIP Host port */ + RegMask(io, VIPH_CONTROL, 0, VIPH_EN); + /* Enable BIOS ROM */ + RegMask(io, BUS_CNTL, 0, BIOS_ROM_DIS); + /* Disable VGA and select extended timings */ + RegMask(io, D1VGA_CONTROL, 0, + D1VGA_MODE_ENABLE | D1VGA_TIMING_SELECT); + RegMask(io, D2VGA_CONTROL, 0, + D2VGA_MODE_ENABLE | D2VGA_TIMING_SELECT); + RegMask(io, VGA_RENDER_CONTROL, 0, VGA_VSTATUS_CNTL); + if (rhdDevice->type >= RHD_R600) { + RegMask(io, ROM_CNTL, SCK_OVERWRITE + | 1 << SCK_PRESCALE_CRYSTAL_CLK_SHIFT, + SCK_OVERWRITE + | 1 << SCK_PRESCALE_CRYSTAL_CLK_SHIFT); + RegMask(io, GENERAL_PWRMGT, 0, OPEN_DRAIN_PADS); + RegMask(io, LOW_VID_LOWER_GPIO_CNTL, 0, 0x400); + RegMask(io, MEDIUM_VID_LOWER_GPIO_CNTL, 0, 0x400); + RegMask(io, HIGH_VID_LOWER_GPIO_CNTL, 0, 0x400); + RegMask(io, CTXSW_VID_LOWER_GPIO_CNTL, 0, 0x400); + RegMask(io, LOWER_GPIO_ENABLE, 0x400, 0x400); + } + + /* Read the ROM */ + + *size = (dev->rom_size > 0) ? dev->rom_size : 0x20000; + + rombase = malloc((size_t)*size); + + if ((errnum = pci_device_read_rom(dev, rombase))) { + fprintf(stderr,"Attempt to read ROM from PCI failed: %s.\n", + strerror(errnum)); + free(rombase); + rombase = NULL; + } + + /* Restore the state prior to being called */ + + if (rhdDevice->type < RHD_R600) + RegWrite(io, SEPROM_CNTL1, save_seprom_cntl1); + RegWrite(io, GPIOPAD_EN, save_gpiopad_en); + RegWrite(io, GPIOPAD_A, save_gpiopad_a); + RegWrite(io, GPIOPAD_MASK, save_gpiopad_mask); + RegWrite(io, VIPH_CONTROL, save_viph_cntl); + RegWrite(io, BUS_CNTL, save_bus_cntl); + RegWrite(io, D1VGA_CONTROL, save_d1vga_control); + RegWrite(io, D2VGA_CONTROL, save_d2vga_control); + RegWrite(io, VGA_RENDER_CONTROL, save_vga_render_control); + if (rhdDevice->type >= RHD_R600) { + RegWrite(io, ROM_CNTL, save_rom_cntl); + RegWrite(io, GENERAL_PWRMGT, save_gen_pwrmgt); + RegWrite(io, LOW_VID_LOWER_GPIO_CNTL, save_low_vid_lower_gpio_cntl); + RegWrite(io, MEDIUM_VID_LOWER_GPIO_CNTL, save_med_vid_lower_gpio_cntl); + RegWrite(io, HIGH_VID_LOWER_GPIO_CNTL, save_high_vid_lower_gpio_cntl); + RegWrite(io, CTXSW_VID_LOWER_GPIO_CNTL, save_ctxsw_vid_lower_gpio_cntl); + RegWrite(io, LOWER_GPIO_ENABLE, save_lower_gpio_en); + } + + return rombase; +} + + + +void FreeBIOS_from_PCI(unsigned char *rombase) +{ + if (rombase) free(rombase); +} +#endif + + +/* + * + */ +static int +AnalyzeCommonHdr(ATOM_COMMON_TABLE_HEADER *hdr) +{ + if (hdr->usStructureSize == 0xaa55) + return FALSE; + + return TRUE; +} + +/* + * + */ +static int +AnalyzeRomHdr(unsigned char *rombase, + ATOM_ROM_HEADER *hdr, + int *data_offset, int *code_offset) +{ + if (AnalyzeCommonHdr(&hdr->sHeader) == -1) { + return FALSE; + } + + *data_offset = hdr->usMasterDataTableOffset; + *code_offset = hdr->usMasterCommandTableOffset; + + return TRUE; +} + +/* + * + */ +static int +AnalyzeRomDataTable(unsigned char *base, int offset, + void *ptr,short *size) +{ + ATOM_COMMON_TABLE_HEADER *table = (ATOM_COMMON_TABLE_HEADER *) + (base + offset); + + if (!*size || AnalyzeCommonHdr(table) == -1) { + if (*size) *size -= 2; + *(void **)ptr = NULL; + return FALSE; + } + *size -= 2; + *(void **)ptr = (void *)(table); + return TRUE; +} + +/* + * + */ +static Bool +GetAtomBiosTableRevisionAndSize(ATOM_COMMON_TABLE_HEADER *hdr, + CARD8 *contentRev, + CARD8 *formatRev, + short *size) +{ + if (!hdr) + return FALSE; + + if (contentRev) *contentRev = hdr->ucTableContentRevision; + if (formatRev) *formatRev = hdr->ucTableFormatRevision; + if (size) *size = (short)hdr->usStructureSize + - sizeof(ATOM_COMMON_TABLE_HEADER); + return TRUE; +} + +static Bool +AnalyzeMasterDataTable(unsigned char *base, + ATOM_MASTER_DATA_TABLE *table) +{ + ATOM_MASTER_LIST_OF_DATA_TABLES *data_table = + &table->ListOfDataTables; + short size; + + if (!AnalyzeCommonHdr(&table->sHeader)) + return FALSE; + if (!GetAtomBiosTableRevisionAndSize(&table->sHeader,NULL,NULL,&size)) + return FALSE; + + AnalyzeRomDataTable(base,data_table->FirmwareInfo,&(AtomData.FirmwareInfo.base),&size); + GetAtomBiosTableRevisionAndSize(AtomData.FirmwareInfo.base, + &AtomData.FirmwareInfoVersion.crev, + &AtomData.FirmwareInfoVersion.frev, + NULL); + AnalyzeRomDataTable(base,data_table->GPIO_I2C_Info,&(AtomData.GPIO_I2C_Info),&size); + GetAtomBiosTableRevisionAndSize((ATOM_COMMON_TABLE_HEADER *)AtomData.GPIO_I2C_Info, + &AtomData.GPIO_I2C_InfoVersion.crev, + &AtomData.GPIO_I2C_InfoVersion.frev, + NULL); + + return TRUE; +} + +void +print_help(const char* progname, const char* message, const char* msgarg) +{ + if (message != NULL) + fprintf(stderr, "%s %s\n", message, msgarg); + fprintf(stderr, "Usage: %s [options] PCI-tag\n" + " Options: -d: dumpBios\n" +#ifdef XSERVER_LIBPCIACCESS +# if HAVE_PCI_DEVICE_ENABLE + " -e: enable pci card (not normally needed)\n" +# endif + " -r: only attempt BIOS read via PCI ROM\n" +#endif + " -s: scanDDCBus\n" + " -x num: dump num bytes from available i2c channels\n" + " PCI-tag: bus:dev.func\n\n", + progname); +} + +/* + * + */ +struct atomCodeDataTableHeader +{ + unsigned char signature; + unsigned short size; +}; + +#define CODE_DATA_TABLE_SIGNATURE 0x7a +#define ATOM_EOT_COMMAND 0x5b + +unsigned char * +AtomBiosGetDataFromCodeTable(unsigned char **tablelist, int n, short *size) +{ + ATOM_COMMON_ROM_COMMAND_TABLE_HEADER *header; + unsigned char *code; + int i; + + if (!tablelist) + return FALSE; + header = (ATOM_COMMON_ROM_COMMAND_TABLE_HEADER *) tablelist[n]; + if (!header) + return NULL; + if (!AnalyzeCommonHdr(&header->CommonHeader)) + return NULL; + if (!GetAtomBiosTableRevisionAndSize(&header->CommonHeader,NULL,NULL,size)) + return NULL; + + code = (unsigned char *)header; +#ifdef DEBUG + fprintf(stderr, "table[%2.2i].size = 0x%3.3x bytes\n",n,*size); +#endif +for (i = sizeof(ATOM_COMMON_ROM_COMMAND_TABLE_HEADER); i < *size - 1; i++) { + + if (code[i] == ATOM_EOT_COMMAND + && code[i+1] == CODE_DATA_TABLE_SIGNATURE) { + + struct atomCodeDataTableHeader *dt + = (struct atomCodeDataTableHeader *)&code[i]; + int diff; + diff = *size - (i + 1) + sizeof(struct atomCodeDataTableHeader) + + SHORT(dt->size); + + if (diff < 0) { + fprintf(stderr, + "Data table in command table %i extends %i bytes " + "beyond command table size\n", + n, -diff); + return NULL; + } else { +#ifdef DEBUG + fprintf(stderr, "code data table size: 0x%4.4x\n",SHORT(dt->size)); + dprint(&code[i + sizeof(struct atomCodeDataTableHeader)], SHORT(dt->size)); +#endif + return &code[i + sizeof(struct atomCodeDataTableHeader)]; + } + } + } + return NULL; +} + +/* + * + */ +unsigned char ** +AtomBiosAnalyzeCommandTable(ATOM_MASTER_COMMAND_TABLE *table, unsigned char *base, int *num) +{ + short size; + int i; + unsigned char **tablelist = NULL; + unsigned short offset; + + *num = sizeof(ATOM_MASTER_LIST_OF_COMMAND_TABLES)/sizeof(USHORT); + + if (!AnalyzeCommonHdr(&table->sHeader)) + return NULL; + if (!GetAtomBiosTableRevisionAndSize(&table->sHeader,NULL,NULL,&size)) + return NULL; + if ((tablelist = (unsigned char **)calloc(*num, sizeof (char *)))) { + for (i = 0; i < *num; i++) + if ((offset = ((USHORT *)&(table->ListOfCommandTables))[i])) { +#ifdef DEBUG + fprintf(stderr, "CommandTableEntry[%2.2i] = 0x%4.4x\n",i,offset); +#endif + tablelist[i] = base + offset; + } else + tablelist[i] = NULL; + } + + return tablelist; +} + +/* + * + */ +static Bool +InterpretATOMBIOS(unsigned char *base) +{ + int data_offset, code_offset; + unsigned short atom_romhdr_off = *(unsigned short*) + (base + OFFSET_TO_POINTER_TO_ATOM_ROM_HEADER); + + ATOM_ROM_HEADER *atom_rom_hdr = + (ATOM_ROM_HEADER *)(base + atom_romhdr_off); + if (memcmp("ATOM",&atom_rom_hdr->uaFirmWareSignature,4)) { + fprintf(stderr,"No AtomBios signature found\n"); + return FALSE; + } + if (!AnalyzeRomHdr(base, atom_rom_hdr, &data_offset, &code_offset)) { + fprintf(stderr, "RomHeader invalid\n"); + return FALSE; + } + if (!AnalyzeMasterDataTable(base, (ATOM_MASTER_DATA_TABLE *) + (base + data_offset))) { + fprintf(stderr, "ROM Master Table invalid\n"); + return FALSE; + } + command_table = + AtomBiosAnalyzeCommandTable((ATOM_MASTER_COMMAND_TABLE *)(base + code_offset), + base, &num_command_table_entries); + + return TRUE; +} + +/* + * + */ +int +main(int argc, char *argv[]) +{ +#ifdef XSERVER_LIBPCIACCESS + struct pci_device *device = NULL; +# if HAVE_PCI_DEVICE_ENABLE + int enable_device; +# endif +#else + struct pci_dev *device = NULL; + struct pci_access *pciAccess; + int devMem; + int saved_errno; +#endif + struct RHDDevice *rhdDevice = NULL; + void *io; + int bus, dev, func; + int ret; + Bool deviceSet = FALSE; + Bool dumpBios = FALSE, scanDDCBus = FALSE; + unsigned long DumpI2CData = 0; + int i; + unsigned char *rombase; + int size; + int using_vbios; + + printf("%s: v%s, %s\n", + "rhd_conntest", PACKAGE_VERSION, GIT_MESSAGE); + +#ifdef XSERVER_LIBPCIACCESS + /* Initialise pciaccess */ + if ((i = pci_system_init())) { + fprintf(stderr, "ERROR: pciaccess failed to initialise PCI bus" + " (error %d)\n", i); + return 1; + } + /* Default actions */ +# if HAVE_PCI_DEVICE_ENABLE + enable_device = FALSE; +# endif + using_vbios = TRUE; +#else + /* init libpci */ + pciAccess = pci_alloc(); + pci_init(pciAccess); + pci_scan_bus(pciAccess); + /* Default action */ + using_vbios = TRUE; +#endif + + if (argc < 2) { + print_help(argv[0], "Missing argument: please provide a PCI tag\n", + ""); + return 1; + } + + for (i = 1; i < argc; i++) { +#ifdef XSERVER_LIBPCIACCESS +# if HAVE_PCI_DEVICE_ENABLE + if (!strncmp("-e", argv[i], 3)) { + enable_device = TRUE; + }else +# endif + if (!strncmp("-r", argv[i], 3)) { + using_vbios = FALSE; + }else +#endif + if (!strncmp("-d",argv[i],3)) { + dumpBios = TRUE; + } else if (!strncmp("-s",argv[i],3)) { + scanDDCBus = TRUE; + } else if (!strncmp("-x",argv[i],3)) { + if (++i == argc || !strncmp("-", argv[i], 1)) { + print_help(argv[0], "Option -x requires an argument",""); + return 1; + } + DumpI2CData = strtol(argv[i], NULL, 0); + if (DumpI2CData > 256) { + fprintf(stderr, "can only dump up to 256 bytes"); + return -1; + } + } else if (!strncmp("-",argv[i],1)) { + print_help(argv[0], "Unknown option", argv[i]); + return 1; + } else { + ret = sscanf(argv[i], "%x:%x.%x", &bus, &dev, &func); + if (ret != 3) { + ret = sscanf(argv[i], "%x:%x:%x", &bus, &dev, &func); + if (ret != 3) { + ret = sscanf(argv[i], "%d:%d.%d", &bus, &dev, &func); + if (ret != 3) + ret = sscanf(argv[i], "%d:%d:%d", &bus, &dev, &func); + } + } + if (ret != 3) { + print_help(argv[0], "Unable to parse the PCI tag argument: ", + argv[i]); + return 1; + } + deviceSet = TRUE; + } + } + + if (!using_vbios & !deviceSet) { + /* Not technically an error, but only a right plonker would specify + this combination of command line options. */ + printf("What?!! You want me to do nothing!\n" + "Specify a PCI tag and/or don't specify '-r' for some action.\n"); + return 0; + } + + if (deviceSet) { +#ifdef XSERVER_LIBPCIACCESS + /* Find the toy using pciaccess */ + if ((device = pci_device_find_by_slot(0, bus, dev, func)) == NULL) { + fprintf(stderr, "ERROR: Unable to find PCI device at %02X:%02X.%02X.\n", + bus, dev, func); + return 1; + } +# if HAVE_PCI_DEVICE_ENABLE + if (enable_device) + pci_device_enable(device); +# endif +#else + /* find our toy using pci */ + device = DeviceLocate(pciAccess->devices, bus, dev, func); + if (!device) { + fprintf(stderr, "Unable to find PCI device at %02X:%02X.%02X.\n", + bus, dev, func); + return 1; + } +#endif + + rhdDevice = DeviceMatch(device); + if (!rhdDevice) { + fprintf(stderr, + "Unknown device: 0x%04X:0x%04X (%02X:%02X.%02X).\n", + device->vendor_id, device->device_id, bus, dev, func); + return 1; + } + +#ifdef XSERVER_LIBPCIACCESS + printf("Found card: %s - %s\n", + pci_device_get_vendor_name(device), + pci_device_get_device_name(device)); +#endif + } + + if (using_vbios) { + /* Attempt to read BIOS from legacy VBIOS. */ + rombase = GetVBIOS(&size); + if (!rombase) { + printf("Cannot get VBIOS. Are we root?\n"); + }else{ + if (!InterpretATOMBIOS(rombase)) { + printf("Cannot analyze AtomBIOS from VBIOS\n"); + rombase = NULL; + } + } + + if (dumpBios && rombase) { + char name[1024] = "posted.vga.rom"; + + if (deviceSet) { +#ifdef XSERVER_LIBPCIACCESS + snprintf(name, 1023, "%04X.%04X.%04X.vga.rom", + device->device_id, device->subvendor_id, device->subdevice_id); +#else + snprintf(name, 1023, "%04X.%04X.%04X.vga.rom", + device->device_id, + pci_read_word(device, PCI_SUBSYSTEM_VENDOR_ID), + pci_read_word(device, PCI_SUBSYSTEM_ID)); +#endif + } + WriteToFile(name, rombase, size); + } + }else{ + /* We ain't goin' to read VBIOS - flag that */ + rombase = NULL; + } + + /* We reuse the flag using_vbios now to indicate whether we successfully + read the VBIOS (rombase is not suitable for the purpose) */ + using_vbios = rombase ? 1 : 0; + + if (!deviceSet) { + if (! using_vbios) { + fprintf(stderr, "ERROR: Failed to read VBIOS.\n"); + return 1; + } + return 0; + } + + if (rhdDevice->bar > 5) { + fprintf(stderr, "ERROR: No acceptable PCI BAR defined for this device.\n"); + return 1; + } + + /* Map into CPU memory space the required PCI memory */ + +#ifdef XSERVER_LIBPCIACCESS + pci_device_probe(device); + + if (device->regions[rhdDevice->bar].base_addr == 0) { + fprintf(stderr, "ERROR: Failed to find required resource on PCI card.\n"); + return 1; + } + + if ((i = pci_device_map_range(device,device->regions[rhdDevice->bar].base_addr, + device->regions[rhdDevice->bar].size, + PCI_DEV_MAP_FLAG_WRITABLE, &io))) { + fprintf(stderr, "ERROR: Couldn't map IO memory: %s.\n", strerror(i)); + return i; + } + +#else + /* make sure we can actually read DEV_MEM before we do anything else */ + devMem = open(DEV_MEM, O_RDWR); + if (devMem < 0) { + fprintf(stderr, "Unable to open "DEV_MEM": %s.\n", strerror(errno)); + return errno; + } + + io = MapBar(device, rhdDevice->bar, devMem); + saved_errno = errno; + close (devMem); + if (io == (void *) -1) { + fprintf(stderr, "Unable to map IO memory: %s.\n", + strerror(saved_errno)); + return 1; + } +#endif + +#ifdef XSERVER_LIBPCIACCESS + /* Attempt to get unposted BIOS if failed before */ + + if (! using_vbios) { + printf("Trying to get BIOS from PCI ROM...\n"); + + if ((rombase = GetBIOS_from_PCI(rhdDevice, device, io, &size)) == NULL) { + fprintf(stderr,"ERROR: Fat lot of use that was -- can't read BIOS image\n"); + return 1; + } + + if (!InterpretATOMBIOS(rombase)) { + fprintf(stderr, "ERROR: Cannot analyze AtomBIOS from PCI ROM\n"); + return 1; + } + + if (dumpBios && rombase) { + char name[1024]; + + snprintf(name, 1023, "%04X.%04X.%04X.vga.rom", + device->device_id, device->subvendor_id, device->subdevice_id); + WriteToFile(name, rombase, size); + } + } +#endif + + +#ifdef XSERVER_LIBPCIACCESS + printf("Checking connectors on 0x%04X, 0x%04X, 0x%04X (@%02X:%02X:%02X):\n", + device->device_id, device->subvendor_id, device->subdevice_id, + device->bus, device->dev, device->func); +#else + printf("Checking connectors on 0x%04X, 0x%04X, 0x%04X (@%02X:%02X:%02X):\n", + device->device_id, pci_read_word(device, PCI_SUBSYSTEM_VENDOR_ID), + pci_read_word(device, PCI_SUBSYSTEM_ID), + device->bus, device->dev, device->func); +#endif + + ChipType = rhdDevice->type; + + LoadReport(io); + HPDReport(io); + DDCReport(io); + + LVDSReport(io); + if (scanDDCBus || DumpI2CData) + DDCScanBus(io, DumpI2CData); + +#ifdef XSERVER_LIBPCIACCESS + if (using_vbios) { + FreeVBIOS(rombase, size); + }else{ + FreeBIOS_from_PCI(rombase); + } + + pci_device_unmap_range(device, io, device->regions[rhdDevice->bar].size); + pci_system_cleanup(); +#else + FreeVBIOS(rombase, size); +#endif + + return 0; +} diff --git a/driver/xf86-video-radeonhd/utils/conntest/rhd_dump.c b/driver/xf86-video-radeonhd/utils/conntest/rhd_dump.c new file mode 100644 index 000000000..c85ed2e7d --- /dev/null +++ b/driver/xf86-video-radeonhd/utils/conntest/rhd_dump.c @@ -0,0 +1,646 @@ +/* + * Copyright 2007, 2008 Luc Verhaegen + * Copyright 2007, 2008 Matthias Hopf + * Copyright 2007, 2008 Egbert Eich + * Copyright 2007, 2008 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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. + */ +/* #define DEBUG */ +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef XSERVER_LIBPCIACCESS +#include +#else +#include +#endif + +#include +#include + +#define DEFAULT_START 0x7200 +#define DEFAULT_END 0x7300 + +#include "git_version.h" + +#ifndef ULONG +typedef unsigned int ULONG; +# define ULONG ULONG +#endif +#ifndef UCHAR +typedef unsigned char UCHAR; +# define UCHAR UCHAR +#endif +#ifndef USHORT +typedef unsigned short USHORT; +# define USHORT USHORT +#endif + +#include "atombios.h" + +typedef int Bool; +#define FALSE 0 +#define TRUE 1 +typedef unsigned char CARD8; +typedef unsigned short CARD16; +typedef unsigned int CARD32; + +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define SHORT(x) (x) +#else +#define SHORT(x) (((x & 0xff) << 8) | ((x & 0xff) >> 8)) +#endif + +#define DEV_MEM "/dev/mem" + +typedef enum _chipType { + RHD_R500 = 1, + RHD_RS690, + RHD_R600, + RHD_RV620 +} chipType; + +/* for RHD_R500/R600 */ +chipType ChipType; + +/* + * Match pci ids against data and some callbacks + */ +struct RHDDevice { + CARD16 vendor; + CARD16 device; + int bar; + chipType type; +} rhdDevices[] = { + + { 0x1002, 0x7100, 2, RHD_R500}, + { 0x1002, 0x7101, 2, RHD_R500}, + { 0x1002, 0x7102, 2, RHD_R500}, + { 0x1002, 0x7103, 2, RHD_R500}, + { 0x1002, 0x7104, 2, RHD_R500}, + { 0x1002, 0x7105, 2, RHD_R500}, + { 0x1002, 0x7106, 2, RHD_R500}, + { 0x1002, 0x7108, 2, RHD_R500}, + { 0x1002, 0x7109, 2, RHD_R500}, + { 0x1002, 0x710A, 2, RHD_R500}, + { 0x1002, 0x710B, 2, RHD_R500}, + { 0x1002, 0x710C, 2, RHD_R500}, + { 0x1002, 0x710E, 2, RHD_R500}, + { 0x1002, 0x710F, 2, RHD_R500}, + { 0x1002, 0x7140, 2, RHD_R500}, + { 0x1002, 0x7141, 2, RHD_R500}, + { 0x1002, 0x7142, 2, RHD_R500}, + { 0x1002, 0x7143, 2, RHD_R500}, + { 0x1002, 0x7144, 2, RHD_R500}, + { 0x1002, 0x7145, 2, RHD_R500}, + { 0x1002, 0x7146, 2, RHD_R500}, + { 0x1002, 0x7147, 2, RHD_R500}, + { 0x1002, 0x7149, 2, RHD_R500}, + { 0x1002, 0x714A, 2, RHD_R500}, + { 0x1002, 0x714B, 2, RHD_R500}, + { 0x1002, 0x714C, 2, RHD_R500}, + { 0x1002, 0x714D, 2, RHD_R500}, + { 0x1002, 0x714E, 2, RHD_R500}, + { 0x1002, 0x714F, 2, RHD_R500}, + { 0x1002, 0x7151, 2, RHD_R500}, + { 0x1002, 0x7152, 2, RHD_R500}, + { 0x1002, 0x7153, 2, RHD_R500}, + { 0x1002, 0x715E, 2, RHD_R500}, + { 0x1002, 0x715F, 2, RHD_R500}, + { 0x1002, 0x7180, 2, RHD_R500}, + { 0x1002, 0x7181, 2, RHD_R500}, + { 0x1002, 0x7183, 2, RHD_R500}, + { 0x1002, 0x7186, 2, RHD_R500}, + { 0x1002, 0x7187, 2, RHD_R500}, + { 0x1002, 0x7188, 2, RHD_R500}, + { 0x1002, 0x718A, 2, RHD_R500}, + { 0x1002, 0x718B, 2, RHD_R500}, + { 0x1002, 0x718C, 2, RHD_R500}, + { 0x1002, 0x718D, 2, RHD_R500}, + { 0x1002, 0x718F, 2, RHD_R500}, + { 0x1002, 0x7193, 2, RHD_R500}, + { 0x1002, 0x7196, 2, RHD_R500}, + { 0x1002, 0x719B, 2, RHD_R500}, + { 0x1002, 0x719F, 2, RHD_R500}, + { 0x1002, 0x71C0, 2, RHD_R500}, + { 0x1002, 0x71C1, 2, RHD_R500}, + { 0x1002, 0x71C2, 2, RHD_R500}, + { 0x1002, 0x71C3, 2, RHD_R500}, + { 0x1002, 0x71C4, 2, RHD_R500}, + { 0x1002, 0x71C5, 2, RHD_R500}, + { 0x1002, 0x71C6, 2, RHD_R500}, + { 0x1002, 0x71C7, 2, RHD_R500}, + { 0x1002, 0x71CD, 2, RHD_R500}, + { 0x1002, 0x71CE, 2, RHD_R500}, + { 0x1002, 0x71D2, 2, RHD_R500}, + { 0x1002, 0x71D4, 2, RHD_R500}, + { 0x1002, 0x71D5, 2, RHD_R500}, + { 0x1002, 0x71D6, 2, RHD_R500}, + { 0x1002, 0x71DA, 2, RHD_R500}, + { 0x1002, 0x71DE, 2, RHD_R500}, + { 0x1002, 0x7200, 2, RHD_R500}, + { 0x1002, 0x7210, 2, RHD_R500}, + { 0x1002, 0x7211, 2, RHD_R500}, + { 0x1002, 0x7240, 2, RHD_R500}, + { 0x1002, 0x7243, 2, RHD_R500}, + { 0x1002, 0x7244, 2, RHD_R500}, + { 0x1002, 0x7245, 2, RHD_R500}, + { 0x1002, 0x7246, 2, RHD_R500}, + { 0x1002, 0x7247, 2, RHD_R500}, + { 0x1002, 0x7248, 2, RHD_R500}, + { 0x1002, 0x7249, 2, RHD_R500}, + { 0x1002, 0x724A, 2, RHD_R500}, + { 0x1002, 0x724B, 2, RHD_R500}, + { 0x1002, 0x724C, 2, RHD_R500}, + { 0x1002, 0x724D, 2, RHD_R500}, + { 0x1002, 0x724E, 2, RHD_R500}, + { 0x1002, 0x724F, 2, RHD_R500}, + { 0x1002, 0x7280, 2, RHD_R500}, + { 0x1002, 0x7281, 2, RHD_R500}, + { 0x1002, 0x7283, 2, RHD_R500}, + { 0x1002, 0x7284, 2, RHD_R500}, + { 0x1002, 0x7287, 2, RHD_R500}, + { 0x1002, 0x7288, 2, RHD_R500}, + { 0x1002, 0x7289, 2, RHD_R500}, + { 0x1002, 0x728B, 2, RHD_R500}, + { 0x1002, 0x728C, 2, RHD_R500}, + { 0x1002, 0x7290, 2, RHD_R500}, + { 0x1002, 0x7291, 2, RHD_R500}, + { 0x1002, 0x7293, 2, RHD_R500}, + { 0x1002, 0x7297, 2, RHD_R500}, + { 0x1002, 0x791E, 2, RHD_RS690}, + { 0x1002, 0x791F, 2, RHD_RS690}, + { 0x1002, 0x793F, 2, RHD_RS690}, + { 0x1002, 0x7941, 2, RHD_RS690}, + { 0x1002, 0x7942, 2, RHD_RS690}, + { 0x1002, 0x796C, 2, RHD_R500}, + { 0x1002, 0x796D, 2, RHD_R500}, + { 0x1002, 0x796E, 2, RHD_R500}, + { 0x1002, 0x796F, 2, RHD_R500}, + { 0x1002, 0x9400, 2, RHD_R600}, + { 0x1002, 0x9401, 2, RHD_R600}, + { 0x1002, 0x9402, 2, RHD_R600}, + { 0x1002, 0x9403, 2, RHD_R600}, + { 0x1002, 0x9405, 2, RHD_R600}, + { 0x1002, 0x940A, 2, RHD_R600}, + { 0x1002, 0x940B, 2, RHD_R600}, + { 0x1002, 0x940F, 2, RHD_R600}, + { 0x1002, 0x94C0, 2, RHD_R600}, + { 0x1002, 0x94C1, 2, RHD_R600}, + { 0x1002, 0x94C3, 2, RHD_R600}, + { 0x1002, 0x94C4, 2, RHD_R600}, + { 0x1002, 0x94C5, 2, RHD_R600}, + { 0x1002, 0x94C6, 2, RHD_R600}, + { 0x1002, 0x94C7, 2, RHD_R600}, + { 0x1002, 0x94C8, 2, RHD_R600}, + { 0x1002, 0x94C9, 2, RHD_R600}, + { 0x1002, 0x94CB, 2, RHD_R600}, + { 0x1002, 0x94CC, 2, RHD_R600}, + { 0x1002, 0x9500, 2, RHD_R600}, + { 0x1002, 0x9501, 2, RHD_R600}, + { 0x1002, 0x9505, 2, RHD_R600}, + { 0x1002, 0x9507, 2, RHD_R600}, + { 0x1002, 0x950F, 2, RHD_R600}, + { 0x1002, 0x9511, 2, RHD_R600}, + { 0x1002, 0x9580, 2, RHD_R600}, + { 0x1002, 0x9581, 2, RHD_R600}, + { 0x1002, 0x9583, 2, RHD_R600}, + { 0x1002, 0x9586, 2, RHD_R600}, + { 0x1002, 0x9587, 2, RHD_R600}, + { 0x1002, 0x9588, 2, RHD_R600}, + { 0x1002, 0x9589, 2, RHD_R600}, + { 0x1002, 0x958A, 2, RHD_R600}, + { 0x1002, 0x958B, 2, RHD_R600}, + { 0x1002, 0x958C, 2, RHD_R600}, + { 0x1002, 0x958D, 2, RHD_R600}, + { 0x1002, 0x958E, 2, RHD_R600}, + { 0x1002, 0x958F, 2, RHD_R600}, + { 0x1002, 0x9590, 2, RHD_RV620}, + { 0x1002, 0x9591, 2, RHD_RV620}, + { 0x1002, 0x9593, 2, RHD_RV620}, + { 0x1002, 0x9594, 2, RHD_RV620}, + { 0x1002, 0x9596, 2, RHD_RV620}, + { 0x1002, 0x9597, 2, RHD_RV620}, + { 0x1002, 0x9598, 2, RHD_RV620}, + { 0x1002, 0x9599, 2, RHD_RV620}, + { 0x1002, 0x959B, 2, RHD_RV620}, + { 0x1002, 0x95C0, 2, RHD_RV620}, + { 0x1002, 0x95C2, 2, RHD_RV620}, + { 0x1002, 0x95C4, 2, RHD_RV620}, + { 0x1002, 0x95C5, 2, RHD_RV620}, + { 0x1002, 0x95C7, 2, RHD_RV620}, + { 0x1002, 0x95CC, 2, RHD_RV620}, + { 0x1002, 0x95CD, 2, RHD_RV620}, + { 0x1002, 0x95CE, 2, RHD_RV620}, + { 0x1002, 0x95CF, 2, RHD_RV620}, + { 0x1002, 0x9610, 2, RHD_RV620}, + { 0x1002, 0x9611, 2, RHD_RV620}, + { 0x1002, 0x9612, 2, RHD_RV620}, + { 0x1002, 0x9613, 2, RHD_RV620}, + { 0x1002, 0x9614, 2, RHD_RV620}, + { 0x1002, 0x9440, 2, RHD_RV620}, + { 0x1002, 0x9441, 2, RHD_RV620}, + { 0x1002, 0x9442, 2, RHD_RV620}, + { 0x1002, 0x9444, 2, RHD_RV620}, + { 0x1002, 0x9446, 2, RHD_RV620}, + { 0x1002, 0x944E, 2, RHD_RV620}, + { 0x1002, 0x9456, 2, RHD_RV620}, + { 0x1002, 0x9590, 2, RHD_RV620}, + { 0x1002, 0x954F, 2, RHD_RV620}, + { 0, 0, 0, 0 } +}; + +/* + * + */ +#ifndef XSERVER_LIBPCIACCESS +/* Only for libpci use */ +static struct pci_dev * +DeviceLocate(struct pci_dev *devices, int bus, int dev, int func) +{ + struct pci_dev *device; + + for (device = devices; device; device = device->next) + if ((device->bus == bus) && (device->dev == dev) && + (device->func == func)) + return device; + return NULL; +} +#endif + +/* + * + */ +static struct RHDDevice * +#ifdef XSERVER_LIBPCIACCESS +DeviceMatch(struct pci_device *device) +#else +DeviceMatch(struct pci_dev *device) +#endif +{ + int i; + + for (i = 0; rhdDevices[i].vendor; i++) + if ((rhdDevices[i].vendor == device->vendor_id) && + (rhdDevices[i].device == device->device_id)) + return (rhdDevices + i); + + return NULL; +} + +/* + * + */ +#ifndef XSERVER_LIBPCIACCESS +/* Only used by pci */ +static void * +MapBar(struct pci_dev *device, int ioBar, int devMem) +{ + void *map; + + if (!device->base_addr[ioBar] || !device->size[ioBar]) + return NULL; + + map = mmap(0, device->size[ioBar], PROT_WRITE | PROT_READ, MAP_SHARED, + devMem, device->base_addr[ioBar]); + /* printf("Mapped IO at 0x%08llX (BAR %1d: 0x%08llX)\n", + device->base_addr[io_bar], io_bar, device->size[io_bar]); */ + + return map; +} +#endif + +/* + * + */ +CARD32 +RegRead(void *map, int offset) +{ + CARD32 ret = *(volatile CARD32 *)((CARD8 *) map + offset); +#ifdef DEBUG + fprintf(stderr, "0x%x = RegRead(0x%x)\n",ret,offset); +#endif + return ret; +} + +/* + * + */ +void +RegWrite(void *map, int offset, CARD32 value) +{ +#ifdef DEBUG + fprintf(stderr, "RegWrite(0x%x, 0x%x)\n",offset,value); +#endif + *(volatile CARD32 *)((CARD8 *) map + offset) = value; +} + +/* + * + */ +void +RegMask(void *map, int offset, CARD32 value, CARD32 mask) +{ + CARD32 tmp; + + tmp = RegRead(map, offset); + tmp &= ~mask; + tmp |= (value & mask); + RegWrite(map, offset, tmp); +} + +void +print_help(const char* progname, const char* message, const char* msgarg) +{ + if (message != NULL) + fprintf(stderr, "%s %s\n", message, msgarg); + fprintf(stderr, "Usage: %s " +#if defined(XSERVER_LIBPCIACCESS) && defined (HAVE_PCI_DEVICE_ENABLE) + "[-e] " +#endif + "[-r start,end | -w addr val | -l {0|1}] PCI-tag\n" +#if defined(XSERVER_LIBPCIACCESS) && defined (HAVE_PCI_DEVICE_ENABLE) + " -e: enable PCI card (not normally needed)\n" +#endif + " PCI-tag: bus:dev.func\n\n", + progname); +} + + +/* + * + */ +int +main(int argc, char *argv[]) +{ +#ifdef XSERVER_LIBPCIACCESS + struct pci_device *device = NULL; +# if HAVE_PCI_DEVICE_ENABLE + int enable_device = FALSE; +# endif +#else + struct pci_dev *device = NULL; + struct pci_access *pciAccess; + int devMem; + int saved_errno; +#endif + struct RHDDevice *rhdDevice = NULL; + void *io; + int bus, dev, func; + int ret; + Bool deviceSet = FALSE; + CARD32 start = DEFAULT_START, end = DEFAULT_END; + CARD32 addr, val; + enum { + NONE, + READ, + WRITE, + LUT + } action = READ; /* default */ + + int i; + unsigned int j; + + + printf("%s: v%s, %s\n", + "rhd_dump", PACKAGE_VERSION, GIT_MESSAGE); + + +#ifdef XSERVER_LIBPCIACCESS + /* Initialise pciaccess */ + if ((i = pci_system_init())) { + fprintf(stderr, "ERROR: pciaccess failed to initialise PCI bus" + " (error %d)\n", i); + return 1; + } +#else + /* init libpci */ + pciAccess = pci_alloc(); + pci_init(pciAccess); + pci_scan_bus(pciAccess); +#endif + + if (argc < 2) { + print_help(argv[0], "Missing argument: please provide a PCI tag\n", + ""); + return 1; + } + + for (i = 1; i < argc; i++) { +#ifdef XSERVER_LIBPCIACCESS +# if HAVE_PCI_DEVICE_ENABLE + if (!strncmp("-e", argv[i], 3)) { + enable_device = TRUE; + }else +# endif +#endif + if (!strncmp("-r",argv[i],3)) { + action = READ; + + if (++i < argc) + ret = sscanf(argv[i], "%x,%x", &start, &end); + else { + i--; + ret = 0; + } + if (ret != 2) { + print_help(argv[0], "Unable to read range: ", argv[i]); + return 1; + } + if (start & 0x3) { + fprintf(stderr, "%s: range start 0x%4.4X not four byte aligned\n",argv[0], start); + return 1; + } + } else if (!strncmp("-w",argv[i],3)) { + action = WRITE; + + if (++i < argc) + ret = sscanf(argv[i++], "%x", &addr); + else { + i--; + ret = 0; + } + if (ret != 1) { + print_help(argv[0], "Unable to read addr: ", argv[i]); + return 1; + } + if (addr & 0x3) { + fprintf(stderr, "%s: addr 0x%4.4X not four byte aligned\n",argv[0], addr); + return 1; + } + if (i < argc) + ret = sscanf(argv[i], "%x", &val); + else { + i--; + ret = 0; + } + } else if (!strncmp("-l", argv[i], 3)) { + action = LUT; + + if (++i < argc) + ret = sscanf(argv[i], "%d", &addr); + else { + i--; + ret = 0; + } + + if (addr > 1) ret = 0; + if (ret != 1) { + print_help(argv[0], "Invalid LUT id:", argv[i]); + return 1; + } + } else if (!strncmp("-",argv[i],1)) { + print_help(argv[0], "Unknown option", argv[i]); + return 1; + } else { + ret = sscanf(argv[i], "%x:%x.%x", &bus, &dev, &func); + if (ret != 3) { + ret = sscanf(argv[i], "%x:%x:%x", &bus, &dev, &func); + if (ret != 3) { + ret = sscanf(argv[i], "%d:%d.%d", &bus, &dev, &func); + if (ret != 3) + ret = sscanf(argv[i], "%d:%d:%d", &bus, &dev, &func); + } + } + if (ret != 3) { + print_help(argv[0], "Unable to parse the PCI tag argument: ", + argv[i]); + return 1; + } + deviceSet = TRUE; + } + } + + if (deviceSet) { +#ifdef XSERVER_LIBPCIACCESS + /* Find the toy using pciaccess */ + if ((device = pci_device_find_by_slot(0, bus, dev, func)) == NULL) { + fprintf(stderr, "ERROR: Unable to find PCI device at %02X:%02X.%02X.\n", + bus, dev, func); + return 1; + } +# if HAVE_PCI_DEVICE_ENABLE + if (enable_device) + pci_device_enable(device); +# endif +#else + /* find our toy using pci */ + device = DeviceLocate(pciAccess->devices, bus, dev, func); + if (!device) { + fprintf(stderr, "Unable to find PCI device at %02X:%02X.%02X.\n", + bus, dev, func); + return 1; + } +#endif + + rhdDevice = DeviceMatch(device); + if (!rhdDevice) { + fprintf(stderr, + "Unknown device: 0x%04X:0x%04X (%02X:%02X.%02X).\n", + device->vendor_id, device->device_id, bus, dev, func); + return 1; + } + } else { + fprintf(stderr, "No PCI tag provided. " + "Please provide a pci tag of the form xx:xx.x.\n"); + return 1; + } + + /* Map into CPU memory space the required PCI memory */ + +#ifdef XSERVER_LIBPCIACCESS + pci_device_probe(device); + + if (device->regions[rhdDevice->bar].base_addr == 0) { + fprintf(stderr, "ERROR: Failed to find required resource on PCI card.\n"); + return 1; + } + + if ((i = pci_device_map_range(device,device->regions[rhdDevice->bar].base_addr, + device->regions[rhdDevice->bar].size, + PCI_DEV_MAP_FLAG_WRITABLE, &io))) { + fprintf(stderr, "ERROR: Couldn't map IO memory: %s.\n", strerror(i)); + return i; + } + +#else + + /* make sure we can actually read DEV_MEM before we do anything else */ + devMem = open(DEV_MEM, O_RDWR); + if (devMem < 0) { + fprintf(stderr, "Unable to open "DEV_MEM": %s.\n", strerror(errno)); + return errno; + } + + io = MapBar(device, rhdDevice->bar, devMem); + saved_errno = errno; + close (devMem); + if (io == (void *) -1) { + fprintf(stderr, "Unable to map IO memory: %s.\n", + strerror(saved_errno)); + return 1; + } +#endif + + ChipType = rhdDevice->type; + if (action == READ) { + for (j = start; j <= end; j+=4) { + CARD32 val = RegRead(io, j); + printf("0x%4.4X: 0x%8.8X\n",j, val); + } + } else if (action == WRITE) { + printf("Writing value: 0x%4.4X: 0x%8.8X\n",addr, val); + RegWrite(io, addr, val); + val = RegRead(io, addr); + printf("New value: 0x%4.4X: 0x%8.8X\n",addr, val); + } + else if (action == LUT) { + RegWrite(io, 0x6480, addr); /* lower half of LUT */ + RegWrite(io, 0x6484, 0); /* table mode */ + RegWrite(io, 0x6488, 0); /* start at 0 */ + + CARD32 r, g, b; + + printf("Printing LUT %d\n", addr); + printf(" R G B\n"); + for (j = 0; j < 256; j++) { + r = RegRead(io, 0x648C) >> 6; + g = RegRead(io, 0x648C) >> 6; + b = RegRead(io, 0x648C) >> 6; + printf("%02X: %3X %3X %3X\n", j, r, g, b); + } + } + +#ifdef XSERVER_LIBPCIACCESS + pci_device_unmap_range(device, io, device->regions[rhdDevice->bar].size); + pci_system_cleanup(); +#endif + + return 0; +}