Date: Mon, 26 Aug 1996 12:51:36 -0500 (CDT) From: "Lars Jonas Olsson" <jonas@mcs.com> To: rsnow@lgc.com (Rob Snow) Cc: jonas@mcs.net, hackers@freebsd.org Subject: Re: [Fwd: Fastvid,NT,Pentium Pro Performance: Expanation] (fwd) Message-ID: <m0uv5p2-000IDOC@venus.mcs.com> In-Reply-To: <Pine.SGI.3.93.960825130712.16821A-110000@dympna> from "Rob Snow" at Aug 25, 96 01:10:02 pm
next in thread | previous in thread | raw e-mail | index | archive | help
I'm also interested in maximising PCI memory copy speed. I got this
mail from John Hinkley that wrote FASTVID.
I'm however using Triton II chip set and am most interested in read
speed from a memory mapped PCI frame grabber.
Jonas
>From CompuServe.COM!72466.1403 Mon Aug 26 12:20:54 1996
>Return-Path: <72466.1403@CompuServe.COM>
>Received: by mailbox.mcs.com (/\==/\ Smail3.1.28.1 #28.5)
> id <m0uv5LJ-000AvfC@mailbox.mcs.com>; Mon, 26 Aug 96 12:20 CDT
>Received: by hil-img-5.compuserve.com (8.6.10/5.950515)
> id NAA05839; Mon, 26 Aug 1996 13:20:48 -0400
>Date: 26 Aug 96 13:19:03 EDT
>From: John Hinkley <72466.1403@CompuServe.COM>
>To: "\"Lars Jonas Olsson\"" <jonas@mcs.com>
>Subject: Re: PCI to DRAM copy speed
>Message-ID: <960826171903_72466.1403_EHB153-1@CompuServe.COM>
>Status: OR
Jonas,
> Can I forward this (FASTVID code fragment) to either XFree86
> (Free X server for UNIX and OS/2) and/or FreeBSD?
It's fine with me...
John.
>From CompuServe.COM!72466.1403 Mon Aug 12 22:33:47 1996
>Return-Path: <72466.1403@CompuServe.COM>
>Received: by mailbox.mcs.com (/\==/\ Smail3.1.28.1 #28.5)
> id <m0uqAEl-000AvTC@mailbox.mcs.com>; Mon, 12 Aug 96 22:33 CDT
>Received: by hil-img-4.compuserve.com (8.6.10/5.950515)
> id XAA04478; Mon, 12 Aug 1996 23:33:46 -0400
>Date: 12 Aug 96 23:32:17 EDT
>From: John Hinkley <72466.1403@CompuServe.COM>
>To: "\"Lars Jonas Olsson\"" <jonas@mcs.com>
>Subject: Re: PCI to DRAM copy speed
>Message-ID: <960813033216_72466.1403_EHB50-2@CompuServe.COM>
>Status: OR
Lars,
Thanks for the interesting code fragment. Your method for optimizing the
Neptune chipset looks vaguely similar to that used on the Pentium Pro --
except the Pro has moved the write combining option onto the processor rather
than the chipset:
setup_lfb(unsigned int base, int mb)
// base = address of LFB
// mb = number of megabytes VRAM
{
#define SVGA_PHYSBASE 0x202
#define SVGA_MASK 0x203
struct QWORD
{
unsigned int eax;
unsigned int edx;
} q;
unsigned int mask; // identifies size controlled by MSR
if (mb == 1)
mask = base | 0xFFF00000;
else if (mb == 2)
mask = base | 0xFFE00000;
else if (mb == 4)
mask = base | 0xFFC00000;
else // if (mb == 8)
mask = base | 0xFF800000;
// first disable the MSR pair in case it's in use
q.edx = 0;
q.eax = 0;
write_msr(SVGA_MASK, q.eax, q.edx);
// 00 = no cache
// 01 = write combining
// 04 = write through
// 05 = write proteced
// 06 = write back
q.edx = 0x00000000;
q.eax = base | 1; // 1 == write combining
write_msr(SVGA_PHYSBASE, q.eax, q.edx);
q.edx = 0x0000000f;
q.eax = mask | 0x00000800; // 800 bit enables MSR
write_msr(SVGA_MASK, q.eax, q.edx);
}
write_msr() uses the WRMSR instruction to write the contents of EDX:EAX out
to the indicated MSR register. The equivalent of:
mov eax,q.eax
mov edx,q.edx
wrmsr MSR_REG
The MSR registers are used in pairs to control the properties of memory
space. WRMSR is a ring-0 instruction so you can't run it from a virtual DOS
session.
John.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?m0uv5p2-000IDOC>
