ports/50766: New port: s3switch - enable TV-Out on S3 chipsets

Bruce M Simpson bms at spc.org
Thu Apr 10 03:50:10 UTC 2003


>Number:         50766
>Category:       ports
>Synopsis:       New port: s3switch - enable TV-Out on S3 chipsets
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed Apr 09 20:50:07 PDT 2003
>Closed-Date:
>Last-Modified:
>Originator:     Bruce M Simpson
>Release:        FreeBSD 5.0-RELEASE-p6 i386
>Organization:
>Environment:
System: FreeBSD saboteur.dollah.com 5.0-RELEASE-p6 FreeBSD 5.0-RELEASE-p6 #0: Fri Mar 28 09:51:11 GMT 2003 root at saboteur.dollah.com:/usr/src/sys/i386/compile/SABOTEUR_GEOM i386


	
>Description:
	s3switch enables switching between lcd, svga and tv-out on recent
	s3 graphics chipsets. essential for ThinkPad owners.
>How-To-Repeat:
	
>Fix:

	

--- s3switch.shar begins here ---
# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	s3switch
#	s3switch/pkg-descr
#	s3switch/distinfo
#	s3switch/Makefile
#	s3switch/pkg-comment
#	s3switch/pkg-plist
#	s3switch/files
#	s3switch/files/patch-s3switch.c
#	s3switch/files/patch-Makefile
#	s3switch/files/patch-s3switch.1x
#
echo c - s3switch
mkdir -p s3switch > /dev/null 2>&1
echo x - s3switch/pkg-descr
sed 's/^X//' >s3switch/pkg-descr << 'END-of-s3switch/pkg-descr'
XThis is a utility used to enable the TV output on S3 Savage based cards,
Xwhich I have ported to run under FreeBSD as well as Linux.
X
XIt must be run as root, though I leave you to do this at your discretion.
X
XBruce
Xbms at spc.org
END-of-s3switch/pkg-descr
echo x - s3switch/distinfo
sed 's/^X//' >s3switch/distinfo << 'END-of-s3switch/distinfo'
XMD5 (s3ssrc.zip) = 1328b070343ac79c5ed4c613a1113754
END-of-s3switch/distinfo
echo x - s3switch/Makefile
sed 's/^X//' >s3switch/Makefile << 'END-of-s3switch/Makefile'
X# New ports collection makefile for:	s3switch
X# Date created:				March 16, 2003
X# Whom:					Bruce M Simpson <bms at spc.org>
X#
X# $FreeBSD$
X#
X
XPORTNAME=	s3switch
XPORTVERSION=	0.1
XCATEGORIES=	graphics
XMASTER_SITES=	http://www.probo.com/timr/
XDISTNAME=	s3ssrc
X
XMAINTAINER=	bms at spc.org
X
XBUILD_DEPENDS+=	${LOCALBASE}/bin/unzip:${PORTSDIR}/archivers/unzip
X
XUSE_GMAKE=	yes
XUSE_ZIP=	yes
XUSE_X_PREFIX=	yes
XNO_WRKSUBDIR=
XMAKE_ENV+=	FREEBSD=1
X
XMAN1=	s3switch.1
X
Xdo-install:
X	${INSTALL_PROGRAM} ${WRKDIR}/s3switch ${PREFIX}/bin
X	${INSTALL_MAN} ${WRKDIR}/s3switch.1x ${PREFIX}/man/man1/s3switch.1
X
X.include <bsd.port.mk>
END-of-s3switch/Makefile
echo x - s3switch/pkg-comment
sed 's/^X//' >s3switch/pkg-comment << 'END-of-s3switch/pkg-comment'
XEnable TV-out on S3 graphics cards
END-of-s3switch/pkg-comment
echo x - s3switch/pkg-plist
sed 's/^X//' >s3switch/pkg-plist << 'END-of-s3switch/pkg-plist'
Xbin/s3switch
END-of-s3switch/pkg-plist
echo c - s3switch/files
mkdir -p s3switch/files > /dev/null 2>&1
echo x - s3switch/files/patch-s3switch.c
sed 's/^X//' >s3switch/files/patch-s3switch.c << 'END-of-s3switch/files/patch-s3switch.c'
X--- s3switch.c.orig	Wed Sep 11 23:25:33 2002
X+++ s3switch.c	Sun Mar 16 03:15:54 2003
X@@ -1,7 +1,37 @@
X // Simple utility to switch a Savage board between CRT/LCD devices.
X // T. N. Roberts, 99-Aug-26.
X 
X-// Linux x86 only.
X+// Ported to FreeBSD/i386 by Bruce M Simpson <bms at spc.org>
X+
X+#if defined(__FreeBSD__)
X+
X+#include <sys/types.h>
X+#include <machine/cpufunc.h>
X+#include <machine/sysarch.h>
X+#include <machine/vm86.h>
X+#include <stdlib.h>
X+#include <stdio.h>
X+
X+#define OUTB(val,port) outb(port,val)
X+#define INB(port) inb(port)
X+#define IOPERM(x,y,z) i386_set_ioperm(x,y,z)
X+
X+typedef struct vm86_intcall_args INTCALL_ARGS_T;
X+#define EAX vmf.eax.r_ex
X+#define EBX vmf.ebx.r_ex
X+#define ECX vmf.ecx.r_ex
X+#define EDX vmf.edx.r_ex
X+
X+#define INTCALL_INIT()
X+
X+static __inline
X+INTCALL(int intnum, INTCALL_ARGS_T *args)
X+{
X+	args->intnum = intnum;
X+	return(!i386_vm86(VM86_INTCALL, args));
X+}
X+
X+#else /* Linux */
X 
X #include <stdio.h>
X #define extern
X@@ -10,6 +40,30 @@
X 
X #include "lrmi.h"
X 
X+#define OUTB(val,port) outb(val,port)
X+#define INB(port) inb(port)
X+#define IOPERM(x,y,z) ioperm(x,y,z)
X+
X+typedef struct LRMI_regs INTCALL_ARGS_T;
X+#define EAX eax
X+#define EBX ebx
X+#define ECX ecx
X+#define EDX edx
X+
X+#define INTCALL_INIT()			\
X+	do {				\
X+		if (!LRMI_init())	\
X+			return (1);	\
X+	} while (0)
X+
X+static __inline
X+INTCALL(int intnum, INTCALL_ARGS_T *args)
X+{
X+	return(LRMI_int(intnum, args));
X+}
X+
X+#endif /* Linux */
X+
X // Usage:
X //  s3switch [-q] [crt|lcd|both]
X 
X@@ -97,10 +151,10 @@
X {
X     /* Allow or disallow access to I/O ports. */
X 
X-    ioperm( 0x40, 4, enable );
X-    ioperm( 0x61, 1, enable );
X-    ioperm( 0x80, 1, enable );
X-    ioperm( 0x3b0, 0x30, enable );
X+    IOPERM( 0x40, 4, enable );
X+    IOPERM( 0x61, 1, enable );
X+    IOPERM( 0x80, 1, enable );
X+    IOPERM( 0x3b0, 0x30, enable );
X }
X 
X 
X@@ -109,10 +163,10 @@
X {
X     // Figure out what kind of Savage it is.
X 
X-    outb( 0x2d, 0x3d4 );
X-    gPCIid = inb( 0x3d5 ) << 8;
X-    outb( 0x2e, 0x3d4 );
X-    gPCIid |= inb( 0x3d5 );
X+    OUTB( 0x2d, 0x3d4 );
X+    gPCIid = INB( 0x3d5 ) << 8;
X+    OUTB( 0x2e, 0x3d4 );
X+    gPCIid |= INB( 0x3d5 );
X 
X     switch( gPCIid ) {
X 	case PCI_CHIP_SAVAGE3D:
X@@ -157,21 +211,21 @@
X 
X     if( ChipClass == S3_SAVAGEMXIX ) 
X     {
X-	outb( 0xc0, 0x3d4 );
X-	jTvFormat = inb( 0x3d5 );
X-	outb( 0x6b, 0x3d4 );
X-	jDevices = inb( 0x3d5 );
X+	OUTB( 0xc0, 0x3d4 );
X+	jTvFormat = INB( 0x3d5 );
X+	OUTB( 0x6b, 0x3d4 );
X+	jDevices = INB( 0x3d5 );
X     }
X     else 
X     {
X-	outb( 0x6b, 0x3d4 );
X-	jTvFormat = inb( 0x3d5 );
X-	outb( 0x6d, 0x3d4 );
X-	jDevices = inb( 0x3d5 );
X+	OUTB( 0x6b, 0x3d4 );
X+	jTvFormat = INB( 0x3d5 );
X+	OUTB( 0x6d, 0x3d4 );
X+	jDevices = INB( 0x3d5 );
X     }
X 
X-    outb( 0x79, 0x3d4 );
X-    cr79 = inb( 0x3d5 );
X+    OUTB( 0x79, 0x3d4 );
X+    cr79 = INB( 0x3d5 );
X 
X     //printf( "Device ID: %04x\n", gPCIid);
X 
X@@ -207,24 +261,23 @@
X unsigned short
X set_active_device( int iDevice )
X {
X-    struct LRMI_regs r;
X+    INTCALL_ARGS_T sa;
X     int iResult = 0;
X 
X-    if (!LRMI_init())
X-	return 1;
X+    INTCALL_INIT();
X 
X     /* Go set the active device. */
X 
X-    memset( &r, 0, sizeof(r) );
X+    memset(&sa, 0, sizeof(sa));
X 
X-    r.eax = 0x4f14;	// S3 extended functions
X-    r.ebx = 0x0003;	// set active device
X-    r.ecx = iDevice;
X+    sa.EAX = 0x4F14;
X+    sa.EBX = 0x0003;
X+    sa.ECX = iDevice;
X 
X     if( ChipClass == S3_SAVAGEMXIX )
X-	r.ecx |= DUO_ON;
X+	sa.ECX |= DUO_ON;
X 
X-    iResult = LRMI_int( 0x10, &r );
X+    iResult = INTCALL(0x10, &sa);
X 
X     if( !iResult )
X     {
X@@ -232,7 +285,7 @@
X 	return 1;
X     }
X 
X-    if ( (r.eax & 0xffff) != 0x4f )
X+    if ( (sa.EAX & 0xffff) != 0x4f )
X     {
X 	fprintf( stderr, "BIOS returned error code.\n" );
X 	return 1;
X@@ -246,22 +299,21 @@
X unsigned short
X set_tv_state( int state )
X {
X-    struct LRMI_regs r;
X+    INTCALL_ARGS_T sa;
X     int iResult = 0;
X 
X-    if (!LRMI_init())
X-	return 1;
X+    INTCALL_INIT();
X 
X     /* And go set the TV state. */
X 
X-    memset( &r, 0, sizeof(r) );
X+    memset(&sa, 0, sizeof(sa));
X 
X-    r.eax = 0x4f14;	// S3 extended functions
X-    r.ebx = 0x0007;	// set tv state
X-    r.ecx = state;
X-    r.edx = TV_FORMAT_MASK;
X+    sa.EAX = 0x4F14;
X+    sa.EBX = 0x0007;
X+    sa.ECX = state;
X+    sa.EDX = TV_FORMAT_MASK;
X 
X-    iResult = LRMI_int( 0x10, &r );
X+    iResult = INTCALL(0x10, &sa);
X 
X     if( !iResult )
X     {
X@@ -269,7 +321,7 @@
X 	return 1;
X     }
X 
X-    if ( (r.eax & 0xffff) != 0x4f )
X+    if ( (sa.EAX & 0xffff) != 0x4f )
X     {
X 	fprintf( stderr, "BIOS returned error code.\n" );
X 	return 1;
X@@ -348,9 +400,9 @@
X 	    if( (cr79 == 5) || (cr79 == 8) )
X 	    {
X 		cr79 = (cr79 == 5) ? 8 : 0x0e;
X-		ioperm( 0x3d4, 2, 1 );
X+		IOPERM( 0x3d4, 2, 1 );
X 		outw( (cr79 << 8) | 0x79, 0x3d4 );
X-		ioperm( 0x3d4, 2, 0 );
X+		IOPERM( 0x3d4, 2, 0 );
X 	    }
X 	}
X 	else if( !(jDevices & LCD_ACTIVE) && (newstate & LCD_ACTIVE) )
X@@ -360,9 +412,9 @@
X 	    if( (cr79 == 8) || (cr79 == 0xe) )
X 	    {
X 		cr79 = (cr79 == 8) ? 5 : 8;
X-		ioperm( 0x3d4, 2, 1 );
X+		IOPERM( 0x3d4, 2, 1 );
X 		outw( (cr79 << 8) | 0x79, 0x3d4 );
X-		ioperm( 0x3d4, 2, 0 );
X+		IOPERM( 0x3d4, 2, 0 );
X 	    }
X 	}
X     }
END-of-s3switch/files/patch-s3switch.c
echo x - s3switch/files/patch-Makefile
sed 's/^X//' >s3switch/files/patch-Makefile << 'END-of-s3switch/files/patch-Makefile'
X--- Makefile.orig	Sun Mar 16 03:08:16 2003
X+++ Makefile	Sun Mar 16 03:08:38 2003
X@@ -1,5 +1,11 @@
X CC = gcc -g
X 
X+ifdef FREEBSD
X+LRMIOBJ=
X+else
X+LRMIOBJ=lrmi.o
X+endif
X+
X all: s3switch
X 
X-s3switch: s3switch.o lrmi.o
X+s3switch: s3switch.o $(LRMIOBJ)
END-of-s3switch/files/patch-Makefile
echo x - s3switch/files/patch-s3switch.1x
sed 's/^X//' >s3switch/files/patch-s3switch.1x << 'END-of-s3switch/files/patch-s3switch.1x'
X--- s3switch.1x.orig	Wed Sep 11 23:21:19 2002
X+++ s3switch.1x	Sun Mar 16 03:49:59 2003
X@@ -55,8 +55,10 @@
X .I S3switch
X will not allow you to activate devices which are not connected, on those
X chips that are able to detect this.
X-.SH AUTHOR
X+.SH AUTHORS
X Tim Roberts (timr at probo.com)
X+.P
X+Bruce M Simpson <bms at spc.org> (FreeBSD Port)
X .SH "SEE ALSO"
X .BR X(1x), 
X .BR Xserver(1x)
END-of-s3switch/files/patch-s3switch.1x
exit
--- s3switch.shar ends here ---


>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list